[CherryUSB] CherryUSB MSC device 使用注意点
cherryusb 提供了 msc device 的实现,可以搭配 SD 卡或者 nor flash 实现 U盘的功能,也提供了 msc 的一些宏,用于在不同的场景中使用。本节主要介绍不同使用场景下的注意事项。
usbd_msc_get_cap 的使用
usbd_msc_get_cap 用于读取介质的信息,包括读取扇区数和每个扇区的大小,需要注意, block_size 目前只能为 512(SD 卡),2048(nand flash),4096(nor flash)。
配置读写函数在不同的上下文
默认 usbd_msc_sector_read 和 usbd_msc_sector_write 函数在中断中使用,因此如果实现的介质读写 API 是纯阻塞的,则会影响其他中断执行。以下几类宏可以将读写函数配置到不同的上下文。
CONFIG_USBDEV_MSC_POLLING表示将读写函数放在 while(1) 中运行,同时,用户需要在 while(1) 中手动调用usbd_msc_polling函数才能使用读写功能CONFIG_USBDEV_MSC_THREAD表示将读写函数放在线程中执行,默认CONFIG_USBDEV_MSC_STACKSIZE为 2048字节,根据用户实现的读写函数,如果超了则需要更改。推荐在使用 RTOS 时,打开该宏。
MSC 性能优化
msc 在工作时,内部会有一个 buffer 用于存储数据供介质读入或者写入到介质中,大小为 CONFIG_USBDEV_MSC_MAX_BUFSIZE,默认为 512 字节,需要注意该值必须是介质扇区大小的整倍数。但是对于 SD 卡这种,单扇区读写的速度是非常低的,因此,如果对读写速度有要求,则增大 CONFIG_USBDEV_MSC_MAX_BUFSIZE 值,但是不能超过 USB_SOC_DCD_QTD_COUNT_EACH_ENDPOINT * 16K,USB_SOC_DCD_QTD_COUNT_EACH_ENDPOINT 默认为8,也就是不能超过 128K,否则会溢出,如果需要更大的 buffer,则修改 USB_SOC_DCD_QTD_COUNT_EACH_ENDPOINT 参数。但是,上述操作,也会相应的增加 ram 的开销,因此,用户需要根据实际情况来定。
MSC 卸载
cherryusb 支持 MSC 卸载功能,通常用于 PC 弹出 U 盘时使用。需要注意,弹出 U盘以后,如果是复合设备,都会全部弹出,无法只弹出 U盘。当 PC 弹出 U盘时,用户可以通过 usbd_msc_get_popup 获取弹出状态,并调用 usbd_deinitialize 卸载 USB 驱动,举例如下:
if(usbd_msc_get_pop(0))
{
usbd_deinitialize(0);
}