在前面的章節中,我們學習了解了字符設備驅動,以及如何在設備樹文件中添加設備信息,接下來就來看一下i.MX6UL終結者開發板的實際硬件是如何添加的。我們先以最簡單的LED設備來看一下具體的注冊流程。 36.1 LED設備注冊流程在i.MX6UL終結者開發板上有一個LED設備,如果想要通過Linux系統/dev目錄下的設備節點來控制LED,就需要在內核中添加LED的驅動,具體的流程可以分為下面幾個步驟: ① 硬件原理圖分析,確定控制LED的GPIO信息。 ② 根據GPIO信息在設備樹文件中添加pinctrl信息 ③ 在設備樹中創建LED的設備節點,并加入GPIO信息 ④ 編寫LED設備驅動程序 接下來根據上面這四步來添加一下LED的設備驅動。 36.2 LED硬件原理圖分析LED設備的硬件原理圖如下所示: LED設備的原理圖很簡單,LED一端接3.3V電源,另一端為控制引腳:GPIO_3,通過控制GPIO_3的高低電平來控制LED的亮滅。所以我們確認LED設備只使用了一個控制引腳:GPIO_3。 36.3 修改設備樹文件在引腳原理圖分析中確認了LED的控制GPIO信息,接下來就要修改設備樹文件。 36.3.1 添加pinctrl信息在i.MX6UL終結者開發板中使用GPIO_3這個引腳來控制LED設備。打開topeet_emmc_4_3.dts文件在iomux節點的imx6ul-evk子節點下創建一個名為“pinctrl_led”的子節點,具體內容如下: &iomuxc { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_hog_1>; imx6ul-evk { pinctrl_led: gpio-led { fsl,pins = ; }; } }; 在pinctrl_gpio_leds節點中將GPIO_3引腳的復用功能定義為GPIO1_IO03,即為一個普通的輸入輸出引腳。宏定義MX6UL_PAD_GPIO1_IO03__GPIO1_IO03定義在arch/arm/boot/dts/imx6ul-pinfunc.h目錄下。 36.3.2 添加LED設備節點在topeet_emmc_4_3.dts文件下,在根節點“/”下創建LED節點,節點名為“gpioled”,具體內容如下: 1 gpioled { 2 #address-cells = <1>; 3 #size-cells = <1>; 4 compatible = "gpioled"; 5 pinctrl-names = "default"; 6 pinctrl-0 = <&pinctrl_led>; 7 led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>; 8 status = "okay"; 9 }; 第6行,pinctrl-0 屬性設置 LED 燈所使用的GPIO對應的 pinctrl 節點。 第7行,led-gpio屬性指定了LED使用的GPIO為GPIO1的IO3引腳,低電平有效,在驅動程序中會獲取led-gpio屬性的內容來得到GPIO編號,因為gpio子系統的操作控制函數需要GPIO編號。 添加完LED的設備節點后,還有一個重要的步驟,就是檢查GPIO引腳有沒有被其他設備使用。一個引腳只能配置成一個功能,如果有其他設備也使用了這個GPIO,那么會導致在LED驅動程序中GPIO初始化失敗。這一點非常重要。 檢查GPIO引腳有沒有被其他設備使用包括兩個方面: ① 檢查pinctrl設置 ② 檢查這個GPIO有沒有被別的設備使用 LED設備使用的是GPIO1_IO03,首先檢查GPIO1_IO03這個引腳有沒有其他pinctrl節點的設置。在topeet_emmc_4_3.dts文件中找到了如下內容: pinctrl_tsc: tscgrp { fsl,pins = < MX6UL_PAD_GPIO1_IO01__GPIO1_IO01 0xb0 MX6UL_PAD_GPIO1_IO02__GPIO1_IO02 0xb0 MX6UL_PAD_GPIO1_IO03__GPIO1_IO03 0xb0 MX6UL_PAD_GPIO1_IO04__GPIO1_IO04 0xb0 >; }; GPIO1_IO03引腳也在pinctrl_tsc節點中定義了,pinctrl_tsc 節點是 TSC(電阻觸摸屏接口)的 pinctrl 節點,而在i.MX6UL終結者開發板中并沒有用到這個接口,因此我們要將pinctrl_tsc節點下的GPIO1_IO03引腳的定義注釋掉。和 C 語言一樣,在要屏蔽的內容前后加上“/*”和“*/”符號即可。 既然有其他設備配置了GPIO1_IO03引腳的pinctrl信息,應該會有使用使用這個pinctrl節點的設備節點,在topeet_emmc_4_3.dts文件中查找一下pinctrl_tsc或者直接查找“gpio1 3”,查找內容如下: 1 &tsc { 2 pinctrl-names = "default"; 3 pinctrl-0 = <&pinctrl_tsc>; 4 xnur-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>; 5 measure-delay-time = <0xffff>; 6 pre-charge-time = <0xfff>; 7 status = "disabled"; 8 }; 可以看出第4行xnur-gpio屬性使用了“gpio1 3”,同意需要把這一行也注釋掉。然后繼續按照上面步驟搜索,看看還有沒有其他設備使用了GPIO1_IO03引腳。 設備樹編寫完成以后使用“make dtbs”命令重新編譯設備樹,然后使用新編譯出來的 topeet_emmc_4_3.dtb 文件啟動 Linux 系統。啟動成功以后進入“/proc/device-tree”目錄中查看“gpioled”節點是否存在,如果存在的話就說明設備樹基本修改成功(具體作用還要驅動驗證),結果如下圖所示: 請繼續:IMX6ULL開發平臺Linux-LED實驗(二)
|