单片机学习小组
直播中

周煌煦

8年用户 1129经验值
私信 关注

如何将STM32F103C8T6的CustomHID和MSC USB设备进行复合?

如何将STM32F103C8T6的CustomHID和MSC USB设备进行复合?

回帖(1)

张玉珍

2022-2-22 11:02:49
本文目的:将STM32F103C8T6的CustomHID和MSC USB设备进行复合,EP0用于枚举 ,EP1用于键盘设备,EP2用于鼠标设备(支持绝对模式和相对模式),EP3用于MSC设备(配有官方demo版本和FAT16版本(默认)),以上全部为双端口。



正常情况下,键鼠设备可以共用一个接口,利用报告ID作为前缀,发送不同的report到主机上。但是这种情况下,报告描述符是写在同一个数组内的,当遇到某些主机(如IBM的AIX7系统)枚举阶段是boot启动模式时,并不会启动报告描述符的请求,那么键鼠均不能用,因此键鼠需要分配不同的接口(interface)。



本文虽然以CUSTOMHID和MSC为复合对象,但是也可为其他复合设备,其他型号的单片机提供参考,如F1 F4 F0 等单片机的HID+MSC,CDC+MSC,HID+CDC等,双复合,甚至是三复合均可。



本文某些内容不会写得太详细,仅为一些需要修改的东西,所涉及的内容某些作者也不是很理解。要求读者有一定的USB device的相关知识[1],本文方可有参考意义。





  • STM32Cube分别新建customhid和msc的工程文件。




  • 两个工程的HAL版本和USB库版本要一致,否则可能出现问题。
  • 新建工程的步骤在此不做过多的叙述,可以参考CSDN上的相关例子[2][3]。
  • 上述工作完成后,即可选定一个工程作为母版,建议选择较难的为母版,本位以cusomhid作为母版(注意:该母版也是经过我修改后的customhid工程)
  • 添加MSC类的inc和src文件(位于class文件夹类的文件)到HID的Class文件夹中,如图所示。










  • 在工程母版中新建两个文件




  • 添加u***d_storge_if.c和u***d_storge_if.h文件到工程中,添加h文件的路径
  • 新建u***d_composite.c和u***d_composite.h文件,并添加h文件的路径。这两个文件的作用是整合customhid和msc设备的各项操作,如Init,DeInit,Setup等操作。
  • composite两个文件可暂时不用书写,尝试编译一下工程,正常情况下,是编译成功的,若不成功,自行根据前面步骤及错误提示加以修改。




  • 编写composite.c和.h文件




  • 定义两个全局变量,因为有两个设备,如果有三个,记得这里也要定义三个。这里的解释可以参考这个网址[4]。此处的复合程序编写可以参考[4][5]






  • 定义复合函数结构体,这里面的函数都是完成两个设备的初始化,设置等操作。




  • 编写配置描述符,两个设备的配置描述符合写在一起,注意其中某些项。详情参考代码








  • IDA描述符


此处不需要IDA描述符,有关该描述符的定义参考该网站[6]。



  • PMA地址设置。


每个EP(EP0、EP1 EP2 PE3)都要有一个缓存区,需要配置每个EP的IN和OUT端点的缓存地址,该函数在u***d_conf.c函数里面。



注意这里的端点0的初始值是0x18,但是我参考了这个网站[7][8][9]的相关配置,故设置成EP0设置成0x40  而端点1属于键盘的接口,数据量一般不大,这里只设置了16个字节(0xd0-0xc0),其他的端口按规矩设置0x40,也就是64个字节,这里中断说明一下,PMA地址的最大值不能超过0x1C0,否则枚举不成功。



  • 为每个设备配置静态内存,修改文件名为u***d_conf.c和u***d_conf.h。


每个设备需要占据不同的内存空间,而默认生成的工程是以你母版工程的默认设备的地址如,如图所示,为USBD_mallc,



故要将相关函数及宏定义修改成以下的样子。



  • 去掉CustomHID发送report函数的state判断,直接往某个端点上发送报文。






  • 最后测试。


正确的结果是识别出如下的设备,弹出一个U盘,鼠标不断往下移动,并且不断输出一个a(英文输入法下)。



举报

更多回帖

发帖
×
20
完善资料,
赚取积分