一. 简介
前面几篇文章简单了解了 Linux设备树文件中的 GPIO设备节点信息。
本文简单了解一下 Linux内核源码中,有关 GPIO子系统的驱动实现。本文继续以 I.MX6ULL-ALPHA 开发板上的 UART1_RTS_B ( SD 卡的检测引脚)为例,分析GPIO子系统的驱动实现。
注意:本小节会涉及到
Linux
驱动分层与分离、平台设备驱动等还未讲解的知识,所以本小节教
程可以不用看,不会影响后续的实验。
二. IMX6ULL的GPIO子系统驱动
通过前面几篇文章学习,I.MX6ULL-ALPHA 开发板上的 SD 卡的检测引脚(即UART1_RTS_B)所使用的GPIO为 GPIO1_IO19。也就是 GPIO1组。
打开 imx6ull.dtsi,找到 GPIO1的设备节点信息:
gpio1: gpio@0209c000 {
compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
reg = <0x0209c000 0x4000>;
interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
};
gpio1 节点的 compatible 属性描述了兼容性,在 Linux 内核中搜索这两个字符串:
“fsl,imx6ul-gpio”
“fsl,imx35-gpio”
查找 GPIO 驱动代码实现。可以在 drivers/gpio/gpio-mxc.c文件中匹配到, gpio-mxc.c 就是 I.MX6ULL 的 GPIO 驱动文件。
gpio-mxc.c 文件中有如下所示 of_device_id 匹配表:
static const struct of_device_id mxc_gpio_dt_ids[] = {
{ .compatible = "fsl,imx1-gpio", .data = &mxc_gpio_devtype[IMX1_GPIO], },
{ .compatible = "fsl,imx21-gpio", .data = &mxc_gpio_devtype[IMX21_GPIO], },
{ .compatible = "fsl,imx31-gpio", .data = &mxc_gpio_devtype[IMX31_GPIO], },
{ .compatible = "fsl,imx35-gpio", .data = &mxc_gpio_devtype[IMX35_GPIO], },
{ /* sentinel */ }
};
第
156
行的
compatible
值为“
fsl,imx35-gpio
”,和
gpio1
的
compatible
属性匹配,因此
gpio-mxc.c
就是
I.MX6ULL
的
GPIO
控制器驱动文件。
gpio-mxc.c
所在的目录为
drivers/gpio
,打开这
个目录可以看到很多芯片的
gpio
驱动文件, “
gpiolib
” 开始的文件是
gpio
驱动的核心文件。
我们重点来看一下
gpio-mxc.c
这个文件,在
gpio-mxc.c
文件中,有如下所示内容: