从网上下载了最新的Chibios-RT源代码(@ec59801), 从testhal/STM32/STM32F4xx/USB_CDC_IAD中可以看到,这个是关于dual CDC的一个 sample, 使用的是Olimex STM32-E407的开发板(https://www.olimex.com/Products/ARM/ST/STM32-E407/resources/STM32-E407.pdf),想porting到stm32f4discovery开发板上,看了相关的代码(mcuconf.h, usbcfg.c, usbcfg.h), 发现它是由OTG_HS core(OTG_FS_2)来实现的。于是修改demos/STM32/RT-STM32F407-DISCOVERY-MEMS下的相关的代码:参考USB_CDC_IAD下的main.c,修改RT-STM32F407-DISCOVERY-MEMS的main.c, 同时将USB_CDC_IAD下的 usbcfg.c和usbcfg.h这两个文件copy过来。修改usbcfg.c这个文件, 使用OTG_FS core。编译后发现虽然电脑可以枚举出两个com口,但是使用超级终端无法使用。之后偿试修改mcucconf.h, 将STM32_USB_OTG1_RX_FIFO_SIZE设为1024后,第一个com口可以正常使用,但第二个com怎么改都无法使用。无意中看了一下os/hal/ports/STM32/LLD/OTGv1/stm32_otg.h这个文件,发现STM32_OTG1_ENDOPOINTS_NUMBER被定义成3, 而STM32_OTG2_ENDOPOINTS_NUMBE却被定义成了5。回头去看了一下reference manual, 才明白:
从stm32f407vg的reference manual上看, OTG_FS core只支持3个IN endpointer和3个OUT endpointer, 但是dual CDC需要两个IN endpointer和一个OUT endpointer, 所以想在OTG_FS core上要实现dual CDC是不可能的。再看看OTG_HS core,它支持5个IN endpointer和5个OUT endpointer, 所以是可以支持dual CDC的。
NOTE:
IAD: Interface Association Descriptor
楼主很棒,坚持。
1
1
1
1