peter 发表于 2018-6-11 15:49:27

【fireflyRK3288/firefly RK3399开发板】GPIO控制

Python例子:
模块安装请参考:http://developer.t-firefly.com/thread-10503-1-2.html

android例子:
http://dev.t-firefly.com/forum.p ... =396&highlight=GPIO
fireflyRK3399驱动中调用GPIO:
http://www.t-firefly.com/doc/product/info/id/88.html



调试方法IO指令GPIO调试有一个很好用的工具,那就是IO指令,Firefly-RK3399的Android系统默认已经内置了IO指令,使用IO指令可以实时读取或写入每个IO口的状态,这里简单介绍IO指令的使用。 首先查看 io 指令的帮助:#io --help
Unknown option: ?
Raw memory i/o utility - $Revision: 1.5 $

io -v -1|2|4 -r|w [-l <len>] [-f <file>] <addr> [<value>]

   -v         Verbose, asks for confirmation
   -1|2|4   Sets memory access size in bytes (default byte)
   -l <len>   Length in bytes of area to access (defaults to
            one access, or whole file length)
   -r|w       Read from or Write to memory (default read)
   -f <file>File to write on memory read, or
            to read on memory write
   <addr>   The memory address to access
   <val>      The value to write (implies -w)

Examples:
   io 0x1000                  Reads one byte from 0x1000
   io 0x1000 0x12             Writes 0x12 to location 0x1000
   io -2 -l 8 0x1000          Reads 8 words from 0x1000
   io -r -f dmp -l 100 200    Reads 100 bytes from addr 200 to file
   io -w -f img 0x10000       Writes the whole of file to memory

Note access size (-1|2|4) does not apply to file based accesses.
从帮助上可以看出,如果要读或者写一个寄存器,可以用:io -4 -r 0x1000 //读从0x1000起的4位寄存器的值
io -4 -w 0x1000 //写从0x1000起的4位寄存器的值使用示例:
[*]查看GPIO1_B3引脚的复用情况
1. 从主控的datasheet查到GPIO1对应寄存器基地址为:0xff320000
2. 从主控的datasheet查到GPIO1B_IOMUX的偏移量为:0x00014
3. GPIO1_B3的iomux寄存器地址为:基址(Operational Base) + 偏移量(offset)=0xff320000+0x00014=0xff320014
4. 用以下指令查看GPIO1_B3的复用情况:
# io -4 -r 0xff320014ff320014:0000816a
5. 从datasheet查到:gpio1b3_sel
GPIO1B iomux select
2'b00: gpio
2'b01: i2c4sensor_sda
2'b10: reserved
2'b11: reserved
因此可以确定该GPIO被复用为 i2c4sensor_sda。
6. 如果想复用为GPIO,可以使用以下指令设置:
# io -4 -w 0xff320014 0x0000812a

GPIO调试接口Debugfs文件系统目的是为开发人员提供更多内核数据,方便调试。 这里GPIO的调试也可以用Debugfs文件系统,获得更多的内核信息。 GPIO在Debugfs文件系统中的接口为 /sys/kernel/debug/gpio,可以这样读取该接口的信息:# cat /sys/kernel/debug/gpio
GPIOs 0-31, platform/pinctrl, gpio0:
gpio-2   (                  |vcc3v3_3g         ) out hi   
gpio-4   (                  |bt_default_wake_host) inlo   
gpio-5   (                  |power               ) inhi   
gpio-9   (                  |bt_default_reset    ) out lo   
gpio-10(                  |reset               ) out lo   
gpio-13(                  |?                   ) out lo   

GPIOs 32-63, platform/pinctrl, gpio1:
gpio-32(                  |vcc5v0_host         ) out hi   
gpio-34(                  |int-n               ) inhi   
gpio-35(                  |vbus-5v             ) out lo   
gpio-45(                  |pmic-hold-gpio      ) out hi   
gpio-49(                  |vcc3v3_pcie         ) out hi   
gpio-54(                  |mpu6500             ) out hi   
gpio-56(                  |pmic-stby-gpio      ) out hi   

GPIOs 64-95, platform/pinctrl, gpio2:
gpio-83(                  |bt_default_rts      ) inhi   
gpio-90(                  |bt_default_wake   ) inlo   
gpio-91(                  |?                   ) out hi   

GPIOs 96-127, platform/pinctrl, gpio3:
gpio-111 (                  |mdio-reset          ) out hi   

GPIOs 128-159, platform/pinctrl, gpio4:
gpio-149 (                  |hp-con-gpio         ) out lo
从读取到的信息中可以知道,内核把GPIO当前的状态都列出来了,以GPIO0组为例,gpio-2(GPIO0_A2)作为3G模块的电源控制脚(vcc3v3_3g),输出高电平(out hi)。FAQsQ1: 如何将PIN的MUX值切换为一般的GPIO?A1: 当使用GPIO request时候,会将该PIN的MUX值强制切换为GPIO,所以使用该pin脚为GPIO功能的时候确保该pin脚没有被其他模块所使用。Q2: 为什么我用IO指令读出来的值都是0x00000000?A2: 如果用IO命令读某个GPIO的寄存器,读出来的值异常,如 0x00000000或0xffffffff等,请确认该GPIO的CLK是不是被关了,GPIO的CLK是由CRU控制,可以通过读取datasheet下面CRU_CLKGATE_CON* 寄存器来查到CLK是否开启,如果没有开启可以用io命令设置对应的寄存器,从而打开对应的CLK,打开CLK之后应该就可以读到正确的寄存器值了。Q3: 测量到PIN脚的电压不对应该怎么查?A3: 测量该PIN脚的电压不对时,如果排除了外部因素,可以确认下该pin所在的io电压源是否正确,以及IO-Domain配置是否正确。Q4: gpio_set_value()与gpio_direction_output()有什么区别?A4: 如果使用该GPIO时,不会动态的切换输入输出,建议在开始时就设置好GPIO 输出方向,后面拉高拉低时使用gpio_set_value()接口,而不建议使用gpio_direction_output(), 因为gpio_direction_output接口里面有mutex锁,对中断上下文调用会有错误异常,且相比 gpio_set_value,gpio_direction_output 所做事情更多,浪费。

页: [1]
查看完整版本: 【fireflyRK3288/firefly RK3399开发板】GPIO控制