U-Boot/zh cn
From Openmoko
(→Forcing fast charge) |
Marko Knöbl (Talk | contribs) m (Bootloader/zh cn moved to U-Boot/zh cn) |
||
(17 intermediate revisions by 7 users not shown) | |||
Line 1: | Line 1: | ||
− | + | {{Languages|U-Boot}} | |
− | + | {{Bootloader}} | |
+ | [[Image:GTA01-U-Boot.JPG|thumb|300px|u-boot menu on Neo1973]] | ||
− | + | [[Image:Neo1973 uboot splash closeup.jpg|thumb|300px|u-boot splash screen on Neo1973]] | |
− | 关于u- | + | [[Neo1973]]上的bootloader '''U-Boot''',在 Openmoko启动之前负责设备的功能运作,包括用来[[Flashing openmoko/zh|烧写OpenmokoFLASH]]的 [[USB DFU]]、屏幕显示、启动选单、[[bootloader commands|bootloader 命令]] 控制台、通过[[bootloader environment|bootloader 环境]]配置和加载[[kernel | 内核]]等。 |
+ | |||
+ | |||
+ | 有不同的[[bootloader versions|bootloader版本]]可供使用: | ||
+ | |||
+ | == Phase0 快速启动== | ||
+ | * 请确认你的Neo手机已装好电池,并且USB连接线已被拔出至少30秒。 | ||
+ | * 通过USB接线,将Neo (并不是调试板) 连接到Linux主机。 | ||
+ | * 在启动电源时,按住AUX按钮以访问启动菜单。 | ||
+ | * 将控制台设定为USB。 | ||
+ | * 在Linux主机上通过终端Terminal连接到/dev/ttyACM0 (你可能会用到chown uucp.uucp /dev/ttyACM0 )。 | ||
+ | * 请注意cdc_acm /dev/ttyACM0 访问会在Neo启动后消失,它会被cdc_ether usb0网络访问取代。 | ||
+ | * 你现在会看见bootloader提示指令。 | ||
+ | * 如果你希望在每次启动时都停留在bootloader,可将bootdelay uboot环境变量设定为-1 。 | ||
+ | |||
+ | == 一般 == | ||
+ | GTA01 使用[http://u-boot.sourceforge.net/ u-boot] bootloader. | ||
+ | |||
+ | 关于u-boot的更多信息,可以参考下列网址: | ||
* http://www.denx.de/wiki/DULG | * http://www.denx.de/wiki/DULG | ||
* http://www.gumstix.org/tikiwiki/tiki-index.php?page=U-Boot | * http://www.gumstix.org/tikiwiki/tiki-index.php?page=U-Boot | ||
* http://linuxdevices.com/articles/AT5085702347.html | * http://linuxdevices.com/articles/AT5085702347.html | ||
− | + | 您也可以参考下面的内容,得到其它u-boot的信息: | |
− | * | + | * 使用[[S3C2410 Steppingstone]]支持从NAND 中启动 |
− | * | + | * 支持S3C2410 NAND 内存 |
− | * | + | * 支持透过S3C2410 USB 装置控制器下载程序 |
− | * | + | * 支持在S3C2410 Framebuffer中显示启动logo / 状态 |
− | * | + | 然而,u-boot并不会支持GTA01所需要的功能,如 |
+ | *支持从SD/Transflash读取kernel/initrd | ||
− | [[User:HaraldWelte| | + | [[User:HaraldWelte|HaraldWelte]]目前正在进行这项工作,事实上,已完成大部份的工作。 |
− | == | + | == Bootloader 源码== |
+ | 目前的bootloader patche 可以在[http://svn.openmoko.org/trunk/src/target/u-boot/patches/| http://svn.openmoko.org/trunk/src/target/u-boot/patches/这个位置]]下位置取得。. | ||
− | + | 将源码解压缩缩,套用到patch,执行"make gta01bv3_config" (或gta01bv2_config, 或你拥有的任何硬件版本),执行"make"。你将会得到"u-boot.bin" 映像档,你可以在NAND中直接更新 (也可以使用现有的bootloader 或 [[sjf2410-linux]])。 | |
− | |||
− | == | + | == Bootloader 二进制文件== |
− | + | 最新的bootloader 二进制文件可以在以下的位置中找到under http://buildhost.openmoko.org/snapshots in the subdirectory 200X.XX/images/。它应该被写入NAND 0x00000000的位置 (大小为0x30000) (第一个 [[Partitions|分割区]]). | |
− | == | + | == 开发Bootloader == |
=== QT2410 === | === QT2410 === | ||
− | + | 如果你想要在QT2410上开发bootloader,使用bootloader 映像档更新会从USB上下载到RAM来的简单的多。 | |
+ | 要进行这项工作,你必须编辑u-boot/include/configs/qt2410.h 档案,并且将第32行程序中的"if 0"变更为 "if 1",之后再使用"make"重新编译。 | ||
− | + | 产生的"u-boot.bin" 档案对于NAND内存并不稳定,但却可以直接或在RAM中执行,如透过使用[[s3c2410_boot_usb]] 程序。 | |
− | + | ||
− | + | ||
=== GTA01 === | === GTA01 === | ||
− | + | 在GTA01上开发bootloader是很辣手的一件事情,首先,我们并不会有任何的NOR内存。第二,并没有其它的方法可以不从NAND中启动。然而,我们也不会有一个像QT2410一样的USB下载器。 | |
− | + | ||
− | + | ||
− | + | 最主要的问题是:[[S3C2410 Steppingstone]]内部的SRAM的前4K并没有被限制。SRAM 分割并非绝对性的对应到实体0的位置。我们要如何因应呢? | |
− | + | ==== 使用JTAG 自RAM中启动==== | |
+ | 那我们要如何自RAM启动?我们使用JTAG / OpenOCD 进行: | ||
− | * | + | * 在PC=0的时候重设及暂停CPU |
<pre> | <pre> | ||
> reset halt | > reset halt | ||
Line 56: | Line 74: | ||
</pre> | </pre> | ||
− | * | + | * 针对低阶SDRAM启动下载程序片段 (做为4k的sram踏脚石) |
<pre> | <pre> | ||
− | > load_binary /space/misc/gta01/u-boot.git/ | + | > load_binary /space/misc/gta01/u-boot.git/board/gta01/lowlevel_foo.bin 0 |
downloaded 332 byte in 0s 21899us | downloaded 332 byte in 0s 21899us | ||
</pre> | </pre> | ||
− | * | + | * 在0x33f80000插入断点 (能指出低阶程序已完成) |
<pre> | <pre> | ||
> bp 0x33f80000 4 hw | > bp 0x33f80000 4 hw | ||
− | + | 在0x33f80000 中加入断点 | |
</pre> | </pre> | ||
− | * | + | * 执行程序到断点 |
<pre> | <pre> | ||
> resume | > resume | ||
− | Target 0 | + | Target 0 重新开始 |
> Target 0 halted | > Target 0 halted | ||
− | + | 因断点的关系,目标暂停,目前的模式为:Supervisor | |
cpsr: 0x600000d3 pc: 0x33f80000 | cpsr: 0x600000d3 pc: 0x33f80000 | ||
MMU: disabled, D-Cache: disabled, I-Cache: enabled | MMU: disabled, D-Cache: disabled, I-Cache: enabled | ||
</pre> | </pre> | ||
− | * | + | * 下载u-boot RAM映像档到0x33f80000 |
<pre> | <pre> | ||
> load_binary /space/misc/gta01/u-boot.git/u-boot.bin 0x33f80000 | > load_binary /space/misc/gta01/u-boot.git/u-boot.bin 0x33f80000 | ||
Line 84: | Line 102: | ||
</pre> | </pre> | ||
− | * | + | * 继续处理 |
<pre> | <pre> | ||
> resume | > resume | ||
− | Target 0 | + | Target 0 重新开始 |
</pre> | </pre> | ||
− | + | 在进行到这里时,显示的背光会变明亮,我们会看到下面的指令: | |
<pre> | <pre> | ||
U-Boot 1.1.6 (Jan 13 2007 - 23:44:23) | U-Boot 1.1.6 (Jan 13 2007 - 23:44:23) | ||
Line 101: | Line 119: | ||
Out: serial | Out: serial | ||
Err: serial | Err: serial | ||
− | Hit any key to stop autoboot: 0 | + | Hit any key to stop autoboot: 0 |
− | GTA01Bv2 # | + | GTA01Bv2 # |
</pre> | </pre> | ||
− | == | + | == 建立可启动的映像档 == |
− | + | ||
− | + | ||
+ | u-boot 需要可启动的映像档 (如kernels,也包括 initrd 及其它内容) ,形成所谓的''uImage''。为了建立''uImage'',如从''vmlinux'' kernel 映像档,你可以进行下面的处理: | ||
<pre> | <pre> | ||
objcopy -O binary -R .note -R .comment -S vmlinux linux.bin | objcopy -O binary -R .note -R .comment -S vmlinux linux.bin | ||
Line 115: | Line 132: | ||
</pre> | </pre> | ||
− | == | + | == 启动选单== |
[[Image:Neo1973 uboot menu.jpg|thumb|400px|u-boot boot menu on Neo1973]] | [[Image:Neo1973 uboot menu.jpg|thumb|400px|u-boot boot menu on Neo1973]] | ||
− | + | 从Phase-0 释出后,我们的u-boot版本现在放在以屏幕显示的启动选单中,选单中的项目被定义在[[bootloader environment#menu|环境选单输入]]中。 | |
− | === | + | === 存取启动选单=== |
− | + | 你可以在启动电话时,藉由按下[[Neo1973 AUX Button]] 及电源按钮来存取选单。 | |
− | === | + | === 使用启动选单=== |
− | + | 藉由按下[[Neo1973 AUX Button]] 你可以循环使用选单项目。使用''POWER''按钮选取其中的项目。 | |
− | == | + | == Bootloader 命令提示== |
− | + | ===存取bootloader的命令提示=== | |
+ | bootloader 命令提示可以在序列控制台上进行 (透过[[Debug Board]]) 或者是虚拟USB 序列装置(USB CDC_ACM)。 | ||
+ | 不论是串行端口或usb,都依照'''stdin'''、 '''stdout''' 及 '''stderr''' u-boot 环境变量而定。 | ||
− | + | 不论你是否使用usbtty,前面的讯息会在序列控制台中显示。bootloader 目前被设定为三秒钟的等待时间。如果在 三秒内,'''stdin'''中收到键入的讯息,自动启动就会被取消掉。 | |
− | === | + | ==== 自Linux中使用usbtty ==== |
− | + | ||
− | + | ||
− | + | 藉由在u-boot模式下连接电话到Linux 主机上,它会让它侦测到 [[CDC ACM]] 装置,你会拥有一个名为/dev/ttyACM0的新tty装置。若没有的话,请启用CONFIG_USB_ACM (Device Drivers -> USB support -> USB Modem (CDC ACM) support)。 (MacOS 的使用者请参考[[MacOS_X#USB_Serial|这里取得更多信息]]) | |
− | + | 使用你熟悉的仿真器 (minicom, cu, zc, screen ...) 像使用任何串行端口般存取。如果你并没有熟悉的仿真器,可以试试看: (位于taylor-uucp 中的cu,使用"apt-get 安装 cu" 如果它还未安装话。 | |
+ | cu -l /dev/ttyACM0 | ||
− | + | 你会需要用到 | |
+ | chown uucp.uucp /dev/ttyACM0 | ||
− | + | 取得必要的权限(甚至是root) | |
− | + | 可以用来取代cu的另一个方法是 Werner Almesberger的 [[NeoCon|neocon]]。 | |
+ | |||
+ | 首先,你必须试着去查看在你执行u-boot模式时,USB装置是否出现了'lsusb' 。 | ||
− | |||
# lsusb -d 1457:5119 | # lsusb -d 1457:5119 | ||
− | Bus 005 Device 079: ID 1457:5119 | + | Bus 005 Device 079: ID 1457:5119 |
− | + | ||
+ | 接着,让我们来查看更多可用的endpoint及设定: | ||
<pre> | <pre> | ||
# lsusb -v -d 1457:5119 | # lsusb -v -d 1457:5119 | ||
− | Bus 005 Device 079: ID 1457:5119 | + | Bus 005 Device 079: ID 1457:5119 |
Device Descriptor: | 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 | Device Status: 0x0001 | ||
− | + | Self Powered | |
</pre> | </pre> | ||
− | + | 接下来,你可以使用你最喜欢的终端机程序存取它。之后,若环境仍然不正确的话,你必须使用目前的控制台(如序列控制台(serial console)) 来变更[[bootloader environment#console|控制台环境下的输入选项]]: | |
− | + | ||
− | + | ||
<pre> | <pre> | ||
GTA01Bv2 # setenv stderr usbtty | GTA01Bv2 # setenv stderr usbtty | ||
Line 264: | Line 283: | ||
</pre> | </pre> | ||
− | ==== | + | ==== 典型的u-boot提示字符==== |
<pre> | <pre> | ||
Line 277: | Line 296: | ||
Out: serial | Out: serial | ||
Err: serial | Err: serial | ||
− | Hit any key to stop autoboot: 0 | + | Hit any key to stop autoboot: 0 |
GTA01Bv3 # | GTA01Bv3 # | ||
</pre> | </pre> | ||
− | === | + | === bootloader 提示字符下的指令=== |
− | + | '请参考[[bootloader commands|bootloader 指令集]].'' | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | == 装置轫体更新== | |
− | + | u-boot也可以使用[[USB DFU]]做为更新工具。对于快速测试下的加载档案及kernel而言,是很有效的一个方法。 | |
+ | 要找出你的u-boot版本是否支持这个USB DFU,请使用下面的方法: | ||
+ | $ lsusb -v -d 1457:5119 | ||
+ | 当装置目前使用的是u-boot模式。 | ||
− | + | 如果它支持DFU,你可以在输出的讯息后面看到以下的内容: | |
<pre> | <pre> | ||
− | + | 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 | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
</pre> | </pre> | ||
− | + | 要查看韧体如何更新,请参考[[dfu-util]]。 | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | === | + | === 透过DFU置入档案 === |
− | + | 要将档案加载内存位置0x32000000: | |
<pre> | <pre> | ||
− | + | dfu-util -a 0 -D fileToLoad -R | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
</pre> | </pre> | ||
− | + | 之后,传送'bootm 0x32000000' 到u-boot或者 'bootelf 0x32000000',如果它是一个elf档案。 | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | 简单的python script可以启动ELF映像档—以防止ACM bug破坏较大的封包。 | |
<pre> | <pre> | ||
− | + | #!/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) | ||
</pre> | </pre> | ||
− | == | + | == 问题排除 == |
− | + | === USB连接问题 === | |
− | + | ||
− | + | 在连接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 | |
− | [[Category: | + | [[Category:System Developers/zh cn]] |
Latest revision as of 15:36, 1 February 2010
![]() |
Languages: |
English • العربية • Български • Česky • Dansk • Deutsch • Esperanto • Eesti • Español • فارسی • Suomi • Français • עברית • Magyar • Italiano • 한국어 • Nederlands • Norsk (bokmål) • Polski • Português • Română • Русский • Svenska • Slovenčina • Українська • 中文(中国大陆) • 中文(台灣) • Euskara • Català |
Bootloaders |
---|
Neo1973上的bootloader U-Boot,在 Openmoko启动之前负责设备的功能运作,包括用来烧写OpenmokoFLASH的 USB DFU、屏幕显示、启动选单、bootloader 命令 控制台、通过bootloader 环境配置和加载 内核等。
有不同的bootloader版本可供使用:
Contents |
[edit] Phase0 快速启动
- 请确认你的Neo手机已装好电池,并且USB连接线已被拔出至少30秒。
- 通过USB接线,将Neo (并不是调试板) 连接到Linux主机。
- 在启动电源时,按住AUX按钮以访问启动菜单。
- 将控制台设定为USB。
- 在Linux主机上通过终端Terminal连接到/dev/ttyACM0 (你可能会用到chown uucp.uucp /dev/ttyACM0 )。
- 请注意cdc_acm /dev/ttyACM0 访问会在Neo启动后消失,它会被cdc_ether usb0网络访问取代。
- 你现在会看见bootloader提示指令。
- 如果你希望在每次启动时都停留在bootloader,可将bootdelay uboot环境变量设定为-1 。
[edit] 一般
GTA01 使用u-boot bootloader.
关于u-boot的更多信息,可以参考下列网址:
- http://www.denx.de/wiki/DULG
- http://www.gumstix.org/tikiwiki/tiki-index.php?page=U-Boot
- http://linuxdevices.com/articles/AT5085702347.html
您也可以参考下面的内容,得到其它u-boot的信息:
- 使用S3C2410 Steppingstone支持从NAND 中启动
- 支持S3C2410 NAND 内存
- 支持透过S3C2410 USB 装置控制器下载程序
- 支持在S3C2410 Framebuffer中显示启动logo / 状态
然而,u-boot并不会支持GTA01所需要的功能,如
- 支持从SD/Transflash读取kernel/initrd
HaraldWelte目前正在进行这项工作,事实上,已完成大部份的工作。
[edit] Bootloader 源码
目前的bootloader patche 可以在http://svn.openmoko.org/trunk/src/target/u-boot/patches/这个位置]下位置取得。.
将源码解压缩缩,套用到patch,执行"make gta01bv3_config" (或gta01bv2_config, 或你拥有的任何硬件版本),执行"make"。你将会得到"u-boot.bin" 映像档,你可以在NAND中直接更新 (也可以使用现有的bootloader 或 sjf2410-linux)。
[edit] Bootloader 二进制文件
最新的bootloader 二进制文件可以在以下的位置中找到under http://buildhost.openmoko.org/snapshots in the subdirectory 200X.XX/images/。它应该被写入NAND 0x00000000的位置 (大小为0x30000) (第一个 分割区).
[edit] 开发Bootloader
[edit] QT2410
如果你想要在QT2410上开发bootloader,使用bootloader 映像档更新会从USB上下载到RAM来的简单的多。 要进行这项工作,你必须编辑u-boot/include/configs/qt2410.h 档案,并且将第32行程序中的"if 0"变更为 "if 1",之后再使用"make"重新编译。
产生的"u-boot.bin" 档案对于NAND内存并不稳定,但却可以直接或在RAM中执行,如透过使用s3c2410_boot_usb 程序。
[edit] GTA01
在GTA01上开发bootloader是很辣手的一件事情,首先,我们并不会有任何的NOR内存。第二,并没有其它的方法可以不从NAND中启动。然而,我们也不会有一个像QT2410一样的USB下载器。
最主要的问题是:S3C2410 Steppingstone内部的SRAM的前4K并没有被限制。SRAM 分割并非绝对性的对应到实体0的位置。我们要如何因应呢?
[edit] 使用JTAG 自RAM中启动
那我们要如何自RAM启动?我们使用JTAG / OpenOCD 进行:
- 在PC=0的时候重设及暂停CPU
> 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
- 针对低阶SDRAM启动下载程序片段 (做为4k的sram踏脚石)
> load_binary /space/misc/gta01/u-boot.git/board/gta01/lowlevel_foo.bin 0 downloaded 332 byte in 0s 21899us
- 在0x33f80000插入断点 (能指出低阶程序已完成)
> bp 0x33f80000 4 hw 在0x33f80000 中加入断点
- 执行程序到断点
> resume Target 0 重新开始 > Target 0 halted 因断点的关系,目标暂停,目前的模式为:Supervisor cpsr: 0x600000d3 pc: 0x33f80000 MMU: disabled, D-Cache: disabled, I-Cache: enabled
- 下载u-boot RAM映像档到0x33f80000
> 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 #
[edit] 建立可启动的映像档
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
[edit] 启动选单
从Phase-0 释出后,我们的u-boot版本现在放在以屏幕显示的启动选单中,选单中的项目被定义在环境选单输入中。
[edit] 存取启动选单
你可以在启动电话时,藉由按下Neo1973 AUX Button 及电源按钮来存取选单。
[edit] 使用启动选单
藉由按下Neo1973 AUX Button 你可以循环使用选单项目。使用POWER按钮选取其中的项目。
[edit] Bootloader 命令提示
[edit] 存取bootloader的命令提示
bootloader 命令提示可以在序列控制台上进行 (透过Debug Board) 或者是虚拟USB 序列装置(USB CDC_ACM)。 不论是串行端口或usb,都依照stdin、 stdout 及 stderr u-boot 环境变量而定。
不论你是否使用usbtty,前面的讯息会在序列控制台中显示。bootloader 目前被设定为三秒钟的等待时间。如果在 三秒内,stdin中收到键入的讯息,自动启动就会被取消掉。
[edit] 自Linux中使用usbtty
藉由在u-boot模式下连接电话到Linux 主机上,它会让它侦测到 CDC ACM 装置,你会拥有一个名为/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的 neocon。
首先,你必须试着去查看在你执行u-boot模式时,USB装置是否出现了'lsusb' 。
- lsusb -d 1457:5119
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
[edit] 典型的u-boot提示字符
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 #
[edit] bootloader 提示字符下的指令
'请参考bootloader 指令集.
[edit] 装置轫体更新
u-boot也可以使用USB DFU做为更新工具。对于快速测试下的加载档案及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
要查看韧体如何更新,请参考dfu-util。
[edit] 透过DFU置入档案
要将档案加载内存位置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)
[edit] 问题排除
[edit] USB连接问题
在连接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