用戶空間通過sysfs操作GPIO & GPIO引腳編號計算


 

 

 

 

GPIO信息

 

 

RK3399 有 5 組 GPIO bank

  GPIO0 ~ GPIO4

 

每組又以 A0~A7, B0~B7, C0~C7, D0~D7 作為編號區分

  不是所有 bank 都有全部編號,例如 GPIO4 就只有 C0~C7, D0~D2

 

所有的 GPIO 在上電后的初始狀態都是輸入模式,可以通過軟件設為上拉或下拉,也可以設置為中斷腳,驅動強度都是可編程的

 

 

 

 

GPIO引腳編號計算

  GPIO2_D3:64 + 24 + 3 = 91

  GPIO1_A3:30 + 0 + 3 = 35

 

  GPIO2_A2:64 + 0 + 2 = 66

  GPIO2_A3:64 + 0 + 3 = 67

  GPIO2_A5:64 + 0 + 5 = 69

 

  https://cdn.modb.pro/db/88436

 

 

編程示例

1.導出控制的GPIO引腳編號
    echo 22 > /sys/class/gpio/export
    
/*
 *    in           輸入
 *    out          輸出
 *    high, low    high/low同時設置方向為輸出
 */ 
2.設置GPIO方向(out表示輸出,in表示輸入)
    echo out > /sys/class/gpio/gpio22/direction
        
/*
 * none            引腳為輸入,不是中斷引腳
 * rising          引腳為中斷輸入,上升沿觸發
 * falling         引腳為中斷輸入,下降沿觸發
 * both            引腳為中斷輸入,邊沿觸發
 */
3.設置GPIO中斷觸發方式
    echo none > /sys/class/gpio/gpio22/edge

4.設置GPIO輸出電平(1表示高電平,0表示低電平)
    echo 1 > /sys/class/gpio/gpio22/value

5.取消導出        
    echo 22 > sys/class/gpio/unexport    
    
    
示例
    用戶空間通過sysfs控制GPIO
        # echo 9 > /sys/class/gpio/export        // 執行此命令會在gpio/下生成gpio9目錄
        # echo out > gpio9/direction              // 設置GPIO9方向為輸出
        # echo 1 > gpio9/value                     // 設置GPIO9為高電平
        # echo 0 > gpio9/value                     // 設置GPIO9為低電平
        # echo 9 > /sys/class/gpio/unexport       // 關閉對GPIO9的控制

    
https:
//www.cnblogs.com/hellokitty2/p/10535903.html https://www.cnblogs.com/dakewei/p/12810536.html

 

 1 /*
 2  * GPIO初始化(GPIO描述符,GPIO引腳編號, GPIO方向) 
 3  */
 4 #define init_gpio(fd, a, direction) \
 5 {    \
 6     if(-1 == (fd = open("/sys/class/gpio/unexport", 1))) dbge();    \
 7     if(2 != write(fd, #a, 2)) dbge();     \
 8     close(fd); \
 9      \
10     if(-1 == (fd = open("/sys/class/gpio/export", 1))) dbge();        \
11     if(2 != write(fd, #a, 2)) dbge();     \
12     close(fd);     \
13     \
14     if(-1 == (fd = open("/sys/class/gpio/gpio"#a"/direction", 1))) dbge();      \
15     if(sizeof(#direction) != write(fd, #direction, sizeof(#direction))) dbge();     \
16     close(fd);      \
17     \
18     if(-1 == (fd = open("/sys/class/gpio/gpio"#a"/edge", 1))) dbge();      \
19     if(4 != write(fd, "none", 4)) dbge();     \
20     close(fd);      \
21     \
22     if(-1 == (fd = open("/sys/class/gpio/gpio"#a"/value", 2))) dbge();      \
23 } 
24 
25 
26 int fd;
27 init_gpio(fd, 66, in); 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM