MaixII M2dock I2C gpio 调试
PIN_CTL
lichee/linux-4.9/drivers/pinctrl/sunxi/pinctrl-sun8iw19p1-r.c
lichee/linux-4.9/drivers/pinctrl/sunxi/pinctrl-sun8iw19p1.c
V831 Dock PIN Maps
- PINCTRL_PIN(64 + (0), "P" "C" "0")
- PINCTRL_PIN(96 + (0), "P" "D" "0")
- PINCTRL_PIN(128 + (0), "P" "E" "0")
- PINCTRL_PIN(160 + (0), "P" "F" "0")
- PINCTRL_PIN(192 + (0), "P" "G" "0")
- PINCTRL_PIN(224 + (0), "P" "H" "0")
- PINCTRL_PIN(256 + (0), "P" "I" "0")
PIN Number | PIN | function | 设备树配置 | 功能 | 备注 |
---|---|---|---|---|---|
238(224+14) | PH14 | SPI1_CS0TWI3_SDAPH_EINT14 | State_LED | ||
--- | --- | --- | --- | ||
166(160+6) | PF6 | PF_EINT6 | |||
RST | |||||
199(192+7) | PG7 | UART1_RXPG_EINT7 | |||
198(192+6) | PG6 | UART1_TXPG_EINT6 | |||
236(224+12) | PH12 | JTAG_CKRMII_TXENSPI1_MOSITWI2_SDAPH_EINT12 | TWI2_SDA | ||
235(224+11) | PH11 | JTAG_MSRMII_TXCKSPI1_CLKTWI2_SCKPH_EINT11 | TWI2_SCK | ||
238(224+14) | PH14 | JTAG_DIMDIOSPI1_CS0TWI3_SDAPH_EINT14 | |||
237(224+13) | PH13 | JTAG_DOMDCSPI1_MISOTWI3_SCKPH_EINT13 | |||
234(224+10) | PH10 | RMII_TXD0TWI3_SDAUART0_RXPH_EINT10 | |||
CPUX-RX | |||||
UART0-TX | PWM_9RMII_TXD1TWI3_SCKUART0_TXPH_EINT9 | ||||
--- | --- | --- | --- | ||
GND | |||||
5V | |||||
230(224+6) | PH6 | PWM_6RMII_RXD0TWI2_SDAUART2_RXPH_EINT6 | |||
231(224+7) | PH7 | PWM_7RMII_CRS_DVUART0_TXUART2_RTSPH_EINT7 | |||
232(224+8) | PH8 | PWM_8RMII_RXERUART0_RXUART2_CTSPH_EINT8 | |||
GPADC0 | |||||
224(224+0) | PH0 | PWM_0I2S0_MCLKSPI1_CLKUART3_TXPH_EINT0 | SPI1_CLK | ||
225(224+1) | PH1 | PWM_1I2S0_BCLKSPI1_MOSIUART3_RXPH_EINT1 | SPI1_MOSI | ||
226(224+2) | PH2 | PWM_2I2S0_LRCKSPI1_MISOUART3_CTSPH_EINT2 | SPI1_MISO | ||
227(224+3) | PH3 | PWM_3I2S0_DOUTSPI1_CS0UART3_RTSPH_EINT3 | SPI1_CS0 |
sysfs 操作 GPIO
root@sipeed:/# ls -l /sys/class/gpio
--w------- 1 root root 4096 Dec 9 08:54 export
lrwxrwxrwx 1 root root 0 Dec 9 08:54 gpiochip0 -> ../../devices/platform/soc/pio/gpio/gpiochip0
lrwxrwxrwx 1 root root 0 Dec 9 08:54 gpiochip352 -> ../../devices/platform/soc/r_pio/gpio/gpiochip352
--w------- 1 root root 4096 Dec 9 08:54 unexport
root@sipeed:/#
/sys/class/gpio 目录下的三种文件:
export/unexport 文件:
/sys/class/gpio/export
,只写,写入 GPIO 编号来向内核申请 GPIO 控制权(前提是没有内核代码申请这个 GPIO 端口), 成功后会在目录下生成 gpioN 目录,/sys/class/gpio/unexport
和导出的效果相反。gpioN 指代具体的 gpio 引脚: 指代某个具体的 gpio 端口, 内有以下属性文件:
Attribution | Read/Write | Value | Function |
---|---|---|---|
direction | RW | in,out;low,high | 设置输入输出 |
value | RW | 0,非零 | 读取或者写入 IO 电平 |
edge | RW | none , rising , falling , both | 配置中断触发方式 |
active_low | RW | 0,非零 | 设置低电平有效 |
- gpiochipN 指代 gpio 控制器: gpiochipN 表示的就是一个 gpio_chip, 用来管理和控制一组 gpio 端口的控制器,该目录下存在以下属性文件:
Attribution | Function |
---|---|
base | 和N相同,表示控制器管理的最小的端口编号。 |
lable | 诊断使用的标志,寄存器地址,1c20800.pinctrl |
ngpio | 表示控制器管理的 gpio 端口数量,A~G,224 |
LED 测试
使用 sysfs 操作 GPIO 的例子:
ls -l /sys/class/gpio/ # show gpio
echo 238 > /sys/class/gpio/export #export PH14(238), State_LED
ls -l /sys/class/gpio/ # show gpio
# output test
echo "out" > /sys/class/gpio/gpio238/direction # set gpio mode: direction
echo 0 > /sys/class/gpio/gpio238/value # set gpio output level: low
echo 1 > /sys/class/gpio/gpio238/value # set gpio output level: height
# input test
echo "in" > /sys/class/gpio/gpio238/direction #设置为输入
cat /sys/class/gpio/gpio192/value #读取电平
ll /sys/devices/platform/soc/r_pio/
Python-gpiod
import gpiod
c = gpiod.chip("gpiochip1")
# pylint: disable=missing-docstring
import sys
import time
import pytest
from gpiod import chip, line, line_request
try:
if len(sys.argv) > 2:
LED_CHIP = sys.argv[1]
LED_LINE_OFFSET = int(sys.argv[2])
else:
raise Exception()
# pylint: disable=broad-except
except Exception:
print(
"""Usage:
python3 -m gpiod.test.blink <chip> <line offset>"""
)
sys.exit()
c = chip(LED_CHIP)
print("chip name: ", c.name)
print("chip label: ", c.label)
print("number of lines: ", c.num_lines)
print()
led = c.get_line(LED_LINE_OFFSET)
print("line offset: ", led.offset)
print("line name: ", led.name)
print("line consumer: ", led.consumer)
print(
"line direction: ",
"input" if led.direction == line.DIRECTION_INPUT else "output",
)
print(
"line active state: ",
"active low" if led.active_state == line.ACTIVE_LOW else "active high",
)
print("is line used: ", led.is_used)
print("is line open drain: ", led.is_open_drain)
print("is_open_source: ", led.is_open_source)
print("is line requested: ", led.is_requested)
print("\nrequest line\n")
config = line_request()
config.consumer = "Blink"
config.request_type = line_request.DIRECTION_OUTPUT
led.request(config)
print("line consumer: ", led.consumer)
print(
"line direction: ",
"input" if led.direction == line.DIRECTION_INPUT else "output",
)
print(
"line active state: ",
"active low" if led.active_state == line.ACTIVE_LOW else "active high",
)
print("is line used: ", led.is_used)
print("is line open drain: ", led.is_open_drain)
print("is_open_source: ", led.is_open_source)
print("is line requested: ", led.is_requested)
while True:
led.set_value(0)
time.sleep(0.1)
led.set_value(1)
time.sleep(0.1)
python test_blink.py gpiochip0 238