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

简介:
对于 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 协议:
/**

  从批量端点读取数据

 * @param *pCbw CBW 数据区指针

 * @param *pData  存放读取结果的数据区指针

 * @param *pCsw CSW 数据区指针

 */

short  bulkRead( unsigned   char  *pCbw,  unsigned   char  *pData,  unsigned   char  *pCsw)

{

     BYTE  toggle;

   

     // 得到批量出端点的下一次发送数据区编号

    toggle = usbGetEdToggle(bulkEd[0]);

     // 初始化批量出端点 ED

    AT91F_CreateEd(

       ( unsigned   int ) &bulkEd[0],   // ED Address

       64 ,                         // Max packet

       0,                           // TD format

       0,                           // Skip

       0,                           // Speed

       ED_OUT,                      // Direction

       usbDevInfo. bulkOutPort ,      // Endpoint

       usbDevInfo. addr ,             // Func Address

       ( unsigned   int ) &genTd[1],    // TDQTailPointer

       ( unsigned   int ) &genTd[0],    // TDQHeadPointer

       toggle,                      // ToggleCarry

       ( unsigned   int ) &bulkEd[1]);  // NextED

 

     // 设置批量出端点的 TD ,用于发送 CBW 命令

    AT91F_CreateGenTd(

       ( unsigned   int ) &genTd[0],     // TD Address

       0,                            // Data Toggle

       TD_DELAY_INT,                 // DelayInterrupt

       TD_OUT,                       // Direction

       1,                            // Buffer Rounding

       ( unsigned   int ) pCbw,          // Current Buffer Pointer

       ( unsigned   int ) &genTd[1],     // Next TD

       31);                          // Buffer Length

   

    AT91F_CreateGenTd(

       ( unsigned   int ) &genTd[1],     // TD Address

       0,                            // Data Toggle

       TD_DELAY_INT,                 // DelayInterrupt

       TD_OUT,                       // Direction

       1,                            // Buffer Rounding

       0x0,                          // Current Buffer Pointer

       ( unsigned   int ) 0,             // Next TD

       0x0);                         // Buffer Length

 

     // 得到批量入端点的下一次发送数据区编号

    toggle = usbGetEdToggle(bulkEd[1]);

     // 初始化批量入端点 ED

    AT91F_CreateEd(

       ( unsigned   int ) &bulkEd[1],     // ED Address

       64 ,                           // Max packet

       0,                             // TD format

       0,                             // Skip

       0,                             // Speed

       ED_IN,                         // Direction

       usbDevInfo. bulkInPort ,         // Endpoint

       usbDevInfo. addr ,               // Func Address

       ( unsigned   int ) &genTd[4],      // TDQTailPointer

       ( unsigned   int ) &genTd[2],      // TDQHeadPointer

       toggle,                        // ToggleCarry

       ( unsigned   int ) 0);             // NextED

 

     // 设置批量入端点的 TD

     // 用于接收数据的 TD

    AT91F_CreateGenTd(

       ( unsigned   int ) &genTd[2],    // TD Address

       0,                           // Data Toggle

       TD_DELAY_INT,                // DelayInterrupt

       TD_IN,                       // Direction

       1,                           // Buffer Rounding

       ( unsigned   int ) pData,        // Current Buffer Pointer

       ( unsigned   int ) &genTd[3],    // Next TD

       512);                        // Buffer Length

   

     // 用于接收 CSW TD

    AT91F_CreateGenTd(

       ( unsigned   int ) &genTd[3],    // TD Address

       0,                           // Data Toggle

       TD_DELAY_INT,                // DelayInterrupt

       TD_IN,                       // Direction

       1,                           // Buffer Rounding

       ( unsigned   int ) pCsw,         // Current Buffer Pointer

       ( unsigned   int ) &genTd[4],    // Next TD

       64);                         // Buffer Length

   

    AT91F_CreateGenTd(

       ( unsigned   int ) &genTd[4],    // TD Address

       0,                           // Data Toggle

       TD_DELAY_INT,                // DelayInterrupt

       TD_IN,                       // Direction

       1,                           // Buffer Rounding

       0x0,                         // Current Buffer Pointer

       ( unsigned   int ) 0,            // Next TD

       0x0);                        // Buffer Length

   

     // 调用底层接口把数据发送出去

    ohciBulkXfer(&bulkEd[0]);

   

    usbRunCmd(USB_CMD_TYPE_BULK_READ, 3);

   

     return  0;

}





本文转自 tywali 51CTO博客,原文链接:http://blog.51cto.com/lancelot/252090,如需转载请自行联系原作者
目录
相关文章
高通平台开发系列讲解(USB篇)USB端口的说明及切换方法
高通平台开发系列讲解(USB篇)USB端口的说明及切换方法
346 0
高通平台开发系列讲解(USB篇)USB端口的说明及切换方法
|
4月前
|
安全 Linux 网络安全
Linux【安全 01】云服务器主机安全加固(修改SSHD端口、禁用登陆失败的IP地址、使用密钥登录)
Linux【安全 01】云服务器主机安全加固(修改SSHD端口、禁用登陆失败的IP地址、使用密钥登录)
181 1
|
4月前
|
网络安全 Windows
Telnet - 访问8080端口并发送数据
Telnet - 访问8080端口并发送数据
73 0
|
5月前
|
Python
python 扫描局域网主机、爆破端口
python 扫描局域网主机、爆破端口
45 0
|
8月前
|
网络协议 Shell 网络安全
iOS 逆向编程(九 - 1)通过 USB 连接登录 iPhone 以及端口映射
iOS 逆向编程(九 - 1)通过 USB 连接登录 iPhone 以及端口映射
174 0
|
缓存 监控 中间件
【Flume中间件】(1)监听netcat44444端口并将数据打印到控制台
【Flume中间件】(1)监听netcat44444端口并将数据打印到控制台
199 1
【Flume中间件】(1)监听netcat44444端口并将数据打印到控制台
|
SQL 负载均衡 应用服务中间件
nginx安装 、分发实现多域名访问同一主机不同端口
nginx安装 、分发实现多域名访问同一主机不同端口
822 0
nginx安装 、分发实现多域名访问同一主机不同端口
|
安全 网络协议 网络安全
【工具】nmap的详细利用-主机发现-端口扫描-系统服务识别扫描-脚本利用
本文适合初学者以及想要进阶的小伙伴们,我们将从最简单的出发,一步步实现工具的精通,此外本文配有视频讲解,让您的理解更近一步。
376 0
|
网络协议 安全 Linux
腾讯云主机上部署端口敲门Knock服务
腾讯云主机上部署端口敲门Knock服务
324 0
腾讯云主机上部署端口敲门Knock服务
|
运维 关系型数据库 MySQL
利用腾讯云主机+SSH远程端口转发实现内网穿透
利用腾讯云主机+SSH远程端口转发实现内网穿透
524 0
利用腾讯云主机+SSH远程端口转发实现内网穿透