U-Boot/zh cn

From Openmoko

(Difference between revisions)
Jump to: navigation, search
(Create Bootloader/zh_cn for future editing.)
 
 
(39 intermediate revisions by 9 users not shown)
Line 1: Line 1:
{{Languages|Bootloader}}
+
{{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]]
 +
 
 +
[[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.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
 +
 
 +
[[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上开发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上开发bootloader是很辣手的一件事情,首先,我们并不会有任何的NOR内存。第二,并没有其它的方法可以不从NAND中启动。然而,我们也不会有一个像QT2410一样的USB下载器。
 +
 
 +
最主要的问题是:[[S3C2410 Steppingstone]]内部的SRAM的前4K并没有被限制。SRAM 分割并非绝对性的对应到实体0的位置。我们要如何因应呢?
 +
 
 +
==== 使用JTAG 自RAM中启动====
 +
那我们要如何自RAM启动?我们使用JTAG / OpenOCD 进行:
 +
 
 +
* 在PC=0的时候重设及暂停CPU
 +
<pre>
 +
> 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
 +
</pre>
 +
 
 +
* 针对低阶SDRAM启动下载程序片段 (做为4k的sram踏脚石)
 +
<pre>
 +
> load_binary /space/misc/gta01/u-boot.git/board/gta01/lowlevel_foo.bin 0
 +
downloaded 332 byte in 0s 21899us
 +
</pre>
 +
 
 +
* 在0x33f80000插入断点 (能指出低阶程序已完成)
 +
<pre>
 +
> bp 0x33f80000 4 hw
 +
在0x33f80000 中加入断点
 +
</pre>
 +
 
 +
* 执行程序到断点
 +
<pre>
 +
> resume
 +
Target 0 重新开始
 +
> Target 0 halted
 +
因断点的关系,目标暂停,目前的模式为:Supervisor
 +
cpsr: 0x600000d3 pc: 0x33f80000
 +
MMU: disabled, D-Cache: disabled, I-Cache: enabled
 +
</pre>
 +
 
 +
* 下载u-boot RAM映像档到0x33f80000
 +
<pre>
 +
> load_binary /space/misc/gta01/u-boot.git/u-boot.bin 0x33f80000
 +
downloaded 135692 byte in 6s 567264us
 +
</pre>
 +
 
 +
* 继续处理
 +
<pre>
 +
> resume
 +
Target 0 重新开始
 +
</pre>
 +
 
 +
在进行到这里时,显示的背光会变明亮,我们会看到下面的指令:
 +
<pre>
 +
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 #
 +
</pre>
 +
 
 +
== 建立可启动的映像档 ==
 +
 
 +
u-boot 需要可启动的映像档 (如kernels,也包括 initrd 及其它内容) ,形成所谓的''uImage''。为了建立''uImage'',如从''vmlinux'' kernel 映像档,你可以进行下面的处理:
 +
<pre>
 +
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
 +
</pre>
 +
 
 +
== 启动选单==
 +
[[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
 +
Bus 005 Device 079: ID 1457:5119
 +
 
 +
接着,让我们来查看更多可用的endpoint及设定:
 +
 
 +
<pre>
 +
# 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
 +
</pre>
 +
 
 +
接下来,你可以使用你最喜欢的终端机程序存取它。之后,若环境仍然不正确的话,你必须使用目前的控制台(如序列控制台(serial console)) 来变更[[bootloader environment#console|控制台环境下的输入选项]]:
 +
<pre>
 +
GTA01Bv2 # setenv stderr usbtty
 +
GTA01Bv2 # setenv stdout usbtty
 +
GTA01Bv2 # setenv stdin usbtty
 +
</pre>
 +
 
 +
==== 典型的u-boot提示字符====
 +
 
 +
<pre>
 +
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 #
 +
</pre>
 +
 
 +
=== bootloader 提示字符下的指令===
 +
 
 +
'请参考[[bootloader commands|bootloader 指令集]].''
 +
 
 +
 
 +
== 装置轫体更新==
 +
 
 +
u-boot也可以使用[[USB DFU]]做为更新工具。对于快速测试下的加载档案及kernel而言,是很有效的一个方法。
 +
要找出你的u-boot版本是否支持这个USB DFU,请使用下面的方法:
 +
$ lsusb -v -d 1457:5119
 +
当装置目前使用的是u-boot模式。
 +
 
 +
如果它支持DFU,你可以在输出的讯息后面看到以下的内容:
 +
<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>
 +
 
 +
要查看韧体如何更新,请参考[[dfu-util]]。
 +
 
 +
=== 透过DFU置入档案 ===
 +
 
 +
要将档案加载内存位置0x32000000:
 +
<pre>
 +
dfu-util -a 0 -D fileToLoad -R
 +
</pre>
 +
 
 +
之后,传送'bootm 0x32000000' 到u-boot或者 'bootelf 0x32000000',如果它是一个elf档案。
 +
 
 +
简单的python script可以启动ELF映像档—以防止ACM bug破坏较大的封包。
 +
 
 +
<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>
 +
 
 +
== 问题排除 ==
 +
 
 +
=== 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:System Developers/zh cn]]

Latest revision as of 15:36, 1 February 2010


Bootloaders
u-boot menu on Neo1973
u-boot splash screen on Neo1973

Neo1973上的bootloader U-Boot,在 Openmoko启动之前负责设备的功能运作,包括用来烧写OpenmokoFLASHUSB 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的更多信息,可以参考下列网址:

您也可以参考下面的内容,得到其它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] 启动选单

u-boot boot menu on Neo1973

从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,都依照stdinstdoutstderr 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' 。

  1. 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

Personal tools