怎么在C6748开发板上实现USB读卡器功能? - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12031|回复: 16
打印 上一主题 下一主题

怎么在C6748开发板上实现USB读卡器功能?

[复制链接]

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
跳转到指定楼层
楼主
发表于 2015-6-1 11:20:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目标:将C6748开发板枚举成MSC设备,电脑通过USB读取开发板上的SD卡。
实现的基本思路:
1.在USB_DEV_MSC例程基础上修改,将其中的disk_read(),disk_write(),disk_initialize(),disk_ioctl()这几个函数映射到SD卡操作上。
2.上述4个函数的功能实现,参考不带BIOS的MMCSD例程。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2015-6-1 12:43:15 | 只看该作者
可以这样啊
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
板凳
 楼主| 发表于 2015-6-1 13:25:32 | 只看该作者
本帖最后由 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读卡器功能。
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
地板
 楼主| 发表于 2015-6-1 13:42:22 | 只看该作者
在实现USB读卡器过程中,分析USB_DEV_MSC例程可知,只需要实现几个底层函数,即文件usbdmscglue.c中的5个函数:
USBDMSCStorageOpen(),打开MSC设备
USBDMSCStorageClose(),关闭MSC设备
USBDMSCStorageRead(),读块
USBDMSCStorageWrite(),写块
USBDMSCStorageNumBlocks(),获取总的块数量

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

点评

我想知道的是楼主移植 USB 驱动库到 SYS/BIOS 并能够正常运行了么?这个是一个难点哦  详情 回复 发表于 2015-6-1 13:50
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
5#
发表于 2015-6-1 13:50:48 | 只看该作者
lushidegreen 发表于 2015-6-1 13:42
在实现USB读卡器过程中,分析USB_DEV_MSC例程可知,只需要实现几个底层函数,即文件usbdmscglue.c中的5个函 ...

我想知道的是楼主移植 USB 驱动库到 SYS/BIOS 并能够正常运行了么?这个是一个难点哦
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
6#
 楼主| 发表于 2015-6-1 14:01:04 | 只看该作者
本帖最后由 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:}

点评

第一个问题可能是 SD 操作没有使用中断方式 必须等待写操作完成  详情 回复 发表于 2015-6-1 19:15
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
7#
 楼主| 发表于 2015-6-1 14:06:56 | 只看该作者
希望缄默 发表于 2015-6-1 13:50
我想知道的是楼主移植 USB 驱动库到 SYS/BIOS 并能够正常运行了么?这个是一个难点哦 ...

我是直接移植USB_DEV_MSC例程的,已经实现USB读卡器功能。
只是还有一个适用性问题,就是写操作只能在你们创龙提供的8G SD卡,在其他SD卡上只能进行正确的读,一写就错。

点评

可能是容量问题 要不你顺带在论坛分享下你 USB 库的移植经验 貌似不少工程师遇到同样的问题  详情 回复 发表于 2015-6-1 19:13
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
8#
发表于 2015-6-1 19:13:47 | 只看该作者
lushidegreen 发表于 2015-6-1 14:06
我是直接移植USB_DEV_MSC例程的,已经实现USB读卡器功能。
只是还有一个适用性问题,就是写操作只能在你 ...

可能是容量问题
要不你顺带在论坛分享下你 USB 库的移植经验 貌似不少工程师遇到同样的问题
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
9#
发表于 2015-6-1 19:15:49 | 只看该作者
lushidegreen 发表于 2015-6-1 14:01
我把USB_DEV_MSC例程中的disk_read()和disk_write()函数改成了如下内容:
Uint32 MMCSD_disk_read(void * p ...

第一个问题可能是 SD 操作没有使用中断方式 必须等待写操作完成
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
10#
 楼主| 发表于 2015-6-2 09:43:29 | 只看该作者
希望缄默 发表于 2015-6-1 19:13
可能是容量问题
要不你顺带在论坛分享下你 USB 库的移植经验 貌似不少工程师遇到同样的问题 ...

有空我整理一下,另起一帖"USB_DEV_MSC移植到BIOS"。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-4-27 02:22 , Processed in 0.040879 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表