基于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协议:
在本函数内只处理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] |
相关文章推荐
- 基于OHCI的USB主机开发 —— OHCI(批量端口写数据) 推荐
- 3.13 基于OHCI的USB主机 —— OHCI(批量端口读数据)
- 3.14 基于OHCI的USB主机开发 —— OHCI(批量端口写数据)
- 3.12 基于OHCI的USB主机开发 —— OHCI(控制端口写数据)
- 基于OHCI的USB主机 —— USB设备描述符数据结构
- 基于OHCI的USB主机开发 —— OHCI(控制端口读数据)
- 基于OHCI的USB主机 —— 批量端口复位代码
- 基于OHCI的USB主机 —— USB设备端口特性清除
- 3.11 基于OHCI的USB主机开发 —— OHCI(控制端口读数据)
- 基于OHCI的USB主机开发 —— OHCI(控制端口写数据)
- 基于OHCI的USB主机 —— OHCI(HCCA)
- 基于OHCI的USB主机 —— OHCI(基本流程)
- 基于OHCI的USB主机 —— OHCI(TD结构说明)
- 基于OHCI的USB主机 —— USB标准请求
- 基于OHCI的USB主机 —— 前言
- 基于OHCI的USB主机 —— 描述符说明
- 基于OHCI的USB主机 —— USB设备其它数据结构
- 基于OHCI的USB主机 ——USB设备枚举过程
- 基于OHCI的USB主机 —— OHCI(ED结构)
- 基于OHCI的USB主机 —— UFI数据结构1 推荐