五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【i.MX6ULL】驅(qū)動(dòng)開發(fā)6——Pinctrl子系統(tǒng)與GPIO子系統(tǒng)點(diǎn)亮LED

2021-11-09 23:18 作者:碼農(nóng)愛學(xué)習(xí)-B站  | 我要投稿

前面的兩篇文章(寄存器配置點(diǎn)亮LED與設(shè)備樹版的點(diǎn)亮LED),其本質(zhì)都是通過寄存器配置,來控制LED的亮滅。

  • 使用直接操作寄存器的方式,是將與LED有關(guān)的寄存器信息,直接寫到了LED的驅(qū)動(dòng)代碼中,這也是一種比較常規(guī)的控制方式。但當(dāng)芯片的寄存器發(fā)了變動(dòng),就要對(duì)底層的驅(qū)動(dòng)進(jìn)行重寫。

  • 使用設(shè)備樹的方式,是將與LED有關(guān)的寄存器信息,寫到了設(shè)備樹文件中,這樣,當(dāng)設(shè)備的信息修改了,還可以通過設(shè)備樹的接口函數(shù),來獲取設(shè)備信息,提高了驅(qū)動(dòng)代碼的復(fù)用能力。

  • 本篇介紹的Pinctrl子系統(tǒng)與GPIO子系統(tǒng)的方式,不需要再直接操作寄存器了,因?yàn)檫@兩個(gè)子系統(tǒng)已經(jīng)替我們實(shí)現(xiàn)了對(duì)寄存器的操作,我們只需要操作這兩個(gè)子系統(tǒng)提供的API函數(shù)即可。

1 Pinctrl子系統(tǒng)

Pintrl子系統(tǒng),顧名思義,就是管理pin引腳的一個(gè)系統(tǒng),比如要點(diǎn)亮LED,即要控制LED對(duì)應(yīng)引腳的高低電平,就要先通過Pintrl子系統(tǒng)將LED對(duì)應(yīng)的引腳復(fù)用為GPIO功能(這一點(diǎn)是不是和之前寄存器配置時(shí)使用的MUX寄存器的功能有點(diǎn)像)。

1.1 設(shè)備樹中iomuxc節(jié)點(diǎn)

如何使用Pintrl子系統(tǒng)呢?其實(shí)它也是要依賴設(shè)備樹的,先來了解一下設(shè)備樹里的iomuxc節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)是IOMUXC外設(shè)對(duì)應(yīng)的節(jié)點(diǎn),負(fù)責(zé)IO功能的復(fù)用。

打開自己開發(fā)板對(duì)應(yīng)的設(shè)備樹文件(我的是imx6ull-myboard.dts),然后找到iomuxc節(jié)點(diǎn),先來看一下其基本結(jié)構(gòu):

這里以pinctrl_hog_1插拔子節(jié)點(diǎn)為例進(jìn)行分析,它是和熱插拔有關(guān)的Pin集合,比如USB OTG的ID引腳,pinctrl_csi1子節(jié)點(diǎn)是csi外設(shè)所使用的PIN,本篇需要控制LED的亮滅,就需要新建一個(gè)對(duì)應(yīng)的節(jié)點(diǎn),然后將這個(gè)自定義外設(shè)的所有Pin配置信息都放到這個(gè)子節(jié)點(diǎn)中。

1.2 宏定義的含義解析

對(duì)于pinctrl_hog_1這個(gè)字節(jié)點(diǎn),注意其中的:

這就是對(duì)Pin引腳的配置,配置包括兩方面:一是設(shè)置Pin的復(fù)用功能,二是設(shè)置Pin的電氣特性。

前面的MX6UL_PAD_UART1_RTS_B__GPIO1_IO19這個(gè)宏定義, 定義在arch/arm/boot/dts/imx6ul-pinfunc.h中(注意imx6ull.dtsi會(huì)引用imx6ull-pinfunc.h,而imx6ull-pinfunc.h又會(huì)引用imx6ul-pinfunc.h

這里一共有8 個(gè)以MX6UL_PAD_UART1_RTS_B開頭的宏定義,分別代表這個(gè)IO的8種不同的功能。

另外,這個(gè)宏定義的值,被分為了5段,每段的值都有具體的含義:

  • 0x0090 mux_reg寄存器偏移地址

  • 0x031C conf_reg寄存器偏移地址

  • 0x0000 input_reg寄存器偏移地址(這里無效)

  • 0x5 mux_reg寄存器的值

  • 0x0 input_reg寄存器值(這里無效)

2 GPIO子系統(tǒng)

GPIO子系統(tǒng),顧名思義,就是管理GPIO功能的一個(gè)系統(tǒng),其作用是初始化配置GPIO(這一點(diǎn)是不是和之前寄存器配置時(shí)使用的PAD寄存器的功能有點(diǎn)像),并提供對(duì)外的API接口。使用GPIO子系統(tǒng)后,就不需要自己操作寄存器,通過調(diào)用GPIO子系統(tǒng)提供的API函數(shù)即可實(shí)現(xiàn)對(duì)GPIO的控制。

2.1 設(shè)備樹中g(shù)pio信息

仍以熱插拔節(jié)點(diǎn)為例:

UART1_RTS_B復(fù)用為GPIO1_IO19,通過讀取其高低電平來判斷SD卡有沒有插入。

那SD卡驅(qū)動(dòng)程序怎么知道CD引腳連接的GPIO1_IO19呢?還是需要設(shè)備樹告訴驅(qū)動(dòng),在設(shè)備樹中SD卡節(jié)點(diǎn)下添加一個(gè)屬性來描述SD卡的 CD 引腳就行了:

cd-gpios描述了SD卡的CD引腳使用的哪個(gè)IO,屬性值一共有三個(gè):

  • &gpio1 表示CD引腳所使用的IO屬于GPIO1組

  • 19 表示GPIO1組的第19號(hào)IO

  • GPIO_ACTIVE_LOW 表示低電平有效

根據(jù)上面這些信息,SD卡驅(qū)動(dòng)程序就可以使用GPIO1_IO19來檢測(cè)SD卡的CD信號(hào)了

2.2 gpio子系統(tǒng)API函數(shù)

2.2.1 gpio_request/free

  • gpio_request

用于申請(qǐng)一個(gè)GPIO管腳

  • gpio_free

用于釋放一個(gè)GPIO管腳

2.2.2 gpio_direction_input/output

  • gpio_direction_input

用于設(shè)置某個(gè)GPIO為輸入

  • gpio_direction_output

此函數(shù)用于設(shè)置某個(gè)GPIO為輸出,并且設(shè)置默認(rèn)輸出值

2.2.3 gpio_get_value/set_value

  • gpio_get_value

此函數(shù)用于獲取某個(gè)GPIO的值(0 或 1)

  • gpio_set_value

用于設(shè)置某個(gè)GPIO的值

2.3 與gpio相關(guān)的OF函數(shù)

2.3.1 of_gpio_named_count

用于獲取設(shè)備樹某個(gè)屬性里面定義了幾個(gè)GPIO信息

2.3.2 of_gpio_count

統(tǒng)計(jì)“gpios”這個(gè)屬性的gpio數(shù)量

2.3.3 of_get_named_gpio

獲取GPIO編號(hào)

3 Pinctr版LED驅(qū)動(dòng)程序

上面介紹了Pinctrl子系統(tǒng)與GPIO子系統(tǒng)的基本情況,下面就來使用它們來實(shí)現(xiàn)LED的亮滅控制。

3.1 修改設(shè)備樹文件

修改imx6ull-myboard.dts,在iomuxc節(jié)點(diǎn)的imx6ull-evk字節(jié)點(diǎn)下創(chuàng)建一個(gè)名為pinctrl_led的子節(jié)點(diǎn),節(jié)點(diǎn)內(nèi)容如下:

  • MX6ULL_PAD_SNVS_TAMPER3__GPIO5_IO03 表示將該io復(fù)用為GPIO

  • 0x10b0 表示對(duì)PAD寄存器的配置值,具體含義為如下,之前的文章(驅(qū)動(dòng)開發(fā)4--點(diǎn)亮LED(寄存器版))介紹過。

在根節(jié)點(diǎn)下創(chuàng)建名為gpioled的LED節(jié)點(diǎn),內(nèi)容如下:

  • pinctrl-0 設(shè)置 LED所使用的PIN對(duì)應(yīng)的pinctrl節(jié)點(diǎn)

  • led-gpio 指定了LED所使用的GPIO,這里是GPIO5的IO03,低電平有效

3.2 檢查引腳是否使用沖突

因?yàn)槲业拈_發(fā)板使用的設(shè)備樹文件(imx6ull-myboard.dts)是從NXP官方提供的設(shè)備樹文件(imx6ull-14x14-evk.dts)上修改而來的,可能某些引腳的配置與自己的開發(fā)板不一樣,需要檢查一下是否有使用沖突。

本次添加的這個(gè)MX6ULL_PAD_SNVS_TAMPER3__GPIO5_IO03與文件中的其它引腳沒有出現(xiàn)沖突,因此無需修改。

3.3 修改LED驅(qū)動(dòng)文件

在上一篇的設(shè)備樹版的驅(qū)動(dòng)文件上進(jìn)行修改,主要修改內(nèi)容如下。

頭文件需要添加一個(gè):

設(shè)備結(jié)構(gòu)體改為gpio_led:

硬件初始化部分是主要修改的內(nèi)容,這次就不需要從設(shè)備樹讀取寄存器操作了,也不需要自己再進(jìn)行I/O內(nèi)存映射了,而實(shí)使用gpio子系統(tǒng)的API函數(shù)來對(duì)LED的GPIO進(jìn)行配置:

開關(guān)LED時(shí),也不需要再直接操作寄存器了,也是使用API函數(shù)來操作:


4 實(shí)驗(yàn)測(cè)試

4.1 編譯程序

  • 編譯設(shè)備樹文件(.dtb),和上篇設(shè)備樹點(diǎn)亮LED的實(shí)驗(yàn)一樣,先將設(shè)備樹文件復(fù)制到nfs文件系統(tǒng)位置,再從網(wǎng)絡(luò)啟動(dòng)開發(fā)板,串口中查看設(shè)備樹中是否有添加的gpioled節(jié)點(diǎn):

  • 編譯LED驅(qū)動(dòng)文件(.ko),復(fù)制到rootfs/lib/modules/4.1.15目錄中:

  • LED應(yīng)用程序不需要改,仍使用之前寄存器版點(diǎn)亮LED實(shí)驗(yàn)時(shí)使用的程序即可。

4.2 測(cè)試

測(cè)試方式與之前的一樣,都是先加載驅(qū)動(dòng)文件,然后調(diào)用應(yīng)用程序來控制LED的亮滅:

效果和之前的寄存器版點(diǎn)亮LED設(shè)備樹版點(diǎn)亮LED的效果一樣

5 總結(jié)

本篇介紹了使用Pinctrl子系統(tǒng)與GPIO子系統(tǒng)的方式來點(diǎn)亮LED,與之前的寄存器版點(diǎn)亮LED設(shè)備樹版點(diǎn)亮LED的最大區(qū)別在于不需要直接操作寄存器了,而是使用API函數(shù)來配置GPIO,具體操作寄存器在過程在API函數(shù)內(nèi)部實(shí)現(xiàn),我們無需在進(jìn)行繁瑣的寄存器操作。

本篇與上一篇的設(shè)備樹版點(diǎn)亮LED的程序編寫流程基本一致,因?yàn)槎际且褂?span id="s0sssss00s" class="md-pair-s " style="">設(shè)備樹,與上一篇的主要區(qū)別就在于,不需要將寄存器信息寫入設(shè)備樹,再從設(shè)備樹獲取出來手動(dòng)配置寄存器了。




【i.MX6ULL】驅(qū)動(dòng)開發(fā)6——Pinctrl子系統(tǒng)與GPIO子系統(tǒng)點(diǎn)亮LED的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
大名县| 竹北市| 浦东新区| 公主岭市| 九龙坡区| 金乡县| 县级市| 邳州市| 海口市| 藁城市| 青川县| 山阴县| 诸城市| 五家渠市| 廊坊市| 平南县| 正阳县| 方城县| 岱山县| 清流县| 洛宁县| 克山县| 松溪县| 合肥市| 梨树县| 旌德县| 乌审旗| 宜良县| 常州市| 双鸭山市| 星座| 遂平县| 湛江市| 怀柔区| 泰和县| 新河县| 安福县| 克什克腾旗| 夏津县| 抚州市| 曲阳县|