轉載: http://blog.csdn.net/qiurihuanghua/article/details/6234832
今天查看了一下在P4080DS板子的U-Boot中支持USB,主要是加入USB Host端驅動和相應設備端驅動來支持存儲設備,這樣就 可以將Kernel以及文件系統存放在U盤上,來通過U盤來啟動。
跟其它接口一樣,在U-Boot中,USB的支持也是通過放在相應板子上的幾個宏定義來實現,對於P4080DS板,是在include/configs/corenet_ds.h定義:
#define CONFIG_CMD_USB /* 支持USB命令集,這樣就可以使用U-Boot命令訪問USB設備 */
#define CONFIG_USB_STORAGE /* 支持USB存儲設備 */
#define CONFIG_USB_EHCI /* 支持EHCI協議標准的USB Host端 */
#define CONFIG_USB_EHCI_FSL /* 支持具體到Freescale的EHCI標准的USB Host控制器 */
#define CONFIG_EHCI_HCD_INIT_AFTER_RESET
#define CONFIG_CMD_EXT2 /* 支持EXT2文件系統 */
在上面個所有宏定義中,除了CONFIG_USB_EHCI_FSL以外,所有其它都是公共的,也就是與平台無關,所以要在P4080DS的U-Boot上,添加對該平台的USB的支持,僅需要實現由CONFIG_USB_EHCI_FSL定義所要求的操作就可以了。
具體來說,做了下列一些操作:
在drivers/usb/host/Makefile一行
COBJS-$(CONFIG_USB_EHCI_FSL) += ehci-fsl.o
即加入與P4080 USB Host端控制器的驅動drivers/usb/host/ehci-fsl.c。這個驅動文件的主要工作就是建立一個對應P4080 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控制器的初始化文件的函數。對於Freescale處理器中的Host控制器,該文件是drivers/usb/host/ehci- fsl.c。
因此整個調用流程為:
usb start命令 ---> usb_init() ---> usb_lowlevel_init() ---> ehci_hcd_init()