How to use USB CDC ACM

Kernel Configuration On Embedded Platform Insmod Drivers After that, a new UART device node will be found in /dev/ [crayon-68014aae14be1755490052/] Connect Target to Host with a USB cable You will see…

Freescale MPC8241 with USB controller

客户想在我们一款很老的设备上(MPC8241)上扩展一个USB控制器。让我很是头疼。因为现在主流的CPU,包括MCU基本都带有USB host/device。 于是各种google,查内核代码,发现NEC/CYPRESS/NXP/VIA均有USB控制器。打电话了解了如下: CYPRESS的USB控制器是本地总线接口,但是没有很好的linux驱动支持,可能需要用户自己调试。PS:我们之前有用过PCIE接FPGA挂载CY7C67200,虽然linux-2.6带有驱动,但是调试中发现各种问题,最后也不清楚是FPGA逻辑还是驱动问题,最后不了了之。 NXP的USB控制器也是本地总线接口,这就需要我们改版,但是代理说NXP现在不是主推这个芯片,并且这个芯片已经很久了,不一定什么时候就停产了。 NEC的USB控制器是PCI接口,这个非常好,因为我可以不用改版。但是代理很久都没有给我找到做好的USB扩展卡。 VIA就更悲剧了,我们连代理都没搞到。 测试1: 研究了一下NEC/VIA的手册和linux的USB控制器驱动。NEC和VIA都是OHCI,通过pci_register_driver注册,理论上来说插上就可以用。于是买了几款USB扩展卡,插上。系统检测到PCI设备,bingo,上个厕所先。结果回来以后发现CPU烧到了。 原来买的USB扩展卡做的有BUG,VIO居然直接直接和5V短在一起。而我们板子的VIO接的是3V3,结果导致3V3和5V短路,把CPU烧掉了。 测试2: 向我们在郑州的同事了解了一下,原来那边已经在MPC8247上扩展了USB控制器。于是原理图和驱动要来。画图、生产。 加载驱动可以找到芯片ID,但是向scratch寄存器写入后在读发现读回来的永远是0x00,放慢写时序也没有效果。这个是很奇怪的,因为读芯片ID之前也要做一个写操作。 想起来很早前用的一款CONEXANT的CS86500。当时调试这个芯片的时候所有寄存器都正常,只有读IIR的时候清不掉中断。后来发现需要在CS有效到RE有效之间有一定延时。MPC8241的LB没有地址建立时间这个概念,当时是通过调整CPLD解决的。 于是修改CPLD在CS有效和WE有效之间增加的一个延时。向scratch寄存器写入0x55AA读回来正确了。插入U盘,提示如下信息: hub.c: new USB device ISP116x_HCD-1, assigned address 2 usb_control/bulk_msg: timeout usb.c: USB device not accepting…

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格式如下:…

下一阶段学习目标

USB 现在大多数设备都需要USB接口,搞好这个肯定吃香 LD Script 做嵌入式如果连这个都搞不定就悲剧了。进一步就是bootloader。。。。

USB Specification

USB分为3种速度 低速(low-speed) 1.5Mb/s 全速(full-speed) 12Mb/s 数据流类型 控制传输(Control Transfers) 当设备第一次插入时,USB系统软件使用控制数据配置设备。其他驱动程序可以选择使用控制传输实现特殊实现。数据传递是不会丢失的。 大块数据传输(Bulk Data Transfers) 块数据通常包含大量的数据,比如用于打印机或者扫描仪。块数据是连续的。在硬件层使用错误检测和导入有限的重试册数来保证数据交互的可靠性。同时,根据其他总线的活动性,块数据需要占用大量的带宽。 中断数据传输(Interrupt Data Transfers) 无论传输到或者来自一个设备的微小的、有限延时的传输称为中断数据。这些数据可以在任何时间准备传输并且它由USB以不低于设备定义的速度传送。 中断数据通常包含一个或多个字节的事件通知,特性或者坐标。一个中断数据的例子是来自一个定位设备的坐标。尽管没有明确的时间速率,USB必须支持交互数据有应答时间界限。 等时数据传输(Isochronous Data Transfers) 等时数据在产生,传输和消费中是连续的和实时的。等时数据必须以接收的速率传递以保证时间。另外对于传递速率,等时传输可能对传递延时比较敏感。对于等时管道,