imx6驱动实验之按键驱动gpio-keys

本文详细介绍了如何在飞凌嵌入式板子上添加并配置8位旋转开关,涉及硬件连接、内核驱动修改及应用开发过程。通过重新配置GPIO引脚和内核参数,成功实现了旋转开关的功能,并提供了应用层代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人能力有限,此博文只当记录实验过程,如有错误,请大家指正。

 

一、硬件连接

 

根据飞凌嵌入式的板子添加一个8位的旋转开关,需要8个gpio,所以去除SD3接口,改成GPIO。

需要修改的引脚为

SD3_DATA0

SD3_DATA1

SD3_DATA2

SD3_DATA3

SD3_DATA4

SD3_DATA5

SD3_CMD

SD3_CLK

查看电路图,可以知道这些都有外部上拉,去除上拉电阻,然后分别将各引脚拉到旋转开关上,旋转开关公共脚接地。

 

二、内核驱动

1、打开文件 imx6q-pinfunc.h

修改MX6QDL_PAD_SD3_DAT0__SD3_DATA0改成alt5,MX6QDL_PAD_SD3_DAT0__SD3_DATA1 改成alt5

#define MX6QDL_PAD_SD3_DAT0__SD3_DATA0              0x2c0 0x6a8 0x000 0x5 0x0 

#define MX6QDL_PAD_SD3_DAT1__SD3_DATA1              0x2c4 0x6ac 0x000 0x5 0x0

2、打开文件 linux-4.1.15/arch/arm/boot/dts/imx6qdl-sabresd.dtsi

搜索   gpio-keys 添加 key-zero、key-one

    gpio-keys {
        compatible = "gpio-keys";
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_gpio_keys>;

        power {
            label = "Power Button";
            gpios = <&gpio3 29 GPIO_ACTIVE_LOW>;
            gpio-key,wakeup;
            linux,code = <KEY_POWER>;
        };

        volume-up {
            label = "Volume Up";
            gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
            gpio-key,wakeup;
            linux,code = <KEY_VOLUMEUP>;
        };

        volume-down {
            label = "Volume Down";
            gpios = <&gpio1 5 GPIO_ACTIVE_LOW>;
            gpio-key,wakeup;
            linux,code = <KEY_VOLUMEDOWN>;
        };

        key-zero {
            label = "Key Zero";
            gpios = <&gpio7 4 GPIO_ACTIVE_LOW>;
            gpio-key,wakeup;
            linux,code = <KEY_0>;        
        };

        key-one {
            label = "Key One";
            gpios = <&gpio7 5 GPIO_ACTIVE_LOW>;
            gpio-key,wakeup;
            linux,code = <KEY_1>;        
        };
    };

搜索pinctrl_gpio_keys,添加IOMUXC_SW_PAD_CTL_PAD_SD3_DATA0、 IOMUXC_SW_PAD_CTL_PAD_SD3_DATA1的寄存器配置

        pinctrl_gpio_keys: gpio_keysgrp {
            fsl,pins = <
                MX6QDL_PAD_EIM_D29__GPIO3_IO29 0x1b0b0
                MX6QDL_PAD_GPIO_4__GPIO1_IO04  0x1b0b0
                MX6QDL_PAD_GPIO_5__GPIO1_IO05  0x1b0b0

                MX6QDL_PAD_SD3_DAT0__SD3_DATA0    0x1b0b0
                MX6QDL_PAD_SD3_DAT1__SD3_DATA1    0x1b0b0
            >;
        };

屏蔽原SD3作为SD卡应用的配置

//pinctrl_usdhc3: usdhc3grp {
//    fsl,pins = <
//        MX6QDL_PAD_SD3_CMD__SD3_CMD        0x17059
//        MX6QDL_PAD_SD3_CLK__SD3_CLK        0x10059
//        MX6QDL_PAD_SD3_DAT0__SD3_DATA0        0x17059
//        MX6QDL_PAD_SD3_DAT1__SD3_DATA1        0x17059
//        MX6QDL_PAD_SD3_DAT2__SD3_DATA2        0x17059
//        MX6QDL_PAD_SD3_DAT3__SD3_DATA3        0x17059
//        MX6QDL_PAD_SD3_DAT4__SD3_DATA4        0x17059
//        MX6QDL_PAD_SD3_DAT5__SD3_DATA5        0x17059
//        MX6QDL_PAD_SD3_DAT6__SD3_DATA6        0x17059
//        MX6QDL_PAD_SD3_DAT7__SD3_DATA7        0x17059
//    >;
//};

 

三、应用开发

进去系统打开节点

 

按键会有乱码出现,证明驱动已经生效。接下来就来写应用。

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <linux/input.h>

#define NOKEY 0



int main()

{

	int keys_fd;	

        char ret[2]; 

	struct input_event t;

	char *dev;



    setvbuf(stdout, (char *)NULL, _IONBF, 0);//disable stdio out buffer;

//	dev = getenv("KEYPAD_DEV");

      

    keys_fd = open("/dev/input/event1", O_RDONLY);

	if(keys_fd<=0)

	{

        printf("open %s device error!\n",dev);

		return 0;

	}



	while(1)

	{	

            if(read(keys_fd,&t,sizeof(t))==sizeof(t)) {

		    if(t.type==EV_KEY)

			if(t.value==0 || t.value==1)

			{

				printf("%d \n", t.	code);

				switch(t.code)

				{

				case 158:

		    			printf("key158 %s\n",(t.value)?"Presse":"Released");
				break;

			    	

			    	case 115:

			    		printf("key115 %s\n",(t.value)?"Pressed":"Released");

			    	break;

			    	

			    	case 114:

			    		printf("key114 %s\n",(t.value)?"pressed":"Released");

			    	break;  

			    	

			    	case 102:

			    		printf("key102 %s\n",(t.value)?"Pressed":"Released");

			    	break;

			    	

			    	case 116:

			    	printf("key116 %s\n",(t.value)?"Released":"Pressed");

			        break;



					//case 261:

					//	printf("key261 %s\n",(t.value)?"Released":"Pressed");

					//break;

			    	

			    	default:

			    		break;

			    }

			}

		}

	}	

	close(keys_fd);

	

        return 0;

}

结果如下

<think>嗯,用户问的是关于“gpio-keys”需要设置哪个defconfig。我需要先确认自己对这个问题是否足够了解。 首先,我记得在Linux内核中,设备驱动通常需要通过内核配置来启用。gpio-keys应该是一个输入子系统下的驱动,用于将GPIO按键映射为输入设备。用户可能是在开发嵌入式系统,需要配置内核来支持物理按钮。 接下来,用户提到的是defconfig,这通常是指默认的配置文件,比如arch/arm/configs或者arch/arm64/configs下的某个文件。不同的硬件平台可能有不同的defconfig,比如imx_v6_v7_defconfig,multi_v7_defconfig等。用户需要知道具体应该修改哪个defconfig,或者在哪个配置选项中启用gpio-keys驱动。 然后,我需要回忆内核配置中的选项名称。通常,GPIO相关的驱动可能位于Device Drivers -> Input device support -> Keyboards下面,或者可能有自己的子菜单。对应的配置符号可能是CONFIG_KEYBOARD_GPIO或者类似的。 不过,用户可能不知道具体该怎么配置,所以需要给出具体的配置步骤,比如如何通过make menuconfig来启用,或者直接在defconfig文件中添加CONFIG_KEYBOARD_GPIO=y这一行。 另外,还需要考虑用户的目标平台是什么,不同的平台可能defconfig名称不同,可能需要用户根据他们的硬件选择正确的defconfig文件。例如,树莓派的defconfig可能是bcm2835_defconfig,而其他平台可能不同。 可能还需要提醒用户,除了配置内核,还需要在设备树中正确配置gpio-keys节点,指定使用的GPIO引脚和按键码等信息。否则即使驱动启用了,设备也不会正常工作。 总结一下,回答应该包括: 1. 需要在内核配置中启用CONFIG_KEYBOARD_GPIO。 2. 修改对应的defconfig文件,添加该配置项。 3. 根据硬件平台选择正确的defconfig。 4. 设备树的配置也是必要的。 5. 提供具体的配置命令或步骤,比如使用make menuconfig的路径。 需要确保信息准确,所以可能需要查阅内核的Kconfig文件或文档确认配置符号的正确性。同时,避免使用可能过时的信息,比如旧版本内核的配置项名称可能不同。</think>在Linux内核中启用`gpio-keys`驱动需要进行以下内核配置: 1. **核心配置项** 必须启用`CONFIG_KEYBOARD_GPIO`选项: ```bash CONFIG_KEYBOARD_GPIO=y ``` 2. **配置路径** 通过`make menuconfig`时的路径: ``` Device Drivers -> Input device support -> Keyboards <*> GPIO Buttons ``` 3. **典型defconfig文件** 需要根据目标平台选择对应的defconfig文件: - **ARMv7平台**:`arch/arm/configs/multi_v7_defconfig` - **树莓派系列**:`arch/arm/configs/bcm2835_defconfig` - **i.MX6平台**:`arch/arm/configs/imx_v6_v7_defconfig` - **x86平台**:`arch/x86/configs/x86_64_defconfig` 4. **设备树配置示例** 启用内核配置后还需在设备树中添加: ```dts gpio-keys { compatible = "gpio-keys"; button1 { label = "User Button"; gpios = <&gpio0 23 GPIO_ACTIVE_LOW>; linux,code = <KEY_ENTER>; }; }; ``` 5. **验证方法** ```bash # 查看输入设备 cat /proc/bus/input/devices # 测试按键事件 evtest /dev/input/eventX ``` **完整操作流程**: 1. 在内核源码目录执行: ```bash make <your_defconfig> # 例如:make imx_v6_v7_defconfig make menuconfig # 手动启用 GPIO Buttons ``` 2. 在`defconfig`文件中确认存在: ```bash grep CONFIG_KEYBOARD_GPIO .config ``` 建议根据具体硬件平台选择对应的defconfig文件进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值