正点原子-imx6ull-EC11E18244AU驱动

一、硬件准备

二、连线

  • 连接示意图
    image

  • 实物图
    9fd3ba4fa389abf1779893feddad570d

三、设备树修改

基于正点原子官方提供的添加

/dts-v1/;

#include <dt-bindings/input/input.h>
#include "imx6ull.dtsi"

/ {
	model = "Freescale i.MX6 ULL 14x14 EVK Board";
	compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";

	chosen {
		stdout-path = &uart1;
	};

	memory {
		reg = <0x80000000 0x20000000>;
	};
......
/**************************************EC11E18244AU 编码器 Start******************************************/
	rotary_encoder {
		compatible = "rotary-encoder";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_rotary_encoder>;
		
		/* A相和B相连接的GPIO */
		gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>,  /* Channel A - EC11 Pin 1 (A相) */
			<&gpio1 1 GPIO_ACTIVE_HIGH>;  /* Channel B - EC11 Pin 3 (B相) */
		
		/* 编码器步数: EC11E18244AU 为 18 PPR,4倍频后为 72 */
		rotary-encoder,steps = <72>;
		
		/* 使用相对轴模式,每次旋转产生 +1 或 -1 */
		rotary-encoder,relative-axis;
		
		/* 如果编码器在半周期模式下工作,取消下面注释 */
		/* rotary-encoder,half-period; */
		
		/* 如果需要上翻功能(从最大值回到0),取消下面注释 */
		/* rotary-encoder,rollover; */
		
		status = "okay";
	};

	rotary_encoder_key {
		compatible = "gpio-keys";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_rotary_encoder_key>;
		#address-cells = <1>;
		#size-cells = <0>;
		autorepeat;

		rotary_key@1 {
			label = "ROTARY-KEY";
			linux,code = <28>;  /* KEY_ENTER */
			gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;  /* EC11 按键 - Pin 4/5 (SW) */
			gpio-key,wakeup;
			linux,input-type = <1>;  /* EV_KEY */
		};
	};
/**************************************EC11E18244AU 编码器 End******************************************/
......
};

......
&iomuxc {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_hog_1>;
	imx6ul-evk {
		pinctrl_hog_1: hoggrp-1 {
			fsl,pins = <
				MX6UL_PAD_UART1_RTS_B__GPIO1_IO19	0x17059 /* SD1 CD */
				MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT	0x17059 /* SD1 VSELECT */
				/* MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID    0x13058 */ /* USB_OTG1_ID - 已禁用,用于EC11 */
			>;
		};

		.....

		/****************************EC11E18244AU 编码器 Begin***********************************/
		pinctrl_rotary_encoder: rotary-encoder-grp {
			fsl,pins = <
				/* EC11 编码器 A相 - GPIO1_IO00 - 启用内部上拉 */
				MX6UL_PAD_GPIO1_IO00__GPIO1_IO00	0x17059
				/* EC11 编码器 B相 - GPIO1_IO01 - 启用内部上拉 */
				MX6UL_PAD_GPIO1_IO01__GPIO1_IO01	0x17059
			>;
		};

		pinctrl_rotary_encoder_key: rotary-encoder-key-grp {
			fsl,pins = <
				/* EC11 按键 - GPIO1_IO02 - 启用内部上拉电阻 */
				MX6UL_PAD_GPIO1_IO02__GPIO1_IO02	0x17059
			>;
		};
		/***************************EC11E18244AU 编码器 End************************************/

		......
	};
};
......

四、Linux内核添加rotary-encoder

  • 在Linux根目录执行make menuconfig
--> Device Drivers
  --> Input device support
    --> Miscellaneous devices
      --> Rotary encoders connected to GPIO pins

image

  • 编译
make distclean
make imx_v7_mfg_defconfig
make -j 16

五、烧写

六、IMX6ULL平台验证

  • 验证按键功能
    image
  • 旋钮功能
    image
posted @ 2026-06-18 16:10  DingJie1024  阅读(8)  评论(0)    收藏  举报