板子的GPIO资源较少,如果想用一种简单的方式控制更多外设的话,除了添加扩展芯片,还有一种项目上用得比较多的方式是USBHID
通信,将
开发板作为主机,通过USB接口与支持USBHID协议的从机进行通信,这个方法非常简单,刚入门嵌入式的小白也必须熟练掌握,只需要应用层开发的知识和皮毛的驱动层开发知识。要想使用这种方式进行通信,板子的内核镜像就必须支持USBHID设备的检测与读写,检测是没什么问题的,但是能不能映射到设备文件,供开发者进行读写操作,那就需要检查内核编译选项了,这里刚好是比较坏的一种情况,米尔厂家出厂镜像是没有打开USBHID通信的,必须让开发者重新编译内核镜像,那么这里就涉及到内核编译的知识了:
下载并解压内核源码镜像:
- https://github.com/MYiR-Dev/myir-imx-uboot.git
编译选项采用米尔MYS-8MMX开发板的编译选项mys_iot_defconfig:
- /home/myir-imx-linux-develop/arch/ARM64/configs/
- make mys_iot_defconfig
这边还需要注意的是内核镜像的版本与使用内核源码编译第三方驱动ko文件的版本必须相同,在内核源码一级目录处可以找到配置的位置:
使用menuconfig打开内核编译选项, Device Drivers > HID support的 /dev/hidraw raw HID device support选项要打开,或者是在配置文件中添加此项配置的环境变量:
配置完毕之后,替换Image内核文件覆盖出厂内核文件:
- mount /dev/mmcblk1p1 /media
mmcblk1是开发板的SD卡,mmcblk1p1是SD卡的FAT分区,存放内核文件的位置:
重新启动之后,将USBHID设备插到板子的USB接口:
在/dev目录下找到/dev/hidraw设备:
安装-ludev软件库:
使用代码读写HID设备:
- handle = hid_open(2020, 2020, NULL);
- res = hid_read(handle, buf, sizeof(buf));