====== 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