发 帖  
原厂入驻New
USB_HOST_MSC怎么移植到BIOS?
525 BIOS USB
分享
Step1.新建BIOS(选择Typical型)工程,命名为USB_HOST_MSC_sysbios。

0
2019-9-19 03:41:16   评论 分享淘帖 邀请回答

相关问题

28个回答
Step3. 复制原工程的main.c文件中除main函数外的所有代码,粘贴到新工程的main.c文件中#include <ti/sysbios/knl/Task.h>语句后面

2019-9-19 04:05:01 评论

举报

Step4.把原工程main函数中do之前的语句复制,粘贴到新工程main函数
System_printf("enter main()\n");语句后面

2019-9-19 04:16:39 评论

举报



Step5. 把原工程main函数中do{……}while(1);中的所有内容复制,粘贴到新工程main函数taskFxn()任务函数中,替代其原来的内容。并在do语句前加入变量定义int iStatus;。
Step6. 添加平台配置,如下图
2019-9-19 04:27:59 评论

举报



Step7. 参考原工程添加包含路径
Step8. 参考原工程添加包含库文件


需要注意的是,Step6、Step7、Step8的相关路径应该根据自己的文件夹结构进行设置。





2019-9-19 04:44:38 评论

举报



Step9.编译工程,出现1个错误和23个警告。
双击警告并不能正确定位错误位置。

错误原因是integer.h中22行枚举类型BOOL的定义与xdc\std.h中对FALSE和TRUE有冲突。

根据错误信息..\..\..\Library\ThirdParty\fatfs\src\integer.h,找到Library\ThirdParty\fatfs\src文件夹,把其中的3个h文件都复制到新工程目录下。

把Step7中设置的包含路径../../../Library/ThirdParty/fatfs/src删除。

重新编译,依然出现1个错误和23个警告。

双击错误,可定位到integer.h文件的22行。

把integer.h文件22行改为typedef enum {mFALSE = 0, mTRUE} BOOL;,把工程中ff.c文件中的所有FALSE替换成mFALSE,所有TRUE替换成mTRUE。



2019-9-19 05:01:41 评论

举报

重新编译,注意此时要用Rebuild Project,没有错误,23个警告。
到工程选项中添加一个宏定义ewarm。

重新编译,剩1个警告。这是由于InterruptInit()函数的声明和实体不一致造成的,在前面声明部分加上static即可。

应注意的是,在原工程USB_HOST_MSC中配置了一个宏DMA_MODE,该宏可能是用于控制USB的数据传输方式。因此在新工程中也应定义DMA_MODE,方法和添加ewarm定义相同。



2019-9-19 05:13:26 评论

举报



Step10.删除DSP中断初始化函数InterruptInit(),因为BIOS启动后会对DSP中断进行初始化。
Step11.注册USB中断函数
USBInterruptInit()的功能是将USB中断映射到硬件中断INT5上,中断ID为SYS_INT_USB0(19),中断函数USB0HostIntHandler ()。
在BIOS中,到cfg文件中进行配置,如下图,配置完成后,将USBInterruptInit()函数删除。



2019-9-19 05:31:46 评论

举报

Step12.接下来要处理的是DelayTimerSetup()等函数。
这是StarterWare中的函数,所在头文件为delay.h。到StarterWare目录
C:\ti\C6748_StarterWare_1_20_04_01下找到delay.c文件 (需事先安装StarterWare),将该文件复制到新建的工程中。
查看delay.c文件,可以发现其中的函数,都是直接调用了另外一个名字很像的函数。
delay.h文件所列函数如下图,上面的5个函数分别直接调用了下面的5个函数,即本质上只有5个函数。

在StarterWare目录搜索发现,下面的5个函数的实现是在sysdelay.c中。将sysdelay.c文件复制到新建工程中。

重新编,出现一个错误,将sysdelay.c中的#include "evmC6748.h"语句删除即可。



2019-9-19 05:37:32 评论

举报

.pcb{margin-right:0}
大神,之所以是大神,就是因为他做了别人没有做的事儿,他才成为大神。今天加班,从早上到现在这一刻,我终于按着你说的移植成功,牛,给你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:r
2019-9-19 05:42:38 评论

举报

而且我发现你的描述和用词相当准确,知道任何一个可能出错的步骤,高,高,的确高!!!!!r
2019-9-19 05:54:16 评论

举报


后续的开发过程中发现本帖有个问题。
当把读卡器从USB OTG接口拔下时,串口会发送“...disconnect”信息,
但是如果保持读卡器和USB OTG的连接,只拔插SD卡,程序会就会卡死。r
2019-9-19 06:01:26 评论

举报

经仿真跟踪,发现程序卡在了usbhostenum.c文件的USBHCDControlTransfer( )函数,卡在4222行语句:
while((g_sUSBHEP0State[ulIndex].eState != EP0_STATE_IDLE)&&(!IsTimerElapsed()))

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

搜索文件,发现只有一个地方能将flagIsrCnt清零,那就是TimerIsr( )定时中断函数。
因此我判断,定时中断没有被正常调用。运行测试,发现果真如此。
r
2019-9-19 06:10:26 评论

举报

分析发现,是USB枚举超时了,而超时退出机制没有起作用。
控制USB枚举超时的函数都在工程的delay.c文件中,因此修改就行了。r
2019-9-19 06:22:25 评论

举报



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

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

r
2019-9-19 06:30:21 评论

举报

修改第二步:修改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函数删除。

r
2019-9-19 06:36:50 评论

举报

至此,修改完成。

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

然后重新跳到USB MSC的初始化部分执行,程序即可继续运行。r
2019-9-19 06:42:20 评论

举报

早点发这个啊,当初学的时候看了好多资料才弄懂了,支持一下r
2019-9-19 06:51:16 评论

举报

2019-9-19 07:05:57 评论

举报

.pcb{margin-right:0}

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()函数用于检测定时时间是否已经到。
r
2019-9-19 07:11:44 评论

举报

只有小组成员才能发言,加入小组>>

12下一页

50个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

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