全部博文(132)
分类: C/C++
2009-05-19 12:26:00
• • • • • • • • • • • • • • • • • • • • • • • 简体中文 • • • |
Bootloader |
---|
|
上的bootloader U-Boot,在 Openmoko启动之前负责设备的功能运作,包括用来的 、屏幕显示、启动选单、 控制台、通过配置和加载等。
有不同的可供使用:
Contents[] |
GTA01 使用 bootloader.
关于u-boot的更多信息,可以参考下列网址:
您也可以参考下面的内容,得到其它u-boot的信息:
然而,u-boot并不会支持GTA01所需要的功能,如
目前正在进行这项工作,事实上,已完成大部份的工作。
目前的bootloader patche 可以在]下位置取得。.
将源码解压缩缩,套用到patch,执行"make gta01bv3_config" (或gta01bv2_config, 或你拥有的任何硬件版本),执行"make"。你将会得到"u-boot.bin" 映像档,你可以在NAND中直接更新 (也可以使用现有的bootloader 或 )。
最新的bootloader 二进制文件可以在以下的位置中找到under in the subdirectory 200X.XX/images/。它应该被写入NAND 0x00000000的位置 (大小为0x30000) (第一个 ).
如果你想要在QT2410上开发bootloader,使用bootloader 映像档更新会从USB上下载到RAM来的简单的多。 要进行这项工作,你必须编辑u-boot/include/configs/qt2410.h 档案,并且将第32行程序中的"if 0"变更为 "if 1",之后再使用"make"重新编译。
产生的"u-boot.bin" 档案对于NAND内存并不稳定,但却可以直接或在RAM中执行,如透过使用 程序。
在GTA01上开发bootloader是很辣手的一件事情,首先,我们并不会有任何的NOR内存。第二,并没有其它的方法可以不从NAND中启动。然而,我们也不会有一个像QT2410一样的USB下载器。
最主要的问题是:内部的SRAM的前4K并没有被限制。SRAM 分割并非绝对性的对应到实体0的位置。我们要如何因应呢?
那我们要如何自RAM启动?我们使用JTAG / OpenOCD 进行:
> reset halt
target halted in ARM state due to debug request, current mode: Supervisor
cpsr: 0x400000d3 pc: 0x00000000
MMU: disabled, D-Cache: disabled, I-Cache: disabled
> load_binary /space/misc/gta01/u-boot.git/board/gta01/lowlevel_foo.bin 0
downloaded 332 byte in 0s 21899us
> bp 0x33f80000 4 hw
在0x33f80000 中加入断点
> resume
Target 0 重新开始
> Target 0 halted
因断点的关系,目标暂停,目前的模式为:Supervisor
cpsr: 0x600000d3 pc: 0x33f80000
MMU: disabled, D-Cache: disabled, I-Cache: enabled
> load_binary /space/misc/gta01/u-boot.git/u-boot.bin 0x33f80000
downloaded 135692 byte in 6s 567264us
> resume
Target 0 重新开始
在进行到这里时,显示的背光会变明亮,我们会看到下面的指令:
U-Boot 1.1.6 (Jan 13 2007 - 23:44:23)
DRAM: 128 MB
NAND: 64 MiB
*** Warning - bad CRC or NAND, using default environment
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
GTA01Bv2 #
u-boot 需要可启动的映像档 (如kernels,也包括 initrd 及其它内容) ,形成所谓的uImage。为了建立uImage,如从vmlinux kernel 映像档,你可以进行下面的处理:
objcopy -O binary -R .note -R .comment -S vmlinux linux.bin
gzip -9 linux.bin
u-boot/tools/mkimage -A arm -O linux -T kernel -C gzip -a 30008000 -e 30008000 -n "Kernel Image QT2410" -d linux.bin.gz uImage
从Phase-0 释出后,我们的u-boot版本现在放在以屏幕显示的启动选单中,选单中的项目被定义在中。
你可以在启动电话时,藉由按下 及电源按钮来存取选单。
藉由按下 你可以循环使用选单项目。使用POWER按钮选取其中的项目。
bootloader 命令提示可以在序列控制台上进行 (透过) 或者是虚拟USB 序列装置(USB CDC_ACM)。 不论是串行端口或usb,都依照stdin、 stdout 及 stderr u-boot 环境变量而定。
不论你是否使用usbtty,前面的讯息会在序列控制台中显示。bootloader 目前被设定为三秒钟的等待时间。如果在 三秒内,stdin中收到键入的讯息,自动启动就会被取消掉。
藉由在u-boot模式下连接电话到Linux 主机上,它会让它侦测到 装置,你会拥有一个名为/dev/ttyACM0的新tty装置。若没有的话,请启用CONFIG_USB_ACM (Device Drivers -> USB support -> USB Modem (CDC ACM) support)。 (MacOS 的使用者请参考)
使用你熟悉的仿真器 (minicom, cu, zc, screen ...) 像使用任何串行端口般存取。如果你并没有熟悉的仿真器,可以试试看: (位于taylor-uucp 中的cu,使用"apt-get 安装 cu" 如果它还未安装话。 cu -l /dev/ttyACM0
你会需要用到 chown uucp.uucp /dev/ttyACM0
取得必要的权限(甚至是root)
可以用来取代cu的另一个方法是 Werner Almesberger的 。
首先,你必须试着去查看在你执行u-boot模式时,USB装置是否出现了'lsusb' 。
Bus 005 Device 079: ID 1457:5119
接着,让我们来查看更多可用的endpoint及设定:
# lsusb -v -d 1457:5119
Bus 005 Device 079: ID 1457:5119
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 2 Communications
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 16
idVendor 0x1457
idProduct 0x5119
bcdDevice 0.00
iManufacturer 1 Openmoko, Inc
iProduct 2 Neo1973 Bootloader U-Boot 1.2.0-g6c7cac8c-dirty-moko3
iSerial 3 0000000
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 85
bNumInterfaces 3
bConfigurationValue 1
iConfiguration 4 TTY via USB
bmAttributes 0xc0
Self Powered
MaxPower 0mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 1 AT-commands (v.25ter)
iInterface 6 Control Interface
CDC Header:
bcdCDC 0.6e
CDC Call Management:
bmCapabilities 0x00
bDataInterface 1
CDC ACM:
bmCapabilities 0x00
CDC Union:
bMasterInterface 0
bSlaveInterface 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 5 Bulk Data Interface
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 255
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 1
iInterface 7 USB Device Firmware Upgrade
Device Status: 0x0001
Self Powered
接下来,你可以使用你最喜欢的终端机程序存取它。之后,若环境仍然不正确的话,你必须使用目前的控制台(如序列控制台(serial console)) 来变更:
GTA01Bv2 # setenv stderr usbtty
GTA01Bv2 # setenv stdout usbtty
GTA01Bv2 # setenv stdin usbtty
U-Boot 1.2.0-moko1 (Feb 16 2007 - 00:36:13)
DRAM: 128 MB
NAND: 64 MiB
Found Environment offset in OOB..
Video: 640x480x8 31kHz 59Hz
USB: S3C2410 USB Deviced
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
GTA01Bv3 #
'请参考.
u-boot也可以使用做为更新工具。对于快速测试下的加载档案及kernel而言,是很有效的一个方法。 要找出你的u-boot版本是否支持这个USB DFU,请使用下面的方法: $ lsusb -v -d 1457:5119 当装置目前使用的是u-boot模式。
如果它支持DFU,你可以在输出的讯息后面看到以下的内容:
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 254 Application Specific Interface
bInterfaceSubClass 1 Device Firmware Update
bInterfaceProtocol 1
iInterface 0
要查看韧体如何更新,请参考。
要将档案加载内存位置0x32000000:
dfu-util -a 0 -D fileToLoad -R
之后,传送'bootm 0x32000000' 到u-boot或者 'bootelf 0x32000000',如果它是一个elf档案。
简单的python script可以启动ELF映像档—以防止ACM bug破坏较大的封包。
#!/usr/bin/python
import sys
import os
import time
cmd1 = "neo backlight off\n"
cmd2 = "bootelf 0x32000000\n"
def output(tty, str):
for x in str:
tty.write(x)
tty.flush()
if len(sys.argv) == 2:
print "Loading %s..." % sys.argv[1]
loadfile = "dfu-util -a 0 -D %s -R" % sys.argv[1]
os.system(loadfile)
time.sleep(3)
tty = open("/dev/ttyACM0", "a")
output(tty, cmd1)
output(tty, cmd2)
tty.close()
else:
print "Usage: %s elffile" % sys.argv[0]
print ""
sys.exit(2)
在连接Neo时,位于u-boot下,在Linux主机上,我曾经遇到如下的问题 (在 dmesg or /var/log/messages) o。
usb 2-1: device descriptor read/64, error -110 usb usb2: Controller not stopped yet!
利用下面的指令,我解决掉上述的问题。请注意,如果你没有USB键盘或者是鼠标,用这些指令可能会造成问题。 我只有PS/2界面的装置,所以,并无法测试这个问题。
rmmod uhci_hcd ; modprobe uhci_hcd
: