Bingo,成功重写了USB控制传输

最近我们公司使用了一款智能卡芯片。该芯片为USB接口。 厂家提供了USB CCID源码,但是由于客户需要免驱只能使用HID或Mass storage Class。 经过几天的调试,Windows和Linux均可以识别为HID设备,但是使用set report时,通过bus bound可以看到urb发送出去,但是设备并没有进到set report函数。重新看了代码,发现原来是在USB insert和CCID通信过程中Control Endpoint不会发送带数据的Control Transaction。所以厂家的代码没有对其进行处理。 在试图在厂家代码上修改接受带数据的Control Transaction失败之后(厂家的代码可读性不是一般的差,虽然是51程序,也不至于全局变量满天飞吧,还有好多无意义代码和永不会执行到的代码)。 于是决定重写USB底层代码。周5约了厂家的一个技术支持详谈了2个多小时,解决了阅读USB specification、厂商datasheet和厂商代码的一些疑惑。 今天成功重写了USB底层代码,插入USB后可以成功识别为HID设备。

USB Class CCID

名词解释 CCID: Integrated Circuit(s) Cards Interface Device ICC: Integrated Circuit(s) Cards 概述 当一个CCID插入USB host时,它可以有或者没有一个插入的ICC。 CCID模型假设一个ICC被或者可以被插入到设备。这就是"slot change"中断消息的目的。 CCID功能特性 通信管道 控制管道 控制管道消息用来控制一个USB设备。这些消息包括标准请求,例如GET_DESCRIPTOR和SET_CONFIGURATION。命令经由默认管道发送,报告信息也经由默认管道返回给主机。如果产生了一个错误,它会产生一个标准的USB错误状态。 中断管道 CCID模型在中断管道处理异步事件。ICC在线,ICC移除或者硬件错误比如电流太大,这些经由这个管道送出。 中断管道对于一个支持ICC插入/移除的CCID是强制的。对于一个只插入没有移除的ICC是可选的。 块进,块出管道 CCID命令经由BULK-OUT端点发出。每个发送给CCID的命令都有一个相应的响应。一些命令也有过程响应。这些响应从BULK-IN端点发送。 所有发送给指定CCID槽位的命令都必须同步发送。一个指定的槽位同时只能接受一条命令。如果一个槽位准备好接受一个新命令那么就认为它是空闲的。 协议和参数选择 CCID在与主机的底层交互的dwFeatures字段声明TPDU、APDU(短或扩展)或者字符。 TPDU层交互 对于PPS交互的TPDU格式如下:…

Smart Card 7816 receive lost

ATME AT91RM9200串口有7816模式。 单独测试7816没有问题。但是在有ping包发现APDU出错。 经过DEBUG发现是7816接收APDU丢失字节。怀疑是7816发送接收切换被中断干扰。 修改7816发送最后一个字节在中断进行,发送完毕后打开接收。