精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是Pinctrl子系統與GPIO子系統?

Linux大陸 ? 來源:Linux大陸 ? 作者:ZhengN ? 2022-11-29 14:16 ? 次閱讀

前言

大家好,我是LinuxZn。

之前我們已經通過幾篇筆記來學習點燈了:

但之前的點燈實驗我們都得去跟一些寄存器打交道,如:

d4e193a0-6f98-11ed-8abf-dac502259ad0.png

我們要配置寄存器,肯定得去閱讀參考手冊查看相關的寄存器,如:

d5044210-6f98-11ed-8abf-dac502259ad0.png

和寄存器打交道是一件費時費力而收獲較小的事情,換句話說就是性價比太低了。

我們在學習STM32的時候,ST都會給我們提供各種各樣的庫,這些庫就是對寄存器操作的一些封裝,我們調用那些庫函數就可以間接地操控寄存器。

我們就基本不用去查參考手冊了,至少點個燈是不用去查手冊的。

這些寄存器相關的代碼一般都是芯片原廠的工程師給我們寫好了,我們只要拿來用就可以了。

同樣的,在嵌入式Linux開發中,像上面幾篇筆記中的那幾種led驅動方式(與寄存器打交道)基本上是用不上的,我們只是為了學習而學習。

Linux內核提供了pinctrl 和 gpio 子系統用于引腳的驅動,這樣我們可以避免與寄存器打交道。

認識pinctrl、gpio子系統

這兩個子系統是軟件上面的概念,屬于Linux內核的一部分。但最終要用起來,都是要與實際硬件掛鉤,比如:

d5111634-6f98-11ed-8abf-dac502259ad0.png

在前幾個led驅動實驗中我們知道我們要操控一個引腳,我們需要配置兩個模塊的寄存器:GPIO模塊及IOMUXC模塊。

IOMUXC模塊是用來配置引腳功能及一些引腳參數(引腳速率、上下拉等);GPIO模塊用于配置引腳的輸入輸出等。

其中,pinctrl子系統管理的是IOMUXC模塊;gpio子系統管理的是GPIO模塊。

下面簡單看一下這兩個子系統在設備樹代碼中的體現(以百問網的設備樹文件100ask_imx6ull-14x14.dts為例):

1、pinctrl子系統

d552898e-6f98-11ed-8abf-dac502259ad0.png

d56d8036-6f98-11ed-8abf-dac502259ad0.png

可以看到這里有兩個節點:iomuxc節點與iomuxc_snvs節點,它們都是用來描述IOMUXC模塊的。

其實這兩個節點是在imx6ull.dtsi文件中被創建的,這是NXP官方提供的。在 100ask_imx6ull-14x14.dts文件中向這兩個節點追加內容。

追加的內容就是實際引腳功能的配置及引腳參數信息配置,下面以一個led的控制引腳為例簡單分析一下:

d57a44e2-6f98-11ed-8abf-dac502259ad0.png

d58d26b6-6f98-11ed-8abf-dac502259ad0.png

這個宏中前三個值是寄存器的偏移地址,后兩個是寄存器的值,另一個寄存器的值就是設備樹文件里pinctrl_leds節點里的那個值,即:

d5ad6836-6f98-11ed-8abf-dac502259ad0.png

下面再進一步分析:

d5c7bf06-6f98-11ed-8abf-dac502259ad0.png

2、gpio子系統

d5e278aa-6f98-11ed-8abf-dac502259ad0.png

這里需要重點關注如下兩個屬性:

gpio-controller;#gpio-cells = <2>;

gpio-controller;表明這個節點是一個GPIO控制器,這個控制器下面有很多引腳。

#gpio-cells = <2>; 表示這個控制器下每一個引腳要用 2 個 32 位的數(cell)來描述,其中一個數(cell)用來表示引腳,另一個數(cell)用來表示有效電平或其它特性。如:

d5f91c22-6f98-11ed-8abf-dac502259ad0.png

至此,基于gpio子系統及pinctrl子系統的設備樹文件的代碼結構如下(圖片來自百問網):

d60b072a-6f98-11ed-8abf-dac502259ad0.png

對于pinctrl信息,有些芯片提供了生成工具。

(1)gpio子系統的API接口

設備樹用于描述設備相關的信息,而我們的驅動獲得設備信息之后也要使用一些API接口來操控設備。

gpio子系統已經幫我們屏蔽掉了寄存器相關的操作,并給我們提供了一些API接口,我們只要調用這些API接口就可以間接地操控相關寄存器。

其有兩套API接口:基于描述符的(descriptor-based)、老的(legacy)。如:

d61bf684-6f98-11ed-8abf-dac502259ad0.png

其中使用基于描述符的(descriptor-based)的接口需要包含頭文件linux/gpio/consumer.h:

d62d956a-6f98-11ed-8abf-dac502259ad0.png

使用老的(legacy)接口需要包含頭文件linux/gpio.h:

d648eb12-6f98-11ed-8abf-dac502259ad0.png

led驅動實驗

下面簡單看一些基于這兩個子系統的led驅動實驗(相關代碼來自百問網)。

1、設備樹文件

我們需要屏蔽掉百問開發板出廠自帶的設備樹文件(100ask_imx6ull-14x14.dts)中描述led設備相關的代碼,并添加如下內容:

(1)在設備樹文件中添加如下Pinctrl信息:

d6658e3e-6f98-11ed-8abf-dac502259ad0.png

(2)在設備樹文件根節點下添加如下led節點信息:

d675da6e-6f98-11ed-8abf-dac502259ad0.png

2、驅動核心代碼

(1)匹配

d6a18222-6f98-11ed-8abf-dac502259ad0.png

(2)probe函數

匹配成功則執行此函數從設備樹獲取設備信息:

d6cdf97e-6f98-11ed-8abf-dac502259ad0.png

(3)open函數

此函數設置引腳方向:

d6f07f4e-6f98-11ed-8abf-dac502259ad0.png

(4)write函數

此函數設置引腳輸出值:

d706fe18-6f98-11ed-8abf-dac502259ad0.png

3、應用代碼

#include
#include
#include
#include
#include
#include

/*
*./ledtest/dev/100ask_led0on
*./ledtest/dev/100ask_led0off
*/
intmain(intargc,char**argv)
{
intfd;
charstatus;

/*1.判斷參數*/
if(argc!=3)
{
printf("Usage:%s
",argv[0]);
return-1;
}

/*2.打開文件*/
fd=open(argv[1],O_RDWR);
if(fd==-1)
{
printf("cannotopenfile%s
",argv[1]);
return-1;
}

/*3.寫文件*/
if(0==strcmp(argv[2],"on"))
{
status=1;
write(fd,&status,1);
}
else
{
status=0;
write(fd,&status,1);
}

close(fd);

return0;
}

4、Makefile文件

d7255ade-6f98-11ed-8abf-dac502259ad0.png

5、驗證

編譯設備樹文件、以模塊的方式編譯驅動文件。并把編譯生成以下幾個文件上傳到板子里:

100ask_imx6ull-14x14.dtb

leddrv.ko

ledtest

這里我們使用百問網開發的100ask_imx6ull_flashing_tool工具來上傳,如

d7496190-6f98-11ed-8abf-dac502259ad0.png

也可以使用開發板掛載NFS來上傳這幾個文件,關于NFS可查看往期筆記:【Linux筆記】掛載網絡文件系統

100ask_imx6ull_flashing_tool工具默認把文件上傳到根目錄。我們需要手動把100ask_imx6ull-14x14.dtb文件拷貝到/boot目錄下并重啟。

測試結果如:

d77d0734-6f98-11ed-8abf-dac502259ad0.png

同時,led燈也對應著亮、滅。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5325

    瀏覽量

    120052
  • Linux
    +關注

    關注

    87

    文章

    11232

    瀏覽量

    208949
  • GPIO
    +關注

    關注

    16

    文章

    1196

    瀏覽量

    51934

原文標題:什么是Pinctrl子系統與GPIO子系統?

文章出處:【微信號:Linux大陸,微信公眾號:Linux大陸】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    一文搞懂Linux pinctrl/gpio子系統

    GPIO的寄存器操作。分享給剛剛接觸外設bsp的小伙伴們。當然后面有時間還會分享GPIO子系統框架和pinctrl子系統框架,先知道黑盒怎么
    發表于 06-09 09:52 ?2629次閱讀

    飛凌嵌入式ElfBoard ELF 1板卡-應用編程示例控制LED燈之sysfs文件系統

    上下拉即可。也可以通過Linux中的pinctrl子系統GPIO子系統,通過配置引腳和系統提供的API進行控制。 而Linux
    發表于 10-18 09:31

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-應用編程示例控制LED燈之sysfs文件系統

    上下拉即可。也可以通過Linux中的pinctrl子系統GPIO子系統,通過配置引腳和系統提供的API進行控制。而Linux
    發表于 10-21 09:52

    「正點原子Linux連載」第四十五章 pinctrlgpio子系統實驗(二)

    =5};第4行,test設備所使用的gpio。關于pinctrl子系統gpio子系統就講解到這里,接下來就使用
    發表于 03-19 14:59

    28byj48步進電機參數耐壓

    28byj48步進電機參數耐壓,17、28BYJ-48 電機驅動什么,學完了pinctrl子系統GPIO子系統還只會點燈?今天就來個高級點的點燈這個電機驅動程序說白了就是 點燈1、2
    發表于 07-09 06:02

    基于GPIO子系統的LED驅動程序分享

    Pinctrl 子系統把引腳的復用、配置抽出來,做成 Pinctrl 子系統,給 GPIO、I2C 等模塊使用。讓我們在使用某個引腳功能時不
    發表于 12-16 07:16

    怎樣去使用linux下的pintcrl和gpio子系統

    pinctrlgpio內部的原理是如何實現的?怎樣去使用linux下的pintcrl和gpio子系統呢?
    發表于 03-07 13:38

    RK3399開發板的pinctrlgpio子系統相關資料介紹

    1、RK3399—pinctrlgpio子系統  記得以前在學習51單片機時,要控制一個GPIO輸出高、低電平,就得根據對應IO寄存器每一bit的作用和含義進行配置,時鐘、速率、方向
    發表于 09-16 17:27

    gpiopinctrl子系統的關系與區別

    gpiopinctrl 子系統在內核里的使用率非常高,和嵌入式產品的關聯非常大。從這兩個子系統開始學習驅動開發是個不錯的入門選擇。
    的頭像 發表于 03-15 11:40 ?4852次閱讀

    嵌入式驅動開發兩大子系統的使用

    本文的關注點是 gpio driver --> gpio subsystem core -> gpio consumer 這一路徑,讀者如果想更深入地了解 pinctrl
    的頭像 發表于 03-15 13:41 ?1773次閱讀

    【i.MX6ULL】驅動開發6——GPIO子系統點亮LED

    本篇介紹了使用**Pinctrl子系統GPIO子系統**的方式來點亮LED,與之前的寄存器版點亮LED與設備樹版點亮LED的最大區別在于不需要直接操作寄存器了,而是使用API函數來配
    的頭像 發表于 05-21 21:50 ?3150次閱讀
    【i.MX6ULL】驅動開發6——<b class='flag-5'>GPIO</b><b class='flag-5'>子系統</b>點亮LED

    使用pinctrlgpio子系統實現LED燈驅動

    前邊已經學了兩種點燈,本質依然還是通過配置寄存器;在學習STM32的時候除了學習配置一下寄存器,基本都是使用庫來開發,那么在i.MX6ULL還使用寄存器開發明顯是不太適合,那么i.MX6ULL有更方便的開發呢,這篇就來學習一下使用 pinctrlgpio
    的頭像 發表于 04-03 10:17 ?1296次閱讀

    RK3568pinctrlgpio 子系統詳解

    如果 pinctrl 子系統將 PIN 復用為 GPIO,那么接下來就要配置 gpio 子系統,且 gp
    的頭像 發表于 12-20 10:22 ?2733次閱讀
    RK3568<b class='flag-5'>pinctrl</b> 和 <b class='flag-5'>gpio</b> <b class='flag-5'>子系統</b>詳解

    gpio子系統API詳解

    gpio 子系統 API gpio 子系統中操作一個 GPIO 需要如下幾步: 1、of_find_compatible_node2、of_
    的頭像 發表于 09-27 17:17 ?762次閱讀
    <b class='flag-5'>gpio</b><b class='flag-5'>子系統</b>API詳解

    瑞芯微RK3568-iomuxc和pinctrl子系統初窺

    pinctrl子系統作用:從設備樹中獲取PIN的描述信息來設置PIN的復用和電氣屬性,PIN可復用為I2C、SPI、GPIOgpio子系統
    發表于 12-20 10:10 ?54次下載