韦东山全系列快速入门学习笔记2-linux对于中断的处理上机实验

使用正点原子的IMX-6ULL开发板实现本例程

  1. 确定GPIO引脚:
    在这里插入图片描述
    在这里插入图片描述
    再对应到核心板上的GPIO引脚GPIO1_IO18

  2. 修改设备树:
    根据前面确定的本开发板使用的设备树文件为: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”

  1. 拷贝dtb文件和驱动程序到开发板指定目录,重新启动开发板,查看开发板设备树
    在这里插入图片描述
    该名称与设备树文件中规定的名字一致:
    在这里插入图片描述
  2. 加载驱动程序
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

达到了我们的目的

  1. 一个小问题
    上图中,按下按键的时候打印为0,松开按键的时候打印为1
    在这里插入图片描述
    在这里插入图片描述
    val打印的值与GPIO_ACTIVE_LOW有什么关系呢?经过实验可知,没什么关系!
    这是因为芯片厂家提供的pinctrl子系统的写的不完善,我们驱动程序读取的值为物理值,非逻辑值。
    按道理应当提供逻辑值,即如果按下状态与GPIO_ACTIVE_LOW一致则打印为1,否则打印为0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值