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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: lushidegreen
打印 上一主题 下一主题

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

[复制链接]

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
11#
 楼主| 发表于 2015-6-4 14:46:11 | 显示全部楼层
本帖最后由 lushidegreen 于 2015-6-4 14:56 编辑

SysDelayTimerSetup()函数的功能是初始化定时器TMR0_TMR12,即TMR0的低32位,然后将TMR0_TMR12中断映射到硬件中断INT10上,中断号为SYS_INT_T64P0_TINT12 (4),中断函数为TimerIsr()。
Sysdelay()函数的功能是,设置定时时间、启动定时器TMR0_TMR12,并等待直到定时时间到,即实现延时功能。在BIOS下实现时,可直接使用Task_sleep()实现。因此,将Sysdelay()函数改为如下:
void Sysdelay(unsigned int milliSec)
{
        Task_sleep(milliSec);
}
再在文件头部加#include <ti/sysbios/knl/Task.h>语句。
SysStartTimer()函数用于设定定时时间,并启动定时器TMR0_TMR12。
SysStopTimer()函数用于停止定时器TMR0_TMR12。
SysIsTimerElapsed()函数用于检测定时时间是否已经到。
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
12#
 楼主| 发表于 2015-6-4 14:46:29 | 显示全部楼层
本帖最后由 lushidegreen 于 2015-6-4 14:51 编辑

由于BIOS系统占用了TMR0,sysdelay.c中TMR0相关的操作都换成对TMR1的操作:把SOC_TMR_0_REGS全部替换成SOC_TMR_1_REGS;把SYS_INT_T64P0_TINT12全部替换成SYS_INT_T64P1_TINT12。
将TimerIsr()函数中的其它代码全部屏蔽,只保留留flagIsrCnt = 0;。
将AintcTimerIntrSetUp()函数整个注释,将SysDelayTimerSetup()函数内部代码全部屏蔽。
然后到cfg文件中配置TMR1,以实现SysDelayTimerSetup()函数的功能。配置步骤如下图:



本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
13#
 楼主| 发表于 2015-6-4 14:49:42 | 显示全部楼层
本帖最后由 lushidegreen 于 2015-6-4 14:53 编辑


重新编译,出现3个错误和2个警告。原因是TimerIsr()是局部函数,把TimerIsr()的static属性去掉即可。
重新编译程序,没有错误和警告。
将程序下载到TL6748开发板,其运行结果和裸奔的USB_HOST_MSC是一样的。
至此,USB_HOST_MSC例程成功移植到SYS/BIOS下。


本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
14#
 楼主| 发表于 2016-1-27 08:46:15 | 显示全部楼层
human 发表于 2016-1-26 15:09
感谢您的无私分享的,广州创龙决定给您奖励的

是不是真的?准备奖励点啥?

点评

给您奖励500代金券,直接使用!跟客服说明就行  详情 回复 发表于 2016-2-29 11:01
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
15#
 楼主| 发表于 2016-3-4 09:31:51 | 显示全部楼层
human 发表于 2016-2-29 11:01
给您奖励500代金券,直接使用!跟客服说明就行

非常感谢!
但是好像没什么可买的。
我现在做的是音频产品,创龙淘宝里面没发现音频相关的模块。
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
16#
 楼主| 发表于 2016-3-4 09:49:12 | 显示全部楼层
本帖最后由 lushidegreen 于 2016-3-10 16:54 编辑

要不给我奖励点实物吧,这500代金券换成一个读卡器和3张8G的SD卡寄给我就可以了。
这个还实用点,我可以用在公司产品上,自己也可以用在相机上。
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

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

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

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

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 04:15 , Processed in 0.043468 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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