如上图所示,右上方部分为GPIO驱动对其它驱动提供的GPIO操作接口,其对应的右下方部分为GPIO硬件操作接口,也就是说对外提供的接口最终会一一对应的对硬件GPIO进行操作。 再来看左边部分,左上方部分为一全局数组,记录各个GPIO的描述符,即对应左下方的gpio_desc结构体,其中gpio_chip指向硬件层的GPIO,flags为一标志位,用来...
Linux的GPIO子系统驱动框架由三个主要部分组成:① GPIO控制器驱动程序、②gpio lib驱动程序 ③GPIO字符设备驱动程序: 使用gpiochip_add/gpiochip_add_data向系统注册gpio_chip, 这些都是半导体原厂要做的,设备商只需要使用即可。 2.0 gpio控制器源码分析 drivers/gpio/gpio-mxc.c就是 I.MX6ULL的 GPIO 控制器驱动...
前者的函数都有前缀 “gpiod_”,它使用 gpio_desc 结构体来表示一个引脚;后者的函数都有前缀 “gpio_”,它使用一个整数来表示一个引脚。 要操作一个引脚,首先要 get 引脚,然后设置方向,读值、写值。 建议使用“devm_”版本的相关函数。有前缀“devm_”的含义是“设备资源管理”(Managed Device Resource),这...
struct gpio_device struct gpio_desc 相关初始化流程 数据结构关系图 总结 在linux内核中GPIO的控制是一个相对独立的子模块,纵然硬件决定着他和PINCTRL有着千丝万缕的关系,但内核还是把他和PINCTRL分开来。PINCTRL就像是一个顾全大局的大哥,把驱动所需要的gpio的状态抽象为一个个state结合PM等其他内核的子系统去配置...
一文搞懂 | Linux pinctrl/gpio子系统 pinctrl 子系统和 gpio 子系统虽然难度不大,但在内核里的使用率非常高,本文争取一次性把相关内容介绍一遍。 pinctrl 数据结构 使用struct pinctrl_desc 抽象一个 pin controller,该结构的定义如下: struct pinctrl_desc {...
pinctrl 子系统和 gpio 子系统虽然难度不大,但在内核里的使用率非常高,本文争取一次性把相关内容介绍一遍。 pinctrl 数据结构 使用struct pinctrl_desc 抽象一个 pin controller,该结构的定义如下: structpinctrl_desc{ constchar*name; conststructpinctrl_pin_desc*pins; ...
GPIO是与硬件体系密切相关的,linux提供一个模型来让驱动统一处理GPIO,即各个板卡都有实现自己的gpio_chip控制模块:request, free, input,output, get,set,irq...然后把控制模块注册到内核中,这时会改变全局gpio数组:gpio_desc[]. 当用户请求gpio时,就会到这个数组中找到,并调用这个GPIO对应的gpio_chip的处理函数。
gpiolib子系统经过多年的发展,其对于gpio的管理方式产生了两种不同的机制,一种是基于gpio num的方式,另一种是基于gpio_desc的描述符形式。前一种机制由于种种问题,现在已经被废弃,但为了向后兼容,内核对于该机制进行了保留,但对于新的gpio驱动程序,内核强烈建议使用新版的机制。
if (!gpio_is_valid(gpio)) WARN(1, "invalid GPIO %d\n", gpio); return NULL; } EXPORT_SYMBOL_GPL(gpio_to_desc); /** * Get the GPIO descriptor corresponding to the given hw number for this chip. */ struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip, ...
GPIO 子系统有两套接口:基于描述符的(descriptor-based)、老的(legacy)。前者的函数都有前缀 “gpiod_”,它使用 gpio_desc 结构体来表示一个引脚;后者的函数都有前缀 “gpio_”,它使用一个整数来表示一个引脚。 要操作一个引脚,首先要 get 引脚,然后设置方向,读值、写值。