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%内容,订阅专栏后可继续查看/也可单篇购买

C++/嵌入式开发 秋招面经 文章被收录于专栏

一名985硕,在25年秋招中斩获多个C++/嵌入式开发Offer。本专栏将分享我的面经,涵盖C/C++、操作系统、计算机网络、ARM体系与架构、Linux应用/驱动开发、Qt、通信协议及开发工具链等核心内容。

全部评论

相关推荐

评论
3
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务