在嵌入式linux中,用 pin control subsystem 来对一款芯片的引脚进行管理,我们经常在设备树中看到 pinctrl 这样的节点,其实就是 引脚控制子系统 驱动的设备树节点。该子系统的帮助各个驱动设备管理引脚,包括 引脚功能复用(pin multiplexing) 、引脚配置(pin configuration)(如输出电平及上下拉电阻) 等。所以其他的设备驱动在调用 pin control subsystem 提供的接口来对本驱动所需要的引脚进行相关功能的配置。
各个设备如果需要复用引脚,则在设备树的 pinctrl 对各个设备的引脚进行配置,将这些配置作为 pinctrl 的子节点,然后设备驱动在自己的设备树节点中引脚这些配置节点
一般 ARM soc 的数据手册会把pin controller 的内容放入 GPIO controller 的章节中,各个设备可以通过自己节点的属性来指向pinctrl 的某个子节点,也就是 pin configuration 来获取相应的引脚配置。 在MYD-YA157C开发板上,我们使用的是D29 LED。 1.应用使用方法
应用层的使用放到相对简单,可以直接通过sysfs 来操作 GPIO口。
- 使用命令 echo num > /sys/class/gpio/export 导出 GPIO口,其中 num 是 GPIO口 的编号。
- 导出后会生成节点 /sys/class/gpio/gpioN
- 通过读写(比如使用 echo 或 cat 等工具)生成的节点来获取 GPIO口 的信息及状态。
- 具体操作:
- LED灯(D29)蓝灯默认的触发方式是heartbeat,下面修改为none,才可以自行控制。
点亮和熄灭LED灯,写'0'点亮LED,写‘1’熄灭LED
设置为心跳的触发
D28红灯的设备名称为red,默认点亮以后可以控制点亮或熄灭,点亮 LED
熄灭user1 LED。
4.gpio测试过程:下面步骤是测试板子gpio,gpio组号0-9分别对应A、B、C、D、E、F、G、H、I、
Z。
查看gpio组
查看指定组gpiochip0信息,即查看对应的GPIOA信息
cd
echo | /sys/class/leds/heartbeat
none > trigger |
echo 0 > brightness
echo 1 > brightness
cd /sys/class/leds/heartbeat
echo heartbeat > trigger
cd /sys/class/leds/red
echo 0 > brightness
echo 1 > brightness
root@myir:~# gpiodetect
gpiochip0 [GPIOA] (16 lines)
gpiochip1 [GPIOB] (16 lines)
gpiochip2 [GPIOC] (16 lines)
gpiochip3 [GPIOD] (16 lines)
gpiochip4 [GPIOE] (16 lines)
gpiochip5 [GPIOF] (16 lines)
gpiochip6 [GPIOG] (16 lines)
gpiochip7 [GPIOH] (16 lines)
gpiochip8 [GPIOI] (16 lines)
gpiochip9 [GPIOZ] (16 lines)
读取组gpiochip0 第1个引脚状态,即读取GPIOA第1个引脚状态
设置组gpiochip0引脚状态,gpioset gpiochip0 <引脚序号>=<高低电平>,如设置GPIOA第1个引
脚为高电平
root@myir:~# gpioinfo gpiochip0
root@myir:~# gpioget gpiochip0 0
root@myir:~# gpioset gpiochip0 0=1
2.获取设备树信息 获取 GPIO口 信息的设备树接口 在of_gpio.h,这里不做详细讲解,读者们可以直接通过接口函数的命名来熟悉使用方法
另外,关于 GPIO口 设备树节点的属性命名方式是一般为 name-gpios , 其中 name 通常用于指该 GPIO口在设备里的具体用途。比如用于复位,则属性可以命名为reset-gpios,举例在设备树中表示为reset-gpios= <&gpio1 15 1>。在驱动中使用 of_get_named_gpi函数 返回值来得到对应的 GPIO号
int gpio_request(unsigned gpio, const char *label)
- unsigned gpio:gpio端口号
- const char *label:给该gpio端口起的名字
int gpio_direction_output(unsigned gpio, int value)
- 作用:GPIO的初始化为输出,并设置输出电平:
- 参数分析:
- unsigned gpio:gpio端口号
- int value:输出值
int gpio_direction_input(unsigned gpio)
void gpio_set_value(unsigned gpio, int value)
- unsigned gpio:gpio端口号
- int value:输出值
int gpio_get_value(unsigned gpio)
void gpio_free(unsigned gpio)
int gpio_to_irq(unsigned gpio)
- 作用:申请GPIO口中断,返回的值即中断编号可以传给request_irq()和free_irq()
- 参数分析:
int gpio_export(unsigned gpio, bool direction_may_change)
内核可以对已经被gpio_request()申请的gpio端口的导出进行明确的管理,
- unsigned gpio:gpio端口号
- direction_may_change:表示用户程序是否允许修改gpio的方向,假如可以则参数direction_may_change为真
void gpio_unexport(unsigned gpio)