1 前言 本例程介紹使用TIMER的寄存器實現最基本的定時功能,輸入捕獲,輸入捕獲模式可以用來測量脈沖寬度或者測量頻率。AM335x開發板有8個32位通用定時器,DMTIMER1是用于操作系統(OS)毫秒定時器,用于操作系統時鐘,DMTIMER4-DMTIMER7作為輸出引腳。 ![]() 圖 1 例程源碼位于光盤資料”Demo\pps-dmtimer\src”下。 本次編譯生成的設備樹文件以及pps-dmtimer.ko驅動模塊和腳本文件gpio.sh位于光盤資料”Demo\pps-dmtimer\bin”下。 1 編譯pps-dmtimer.ko驅動模塊2.1 修改Makefile文件工程源碼位于光盤”Demo\pps-dmtimer\src”下,將pps-dmtimer工程源碼拷貝到Ubuntu任意目錄下。進入pps-dmtimer工程源碼目錄,修改Makefile配置文件。 Host# vi Makefile ![]() 圖 2 將KDIR修改為kernel源碼所在目錄(kernel必須已經編譯過,如果沒編譯,可以參照用戶手冊下《Linux內核編譯方法》來編譯內核)。 ![]() 圖 3 在pps-gmtimer.c文件中添加頭文件:#include "dmtimer.h"。 Host# vi pps-gmtimer.c ![]() 圖 4 ![]() 圖 5 如下圖,將timespec修改為timespec64,修改完成后保存退出。 ![]() 圖 6 將內核源碼下的”arch/arm/plat-omap/include/plat/dmtimer.h”文件拷貝到pps-dmtimer工程源碼根目錄下。 Host# cp /home/tronlong/AM335x/kernel/Linux-4.4.12/arch/arm/plat-omap/include/plat/dmtimer.h ./ ![]() 圖 7 執行如下指令進行編譯,編譯完成后在源碼根目錄下生成pps-dmtimer.ko驅動模塊: Host# cp /home/tronlong/AM335x/kernel/Linux-4.4.12/arch/arm/plat-omap/include/plat/dmtimer.h ./ ![]() 圖 8 將生成的pps-dmtimer.ko拷貝到SD系統啟動卡的boot分區。 3 修改設備樹(1) 修改內核源碼下的設備樹文件am335x-icev2.dts,添加以下Timer4節點。 Host# vi arch/arm/boot/dts/am335x-icev2.dts ![]() 圖 9 添加節點: &pps_gmtimer { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&gps_pps_pins>; }; ![]() 圖 10 添加PINMUX,將開發板上的”GPIO/eHRPWM/eQEP/I2C”接口引出的GPMC_ADVN_ALE配置為TIMER4功能(GPMC_ADVN_ALE和TIMER4復用),將開發板引出的XDMA_EVENT_INTR1口配置為TCLKIN,接口以及詳細配置請查閱光盤資料”Datasheet\核心板芯片\CPU”下的數據手冊以及開發板底板原理圖。配置如下: gps_pps_pins: gps_pps_pins { pinctrl-single,pins = < AM33XX_IOPAD(0x9b4, PIN_INPUT | MUX_MODE2) //TCLKIN AM33XX_IOPAD(0x890, PIN_INPUT | MUX_MODE2) //TIMER4 >; }; ![]() 圖 11 (2) 修改內核源碼下設備樹文件am33xx.dtsi。 Host# vi arch/arm/boot/dts/am33xx.dtsi ![]() 圖 12 增加Timer4結點: pps_gmtimer:pps_gmtimer { compatible = "pps-gmtimer"; timer = <&timer4>; use-tclkin = <1>; status = "okay"; }; ![]() 圖 13 (3) 修改am335x-icev2.dts文件,加入PINMUX。 Host# vi arch/arm/boot/dts/am335x-icev2.dts ![]() 圖 14 將開發板上的”GPIO/eHRPWM/eQEP/I2C”接口引出的IO口作為脈沖輸出,這里是選取GPIO1[15]作為外部脈沖輸出。 gpio_pins: gpio_pins { pinctrl-single,pins = < AM33XX_IOPAD(0x83c, PIN_OUTPUT | MUX_MODE7) /* (U13) GPIO1[15] */ >; }; ![]() 圖 15 在gpio_keys節點下加上PINMUX的說明。 將pinctrl-0 = <&user_keys_default>; 修改為pinctrl-0 = <&user_keys_default &gpio_pins>; ![]() 圖 16 如果是eMMC的核心板,按照如上修改完成后保存退出,編譯設備樹,將編譯生成的設備樹拷貝到SD系統啟動卡的”rootfs/boot”目錄。 如果是NAND FLASH的核心板,除了做如上修改,還需要修改am335x-icev2-nand.dts文件,因為在am335x-icev2-nand.dts中已經將GPMC_ADVN_ALE配置為了gpmc_advn_ale功能,將該配置注釋掉,如下圖。 ![]() 圖 17 修改完成后,保存退出,編譯生成am335x-icev2-nand.dtb文件,將am335x-icev2-nand.dtb重命名為am335x-icev2.dtb并拷貝至SD系統啟動卡的”rootfs/boot”目錄。 |
更多幫助 銷售郵箱:sales@tronlong.com 技術郵箱:support@tronlong.com 創龍總機:020-8998-6280 技術熱線:020-3893-9734 創龍官網:www.tronlong.com 技術論壇:www.51ele.net 線上商城:https://tronlong.taobao.com |