====== GPIO @ Core-3568J======
===== Reference =====
- [[https://wiki.t-firefly.com/Core-3568J/driver_gpio.html|GPIO 使用]]
- [[https://wiki.t-firefly.com/zh_CN/Firefly-Linux-Guide/development_kernel.html|Kernel 开发-GPIO 配置与使用]]
===== - LEDS =====
^ No | Name ^ GPIO ^ pin ^ out ^
^ 1 | WORK_LED/LED1 | GPIO0_C0 | 16 | ✔ |
^ 2 | USER_LED/LED2 | GPIO0_C4 | 20 | ✔ |
^ 3 | FANS | GPIO1_A4 | 36 | |
^ 4 | BACKLIGHT | GPIO0_C3 | 19 | |
* number = group * 8 + X = 3 * 8 + 5 = 29 \\
* pin = bank*32 + number= 4 * 32 + 29 = 157 \\
==== - 用户状态使用LED ====
LED1 @ pin 16 :
echo 16 > /sys/class/gpio/export # 申请 GPIO
cat /sys/class/gpio/gpio16/direction # 查看默认引脚方向
echo out > /sys/class/gpio/gpio16/direction # 配置成输出方向
echo 1 > /sys/class/gpio/gpio16/value # 输出高电平为点亮LED
echo 0 > /sys/class/gpio/gpio16/value # 输出低电平为熄灭 LED
LED2 @ pin 20 :
echo 20 > /sys/class/gpio/export # 申请 GPIO
cat /sys/class/gpio/gpio20/direction # 查看默认引脚方向
echo out > /sys/class/gpio/gpio20/direction # 配置成输出方向
echo 1 > /sys/class/gpio/gpio20/value # 输出高电平为熄灭LED
echo 0 > /sys/class/gpio/gpio20/value # 输出低电平为点亮 LED
==== - 设备树使用 GPIO ====
-
===== - KEYS =====
^ Key ^ GPIO ^ PIN ^ in ^ out ^
^ 1 | GPIO3_C3 | 115 | ✔ | |
^ 2 | GPIO3_C4 | 116 | ✔ | ✔ |
^ 3 | GPIO4_D2 | 154 | ✔ | ✔ |
^ 4 | GPIO3_C2 | 114 | ✔ | |
^ 5 | GPIO3_B5 | 109 | |
* number = group * 8 + X = 3 * 8 + 5 = 29 \\
* pin = bank*32 + number= 4 * 32 + 29 = 157 \\
==== - 用户状态使用KEYS ====
=== - 直接查询按键状态 ===
echo 115 > /sys/class/gpio/export
echo 116 > /sys/class/gpio/export
echo 154 > /sys/class/gpio/export
echo 114 > /sys/class/gpio/export
echo 109 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio109/direction
echo in > /sys/class/gpio/gpio114/direction
echo in > /sys/class/gpio/gpio115/direction
echo in > /sys/class/gpio/gpio116/direction
echo in > /sys/class/gpio/gpio154/direction
cat /sys/class/gpio/gpio109/value # 读KEY状态, 0 按下 1 释放
cat /sys/class/gpio/gpio114/value
cat /sys/class/gpio/gpio115/value
cat /sys/class/gpio/gpio116/value
cat /sys/class/gpio/gpio154/value
=== - 中断方式接收按键状态 ===
== - 初始化 ==
#!/bin/bash
pins=(115 116 154 114 109)
for pin in ${pins[@]}; do
echo ${pin} > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio${pin}/direction
echo falling > /sys/class/gpio/gpio${pin}/edge
done
# Pullup
# GPIO3_C2 GPIO3_C3 GPIO3_C4
io -4 -w 0xfdc600a8 0x03F00150
# GPIO3_D2
io -4 -w 0xfdc600bc 0x00300010
# GPIO3_B5
io -4 -w 0xfdc600a4 0x0c000400
== - 中断检测 ==
===== - io指令直接读写寄存器 =====
==== - io指令 ====
io -v -1|2|4 -r|w [-l ] [-f ] []
-v Verbose, asks for confirmation
-1|2|4 Sets memory access size in bytes (default byte)
-l 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 to write on memory read, or
to read on memory write
The memory address to access
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.
==== - 基本指令 ====
# Read 4 bytes (32bits)
io -4 -r 0xfdcb0010
# Write 4 bytes (32bits)
io -4 -w 0xfdcb0010 0xffff0055
==== - 寄存器地址 ====
RK3568的寄存器可以通过芯片的TRM手册进行查询。
寄存器的地址是由 Operational Base + offset组成
寄存器的基地址在TRM的Address Mapping章节中描述(《RKRK3568 TRM-Part1》 p.11)
^ Module ^ Start Address ^ Size ^ Module ^ Start Address ^ Size ^
| PCIe3x2_S | 0xF0000000 | 32MB | Reserved | 0xFE290000 | 64KB |
| PCIe3x1_S | 0xF2000000 | 32MB | GMAC0 | 0xFE2A0000 | 64KB |
| PCIe2x1_S | 0xF4000000 | 32MB | SDMMC0 | 0xFE2B0000 | 64KB |
| PCIe3x2_DBI | 0xF6000000 | 4MB | SDMMC1 | 0xFE2C0000 | 64KB |
| PCIe3x1_DBI | 0xF6400000 | 4MB | Reserved | 0xFE2D0000 | 192KB |
| PCIe2x1_DBI | 0xF6800000 | 4MB | FSPI | 0xFE300000 | 64KB |
| Reserved | 0xF6C000008 | 4MB | EMMC | 0xFE310000 | 64KB |
| SATA0 | 0xFC000000 | 4MB | Reserved | 0xFE320000 | 64KB |
| SATA1 | 0xFC400000 | 4MB | NANDC | 0xFE330000 | 64KB |
| SATAx2 | 0xFC800000 | 4MB | Reserved | 0xFE340000 | 128KB |
| USB3_0 | 0xFCC00000 | 4MB | KEYLADDER_S | 0xFE360000 | 64KB |
| USB3_1 | 0xFD000000 | 4MB | TRNG_S | 0xFE370000 | 64KB |
| GIC600 | 0xFD400000 | 4MB | CRYPTO_NS | 0xFE380000 | 32KB |
| USB20HOST0 | 0xFD800000 | 512KB | TRNG_NS | 0xFE388000 | 16KB |
| USB20HOST1 | 0xFD880000 | 512KB | OTP_NS | 0xFE38C000 | 16KB |
| DAPLITE | 0xFD900000 | 512KB | Reserved | 0xFE390000 | 64KB |
| Rreserved | 0xFD980000 | 512KB | OTP_S | 0xFE3A0000 | 32KB |
| QSGMII_PCS | 0xFDA00000 | 2MB | DCF_S | 0xFE3A8000 | 32KB |
| PMU_SGRF | 0xFDC00000 | 64KB | Reserved | 0xFE3B0000 | 32KB |
| Reserved | 0xFDC10000 | 64KB | KEY_READER | 0xFE3B8000 | 32KB |
| PMU_GRF | 0xFDC20000 | 64KB | WDT_S | 0xFE3C0000 | 64KB |
| CPU_GRF | 0xFDC30000 | 64KB | SEC_TRNG_CHK | 0xFE3D0000 | 64KB |
| DDR_GRF | 0xFDC40000 | 64KB | JBG_USR | 0xFE3E0000 | 64KB |
| PIPE_GRF | 0xFDC50000 | 64KB | JBG_OTP | 0xFE3F0000 | 64KB |
| SYS_GRF | 0xFDC60000 | 64KB | I2S0_8CH | 0xFE400000 | 64KB |
| PIPE_PHY_GRF0 | 0xFDC70000 | 64KB | I2S1_8CH | 0xFE410000 | 64KB |
| PIPE_PHY_GRF1 | 0xFDC80000 | 64KB | I2S2_2CH | 0xFE420000 | 64KB |
| PIPE_PHY_GRF2 | 0xFDC90000 | 64KB | I2S3_2CH | 0xFE430000 | 64KB |
| USBPHY_U3_GRF | 0xFDCA0000 | 32KB | PDM | 0xFE440000 | 64KB |
| USBPHY_U2_GRF | 0xFDCA8000 | 32KB | VAD | 0xFE450000 | 64KB |
| EDP_PHY_GRF | 0xFDCB0000 | 32KB | SPDIF_8CH | 0xFE460000 | 64KB |
| PCIE30_PHY_GRF | 0xFDCB8000 | 32KB | AUDPWM | 0xFE470000 | 32KB |
| SYSTEM_SRAM(64K) | 0xFDCC0000 | 64KB | DIG_ACODEC | 0xFE478000 | 32KB |
| PMU_MEM | 0xFDCD0000 | 128KB | SDMMC_BUF | 0xFE480000 | 64KB |
| USB_GRF | 0xFDCF0000 | 64KB | Reserved | 0xFE490000 | 448KB |
| PMU_CRU | 0xFDD00000 | 64KB | Reserved | 0xFE500000 | 64KB |
| CRU_S | 0xFDD10000 | 32KB | DMAC0_S | 0xFE510000 | 64KB |
| SYS_SGRF | 0xFDD18000 | 16KB | Reserved | 0xFE520000 | 64KB |
| Stimer | 0xFDD1C000 | 16KB | DMAC0_NS | 0xFE530000 | 64KB |
| CRU_NS | 0xFDD20000 | 64KB | DMAC1_S | 0xFE540000 | 64KB |
| PMU_CRU_S | 0xFDD30000 | 64KB | DMAC1_NS | 0xFE550000 | 64KB |
| I2C0 | 0xFDD40000 | 64KB | SCR | 0xFE560000 | 64KB |
| UART0 | 0xFDD50000 | 64KB | CAN0 | 0xFE570000 | 64KB |
| GPIO0 | 0xFDD60000 | 64KB | CAN1 | 0xFE580000 | 64KB |
| PWM0 | 0xFDD70000 | 64KB | CAN2 | 0xFE590000 | 64KB |
| PVTM_PMU | 0xFDD80000 | 64KB | I2C1 | 0xFE5A0000 | 64KB |
| PMU_NS | 0xFDD90000 | 64KB | I2C2 | 0xFE5B0000 | 64KB |
| Reserved | 0xFDDA0000 | 128KB | I2C3 | 0xFE5C0000 | 64KB |
| DDR_SCRAMB_LE_KEY | 0xFDDC0000 | 32KB | I2C4 | 0xFE5D0000 | 64KB |
| OSC_CHK | 0xFDDC8000 | 32KB | I2C5 | 0xFE5E0000 | 64KB |
| Reserved | 0xFDDD0000 | 192KB | TIMER_NS | 0xFE5F0000 | 64KB |
| PVTM_CORE | 0xFDE00000 | 64KB | WDT_NS | 0xFE600000 | 64KB |
| Reserved | 0xFDE10000 | 128KB | SPI0 | 0xFE610000 | 64KB |
| GIC600 | 0xFDE30000 | 0KB | SPI1 | 0xFE620000 | 64KB |
| SPINLOCK | 0xFDE30000 | 64KB | SPI2 | 0xFE630000 | 64KB |
| NPU | 0xFDE40000 | 128KB | SPI3 | 0xFE640000 | 64KB |
| MALIG52 | 0xFDE60000 | 128KB | UART1 | 0xFE650000 | 64KB |
| PVTM_GPU | 0xFDE80000 | 64KB | UART2 | 0xFE660000 | 64KB |
| PVTM_NPU | 0xFDE90000 | 64KB | UART3 | 0xFE670000 | 64KB |
| VDPU | 0xFDEA0000 | 64KB | UART4 | 0xFE680000 | 64KB |
| RGA | 0xFDEB0000 | 64KB | UART5 | 0xFE690000 | 64KB |
| EBC | 0xFDEC0000 | 64KB | UART6 | 0xFE6A0000 | 64KB |
| JPEG_DEC | 0xFDED0000 | 64KB | UART7 | 0xFE6B0000 | 64KB |
| JPEG_ENC | 0xFDEE0000 | 64KB | UART8 | 0xFE6C0000 | 64KB |
| IEP | 0xFDEF0000 | 64KB | UART9 | 0xFE6D0000 | 64KB |
| Eink | 0xFDF00000 | 128KB | PWM1 | 0xFE6E0000 | 64KB |
| Reserved | 0xFDF20000 | 128KB | PWM2 | 0xFE6F0000 | 64KB |
| RKVENC | 0xFDF40000 | 128KB | PWM3 | 0xFE700000 | 64KB |
| Reserved | 0xFDF60000 | 128KB | TSADC | 0xFE710000 | 64KB |
| RKVDEC | 0xFDF80000 | 128KB | SARADC | 0xFE720000 | 64KB |
| CSI_RX_CTRL0 | 0xFDFA0000 | 64KB | Reserved | 0xFE730000 | 64KB |
| CSI_RX_CTRL1 | 0xFDFB0000 | 64KB | GPIO1 | 0xFE740000 | 64KB |
| Reserved | 0xFDFC0000 | 64KB | GPIO2 | 0xFE750000 | 64KB |
| VICAP0 | 0xFDFD0000 | 64KB | GPIO3 | 0xFE760000 | 64KB |
| VICAP1 | 0xFDFE0000 | 64KB | GPIO4 | 0xFE770000 | 64KB |
| ISP | 0xFDFF0000 | 64KB | Mailbox | 0xFE780000 | 64KB |
| SDMMC2 | 0xFE000000 | 64KB | MCU_INTC | 0xFE790000 | 64KB |
| GMAC1 | 0xFE010000 | 64KB | Reserved | 0xFE7A0000 | 384KB |
| Reserved | 0xFE020000 | 128KB | DDR_PHY | 0xFE800000 | 64KB |
| VOP | 0xFE040000 | 64KB | Reserved | 0xFE810000 | 64KB |
| HDCP_AHB | 0xFE050000 | 64KB | PIPE_PHY0 | 0xFE820000 | 64KB |
| DSITX0 | 0xFE060000 | 64KB | PIPE_PHY1 | 0xFE830000 | 64KB |
| DSITX1 | 0xFE070000 | 64KB | PIPE_PHY2 | 0xFE840000 | 64KB |
| HDCP_APB | 0xFE080000 | 128KB | DSI_TX_PHY0 | 0xFE850000 | 64KB |
| HDMI | 0xFE0A0000 | 128KB | DSI_TX_PHY1 | 0xFE860000 | 64KB |
| eDP | 0xFE0C0000 | 64KB | CSI_RX_PHY | 0xFE870000 | 64KB |
| HDCP_KEY | 0xFE0D0000 | 64KB | OTP_PHY | 0xFE880000 | 64KB |
| Reserved | 0xFE0E0000 | 128KB | CPU_BOOST | 0xFE890000 | 64KB |
| Reserved | 0xFE100000 | 1024KB | USB2PHY_U3OTG | 0xFE8A0000 | 64KB |
| FIREWALL_DDR | 0xFE200000 | 64KB | USB2PHY_U2HOST | 0xFE8B0000 | 64KB |
| Reserved | 0xFE210000 | 64KB | PCIE30_PHY | 0xFE8C0000 | 128KB |
| DMA2DDR | 0xFE220000 | 64KB | PCIe2x1_S | 0x300000000 | 1024MB |
| DFIMON | 0xFE230000 | 64KB | PCIe3x1_S | 0x340000000 | 1024MB |
| DFICTRL | 0xFE240000 | 64KB | PCIe3x2_S | 0x380000000 | 1024MB |
| UPCTL2 | 0xFE250000 | 64KB | PCIe2x1_DBI | 0x3C0000000 | 4MB |
| PCIe2x1_APB | 0xFE260000 | 64KB | PCIe3x1_DBI | 0x3C0400000 | 4MB |
| PCIe3x1_APB | 0xFE270000 | 64KB | PCIe3x2_DBI | 0x3C0800000 | 4MB |
==== - LEDs 的IO配置 ====
^ LED ^ GPIO ^ Base Address ^ GPIO IOMUX control ^
| 1 | GPIO0_C0 | PMU_GRF:0xFDC20000 | PMU_GRF_GPIO0C_IOMUX_L(0x0010) \\ PMU_GRF_GPIO0C_IOMUX_H(0x0014) |
| 2 | GPIO0_C4 | ::: | ::: |
# Check pin function
io -4 0xfdc20010
io -4 0xfdc20014
# Set pin function: GPIO
io -4 -w 0xfdc20010 0x00070000
io -4 -w 0xfdc20014 0x00070000
==== - KEYs 的IO配置 ====
^ KEY ^ GPIO ^ Base Address ^ GPIO IOMUX control ^ GPIO PU/PD control ^ Open drain |
| 1 | GPIO3_C3 | SYS_GRF:0xFDC60000 | GRF_GPIO3C_IOMUX_L(0x0050) \\ GRF_GPIO3C_IOMUX_H(0x0054) | GRF_GPIO3C_P(0x00A8) | GRF_GPIO3C_OPD(0x0128) |
| 2 | GPIO3_C4 | ::: | ::: | ::: | ::: |
| 4 | GPIO3_C2 | ::: | ::: | ::: | ::: |
| 3 | GPIO4_D2 | ::: | GRF_GPIO4D_IOMUX_L(0x0078) | GRF_GPIO4D_P(0x00BC) | GRF_GPIO4D_OPD(0x013C) |
| 5 | GPIO3_B5 | ::: | GRF_GPIO3B_IOMUX_H(0x004C) | GRF_GPIO3B_P(0x00A4) | GRF_GPIO3B_OPD(0x0124) |
# Check pin function
io -4 0xfdc60050
io -4 0xfdc60054
io -4 0xfdc60078
io -4 0xfdc6004C
# Set pin function: GPIO
# GPIO3_C2 GPIO3_C3
io -4 -w 0xfdc60050 0x77000000
# GPIO3_C4
io -4 -w 0xfdc20054 0x00070000
# GPIO4_D2
io -4 -w 0xfdc20078 0x07000000
# GPIO3_B5
io -4 -w 0xfdc2004C 0x00700000
# Pullup
# GPIO3_C2 GPIO3_C3 GPIO3_C4
io -4 -w 0xfdc600a8 0x03F00150
# GPIO3_D2
io -4 -w 0xfdc600bc 0x00300010
# GPIO3_B5
io -4 -w 0xfdc600a4 0x0c000400
==== - GPIO调试 ====
^ Module ^ Start Address ^
| GPIO0 | 0xFDD60000 |
| GPIO1 | 0xFE740000 |
| GPIO2 | 0xFE750000 |
| GPIO3 | 0xFE760000 |
| GPIO4 | 0xFE770000 |
^ Name ^ Offset ^ Size ^ Reset Value ^ Description ^
| GPIO_SWPORT_DR_L | 0x0000 | W | 0x00000000 | Port Data Register (Low) |
| GPIO_SWPORT_DR_H | 0x0004 | W | 0x00000000 | Port Data Register (High) |
| GPIO_SWPORT_DDR_L | 0x0008 | W | 0x00000000 | Port Data Direction Register (Low) |
| GPIO_SWPORT_DDR_H | 0x000C | W | 0x00000000 | Port Data Direction Register (High)|
测试GPIO指令与寄存器操作
使用IO:GPIO0_C4 \\
序号: 20
GPIO3基地址:0xFDD60000
GPIO(0)_SWPORT_DR_H: 0xFDD60004
GPIO(0)_SWPORT_DDR_H: 0xFDD6000C
cd /sys/class/gpio
echo 20 > export
cd gpio20
# Write sysfs and check registers
cat direction # output: in
io -4 0xFDD6000C # output : fdd6000c: 00007001
bit5:0, input
echo out > direction
io -4 0xFDD6000C # output : fdd6000c: 00007011
bit5:1, output
cat value # output: 0
io -4 0xFDD60004 # output : fdd60004: 00007000
bit5:0
echo 1 > value
io -4 0xFDD60004 # output : fdd60004: 00007010
bit5:1
# Write register and check sysfs
io -4 -w 0xFDD60004 0x00100000
cat value # output: 0
io -4 -w 0xFDD60004 0x00100010
cat value # output: 1
===== - 其他指令 =====
# 查看GPIO信息
cat /sys/kernel/debug/gpio
# 查看pin状态
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinconf-pins