失败了无数次之后,一瞬间竟然可以了。成功和失败只隔了一层纸,但是个中滋味却相差甚远...
简单记录一下移植过程:
1、在SD实现读写的移植基础上展开。
2、usb端口初始化和USB鼠标一样,无需改变。
3、在此基础上加入下图几个文件
usb_msc_structs.c是大容量存储设备描述符文件。
usbdsdcard.c是基于fatfs的sd卡读写函数文件,主要有以下几个函数
- extern void * USBDMSCStorageOpen(unsigned long ulDrive);
extern void USBDMSCStorageClose(void * pvDrive);
extern unsigned long USBDMSCStorageRead(void * pvDrive, unsigned char *pucData,
unsigned long ulSector,
unsigned long ulNumBlocks);
extern unsigned long USBDMSCStorageWrite(void * pvDrive, unsigned char *pucData,
unsigned long ulSector,
unsigned long ulNumBlocks);
unsigned long USBDMSCStorageNumBlocks(void * pvDrive);
复制代码它们供usb_msc_structs.c里面的tUSBDMSCDevice g_sMSCDevice实例引用。
usbdmsc.c是几个USB操作SD的API函数,供外部程序调用
- //*****************************************************************************
//
// API Function Prototypes
//
//*****************************************************************************
extern void *USBDMSCInit(unsigned long ulIndex,
const tUSBDMSCDevice *psMSCDevice);
extern void *USBDMSCCompositeInit(unsigned long ulIndex,
const tUSBDMSCDevice *psMSCDevice);
extern void USBDMSCTerm(void *pvInstance);
extern void USBDMSCMediaChange(void *pvInstance,
tUSBDMSCMediaStatus eMediaStatus);
复制代码
4、加入相应的头文件和包含
修改库头文件请备份。
5、创建一个接收usb事件信息的回调函数
unsigned long
USBDMSCEventCallback(void *pvCBData, unsigned long ulEvent,
unsigned long ulMsgParam, void *pvMsgData)
6、初始化用到的UDMA模块
TI的例程里面用了DMA模块,我们用他的usbdmsc.c的话就必须要打开DMA模块,
我们要加入一个初始化函数。这个就是让我失败了一次又一次的家伙。。
但是我仿真时老是会死在USBDMSCCompositeInit(unsigned long ulIndex, const tUSBDMSCDevice *psDevice)函数的
MAP_uDMAChannelAttributeDisable(psInst->ucINDMA, UDMA_ATTR_ALL);
MAP_uDMAChannelAttributeDisable(psInst->ucOUTDMA, UDMA_ATTR_ALL);
这两句上,找不到原因,我就把他们注释掉了,哪位大侠能指导下为什么?谢谢
初始化前记得加这句tDMAControlTable sDMAControlTable[64] __attribute__ ((aligned(1024)));
7、初始化USB模块为大容量存储设备
- if(!USBDMSCInit(0, (tUSBDMSCDevice *)&g_sMSCDevice))
{
Show_Msg("Init USB MSC fail");
return 0;
}
Show_Msg("Init USB device ");
复制代码
8、主函数里进行信息处理,显示
加入USBDMSCTerm((tUSBDMSCDevice *)&g_sMSCDevice);函数可以人为断开连接。
记得插拔卡必须要断电,本人对此程序造成的硬件损坏不负责
测试读写时最好两个usb口供电,不然屏幕会闪烁,可能电压不稳。
测试读出大概2xx-4xxK/s;写入居然是丢人的1xK;不知道原因,那位大侠分析一下教教我啊。
谢谢了。这个调试占用了我很多时间,要做别的事了,唉,时间不够用啊。
最后上图,源码,视频,福利
视频在这里:
[
本帖最后由 shower.xu 于 2012-6-9 16:37 编辑 ]