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