您的位置:首页 > 理论基础 > 数据结构算法

基于OHCI的USB主机 —— OHCI(批量端口读数据)

2009-12-29 17:26 525 查看
对于U盘来说,进行U盘的数据传输时需要通过批量传输端口收发数据,所使用的协议为Mass Storage协议,参见《Universal Serial Bus Mass Storage Class Bulk-Only Transport》 。该协议是批量端口数据传输的底层协议,为了完成U盘扇区读写,还需要在该协议上面实现UFI协议,参见《Universal Serial Bus Mass Storage Class UFI Command Specification》 。

在本函数内只处理Mass Storage协议,不理会UFI协议:
[align=left]/**[/align]
[align=left] * 从批量端点读取数据[/align]
[align=left] * @param *pCbw CBW数据区指针[/align]
[align=left] * @param *pData 存放读取结果的数据区指针[/align]
[align=left] * @param *pCsw CSW数据区指针[/align]
[align=left] */[/align]
[align=left]short bulkRead(unsigned char *pCbw, unsigned char *pData, unsigned char *pCsw)[/align]
[align=left]{[/align]
[align=left] BYTE toggle;[/align]
[align=left] [/align]
[align=left] //得到批量出端点的下一次发送数据区编号[/align]
[align=left] toggle = usbGetEdToggle(bulkEd[0]);[/align]
[align=left] //初始化批量出端点ED[/align]
[align=left] AT91F_CreateEd([/align]
[align=left] (unsigned int) &bulkEd[0], // ED Address[/align]
[align=left] 64 , // Max packet[/align]
0,
// TD format
0,
// Skip
0,
// Speed
[align=left] ED_OUT, // Direction[/align]
[align=left] usbDevInfo.bulkOutPort, // Endpoint[/align]
[align=left] usbDevInfo.addr, // Func Address[/align]
[align=left] (unsigned int) &genTd[1], // TDQTailPointer[/align]
[align=left] (unsigned int) &genTd[0], // TDQHeadPointer[/align]
[align=left] toggle, // ToggleCarry[/align]
[align=left] (unsigned int) &bulkEd[1]); // NextED[/align]
[align=left] [/align]
[align=left] //设置批量出端点的TD,用于发送CBW命令[/align]
[align=left] AT91F_CreateGenTd([/align]
[align=left] (unsigned int) &genTd[0], // TD Address[/align]
0,
// Data Toggle
[align=left] TD_DELAY_INT, // DelayInterrupt[/align]
[align=left] TD_OUT, // Direction[/align]
1,
// Buffer Rounding
[align=left] (unsigned int) pCbw, // Current Buffer Pointer[/align]
[align=left] (unsigned int) &genTd[1], // Next TD[/align]
31);
// Buffer Length
[align=left] [/align]
[align=left] AT91F_CreateGenTd([/align]
[align=left] (unsigned int) &genTd[1], // TD Address[/align]
0,
// Data Toggle
[align=left] TD_DELAY_INT, // DelayInterrupt[/align]
[align=left] TD_OUT, // Direction[/align]
1,
// Buffer Rounding
0x0,
// Current Buffer Pointer
(unsigned int) 0,
// Next TD
0x0);
// Buffer Length
[align=left] [/align]
[align=left] //得到批量入端点的下一次发送数据区编号[/align]
[align=left] toggle = usbGetEdToggle(bulkEd[1]);[/align]
[align=left] //初始化批量入端点ED[/align]
[align=left] AT91F_CreateEd([/align]
[align=left] (unsigned int) &bulkEd[1], // ED Address[/align]
[align=left] 64 , // Max packet[/align]
0,
// TD format
0,
// Skip
0,
// Speed
[align=left] ED_IN, // Direction[/align]
[align=left] usbDevInfo.bulkInPort, // Endpoint[/align]
[align=left] usbDevInfo.addr, // Func Address[/align]
[align=left] (unsigned int) &genTd[4], // TDQTailPointer[/align]
[align=left] (unsigned int) &genTd[2], // TDQHeadPointer[/align]
[align=left] toggle, // ToggleCarry[/align]
(unsigned int) 0);
// NextED
[align=left] [/align]
[align=left] //设置批量入端点的TD[/align]
[align=left] //用于接收数据的TD[/align]
[align=left] AT91F_CreateGenTd([/align]
[align=left] (unsigned int) &genTd[2], // TD Address[/align]
0,
// Data Toggle
[align=left] TD_DELAY_INT, // DelayInterrupt[/align]
[align=left] TD_IN, // Direction[/align]
1,
// Buffer Rounding
[align=left] (unsigned int) pData, // Current Buffer Pointer[/align]
[align=left] (unsigned int) &genTd[3], // Next TD[/align]
512);
// Buffer Length
[align=left] [/align]
[align=left] //用于接收CSW的TD[/align]
[align=left] AT91F_CreateGenTd([/align]
[align=left] (unsigned int) &genTd[3], // TD Address[/align]
[align=left] 0, // Data Toggle[/align]
[align=left] TD_DELAY_INT, // DelayInterrupt[/align]
TD_IN,
// Direction
1,
// Buffer Rounding
[align=left] (unsigned int) pCsw, // Current Buffer Pointer[/align]
[align=left] (unsigned int) &genTd[4], // Next TD[/align]
64);
// Buffer Length
[align=left] [/align]
[align=left] AT91F_CreateGenTd([/align]
[align=left] (unsigned int) &genTd[4], // TD Address[/align]
0,
// Data Toggle
[align=left] TD_DELAY_INT, // DelayInterrupt[/align]
TD_IN, //
Direction
1,
// Buffer Rounding
0x0,
// Current Buffer Pointer
(unsigned int) 0,
// Next TD
0x0);
// Buffer Length
[align=left] [/align]
[align=left] //调用底层接口把数据发送出去[/align]
[align=left] ohciBulkXfer(&bulkEd[0]);[/align]
[align=left] [/align]
[align=left] usbRunCmd(USB_CMD_TYPE_BULK_READ, 3);[/align]
[align=left] [/align]
[align=left] return 0;[/align]
[align=left]}[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息