Linux下USB—Key通讯库探究和实现.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux下USB—Key通讯库探究和实现

Linux下USB—Key通讯库探究和实现   摘 要 UKey在Linux下被枚举成Mass Storage类的SCSICD-ROM,通过发送SCSI指令进行设备操作。UKey的功能指令遵从ISO7816-4规范在SCSI中以APDU方式与设备通讯。Linux下采用基于libusb的无驱设计,以此与设备进行数据传输。文章基于MSC Bulk-Only协议,研究并实现一套与UKey通讯的封装库。 关键词 MSC Bulk-Only;SCSI;APDU;libusb库;无驱设计 中图分类号:TN918 文献标识码:A 文章编号:1671-7597(2013)20-0077-02 在Linux系统下,并没有实现与UKey通讯协议的封装并提供简易的API接口。在此背景下,本文研究如何在Linux下实现与UKey的通讯,作为Linux系统下的对协议的封装库,并提供简易的接口以供上层应用调用。 1 研究内容 1.1 MSC Bulk-Only 1.1.1 主机/设备包传输顺序 主机先发送CBW包,再传输相关的输出数据;设备在接受到CBW包后,先发送输入数据,再发送CSW包。主机可以在发送CBW包之前,请求输入数据或者CSW包。 1.1.2 命令块封装包 依据协议对CBW的定义(协议5.1),实现CBW的结构体定义如下。 structcommand_block_wrapper { uint8_t dCBWSignature[4]; uint32_t dCBWTag; uint32_t dCBWDataTransferLength; uint8_t bmCBWFlags; uint8_t bCBWLUN; uint8_t bCBWCBLength; uint8_t CBWCB[16]; }; 其中CBWCB字段就是SCSI指令部分。 1.1.3 命令状态封装包 依据协议[0]关于CSW的定义(协议5.2),实现CSW结构体的定义如下: structcommand_status_wrapper { uint8_t dCSWSignature[4]; uint32_t dCSWTag; uint32_t dCSWDataResidue; uint8_t bCSWStatus; }; 1.2 SCSI指令 USBBulk-Only协议中规定的CBW中的SCSI指令集字段CBWCB中的内容即为命令块描述符。 本项目将主要用到Write指令向设备发送信息;Read指令接收设备的信息。下面是将用到的指令。 1)自定义Write: 0XE2h。 2)自定义Read: 0XE1h。 1.3 ISO7816-4规范 该规范定义了数据传输的命令格式和响应格式,本文将按照该格式组织报文。 1.4 libusb库 libusb设计了一系列的API,通过这些API应用程序可以操作硬件,libusb更加接近USB规范。使得libusb的使用也比开发内核驱动相对容易的多。关于libusb请参看该项目的网站。 2 结果展示 综合以上内容,本项目实现了一套Linux下通用的与Ukey通讯的封装库。下面将介绍接口提供的数据结构与API,以及调用方法。 2.1 数据结构 //最顶层的包结构 //对应于接口send_receive_data structdata_send_receive { uint8_t buffer[1024];//1K数据缓冲区 uint32_t data_length;//数据长度 uint32_t time_out;//超时时间 }; //用于SCSI封装 //封装与协议有关的内容 structcommand_packet { structdata_send_receivedsr;//数据 uint8_tcdb[16];//命令描述块 uint8_t cdb_length;/实际长度 uint32_t ret_tag;//CBW和CSW的对应关系标签 uint8_t expected_endpoint;//传输方向 uint8_tlun;//为0 uint32_tactual;//实际长度 }; 2.2 通用API接口 int inquiry(libusb_device_handle* handle, structdata_send_receive* dsr);

文档评论(0)

docman126 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7042123103000003

1亿VIP精品文档

相关文档