AT91SAM9260
U-BOOT
OHCI
对于 U 盘启动 kernel, 先通过了解整个框架,在细说 USB 枚举(包括 HUB ) ,OHCI 等内容
一. 总体流程
在 U-BOOT 中, USB HOST 是可以不支持的,如果需要 U 盘启动内核时,会使用此功能。
在 U_BOOT_CMD 中有 usb host 的命令结构,具体调用的是 do_usb ,若使用 USB storage ( U 盘),则同时会有 do_usbboot
使用 U 盘启动内核的过程一般是,(举例)
在 do_usb 函数中添加如下代码,
if (strcmp(argv[1], "boot") == 0) {
char *s;
s=getenv("boot");
run_command(s,0);
return 0;
}
插上 U 盘之后,进入命令行模式,先写命令 usb start 启动 HUB 和 U 盘设备,然后配置环境变量,如 boot=usbboot ,接着写命令 usb boot ,如上代码所示,取得环境变量之后,就会调用 do_usbboot 完成 U 盘启动 kernel image
首先分析 do_usb , do_usbboot 在 USB storage 部分分析
do_usb--------usb_init,usb_init 主要调用 usb_lowlevel_init 和 usb_scan_devices
识别设备之后,如果配置了 USB storage ,则会调用 usb_stor_scan 配置 U 盘,接着输入命令 usb boot 就会调用 do_usbboot
二. Usb_low_init
usb_low_init 主要流程如下,
a) 配置外部时钟,使能时钟,寄存器为 PCER 和 SCER
b) 配置 host controller 相关变量,包括
gohci,ghcca[0],phcca,ohci_dev,gtd,ptd,urb_priv 等
c) hc_reset
写命令到 host controller 的 control 寄存器, reset ,等待 reset 结束 ( 不懂为啥用两次 reset)
d) hc_start
三. Usb device