RK3326 RK3399 GPIO寄存器操作筆記



title: RK3326 RK3399 GPIO寄存器操作指南
created: '2019-04-29T09:43:30.622Z'
modified: '2019-05-30T02:18:42.676Z'

RK3326 RK3399 GPIO寄存器操作指南

參考資料
http://wiki.t-firefly.com/zh_CN/Firefly-RK3399/driver_gpio.html
Rockchip+RK3399TRM+V1.1+Part2+20160728.pdf
Rockchip GPIO常見問題.pdf

基本環境

RK3326 小板
8pin引出接口中的GPIO0_B3(實際為GPIO1_C2)
RK3326 EVB開發板
RK3399 EVB開發板
Linux與Android系統都適用

FAE給的操作步驟

  1. IOMUX復用為GPIO
  2. GPIO設置為輸出
  3. 設置GPIO高低
  4. 補充,事實上還漏了一個重要一部,要先設置時鍾,否則前面的設置都不生效

RK3326寄存器手冊查詢

參考寄存器手冊Address Maping部分
GRF基地址為0xFF140000
GPIO1基地址為0xFF250000
DDR(方向寄存器)偏移地址0x04, 所以寄存器地址為0xFF250004
DR(設置高低電平)偏移地址為0x00, 所以寄存器地址為0xFF250000
GRF_GPIO1C_IOMUX_L 偏移地址為0x10, 所以IOMUX地址為0xFF140010
GPIO1_C2對應的位為bit19

RK3326 GPIO1_C2 設置實驗

讀取GPIO1_C2的值(DR)
io -4 -l 4 0xFF250000
輸出
ff250000: 00000000
bit19 為0, 測得電壓為0.26V
寫入bit19 為 1
io -4 -w 0xff250000 0x00040000
回讀正常,測得電壓為3V
方向寄存器
io -4 -l 4 0xFF2500004
輸出
ff250004: 00040000

IOMUX寄存器
io -4 -l 4 0xFF140010
輸出
ff140010: 00000011
根據寄存器手冊P104可知, bit11:8為0, gpio1_c2為gpio功能

RK3326 WAKE_UP設置實驗(對應GPIO1_C3, 對應bit20)

有前面可知,IOMUX已經設置為GPIO
設置方向寄存器(DR)為輸出
io -4 -w 0xff250004 0x000C0000
設置為高電平
io -4 -w 0xff250000 0x000C0000
回讀
io -4 -l 4 0xFF250000
返回:
ff250000: 000c0000
萬用表測得為3V, 同理,設置為低電平,萬用表測得為0.027V,實驗成功!

RK3326 MAV022 GPIO驅動分析

內核文件節點
/sys/class/leds/call_answer_led/brightness
echo 255 > /sys/class/leds/call_answer_led/brightness (高電平)
echo 0 > /sys/class/leds/call_answer_led/brightness(低電平)
原先的驅動設計是具有pwm功能的,這里我借用了這個接口,沒有pwm功能,只有高低電平
DTS中的位置
rk3326-mav022-v10.dts
關鍵字
搜索RK_PC2或者gpio-leds
驅動不用修改,只需要修改DTS中兩處即可,移植到開發板GPIO3_C2也可行

RK3326 EVB GPIO寄存器控制

選定開發板D12-GPIO3-C0作為控制腳,對應的bit = (C-A)*8 + 0 = 16
對應位設為1, 0x00010000, 設為0, 0x00000000
設置DDR方向寄存器
io -4 -w 0xFF270004 0x00050000
設置輸出為低電平
io -4 -w 0xFF270000 0x00000000
LED燈亮
設置輸出為高電平
io -4 -w 0xFF270000 0x00010000
LED燈滅

這一步一開始實驗一直控制無效,后來參考文檔《Rockchip GPIO常見問題.pdf》,發現是CLK沒有設置造成的,前面的實驗之所以成功,應該是在DTS里配置了相應的管腳,CLK在驅動里已經打開,而DTS沒有配置的管腳,CLK默認是關閉的

查詢clk
cat /sys/kernel/debug/clk/clk_summary |grep gpio
GPIO3果然為0
使能GPIO3 ClK
echo 1 > /sys/kernel/debug/clk/pclk_gpio3/clk_enable_count

RK3399 EVB GPIO2_B2, GPIO2_B3測試

首先根據RK3326經驗查詢CLK
cat /sys/kernel/debug/clk/clk_summary |grep gpio

gpio2為0, 寫入1
echo 1 > /sys/kernel/debug/clk/pclk_gpio2/clk_enable_count
GPIO2_B2 bit位為(B-A)8 + 2 = 10
GPIO3_B3 bit位為(B-A)
8 + 3 = 11

測試DDR寄存器
io -4 -r 0xff780004
返回
807f1

讀取DR寄存器
io -4 -r 0xff780004
返回
0x3f0

開始GPIO控制
測試GPIO2_B2
寫入GPIO2_B2位低電平
io -4 -w 0xff780000 0x7f0
紅燈亮,設置生效
測試GPIO2_B3
寫入GPIO2_B3為輸出
io -4 -w 0xff780004 0x80ff1
GPIO2_B3輸出為低
io -4 -w 0xff780000 0xff0
發現不生效,查詢IOMUX寄存器
io -4 -r 0xff77e004
返回
0x00c0

查詢寄存器文檔可知bit7:6為11, gpio2_b3沒有設為gpio
設置iomux為gpio
io -4 -w 0xff7e004 0x0000
設置無效,可能是被驅動限制了

測試GPIO2_B1
bit位為(B-A)*8 + 1 = 9
由前面可知,DDR應該已經是輸出
直接設置DR
io -4 -w 0xff780000 0x5f0
設置成功,黃燈亮!

另外一種用GPIO Debug接口控制的方法

參考[https://blog.csdn.net/kris_fei/article/details/69553422]
原作者是在Android6.0下實驗的,經測試Android8.1下一樣可以使用
以GPIO2_B2為例

  1. 查看GPIO2_B2的gpio number
1. rk3399:/sys/kernel/debug # cat gpio                                       
   GPIOs 0-31, platform/pinctrl, gpio0:
    gpio-1   (                    |vcc_sd              ) out lo    
    gpio-4   (                    |bt_default_wake_host) in  lo    
    gpio-5   (                    |power               ) in  hi    
    gpio-9   (                    |bt_default_reset    ) out lo    
    gpio-10  (                    |reset               ) out hi    

GPIOs 32-63, platform/pinctrl, gpio1:
 gpio-34  (                    |int-n               ) in  hi    
 gpio-35  (                    |camsys_gpio         ) out hi    
 gpio-45  (                    |enable              ) out hi    
 gpio-46  (                    |vsel                ) out lo    
 gpio-49  (                    |vsel                ) out lo    
 gpio-54  (                    |mpu6500             ) in  lo    

GPIOs 64-95, platform/pinctrl, gpio2:
 gpio-64  (                    |vbus-5v             ) out lo    
 gpio-69  (                    |power33             ) out hi    
 gpio-70  (                    |power               ) out hi    
 gpio-71  (                    |reset               ) out hi    
 gpio-72  (                    |stanby              ) out hi    
 gpio-73  (                    |power18             ) out hi    
 gpio-74  (                    |sysfs               ) out lo    
 gpio-76  (                    |int                 ) in  hi    
 gpio-83  (                    |bt_default_rts      ) in  hi    
 gpio-90  (                    |bt_default_wake     ) in  lo

可知GPIO2_B2的number 為GPIO74

  1. 導出為GPIO
rk3399:/sys/class/gpio # echo 74 > export                                 
1|rk3399:/sys/class/gpio # ls
export gpiochip0   gpiochip32 gpiochip96 
gpio74 gpiochip128 gpiochip64 unexport   
rk3399:/sys/class/gpio # 
  1. 設置輸出高低電平

    rk3399:/sys/class/gpio/gpio74 # ls
    active_low device direction edge power subsystem uevent value 
    rk3399:/sys/class/gpio/gpio74 # echo 1 > value                            
    rk3399:/sys/class/gpio/gpio74 # echo 0 > value                            
    rk3399:/sys/class/gpio/gpio74 # 
    

但同樣的方法GPIO73不能導出,看來這種方法還是有些局限


免責聲明!

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



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