Skip to content

LV540-虚拟gpio控制器实例

来写一个虚拟的 GPIO 控制器?若笔记中有错误或者不合适的地方,欢迎批评指正 😃。

一、虚拟 GPIO 控制器

1. 硬件功能

假设这个虚拟的 GPIO Controller 有 4 个引脚,和前面的虚拟 pinctrl 硬件功能一样。

image-20260121170336329

2. 编写设备树文件

2.1 GPIO 控制器

shell
gpio_virt: virtual_gpiocontroller {
	compatible = "alpha,virtual_gpio";
    gpio-controller;
    #gpio-cells = <2>;
    ngpios = <4>;
};
  • gpio-controller 属性用于标识一个设备节点作为 GPIO 控制器。 GPIO 控制器是负责管理和控制 GPIO 引脚的硬件模块或驱动程序。
  • #gpio-cells 用于指定 GPIO 引脚描述符的编码方式。值是一个整数, 表示用于编码 GPIO 引脚描述符的单元数。 通常,这个值为 2,这样每个引脚描述属性中会有两个整数:
c
client-gpios = <&gpio_virt 2 GPIO_ACTIVE_LOW>; // 2 和 GPIO_ACTIVE_LOW 就是那两个整数
  • ngpios 属性指定了 GPIO 控制器所支持的 GPIO 引脚数量。 它表示该设备上可用的 GPIO 引脚的总数。

2.2 client_node

再写一个节点使用上面的 GPIO 控制器:

c
client-node {
    compatible = "alpha,client-drv";
    client-gpios = <&gpio_virt 2 GPIO_ACTIVE_LOW>;
};

gpio 引脚描述属性个数由#gpio-cells 所决定, 因为 gpio0 节点中的#gpio-cells 属性设置为了 2, 所以上面设备树 gpio 引脚描述属性个数也为 2。第一个表示 gpio 的编号,第二个表示 gpio 的电平状态。

3. 编写驱动程序

参考:Linux-doc_and_source_for_drivers/IMX6ULL/source/07_GPIO/03_virtual_gpio_ok at master · 100askTeam/Linux-doc_and_source_for_drivers · GitHub

3.1 虚拟 gpio 控制器驱动

核心:分配/设置/注册一个 gpio_chip 结构体。可以参考31_pinctrl_gpio_subsystem/04_virtual_gpio/drivers_demo/virtual_gpio_driver.c

3.2 led 设备驱动

这个就是和之前一样,可以驱动 led 灯的那种就可以,前面设备树已经写了 led 的节点,就可以用平台设备驱动来写。可以参考31_pinctrl_gpio_subsystem/04_virtual_gpio/drivers_demo/sdriver_demo.c

二、虚拟 GPIO 控制器调试

这里主要就是可以参考 gpio 控制与调试了。