1、输出引脚
reset-gpios = <&gpio0 GPIO_D1 GPIO_ACTIVE_HIGH>;
以上参数分别对应:引脚的名称,第几组gpio,第几个引脚,工作模式
注:以上配置对应为 GPIO0_D1
2、输入(中断)引脚
irq-gpios = <&gpio1 GPIO_B0 IRQ_TYPE_LEVEL_LOW>;
以上参数分别对应:引脚的名称,第几组gpio,第几个引脚,工作模式
注:以上配置对应为 GPIO1_B0
第二章 dts和驱动代码的实现
1、完整的dts
gt9xx@5d {
// ---------- 复位对应 GPIO0_D1
reset-gpios = <&gpio0 GPIO_D1 GPIO_ACTIVE_HIGH>;
// ---------- 中断引脚 GPIO1_B0
irq-gpios = <&gpio1 GPIO_B0 IRQ_TYPE_LEVEL_LOW>;
};
2、驱动代码
2.1、找到dts中对应的引脚
使用API:of_get_named_gpio获取到引脚的编号。
rst_gpio = of_get_named_gpio(np, "reset-gpios", 0);//获取gpio
irq_gpio = of_get_named_gpio(np, "irq-gpios", 0);//获取中断的gpio
2.2、检查引脚状态
使用API:gpio_is_valid检查引脚状态,返回1表示引脚可操作。
if (!gpio_is_valid(rst_gpio))//检查gpio
printk( "No valid rst gpio");
if (!gpio_is_valid(irq_gpio))
printk( "No valid irq gpio");
2.3、释放引脚
if (gpio_is_valid(rst_gpio))//检查引脚可操作
gpio_free(rst_gpio);//释放复位引脚
if (gpio_is_valid(irq_gpio))//检查引脚可操作
gpio_free(irq_gpio);//释放中断引脚
注:获取、检查和释放使用的API都是一样的方法
2.4、gpio设置成输入输出模式
普通gpio引脚的控制
if (gpio_is_valid(rst_gpio)) {//检查引脚是否可用
gpio_direction_output(rst_gpio, 0);//设置成输出低电平
gpio_direction_output(rst_gpio, 1);//设置成输出高电平
gpio_direction_input(rst_gpio);//设置成输入模式
}
中断引脚的控制
if (gpio_is_valid(irq_gpio)){
gpio_direction_output(irq_gpio, 0);//设置成输出低电平
gpio_direction_output(irq_gpio, 1);//设置成输出高电平
}
将中断引脚转成中断模式
if (gpio_is_valid(irq_gpio)){
irq = gpio_to_irq(irq_gpio);//返回值是中断号
ret = request_threaded_irq(irq, NULL,gtp_irq_handler,
irq_flags | IRQF_ONESHOT,name,ts);//申请中断
}
1、输出引脚
reset-gpios = <&gpio0 GPIO_D1 GPIO_ACTIVE_HIGH>;
以上参数分别对应:引脚的名称,第几组gpio,第几个引脚,工作模式
注:以上配置对应为 GPIO0_D1
2、输入(中断)引脚
irq-gpios = <&gpio1 GPIO_B0 IRQ_TYPE_LEVEL_LOW>;
以上参数分别对应:引脚的名称,第几组gpio,第几个引脚,工作模式
注:以上配置对应为 GPIO1_B0
第二章 dts和驱动代码的实现
1、完整的dts
gt9xx@5d {
// ---------- 复位对应 GPIO0_D1
reset-gpios = <&gpio0 GPIO_D1 GPIO_ACTIVE_HIGH>;
// ---------- 中断引脚 GPIO1_B0
irq-gpios = <&gpio1 GPIO_B0 IRQ_TYPE_LEVEL_LOW>;
};
2、驱动代码
2.1、找到dts中对应的引脚
使用API:of_get_named_gpio获取到引脚的编号。
rst_gpio = of_get_named_gpio(np, "reset-gpios", 0);//获取gpio
irq_gpio = of_get_named_gpio(np, "irq-gpios", 0);//获取中断的gpio
2.2、检查引脚状态
使用API:gpio_is_valid检查引脚状态,返回1表示引脚可操作。
if (!gpio_is_valid(rst_gpio))//检查gpio
printk( "No valid rst gpio");
if (!gpio_is_valid(irq_gpio))
printk( "No valid irq gpio");
2.3、释放引脚
if (gpio_is_valid(rst_gpio))//检查引脚可操作
gpio_free(rst_gpio);//释放复位引脚
if (gpio_is_valid(irq_gpio))//检查引脚可操作
gpio_free(irq_gpio);//释放中断引脚
注:获取、检查和释放使用的API都是一样的方法
2.4、gpio设置成输入输出模式
普通gpio引脚的控制
if (gpio_is_valid(rst_gpio)) {//检查引脚是否可用
gpio_direction_output(rst_gpio, 0);//设置成输出低电平
gpio_direction_output(rst_gpio, 1);//设置成输出高电平
gpio_direction_input(rst_gpio);//设置成输入模式
}
中断引脚的控制
if (gpio_is_valid(irq_gpio)){
gpio_direction_output(irq_gpio, 0);//设置成输出低电平
gpio_direction_output(irq_gpio, 1);//设置成输出高电平
}
将中断引脚转成中断模式
if (gpio_is_valid(irq_gpio)){
irq = gpio_to_irq(irq_gpio);//返回值是中断号
ret = request_threaded_irq(irq, NULL,gtp_irq_handler,
irq_flags | IRQF_ONESHOT,name,ts);//申请中断
}
举报