总结
驱动程序还想控制gpio 可以不用读写寄存器 直觉用gpio子系统开发的接口就能用了
 轻松做输入输出 获取当前值
详细介绍
用设备树里的节点 gpio1 介绍
imx6ull.dtsi
 gpio1 记录了控制器相关的寄存器基地址
gpio1: gpio@209c000 {
				compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
				reg = <0x209c000 0x4000>;
				interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
					     <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
				clocks = <&clks IMX6UL_CLK_GPIO1>;  //初始化外设时钟
				gpio-controller;  //表明gpio1是gpio控制器
				#gpio-cells = <2>;
				interrupt-controller; //表明gpio1是中断控制器
				#interrupt-cells = <2>;
				gpio-ranges = <&iomuxc  0 23 10>, <&iomuxc 10 17 6>,
					      <&iomuxc 16 33 16>; //表明gpio1和pinctrl子系统关系
				gpio子系统引脚编号和pinctrl子系统引脚编号的关系
				
			};
<&iomuxc 16 33 16>;  &iomuxc 引用pinctrl子系统的iomuxc节点
16 33  16 : gpio子系统引脚编号和pinctrl子系统引脚编号的关系   gpio的16号引脚 对应pinctrl子系统的33号引脚,对应关系的长度为16
 

其他设备节点想要使用gpio子系统的话怎么使用
比如rgb节点 用的话增加了下面的属性
 rgb_led_red rgb_led_green rgb_led_blue
rgb_led{
    #address-cells = <1>;
    #size-cells = <1>;
    pinctrl-names = "default";
    compatible = "fire,rgb_led";
    pinctrl-0 = <&pinctrl_rgb_led>;
    rgb_led_red = <&gpio1 4 GPIO_ACTIVE_LOW &gpio1 10 GPIO_ACTIVE_LOW>;
    rgb_led_green = <&gpio4 20 GPIO_ACTIVE_LOW>;
    rgb_led_blue = <&gpio4 19 GPIO_ACTIVE_LOW>;
    status = "okay";
};
rgb_led_red:自定义属性,&gpio1 4 表示引用了gpio1: gpio@209c000节点 GPIO1_IO04表示在gpio1的编号,GPIO_ACTIVE_LOW表示低电平有效
 
函数使用
常用函数
of_find_node_by_path()函数
函数原型:
inline struct device_node *of_find_node_by_path(const char *path)
 
参数:
- path:设备树节点的绝对路径
 
返回值:
-  
成功:目标节点
 -  
失败:NULL
 
of_get_named_gpio()函数
用来获取gpio的编号
 函数原型:
static inline int of_get_named_gpio(struct device_node *np,const char *propname, int index)
 
参数:
- np:指定的设备树节点
 - propname:GPIO属性名== rgb_led_red
 - index:引脚索引值 比如rgb_led_red 有两个属性 需要选择gpio1 10 GPIO_ACTIVE_LOW index填写1
 
返回值:
- 成功:GPIO编号
 - 失败:负数
 
gpio_request()函数
把gpio引脚放入pinctrl子系统中 避免不同外设使用一个引脚
 函数原型:
static inline int gpio_request(unsigned gpio, const char *label)
 
参数:
- gpio:要申请的GPIO编号
 - label:给 gpio 设置个名字
 
返回值:
- 成功:0
 - 失败:负数
 
gpio_free()函数
函数原型:
static inline void gpio_free(unsigned gpio);
 
参数:
- gpio:要释放的GPIO编号
 
返回值:
无
gpio_direction_output()函数
函数原型:
static inline int gpio_direction_output(unsigned gpio , int value);
 
参数:
-  
gpio:要操作的GPIO编号
 -  
value:设置默认输出值
 
返回值:
- 成功:0
 - 失败:负数
 
gpio_direction_input()函数
函数原型:
int gpio_direction_input(unsigned gpio)
 
参数:
- gpio:要操作的GPIO编号
 
返回值:
- 成功:0
 - 失败:负数
 
gpio_get_value()函数
函数原型:
#define gpio_get_value __gpio_get_value
int __gpio_get_value(unsigned gpio)
 
参数:
- gpio:要操作的GPIO编号
 
返回值:
- 成功: GPIO的电平值
 - 失败:负数
 
gpio_set_value()函数
函数原型:
#define gpio_set_value __gpio_set_value
void __gpio_set_value(unsigned gpio, int ;)
 
参数:
- gpio:要操作的GPIO编号
 - value:要设置的输出值
 
返回值:
无



















