瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。
【公众号】迅为电子
【粉丝群】824412014(加群获取驱动文档+例程)
【视频观看】嵌入式学习之Linux驱动(第十三篇 输入子系统_全新升级)_基于RK3568
【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板
第十三篇 输入子系统
第137章 初识input子系统
137.1什么是输入子系统?
在Linux中,input子系统是专门为处理输入类设备而设计的一个子系统或框架。它提供了一套通用的接口和机制,用于驱动开发人员编写和管理输入设备的驱动程序。输入设备包括键盘、鼠标、触摸屏、游戏手柄等,具体示意图如下所示:
使用input子系统的主要目的是规范和简化输入设备驱动的开发过程,以提高驱动的通用性和兼容性。它通过将输入设备的共同功能和处理逻辑提取出来,编写成通用的代码,将差异化的代码留给具体的设备驱动开发人员,这种分工合作的方式使得驱动开发人员可以更专注地处理设备特定的细节,从而大大降低工程师的开发难度。
在不使用输入子系统的情况下,可能会使用不同的代码来表示相同的动作。例如,一个同学可能使用数字1来表示按键按下,数字0来表示按键松开;而另一个同学可能使用数字2来表示按键按下,数字3来表示按键松开。这样的情况下,应用程序很难适配所有不同的驱动程序,从而导致程序的兼容性和移植性较差。
而在使用输入子系统后就可以解决这个问题。例如,当不同厂家的键盘连接到计算机上时,它们的驱动程序都是按照输入子系统框架来编写的。这意味着所有厂家的驱动程序都使用相同的代码规范来表示按键动作,例如使用1表示按下,使用0表示松开。这样一来,无论是哪个厂家的键盘,都可以在任意计算机上正常使用。
使用输入子系统的另一个好处是驱动开发人员不需要自己实现文件操作集函数。输入子系统已经提供了一套标准的接口和函数,开发人员只需要按照这些接口进行开发,而无需关心底层的文件操作细节。这样可以大大降低开发的难度和复杂度。
综上使用input子系统的作用如下所示:
(1)兼容性: 输入子系统提供了一个统一的框架和接口,使得不同厂家的输入设备都可以按照相同的规范进行驱动开发。无论是键盘、鼠标还是其他输入设备,只要符合输入子系统定义的接口和事件格式,都可以在Linux系统中正常工作。这样一来,工程师不需要针对每个厂家的设备编写和维护不同的驱动代码,大大提高了设备的兼容性。
(2)统一的驱动编程方式: 输入子系统定义了一套通用的驱动编程方式,工程师只需要按照输入子系统的规范进行开发即可。输入设备的驱动模块需要实现相应的接口函数,如初始化函数、事件处理函数等。这些接口函数的实现方式是相同的,不论是键盘驱动还是鼠标驱动,都可以按照统一的方式进行开发。这样一来,工程师可以更加专注于设备特定的细节,而无需关心通用的驱动框架,简化了开发过程。
(3)统一的应用操作接口: 输入子系统通过提供一组统一的应用操作接口,如/dev/input/eventX,使得应用程序可以方便地与输入设备进行交互。应用程序可以通过读取这些设备节点,获取输入事件的信息,并进行相应的处理。无论是哪种类型的输入设备,应用程序都可以使用相同的方式进行访问和操作。这样一来,应用程序的开发人员不需要关心底层输入设备的细节,可以更加专注于应用程序的逻辑开发。
137.2 如何确定输入设备和节点的关系
在输入子系统中,输入设备与设备节点之间有一定的对应关系。以下是判断设备节点与输入设备的方法:
1.设备名: 输入子系统的设备节点可以分为通用设备名和专用设备名。专用设备名通常可以从设备名中直接识别出设备类型,例如"keyboard"(键盘)或"mouse"(鼠标)。而通用设备名则不能直接确定设备类型。如下图所示,event0-event4属于通用设备名,而mouse0和mouse2属于专用设备名。
2.试探性方法: 可以使用"cat"命令打开设备节点文件,然后对物理设备进行操作,观察终端是否有输出。例如,对于键盘设备,你可以运行"cat /dev/input/eventX",其中"/dev/input/eventX"是设备节点的路径,然后按下键盘按键,观察终端是否输出相应的字符。通过这种试探性的方法,你可以判断设备节点与具体设备之间的对应关系。例如使用以下命令来测试鼠标,如下所示:
sudo cat /dev/input/mouse0
注:鼠标节点也可能是mouse1或者mouse2。
3.查看输入设备信息:可以使用以下命令查看"/proc/bus/input/devices"文件:
cat /proc/bus/input/devices
部分打印截图如下所示:
该文件记录了当前系统的所有输入设备的信息在该文件中,你可以找到与设备节点相关的信息,例如设备名称、供应商ID、产品ID等。通过对比设备节点的路径和设备信息中的对应字段,你可以确定设备节点与特定输入设备之间的关系,例如可以通过上述打印信息查看到,键盘对应的设备节点为/dev/input/event1,如下图所示:
其他相关内容的解释如下所示:
I: Bus=0011 Vendor=0001 Product=0001 Version=ab41: 这一行显示了设备的总线类型、供应商ID、产品ID和固件版本。在这个例子中,该设备的总线类型为0011,供应商ID为0001,产品ID为0001,固件版本为ab41。
N: Name="AT Translated Set 2 keyboard": 这一行显示了设备的名称。在这个例子中,该设备的名称为"AT Translated Set 2 keyboard"。
P: Phys=isa0060/serio0/input0: 这一行显示了设备的物理位置。在这个例子中,该设备的物理位置是isa0060/serio0/input0。
S: Sysfs=/devices/platform/i8042/serio0/input/input1: 这一行显示了设备在sysfs文件系统中的路径。在这个例子中,该设备的路径是/devices/platform/i8042/serio0/input/input1。
U: Uniq=: 这一行显示了设备的唯一标识符。在这个例子中,唯一标识符为空。
H: Handlers=sysrq kbd event1 leds: 这一行显示了设备的处理程序。它指示了处理设备输入事件的程序或模块。在这个例子中,设备有sysrq、kbd、event1和leds这些处理程序,其中event1就表示设备节点为/dev/input/event1。
B: PROP=0: 这一行显示了设备的属性。在这个例子中,设备的属性值为0。
B: EV=120013: 这一行显示了设备支持的事件类型。在这个例子中,设备支持EV_SYN、EV_KEY、EV_MSC和EV_LED这些事件类型。
B: KEY=402000000 3803078f800d001 feffffdfffefffff fffffffffffffffe: 这一行显示了设备支持的按键。每个按键对应一个位,1表示按键被按下,0表示按键未被按下。该行显示了按键的状态,以16进制表示。
B: MSC=10: 这一行显示了设备支持的杂项事件。在这个例子中,设备支持MSC_SCAN事件。
B: LED=7: 这一行显示了设备支持的LED灯。在这个例子中,设备支持3个LED灯,使用一个7位的二进制数表示灯的状态。
上面讲解的cat命令是一种试探性的方法,除此之外还可以使用hexdump命令对输出信息进行二进制内容查看,它可以将二进制文件以十六进制和ASCII码的形式进行显示。它的基本语法为:
hexdump [选项] [文件]...
下面是一些常用的选项:
-C: 以规范的格式输出十六进制和ASCII码。它会按照十六进制的形式显示文件的内容,并在每行的右侧显示相应的ASCII码。这种格式可以很方便地查看二进制文件的内容。
-b: 以单字节八进制的形式显示文件内容。每个字节的值将以八进制数字的形式显示。
-c: 以单字节字符的形式显示文件内容。每个字节将以字符的形式显示,非可打印字符将显示为"."。
-d: 以双字节十进制的形式显示文件内容。每个字节对应的十进制值将以十进制数字的形式显示。
-o: 以双字节八进制的形式显示文件内容。每个字节的值将以八进制数字的形式显示。
-x: 以双字节十六进制的形式显示文件内容。每个字节的值将以十六进制数字的形式显示。
-s offset: 从指定的偏移量开始输出文件内容。可以使用十进制或十六进制表示偏移量。
然后使用以下命令对键盘的输出信息进行二进制内容查看,如下图所示:
sudo hexdump /dev/input/event1
137.3.确定开发板输出设备节点
在上个小节基于虚拟机ubuntu来学习了如何确定输入设备和节点的关系,本小节将使用RK3568开发板进行实践,开发板上的的输入设备如下所示:
总共有4个输入设备,分别是触摸屏、红外接收器、adc按键以及耳机接口,然后启动开发板,进入系统之后如下图所示:
首先通过以下命令查看总共有多少个输入设备,如下图所示:
ls /dev/input/
可以看到总共有event0-event4 五个通用设备名,上面我们总共找出来了4个输入设备,那这里为什么会有五个节点呢,所以我们就需要使用下面的命令查看详细的输入设备信息了,如下图所示:
cat /proc/bus/input/devices
从上到下依次是红外接收器、电源power按键、触摸屏、adc按键和耳机,为了更简单的进行演示,这里选取触摸屏和adc按键来进行测试,从上面的信息可以得到触摸屏和adc按键分别对应event2和event3,所以可以使用以下命令对两个输入设备的输出信息进行二进制内容查看,如下图所示:
hexdump /dev/input/event2
hexdump /dev/input/event3
至此,开发板输出设备节点的测试就完成了。