目标:在uboot中加入usb功能,实现从usb存储设备上启动kernel。
ralink的SDK提供的uboot是支持usb相关命令的,只需要在config.mk打开相应的开关即可。一开始以为只需要这样做:
RALINK_USB = ON
RALINK_EHCI = ON
RALINK_OHCI = ON
编译烧写后,发现usb相关命令已经出现在uboot中了,但是每次usb reset,都扫描不到storage存储设备。
MT7620 # usb reset
(Re)start USB...
USB: scanning bus for devices... ## RH_GET_DESCRIPTOR
## RH_SET_ADDRESS
## RH_GET_DESCRIPTOR
## RH_GET_DESCRIPTOR
## RH_GET_DESCRIPTOR
## RH_SET_CONFIGURATION
## RH_GET_DESCRIPTOR
## RH_GET_DESCRIPTOR
## RH_GET_DESCRIPTOR | RH_CLASS
## RH_GET_DESCRIPTOR | RH_CLASS
## RH_GET_STATUS | RH_CLASS
1 USB Device(s) found
scanning bus for storage devices... 0 Storage Device(s) found
usb info中,product和vendor id均为0,太怪异了!
MT7620 # usb info
1: Hub, USB Revision 1.10
- OHCI Root Hub
- Class: Hub
- PacketSize: 8 Configurations: 1
- Vendor: 0x0000 Product 0x0000 Version 0.0
Configuration: 1
- Interfaces: 1 Self Powered 0mA
Interface: 0
- Alternate Settings 0, Endpoints: 1
- Class Hub
- Endpoint 1 In Interrupt MaxPacket 2 Interval 255ms
并且发现uboot识别的usb host只有12M/s的速度
MT7620 # usb tree
Device Tree:
1 Hub (12 Mb/s, 0mA)
OHCI Root Hub
按理说,MT7620的usb应该是2.0的高速设备,不可能是12M/s的。仔细分析了一下代码,发现只要开启了RALINK_OHCI,RALINK_EHCI就会失效。so,只打开EHCI,关闭OHCI。
RALINK_USB = ON
RALINK_EHCI = ON
RALINK_OHCI = OFF
U-Boot 1.1.3 (Jun 9 2014 - 17:38:01)
MT7620 # usb reset
(Re)start USB...
USB: in usb_lowlevel_init
Error, couldn't init Lowlevel part
看来调用usb_lowlevel_init失败!找到usb_lowlevel_init的代码,并加入一些printf信息,便于分析问题:
发现,usb_lowlevel_init返回-1,于是继续跟踪代码,发现usb_lowlevel_init调用了如下代码:
位于ehci-ra.c中
int ehci_hcd_init(void)
{
#if defined(RT3352_ASIC_BOARD) || defined(RT3883_ASIC_BOARD) || defined(RT5350_ASIC_BOARD)
leave_power_saving();
mdelay(100);
rt_set_host();
mdelay(100);
hccr = (struct ehci_hccr *)(0xb01c0000);
hcor = (struct ehci_hcor *)((uint32_t) hccr + HC_LENGTH(ehci_readl(&hccr->cr_capbase)));
printf("Mediatek/Ralink USB EHCI host init hccr %x and hcor %x hc_length %d\n", (uint32_t)hccr, (uint32_t)hcor, (uint32_t)HC_LENGTH(ehci_readl(&hccr->cr_capbase)));
return 0;
#else
return -1;
#endif
}
MT7620 # usb reset
(Re)start USB...
USB: in usb_lowlevel_init
Mediatek/Ralink USB EHCI host init hccr b01c0000 and hcor b01c0010 hc_length 16
Register 1111 NbrPorts 1
USB EHCI 1.00
scanning bus for devices... 2 USB Device(s) found
scanning bus for storage devices... 1 Storage Device(s) found
MT7620 # usb info
1: Hub, USB Revision 0.2
- u-boot EHCI Host Controller
- Class: Hub
- PacketSize: 64 Configurations: 1
- Vendor: 0x0000 Product 0x0000 Version 0.1
Configuration: 1
- Interfaces: 1 Self Powered 0mA
Interface: 0
- Alternate Settings 0, Endpoints: 1
- Class Hub
- Endpoint 1 In Interrupt MaxPacket 8 Interval 0ms
2: Mass Storage, USB Revision 2.0
- HP USB 2.0 Flash 00CCCBB99999
- Class: (from Interface) Mass Storage
- PacketSize: 64 Configurations: 1
- Vendor: 0x0204 Product 0x6025 Version 1.0
Configuration: 1
- Interfaces: 1 Bus Powered 100mA
Interface: 0
- Alternate Settings 0, Endpoints: 2
- Class Mass Storage, Transp. SCSI, Bulk only
- Endpoint 1 Out Bulk MaxPacket 512
- Endpoint 1 In Bulk MaxPacket 512
速度也正确了!
MT7620 # usb tree
Device Tree:
1 Hub (480 Mb/s, 0mA)
| u-boot EHCI Host Controller
|
+-2 Mass Storage (480 Mb/s, 100mA)
HP USB 2.0 Flash 00CCCBB99999
看来,是原始代码的问题,解决的办法是在ehci-ra.c的ehci_hcd_init中加入MT7620_ASIC_BOARD定义。