嵌入式开发者社区

标题: 怎么在C6748开发板上实现USB读卡器功能? [打印本页]

作者: lushidegreen    时间: 2015-6-1 11:20
标题: 怎么在C6748开发板上实现USB读卡器功能?
目标:将C6748开发板枚举成MSC设备,电脑通过USB读取开发板上的SD卡。
实现的基本思路:
1.在USB_DEV_MSC例程基础上修改,将其中的disk_read(),disk_write(),disk_initialize(),disk_ioctl()这几个函数映射到SD卡操作上。
2.上述4个函数的功能实现,参考不带BIOS的MMCSD例程。


作者: 希望缄默    时间: 2015-6-1 12:43
可以这样啊
作者: lushidegreen    时间: 2015-6-1 13:25
本帖最后由 lushidegreen 于 2015-6-1 13:28 编辑

因为我开发的产品程序是基于BIOS的,产品主要的功能已经实现,因此其他的功能也必须在BIOS下实现。
现在还差一个功能,就是连接PC后,让PC将产品识别为U盘。

我已经在BIOS下成功实现了48M虚拟U盘,其中48M就是USB_DEV_MSC中映射到内存上的空间。
在将disk_read(),disk_write(),disk_initialize(),disk_ioctl()这4个函数映射到SD卡操作时遇到了问题。
我本来想直接使用FatFs中的函数,但是在FatFs中这几个函数可能用到了信号量,而调用它们的上层函数USBDMSCStorageRead,USBDMSCStorageWrite,USBDMSCStorageNumBlocks可能是在ISR中执行的。最后就只能移植不带BIOS的MMCSD例程中的实现函数来实现disk_read()等4个函数。

通过上述方法,实现了所需要的USB读卡器功能。
作者: lushidegreen    时间: 2015-6-1 13:42
在实现USB读卡器过程中,分析USB_DEV_MSC例程可知,只需要实现几个底层函数,即文件usbdmscglue.c中的5个函数:
USBDMSCStorageOpen(),打开MSC设备
USBDMSCStorageClose(),关闭MSC设备
USBDMSCStorageRead(),读块
USBDMSCStorageWrite(),写块
USBDMSCStorageNumBlocks(),获取总的块数量

事实上,前两个函数只是对标志变量进行操作,因为SD卡的初始化操作在进行USB枚举前已经进行过了。
只需要实现后面3个函数即可。

作者: 希望缄默    时间: 2015-6-1 13:50
lushidegreen 发表于 2015-6-1 13:42
在实现USB读卡器过程中,分析USB_DEV_MSC例程可知,只需要实现几个底层函数,即文件usbdmscglue.c中的5个函 ...

我想知道的是楼主移植 USB 驱动库到 SYS/BIOS 并能够正常运行了么?这个是一个难点哦
作者: lushidegreen    时间: 2015-6-1 14:01
本帖最后由 lushidegreen 于 2015-6-1 14:09 编辑

我把USB_DEV_MSC例程中的disk_read()disk_write()函数改成了如下内容:
Uint32 MMCSD_disk_read(void * pvDrive, unsigned char *pucData, unsigned int ulSector, unsigned int ulNumBlocks)
{
        Uint32 res = 0;
        res = SDMMC_MEM_readBytes ( hSDMMCMemInfo, ulSector *512, ulNumBlocks * 512, pucData);
        return res;
}

Uint32 MMCSD_disk_write(void * pvDrive, unsigned char *pucData, unsigned int ulSector, unsigned int ulNumBlocks)
{
        Uint32 res = 0;
        Uint32 i;
        for (i = 0; i < ulNumBlocks; i++) {
                res = SDMMC_MEM_writeBytes ( hSDMMCMemInfo, (ulSector + i) * 512, 512, &pucData[i * 512]);
                UTIL_waitLoop(100000);
                UTIL_waitLoop(100000);
                UTIL_waitLoop(100000);
        }
        return res;
}

其中有一个问题,SD卡写块函数不能调用SDMMC_MEM_writeBytes() 进行连续写,而且在每个块直接需要加入UTIL_waitLoop(100000);延时,而且不能少于3个100000。因为这个原因,所以SD卡写的时候很慢。
另外一个问题是,只能使用创龙配的8G SD卡,用其它卡的时候只能正常读,写入则会导致SD卡文件系统崩溃。用常用的正常读卡器插入,PC无法正常读取文件。用WinHex查看,发现DBR扇区已经被非法修改。

我想问一下,这两个问题是什么原因造成的?{:soso_e132:}{:soso_e132:}
作者: lushidegreen    时间: 2015-6-1 14:06
希望缄默 发表于 2015-6-1 13:50
我想知道的是楼主移植 USB 驱动库到 SYS/BIOS 并能够正常运行了么?这个是一个难点哦 ...

我是直接移植USB_DEV_MSC例程的,已经实现USB读卡器功能。
只是还有一个适用性问题,就是写操作只能在你们创龙提供的8G SD卡,在其他SD卡上只能进行正确的读,一写就错。
作者: 希望缄默    时间: 2015-6-1 19:13
lushidegreen 发表于 2015-6-1 14:06
我是直接移植USB_DEV_MSC例程的,已经实现USB读卡器功能。
只是还有一个适用性问题,就是写操作只能在你 ...

可能是容量问题
要不你顺带在论坛分享下你 USB 库的移植经验 貌似不少工程师遇到同样的问题
作者: 希望缄默    时间: 2015-6-1 19:15
lushidegreen 发表于 2015-6-1 14:01
我把USB_DEV_MSC例程中的disk_read()和disk_write()函数改成了如下内容:
Uint32 MMCSD_disk_read(void * p ...

第一个问题可能是 SD 操作没有使用中断方式 必须等待写操作完成
作者: lushidegreen    时间: 2015-6-2 09:43
希望缄默 发表于 2015-6-1 19:13
可能是容量问题
要不你顺带在论坛分享下你 USB 库的移植经验 貌似不少工程师遇到同样的问题 ...

有空我整理一下,另起一帖"USB_DEV_MSC移植到BIOS"。
作者: lushidegreen    时间: 2015-6-2 09:53
希望缄默 发表于 2015-6-1 19:15
第一个问题可能是 SD 操作没有使用中断方式 必须等待写操作完成

事实上我查过SDMMC_MEM_writeBytes()函数的底层代码,是有等待操作完成的。
该函数有返回值,我尝试过类似下面的代码:
       for (i = 0; i < ulNumBlocks; ) {
                res = SDMMC_MEM_writeBytes ( hSDMMCMemInfo, (ulSector + i) * 512, 512, &pucData[i * 512]);
                UTIL_waitLoop(100000);
                if (E_PASS == res ) i++;
        }
这样会检测每个扇区是否写入成功,直到成功才写下一个扇区。
但结果还是会造成SD卡文件系统崩溃。
作者: 希望缄默    时间: 2015-6-2 10:27
lushidegreen 发表于 2015-6-2 09:53
事实上我查过SDMMC_MEM_writeBytes()函数的底层代码,是有等待操作完成的。
该函数有返回值,我尝试过类 ...

之前不是说用创龙提供的 SD 卡是正常的么?
作者: lushidegreen    时间: 2015-6-2 15:02
希望缄默 发表于 2015-6-2 10:27
之前不是说用创龙提供的 SD 卡是正常的么?

我用上面if (E_PASS == res ) i++;的方式,好像所有的卡都不行。
用前面说的,3个UTIL_waitLoop(100000);,创龙的8G卡是可以的。
作者: 希望缄默    时间: 2015-6-2 15:32
lushidegreen 发表于 2015-6-2 15:02
我用上面if (E_PASS == res ) i++;的方式,好像所有的卡都不行。
用前面说的,3个UTIL_waitLoop(100000) ...

对了你有没有试过用 SYS/BIOS 基于 RAW 模式读写 SD 卡的代码呢?
从理论上讲应该不会有什么问题的
作者: DSP_推粪球    时间: 2016-3-9 15:23
狂顶啊, 楼主是不是只要 修改Uint32 MMCSD_disk_write和 Uint32 MMCSD_disk_read就可以实现 USB和PC的通信呢??  USB小白问题让您见笑了。
作者: lushidegreen    时间: 2016-3-9 18:16
DSP_推粪球 发表于 2016-3-9 15:23
狂顶啊, 楼主是不是只要 修改Uint32 MMCSD_disk_write和 Uint32 MMCSD_disk_read就可以实现 USB和PC的通信 ...

该帖基本沉底了。
创龙工程师说,在DSP端实现读卡器功能意义不大,因此也没有出后续的支持例程。

1楼已经说明,目标是:将C6748开发板枚举成MSC设备,电脑通过USB读取开发板上的SD卡。


作者: daoerb    时间: 2017-6-8 15:05
高手.技术贴




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4