uboot分析之 usb启动

继上篇文章uboot分析之Loopback接口,我们接着看下关于uboot下USB初始化方面的知识,经过这几天对zturn开发板uboot的分析,结合网上查阅的资料,大概弄懂了其基本流程,其在uboot阶段主要是加入USB Host端驱动和相应设备端驱动来支持存储设备,这样就 可以将Kernel以及文件系统存放在U盘上,来通过U盘来启动。

具体来说,做了下列一些操作:

在drivers/usb/host/Makefile一行
COBJS-$(CONFIG_USB_EHCI_FSL) += ehci-fsl.o
即加入与zturn USB Host端控制器的驱动drivers/usb/host/ehci-fsl.c。这个驱动文件的主要工作就是建立一个对应zturn USB Host端控制器的数据结构,设置为Host模式和少数一些特性,初始化PHY,最后使能该控制器。因此所做的工作非常简单。

跟其它接口一样,在U-Boot中,USB的支持也是通过放在相应板子上的几个宏定义来实现,在include/usb.h定义:

/* Everything is aribtrary */
#define USB_ALTSETTINGALLOC 4
#define USB_MAXALTSETTING 128/* Hard limit */


#define USB_MAX_DEVICE 32
#define USB_MAXCONFIG 8
#define USB_MAXINTERFACES 8
#define USB_MAXENDPOINTS 16
#define USB_MAXCHILDREN 8/* This is arbitrary */
#define USB_MAX_HUB 16


#define USB_CNTL_TIMEOUT 100 /* 100ms timeout */

具体来说,做了下列一些操作:

在drivers/usb/host/Makefile一行
COBJS-$(CONFIG_USB_EHCI_FSL) += ehci-fsl.o
即加入与zturn USB Host端控制器的驱动drivers/usb/host/ehci-fsl.c。这个驱动文件的主要工作就是建立一个对应zturn USB Host端控制器的数据结构,设置为Host模式和少数一些特性,初始化PHY,最后使能该控制器。因此所做的工作非常简单。

USB初始化的调用过程:
1. 在U-Boot命令行中发
=> usb start
2. USB命令解析器判定(common/cmd_usb.c)是start命令,会调用usb_init()函数(common/usb.c)
3. usb_init()会调用底层初始化函数usb_lowlevel_init()(drivers/usb/host/ehci-hcd.c)
4. 在usb_lowlevel_init()函数里,最后会调用到具体的Host控制器的初始化函数ehci_hcd_init(),这个函数就是放置在对应各种Host控制器的初始化文件的函数。对于zynq处理器中的Host控制器,该文件是drivers/usb/host/ehci-fsl.c。
因此整个调用流程为:
usb start命令 ---> usb_init() ---> usb_lowlevel_init() ---> ehci_hcd_init()

你可能感兴趣的:(uboot)