6.6 Linux 驱动开发 GPIO子系统
GPIO 子系统专注于对通用输入输出引脚(GPIO)的操作和控制。它提供了对 GPIO 引脚进行读、写操作的接口,以便实现通过软件控制引脚的输入输出状态,从而与外部设备进行通信或控制外部设备。简单来说,gpio 子系统侧重于对已经配置好的 GPIO 引脚进行实际的数据读写和状态控制。
一、通用功能
- 可以将引脚设置为输出:使其输出高低电平。
- 可以将引脚设置为输入:读取引脚当前的电平。
- 可以用来触发中断。
二、设备树
gpioled{
compatible = "alientek,gpioled";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpioled>;
led-gpios = <&gpio1 3 GPIO_ACTIVE_LOW>; // 后面代表逻辑值 1 代表电平
status = "okay";
};
三、GPIO 子系统层次
GPIO lib 汇总了 GPIO 的通用操作,根据 GPIO 的特性,GPIO lib 对上(其他 Drivers)提供的一套统一通用的操作 GPIO 的软件接口,屏蔽了不同芯片的具体实现。对下,GPIO lib 提供了针对不同芯片操作的一套 framework,针对不同芯片,只需要实现 Specific Chip Driver ,然后使用 GPIO lib 提供的注册函数,将其挂接到 GPIO lib 上,这样就完成了这一套东西。
四、三个重要的数据结构
(1)gpio_desc 结构
每个 GPIO 实体由一个 gpio_desc 来描述。
(2)gpio_chip 结构
(3)gpio_device 结构
当申请一个引脚时(led_gpio = gpiod_get(&pdev->dev, "led", 0); ),会根据设备树中的 GPIO 组找到相应的 gpio_device,而根据第几个引脚再从其 descs 中指向相应的 gpio_desc。对引脚进行操作时,会根据 gpio_desc 中的 gdev 找到相应的控制器,再从 gpio_device 中找到相对应的 gpio_chip。gpio_chip 里面的函数需要 offset 以确定对哪个引脚进行操作,由于引脚组的 gpio_desc 基地址知道,又知道当前引脚的 gpio_desc 地址,从而得知 offset。
五、旧版 API:获得引脚、设置方向、读取/设置值
(1)找到设备节点
struct device_node *of_find_node_by_path(const
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
一名985硕,在25年秋招中斩获多个C++/嵌入式开发Offer。本专栏将分享我的面经,涵盖C/C++、操作系统、计算机网络、ARM体系与架构、Linux应用/驱动开发、Qt、通信协议及开发工具链等核心内容。
