一、Linux的gpio子系统
1、Linux内核提供pinctrl子系统,目的为了统一各soc厂商的pin引脚管理;
2、pinctrl子系统提供的功能
①、管理系统中所有可控制的pin引脚:在系统初始化时候,枚举所有可控制的pin,并标识这些pin;
②、管理这些pin的复用功能:配置若干引脚组成一个pin group,形成特定的功能。复用涉及两个概念
[1]、function: 如SPI0,UART1等功能模块
[2]、pin group: 对应的SPI0可能配置pin group{C5, C6, C7, C8},也可以配置pin group{C22, C23, C24, C25},但是只能选择一组pin group来对应一个function.
③、配置这些pin的电气特性,如上拉、下拉、驱动能力、频率等
3、调用 pin control subsystem 的接口主要三步骤:
①、驱动加载或运行时,获取pin control state holder的句柄
②、设置pin control的状态
③、驱动卸载或退出时,释放pin control state holder的句柄
二、sysfs操作GPIO
1、State_LED灯的引脚编码(PH14)==》PINCTRL_PIN(224 + (14), "P" "H" "14") ==》gpio238
2、查询/sys/class/gpio 目录下的文件
①、export: 仅允许写入操作,写入GPIO编号向内核申请GPIO的控制权限(前提是没有内核代码申请使用这个 GPIO 端口),成功后会在目录下生成一个gpioN 的目录(echo 238 > /sys/class/gpio/export)
②、unexport:仅允许写入操作,写入GPIO编号向内核申请释放GPIO的控制权限。操作后该目录下会删除gpioN的目录
③、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,非零 |
设置低电平有效 |
Attribution |
Function |
base |
和N相同,表示控制器管理的最小的端口编号。 |
lable |
诊断使用的标志,寄存器地址,1c20800.pinctrl |
ngpio |
表示控制器管理的 gpio 端口数量,A~G,224 |
root@sipeed:/# echo 238 > /sys/class/gpio/export #向内核申请gpio238
root@sipeed:/# echo "out" > /sys/class/gpio/gpio238/direction #设置gpio238为输出控制led
root@sipeed:/# echo 0 > /sys/class/gpio/gpio238/value #设置gpio238的IO电平为0 点亮led
root@sipeed:/# echo 1 > /sys/class/gpio/gpio238/value #设置gpio238的IO电平为1 熄灭led
root@sipeed:/# echo "in" > /sys/class/gpio/gpio238/direction #设置gpio238为输入
root@sipeed:/# cat /sys/class/gpio/gpio238/value #读取gpio238的电平值 (上面设置了1,读出来也正是1)
root@sipeed:/# echo 238 > /sys/class/gpio/unexport #不使用是释放gpio238
三、使用python 脚本控制led
查看设备提供gpiochip,其他V831只能使用gpiochip1
修改/root/app/main.py文件,如下循环点灯
#from maixhub.ui import main
#if __name__ == "__main__":
# main()
import time
from maix import gpio
gpio.load(gpio.m2dock)
LED = gpio.gpio(14, "H", 1)
while True:
LED.set_value(0)
print(LED.get_value())
time.sleep(1)
LED.set_value(1)
print(LED.get_value())
time.sleep(1)