您的位置:首页 > 其它

3.11 基于OHCI的USB主机开发 —— OHCI(控制端口读数据)

2013-10-25 17:38 351 查看
原创作品,允许转载,转载时请务必以超链接形式标明文章
原始出处 、作者信息和本声明。否则将追究法律责任。/article/4321865.html

根据USB的规范,在系统初始化的时候需要从控制端口发送命令,其中有一些命令是包含数据的,对于这些命令,需要调用本函数来完成。函数内主要调用AM9200提供的OHCI接口:AT91F_CreateEd()和AT91F_CreateGenTd()来完成ED和TD的参数设置:
[align=left]/**[/align]
*
从控制端点读取数据
[align=left] * @param pSetup Setup包指针,用来设置数据长度和传输方向[/align]
* @param *pData
数据缓冲区指针
[align=left] */[/align]
shortctrlCmdGet(unsignedint
pSetup,unsignedshort len,unsignedchar
*pData)
[align=left]{[/align]
[align=left] unsignedchar direction;[/align]
[align=left] [/align]
[align=left] //初始化控制端点的ED[/align]
[align=left] AT91F_CreateEd([/align]
[align=left] (unsignedint) &controlEd,// ED Address[/align]
[align=left] 64, // Max packet[/align]
[align=left] 0, // TD format[/align]
[align=left] 0, // Skip[/align]
[align=left] 0, // Speed[/align]
[align=left] 0x0, // Direction[/align]
[align=left] 0, // Endpoint[/align]
usbDevInfo.addr,
// Func Address
(unsignedint) &genTd[3],
// TDQTailPointer
(unsignedint) &genTd[0],
// TDQHeadPointer
[align=left] 0, // ToggleCarry[/align]
[align=left] 0x0); // NextED[/align]
[align=left] [/align]
[align=left] direction = TD_IN;[/align]
[align=left] [/align]
[align=left] //控制端点的第一个TD,用于发送Setup包[/align]
[align=left] AT91F_CreateGenTd([/align]
(unsignedint) &genTd[0],
// TD Address
[align=left] 2, // Data Toggle[/align]
[align=left] TD_DELAY_INT, // DelayInterrupt[/align]
[align=left] TD_SETUP, // Direction[/align]
[align=left] 1, // Buffer Rounding[/align]
(unsignedint) pSetup,
// Current Buffer Pointer
(unsignedint) &genTd[1],
// Next TD
[align=left] 8); // Buffer Length[/align]
[align=left] [/align]
[align=left] //控制端点的第二个TD,用于接收数据[/align]
[align=left] AT91F_CreateGenTd([/align]
(unsignedint) &genTd[1],
// TD Address
[align=left] 3, // Data Toggle[/align]
[align=left] TD_DELAY_INT, // DelayInterrupt[/align]
[align=left] direction, // Direction[/align]
[align=left] 1, // Buffer Rounding[/align]
[align=left] (unsignedint) pData, // Current Buffer Pointer[/align]
(unsignedint) &genTd[2],
// Next TD
[align=left] len); // Buffer Length[/align]
[align=left] [/align]
[align=left] //控制端点的第三个TD,用于得到命令的状态[/align]
[align=left] AT91F_CreateGenTd([/align]
(unsignedint) &genTd[2],
// TD Address
[align=left] 3, // Data Toggle[/align]
[align=left] TD_DELAY_INT, // DelayInterrupt[/align]
[align=left] ~direction, // Direction[/align]
[align=left] 1, // Buffer Rounding[/align]
[align=left] 0x0, // Current Buffer Pointer[/align]
[align=left] (unsignedint) &genTd[3], // Next TD[/align]
[align=left] 0x0); // Buffer Length[/align]
[align=left] [/align]
[align=left] //标志TD队列结束的最后一个TD,设置为空[/align]
[align=left] AT91F_CreateGenTd([/align]
(unsignedint) &genTd[3],
// TD Address
[align=left] 3, // Data Toggle[/align]
[align=left] TD_DELAY_INT, // DelayInterrupt[/align]
[align=left] ~direction, // Direction[/align]
[align=left] 1, // Buffer Rounding[/align]
[align=left] 0x0, // Current Buffer Pointer[/align]
(unsignedint) 0,
// Next TD
[align=left] 0x0); // Buffer Length[/align]
[align=left] [/align]
[align=left] //调用底层接口把数据发送出去[/align]
[align=left] ohciCtrlXfer(&controlEd);[/align]
[align=left] [/align]
[align=left] //设置相关信息,以便中断程序中判断命令是否结束[/align]
[align=left] usbRunCmd(USB_CMD_TYPE_CTRL_READ, 3);[/align]
[align=left] [/align]
[align=left] return 0;[/align]
[align=left]}[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: