使用正点原子的IMX-6ULL开发板实现本例程
-
确定GPIO引脚:
再对应到核心板上的GPIO引脚GPIO1_IO18 -
修改设备树:
根据前面确定的本开发板使用的设备树文件为:arch/arm/boot/dts/imx6ull-14x14-emmc-4.3-480x272-c.dts,
查看可知该文件又最终包含了:arch/arm/boot/dts/imx6ull-14x14-evk.dts
(1)《imx6ull-14x14-evk.dts》文件中已经使能了该引脚,所以为了避免这里与我们自己定义的外设pin脚冲突,所以需要首先让该外设禁用:
(2)如何禁用?《arch/arm/boot/dts/imx6ull-14x14-emmc-4.3-480x272-c.dts》文件中修改如下:
编译后报错,发现&gpio_keys不应当在根目录下,所以修改为下图:
(3)添加一个子节点gpio_keys_100ask如上图.
注意:我们上图中并未添加pinctrl信息,但是这个引脚也能够工作,这是为什么呢?
因为该芯片的引脚上电默认就是工作在GPIO状态,并且为输入状态!
但是,为了保险起见还是应当添加pinctrl信息,让芯片厂家的BSP工程师编写的pinctrl子系统根据设备树的配置来初始化对应引脚!
/
{
gpio_keys_100ask {
compatible = "100ask,gpio_key";
gpios = <&gpio1 18 GPIO_ACTIVE_LOW>;
pinctrl-names = "default"; //表示本设备只有一个默认状态
pinctrl-0 = <&pinctrl_gpio_keys>; //默认状态下,使用本行指定的一个节点,需要pinctrl子系统配置为这里指定的状态
};
};
&gpio_keys{
status = "disabled";
};
那么,&pinctrl_gpio_keys在哪里定义呢?
文件《arch/arm/boot/dts/imx6ull-14x14-evk.dts》
&iomuxc {
...
pinctrl_gpio_keys: gpio-keys {
fsl,pins = <
MX6UL_PAD_UART1_CTS_B__GPIO1_IO18 0x80000000
>;
};
...
}
那么,这个代码是怎么生成呢?
NXP官方工具“i.MX Pins Tool v6”
- 拷贝dtb文件和驱动程序到开发板指定目录,重新启动开发板,查看开发板设备树
该名称与设备树文件中规定的名字一致:
- 加载驱动程序
root@ALIENTEK-IMX6U:/mnt/linux-imx-4.1.15-2.1.0/source/01_simple# insmod gpio_key _drv.ko
/home/book/linux-imx-4.1.15-2.1.0/source/01_simple/gpio_key_drv.c gpio_key_init l ine 128
/home/book/linux-imx-4.1.15-2.1.0/source/01_simple/gpio_key_drv.c gpio_key_probe line 59
操作按键KEY0:
root@ALIENTEK-IMX6U:/mnt/linux-imx-4.1.15-2.1.0/source/01_simple# key 18 0
key 18 1
key 18 0
key 18 1
key 18 0
key 18 1
key 18 0
key 18 1
key 18 0
key 18 1
达到了我们的目的
- 一个小问题
上图中,按下按键的时候打印为0,松开按键的时候打印为1
val打印的值与GPIO_ACTIVE_LOW有什么关系呢?经过实验可知,没什么关系!
这是因为芯片厂家提供的pinctrl子系统的写的不完善,我们驱动程序读取的值为物理值,非逻辑值。
按道理应当提供逻辑值,即如果按下状态与GPIO_ACTIVE_LOW一致则打印为1,否则打印为0。