<!-- END HEADER --> <!-- LEFTBAR -->
转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot com>
很多朋友买Broncho A1就是冲着它的开放性来的,A1不但开放基本内核源代码,提供开发用的数据线,而且开放以前开发的Broncho Linux Platform手机平台。无论是对Just for fun的玩家,还是想学习嵌入式Linux开发的程序员,Broncho A1都是最好的选择之一。我们将写一系列的文章,为新手提供一个hack指南。也希望有兴趣的朋友加入文档的编写和修订工作中来。
3.移植Android 2.0
警告:移植Android 2.0的工作量很大,如果没有很多空闲时间和深入研究的决心,请不要轻易去尝试(呵,我可没有时间来帮你解决所有问题)。
3.1 下载和编译Android-2.0
下载源代码请参考android官方网站上的指南:http://source.android.com/download。
这里我们假设eclair的源代码已经下载到/work/android/android-eclair目录里了。
cd /work/android/android-eclair
make -j2
正常情况下应该可以顺利编译过去。
3.2 制作yaffs2文件系统
编译完成后,生成的文件系统out/target/product/generic/system.img不能直接使用,要用broncho提供的 mkyaffs2image(可到官方网站下载:http://www.broncho.cn/download/hacktools /mkyaffs2image)重新生成image,这个版本与原始版本不同之外在于,它在yaffs2文件系统的OOB里写了一些用于硬件ECC的数 据。可按下列方式生成:
[android-eclair]# mkyaffs2image out/target/product/generic/system system.bin
把生成的文件系统映像system.bin拷贝到tftp服务的根目录里:
[android-eclair]#cp system.bin /var/lib/tftpboot/
[android-eclair]#chmod 644 /var/lib/tftpboot/system.bin
3.2 编译内核
注:在本文发表之际,broncho还没有公布内核代码,开发人员正在从linux 2.6.28移植到linux 2.6.29,基本功能完成后就会公布。从商业角度考虑,这个公布的内核代码只提供基本的驱动程序,至于电源的管理等特性还需要hacker们自己的去完 善和优化。如果感兴趣的朋友比较多,可以考虑想成立一个开源项目,大家一起来玩。
下面以linux-2.6.28的编译为例。
在arch/arm/configs/目录下,有很多编译配置文件,其中arch/arm/configs/android_an0001_pxa300_defconfig是开发用的内核,里面支持usbnet。
[android-eclair]# cd linux-2.6.28
先配置内核,如果你还需要定制其它特性,可以用make ARCH=arm menuconfig来定制。
[linux-2.6.28]# make ARCH=arm android_an0001_pxa300_defconfig
拷贝initrd过来(也就是out/target/product/generic/root目录,前面编译eclair时生成的),后面编译内核时会根据它来生成initrd。
[linux-2.6.28]# cp /work/android/android-eclair/out/target/product/generic/root . -rf
编译
[linux-2.6.28]# make ARCH=arm CROSS_COMPILE=/work/android/android-eclair/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
编译完成后,会生成arch/arm/boot/zImage, 把它拷贝到tftp服务的根目录下:
[linux-2.6.28]# cp arch/arm/boot/zImage /var/lib/tftpboot/kernel.bin
[linux-2.6.28]# chmod 644 /var/lib/tftpboot/kernel.bin
3.3 下载内核
确保tftp服务启动,firewall关闭。关于PC端的配置请参考《broncho a1 hack指南-准备环境》。
取下A1的电池,用开发数据数连接电脑和手机,用minicom打开串口,安装好电池,A1自动开机。
当串口输出下列信息时,按下空格键,blob进入交互模式:
Autoboot (1 seconds) in progress, press key SPACE to stop .Type “help” to get a list of commands
在交互模式下输入:dwrite kernel.bin
blob> dwrite kernel.bin
串口会输出:
Set id: 0×7d3
***** Plug-in USB cable & config usbdnet now ******
exit check_usb_connection:1
然后在PC端配置USBNET:
[root@localhost ~]# ifconfig usb0 1.1.1.1
此时手机端开始下载,串口会输出:
TFTPing kernel.bin####################* OK.
received 0×1459 blocks (0×28ae10 bytes)
download kernel.bin to nandflash partition kernel, address 0×9a0000 size 0×400000 …… OK
注意:如果下载时中断了,通常是因为dhclient重新配置了USBNET的IP地址,所以要禁止dhclient为USBNET动态配置IP。同事上次教我一个简单的办法,就是为usb0写一个网络配置脚本。
3.4 下载文件系统
在交互模式下输入:dwrite system.bin
blob> dwrite system.bin
如果前面刚刚下载过内核,不需要在PC端重新配置usbnet了,否则要在PC端执行:
[root@localhost ~]# ifconfig usb0 1.1.1.1
然后开始下载,串口会输出:
Vendor ID : 0×8086
Product ID : 0×7d3
TFTPing system.bin############################################################################################
这个过程比较长,可能要好几分钟,你可以先休息一下或者做点别的。
下载完成后reboot,串口会打印内核的调试信息:
Starting kernel at 0×80800000…
Uncompressing Linux……………………………………………………………………………………………………………
Linux version 2.6.28 (lixianjing@localhost.localdomain) (gcc version 4.1.1) #4 Wed Oct 7 16:42:59 CST 2009
CPU: XScale-V3 based processor [69056881] revision 1 (ARMv5TE), cr=0000397f
CPU: VIVT data cache, VIVT instruction cache
Machine: Marvell Form Factor Development Platform (aka Littleton)
Memory policy: ECC disabled, Data cache writeback
RO Mode clock: 60.00MHz (inactive)
Run Mode clock: 312.00MHz (*24)
Turbo Mode clock: 624.00MHz (*2, active)
HSIO bus clock: 208.00MHz
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512
Kernel command line: init=/linuxrc root=/dev/ram0 console=ttyS2,115200 mem=128M android uart_dma
PID hash table entries: 512 (order: 9, 2048 bytes)
Console: colour dummy device 80×30
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
…
后面?系统启不来?运行有问题?那就对了,Android是一个通用平台,当然不可能直接拿过来用,你要针对不同的硬件去实现适配层,工作量相当 大,否则MOTO、HTC和BORQS(即 OPhone实现者)就不用养几百号开发人员了。即使你是天才,也不可能一个人完成这个任务。如果你真的感兴趣,可以选择某一方面去尝试,比如 WIFI,BT和GSM模组等。后面我们会介绍一些调试方法,有助于加快hack的速度。
前面我们已经告诉你玩火时要小心了,如果你不是真是的hacker,现在又后悔了,怎么呢?在后面的文章中,我们会告诉你怎么把A1恢复到原来的样子。
附:这是我在Fedora 12上为usb0写的配置文件:
/etc/sysconfig/network-scripts/ifcfg-usb0
DEVICE=usb0
BOOTPROTO=none
ONBOOT=no
TYPE=Ethernet
NETMASK=255.255.255.0
BROADCAST=1.1.1.255
IPADDR=1.1.1.1
GATEWAY=192.168.1.1
USERCTL=no
IPV6INIT=no
PREFIX=24
NAME=”System usb0″
UUID=689ce77b-bfa1-c10b-19a2-eb3a89251128
NM_CONTROLLED=no