################ GPIO驱动
1.驱动简介
drivers/gpio下实现了基于gpiolib的GPIO驱动,其中定义了一个通用的用于描述底层GPIO控制器的gpio_chip结构体.
SOC的嵌入式工程师需要实现gpio_chip成员函数,然后通过gpiochip_add()注册gpio_chip。
gpio驱动一般在driver/gpio/下,但是gpio往往有复用功能,所以常常在drivers/pinctrl/下和pinmux
一起实现。
2.API简介:
参考之前一篇调试记录:Linux 驱动层gpio调用_乡棒的博客-优快云博客
注:有点API以devm_开头,内核会有自动回收机制,因此在错误处理时会自动回收资源。
3.gpio控制方法
3.1 文件io:
内核会创建节点/sys/class/gpio/gpioN,可以通过echo值改变gpio的方向、设置、获取值
3.2 设备树
在控股之节点中,定义#gpio-cells和gpio-controller属性,具体的设备节点通过xxx-gpios属性
来引用gpio控制器节点和引脚
例如瑞芯微rk3588的节点:
控制器:
gpio0: gpio@fd8a0000 {
compatible = "rockchip,gpio-bank";
reg = <0x0 0xfd8a0000 0x0 0x100>;
interrupts = <GIC_SPI 277 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_GPIO0>, <&cru DBCLK_GPIO0>;
gpio-controller;
#gpio-cells = <2>;
gpio-ranges = <&pinctrl 0 0 32>;
interrupt-controller;
#interrupt-cells = <2>;
};
pcie使用控制器
&pcie2x1l0{
phys = <&combphy1_ps PHY_TYPE_PCIE>;
reset-gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
##################### pinctrl
1.注册
在pinctrl驱动中,我们需要向pinctrl子系统中注册一个pinctrl_desc描述符,该描述符pins成员中
包含所有引脚的列表