很多人USB的电脑驱动是正确的,但是DNW中会提示usb host is not connected yet错误。这是因为你的硬件没有设置好。硬件设置步骤是1. 设置GPG9为输出引脚(ok2440.c);2. 然后先设输出0(ok2440.c); 3. 最后在usb_init_slave函数中,输出1,使能(usbinit.c)。
还有人是在编译u_boot.bin的时候Port_Init()和usb_init()出错。那是因为你下载的usb slave源码版本不对。
slave源码的版本不止一种。http://blog.chinaunix.net/uid-8087110-id-1989046.html的源码就是有Port_Init()和usb_init() (usbinit.c)。我用的是https://github.com/tekkamanninja/u-boot-2010.03-tekkaman中提取的usb slave源码。
下面我就来胡说八道一番。当然我是参考了网上别人移植的步骤,如果我侵犯了谁的权益,请直接拨打客服110。
其实大家在网上都能找到移植的步骤,大同小异。只是很少有人来说硬件引脚问题。比如我的板子是GPG9作为USB_EN的引脚,驱动USB工作。有其他人的板子是GPG12引脚USB_EN的引脚。那么移植的时候就要看自己的硬件实际情况了。以我的板子为例,简要说一下吧。涉及到的文件 board/samsung/ok2440/ok2440.c 和 drivers/usb/slave/usbinit.c(uboot的版本不同可能文件目录也会不同,我的是u-boot-2010.06版本)。
board/samsung/ok2440/ok2440.c中的int board_init (void)函数
中设置好引脚:输出功能、输出低电平,关闭USB使能。
gpio->GPGCON = 0xFF95FFBA;
gpio->GPGUP = 0x0000FFFF;
gpio->GPGDAT &= ~(1<<9);
drivers/usb/slave/usbinit.c中的void usb_init_slave(void)函数
writel((readl(&gpioregs->MISCCR) & ~((1<<3) | (1<<12) | (1<<13))), &gpioregs->MISCCR);// USBD is selected instead of USBH1
// USB port 1 is enabled.
// USBD should be initialized first of all.
MISCCR杂项控制寄存器 第3、12、13是和USB相关的,记住板子不同,实用USB端口的情况不同,别给挂起了。
writel((readl(&gpioregs->GPGDAT) | (1<<9)), &gpioregs->GPGDAT);
/* enable USB Device, thisway.diy */
这里是驱动USB,我的是GPG9管脚,输出高电平,使能之。
drivers/usb/slave/usbinit.c中的void udc_disconnect (void) 函数writel((readl(&gpioregs->GPGDAT) & ~(1<<9)), &gpioregs->GPGDAT);
这里是关闭USB,我的是GPG9管脚,输出低电平,关闭之。