本文为大家带来CherryUSB-HID设备实践,以MCXA156为例。开发环境搭建请参考RT-Thread的快速入门,咱们就直入主题,折腾USB去。
CherryUSB的移植适配
据笔者理解,RT-Thread历史上一共曾有过三个USB协议栈,原自带Legacy USB协议栈、TinyUSB、CherryUSB,但在2024年已经统一切换成CherryUSB了。CherryUSB的适配其实也有固定套路:第一步准确找到USB对应的IP,因为CherryUSB的IP实现是作为一个port存在,复用即可。那么对于MCXA156 USB来说,它的IP应该是kinetis一类;第二步实现usb_dc_low_level_init()与usb_dc_low_level_deinit()函数,前者主要做USB相关的时钟阿、中断阿、甚至pinmux等一些初始化,而后者就是去初始化是前者的逆向操作,这一步可以观察下仓库里的code是不是已经有对应的glue代码,如果有修改即可,如果没有添加下对应代码也不是难事。
对应到MCXA156来说,如上文所述有版友已经做完CherryUSB适配的修改,咱就搭个顺风车。
USB HID设备的实践
版友做完CherryUSB适配修改后测试的是CDC ACM设备,那笔者就换USB HID设备玩玩,就模拟个USB HID鼠标吧。
直接上代码,修改bsp/nxp/mcx/mcxa/frdm-mcxa156/board/ports/cherryusb/cherryusb.c,加入以下代码:
extern void hid_mouse_init(uint8_t busid, uintptr_t reg_base);
extern void hid_mouse_test(uint8_t busid);
static int rt_hw_mcxa156_cherryusb_hid_init(void)
{
hid_mouse_init(0, 0x400A4000u);
return 0;
}
INIT_COMPONENT_EXPORT(rt_hw_mcxa156_cherryusb_hid_init);
static int hid_example(int argc, char **argv)
{
hid_mouse_test(0);
return 0;
}
MSH_CMD_EXPORT(hid_example, USB hid example);
笔者觉得代码挺简单的,调用hid_mouse_init()初始化一个USB HID鼠标,调用hid_mouse_test()做具体测试,其实就是鼠标画圆了可参见文末视频,代码基本是self-commented and explained,在CherryUSB的手册里也有对应的函数API介绍,如有疑问可回帖垂询。
然后在bsp/nxp/mcx/mcxa/frdm-mcxa156/目录下运行如下命令进入menuconfig配置界面
scons --menuconfig
进入menuconfig配置界面后,按如下步骤配置一下:
配置主界面进RT-Thread Components
再进Device Drivers
最下面有Using USB with CherryUSB
进入CherryUSB配置页面,这里选中Enable usb device mode
再Enter键进入USB Device模式配置,这里选中FS,IP选kinetis_mcx, 并Enable usb hid device, usb device template选hid_mouse
配置完毕,运行如下命令编译:
scons -j8
编译成功,在当前目录下也会有rtthread.bin文件生成,用如下pyocd命令即可烧录:
pyocd load -e sector -t mcxa156vll rtthread.bin
烧录完毕后板子会自动重启,电脑系统中应该会识别出一个新USB HID鼠标设备,笔者电脑的linux系统下dmesg看到内容如下图所示:
在Finsh终端运行hid_example命令,会看到鼠标画圆
测试视频如下:
https://www.bilibili.com/video/BV19dX9YUEGr/
End
想要在RT-Thread平台或社区投放内容?或想参与相关直播活动及赛事?RT-Thread已开放对接窗口,请通过邮件与我们取得联系,期待合作!
合作邮箱: tongfangyi@rt-thread.com
点击“阅读原文”