Posted inDebug
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…