【分享】USB_HOST_MSC移植到BIOS详细步骤 - 第3页 - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: lushidegreen

【分享】USB_HOST_MSC移植到BIOS详细步骤

[复制链接]

0

主题

3

帖子

25

积分

新手上路

Rank: 1

积分
25
发表于 2016-3-27 15:46:15 | 显示全部楼层
lushidegreen 发表于 2015-6-4 14:49
重新编译,出现3个错误和2个警告。原因是TimerIsr()是局部函数,把TimerIsr()的static属性去掉即可。
重新 ...

大神,之所以是大神,就是因为他做了别人没有做的事儿,他才成为大神。今天加班,从早上到现在这一刻,我终于按着你说的移植成功,牛,给你32个赞,拿去,:kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss::kiss:
回复 支持 反对

使用道具 举报

0

主题

3

帖子

25

积分

新手上路

Rank: 1

积分
25
发表于 2016-3-27 15:49:10 | 显示全部楼层
而且我发现你的描述和用词相当准确,知道任何一个可能出错的步骤,高,高,的确高!!!!!
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
 楼主| 发表于 2016-4-15 18:03:03 | 显示全部楼层
lushidegreen 发表于 2015-6-4 14:49
重新编译,出现3个错误和2个警告。原因是TimerIsr()是局部函数,把TimerIsr()的static属性去掉即可。
重新 ...

后续的开发过程中发现本帖有个问题。
当把读卡器从USB OTG接口拔下时,串口会发送“...disconnect”信息,
但是如果保持读卡器和USB OTG的连接,只拔插SD卡,程序会就会卡死。
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
 楼主| 发表于 2016-4-15 18:12:07 | 显示全部楼层
经仿真跟踪,发现程序卡在了usbhostenum.c文件的USBHCDControlTransfer( )函数,卡在4222行语句:
while((g_sUSBHEP0State[ulIndex].eState != EP0_STATE_IDLE)&&(!IsTimerElapsed()))

硬件问题导致了while中的第一个条件总数成立。
然后就是IsTimerElapsed()函数了,该函数在工程的delay.c文件中。
该函数的返回值跟一个变量flagIsrCnt有关,而该变量被清零,才可能退出上述的while。

搜索文件,发现只有一个地方能将flagIsrCnt清零,那就是TimerIsr( )定时中断函数。
因此我判断,定时中断没有被正常调用。运行测试,发现果真如此。
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
 楼主| 发表于 2016-4-15 18:14:15 | 显示全部楼层
分析发现,是USB枚举超时了,而超时退出机制没有起作用。
控制USB枚举超时的函数都在工程的delay.c文件中,因此修改就行了。
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
 楼主| 发表于 2016-4-15 18:16:41 | 显示全部楼层
本帖最后由 lushidegreen 于 2016-4-15 18:19 编辑

修改第一步:修改定时器的配置。
既然是无法进入定时器中断函数引起的,而在此定时器的作用只是判定超时,改用其他方法,不用中断了。
.cfg文件中,将定时器配置改为下图:

使用定时器1的低32位,周期赋值-1,其实就是0xFFFFFFFF,自动运行,周期性连续运行,中断号-1表示不启用,中断函数也写成null。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
 楼主| 发表于 2016-4-15 18:27:08 | 显示全部楼层
修改第二步:修改delay.c中的函数。
先在开头定义两个变量:static volatile unsigned long tickstart, delaytime;
StartTimer函数改为:
void StartTimer(unsigned int milliSec)
{
        tickstart = TimerCounterGet(SOC_TMR_1_REGS, TMR_TIMER12);
        delaytime = (unsigned long)milliSec * TMR_PERIOD_LSB32;
}
将StopTimer函数内容清空。
IsTimerElapsed函数改为:
unsigned int IsTimerElapsed(void)
{
        unsigned long tickcurrent;
        tickcurrent = TimerCounterGet(SOC_TMR_1_REGS, TMR_TIMER12);
        if ((tickcurrent - tickstart) > delaytime) {
                return TRUE;
        } else {
                return FALSE;
        }
}
可以将TimerIsr函数删除。

回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
 楼主| 发表于 2016-4-15 18:31:44 | 显示全部楼层
至此,修改完成。

在应用程序中,如果检测到SD卡操作失败,则可通过
USBHMSCDriveClose(g_ulMSCInstance);函数关闭USB MSC设备,
并清除变量iStatus = 0;

然后重新跳到USB MSC的初始化部分执行,程序即可继续运行。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2016-12-29 22:56:17 | 显示全部楼层
早点发这个啊,当初学的时候看了好多资料才弄懂了,支持一下
回复 支持 反对

使用道具 举报

32

主题

72

帖子

499

积分

中级会员

Rank: 3Rank: 3

积分
499
发表于 2018-1-29 21:41:46 | 显示全部楼层
很详细啊。厉害啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-19 18:12 , Processed in 0.041525 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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