参考文章
Linux驱动开发(十一):pinctrl子系统和GPIO子系统
GPIO子系统的作用
在以前的内核版本中,如果要配置GPIO的话一般要使用IC厂家实现的GPIO配置函数,例如三星的配置函数为
/*设置为输入*/
s3c_gpio_cfgpin(EXYNOS4_GPC0(3),S3C_GPIO_INPUT);
/*不上拉不下拉*/
s3c_gpio_setpull(EXYNOS4_GPC0(3),S3C_GPIO_PULL_NONE);
这样带来的问题就是各家有各家的接口函数与实现方式,不但内核的代码复用率低而且开发者很难记住这么多的函数,如果要使用多种平台的话背函数都是很麻烦的,所以在引入设备树后对GPIO子系统进行了大的改造,使用设备树来实现并提供统一的接口
通过GPIO子系统功能要实现:
- 引脚功能的配置(设置为GPIO,特殊功能,GPIO的方向,设置为中断等)
- 实现软硬件的分离(分离出硬件差异,有厂商提供的底层支持;软件分层。驱动只需要调用接口API即可操作GPIO)
- iommu内存管理(直接调用宏即可操作GPIO)
经过GPIO子系统,我们可以通过如下的方式来配置GPIO
gpio_request(leddev.led0, "led0");
gpio_direction_output(leddev.led0, 1);
gpio_set_value(leddev.led0, 0);
gpio_direction_input(key.irqkeydesc[0].gpio);
value = gpio_get_value(keydesc->gpio);