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位寄存器的值
复制代码使用示例: 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查到[7:6]: - gpio1b3_sel
- GPIO1B[3] 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) in lo
- gpio-5 ( |power ) in hi
- 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 ) in hi
- 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 ) in hi
- gpio-90 ( |bt_default_wake ) in lo
- 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 所做事情更多,浪费。
|