主要是如何使用gpiolib相关接口,进行其他的驱动开发。
这块主要是针对“驱动工程师”而言的,不是针对原厂的BSP工程师。
几个gpiolib常用的经典接口包括:
- gpio_request: 驱动中要想使用某一个gpio,就必须先调用gpio_request接口来向内核申请,得到允许后才可以去使用这个gpio。
- gpio_free: 对应gpio_request,用来释放申请后用完了的gpio。
- gpiochip_is_requested: 接口用来判断某一个gpio是否已经被申请了。
- gpio_direction_input:?接口用来设置GPIO为输入模式。
- gpio_direction_output: 接口用来设置GPIO为输出模式。
另外几个新接口包括:
- devm_gpio_request_one:?申请并将gpio初始为高电平。
- gpio_get_value:?//读取gpio电平值
- gpio_set_value:??//设置gpio电平值
另外就是获取设备树引脚定义的接口包括:
- of_get_named_gpio:// 根据函数返回值来得到gpio号
引用一张图:
?典型应用
/* 从设备树获取引脚编号 */
gpio_cs = of_get_named_gpio(nd, "spi_cs", 0);
if(!gpio_is_valid(gpio_cs )) {
printk("get gpio_cs failed !\r\n");
return -EINVAL;
} else {
printk("gpio_cs = %d gpio ok !\r\n", gpio_cs );
ret = gpio_request(gpio_cs, "spi_cs");
if(ret < 0) {
printk("request gpio spi_cs failed !\r\n");
gpio_free(gpio_cs);
return -EINVAL;
}
/* 设置gpio_cs 引脚方向 */
ret = gpio_direction_output(gpio_cs, 0);// 片选:低有效
if (ret < 0) {
printk("can't request output direction spi_cs gpio %d\n", gpio_cs);
return ret;
} else {
printk("spi_cs gpio_direction_output ok !\r\n");
}
}
|