Maix II Dock gpio子系统点亮LED学习

发布时间 2023-12-20 19:05:07作者: zbl1118

一、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

    参考:Thoughts (teambition.com)

  

  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,非零

设置低电平有效

   ④、 gpiochipN 指代 gpio 控制器: gpiochipN 表示的就是一个 gpio_chip, 用来管理和控制一组 gpio 端口的控制器,该目录下存在以下属性文件:

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)

   上电运行,state led闪烁。