实现功能:在Devkit8000开发板上实现android环境运行
开发板:TI-OMAP3530,以及其他配件,容量大的SD卡一张
运行环境:ubuntu10.04;
1.接下来要下载源码,由于TI(德州仪器公司官方网站提供了android源码,所以我们可以到期官方网站上下载,为了便于查找,我在下面给出了链接)
GingerBread 2.3.4版Devkit,下载页面链接地址如下:
http://software-dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/TI_Android_GingerBread_2_3_4_DevKit_2_1/index_FDS.html
or
(更方便查找)
http://software-dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/TI_Android_GingerBread_2_3_4_DevKit_2_1/exports/TI_Android_GingerBread_2_3_4_DevKit_2_1.tar.gz
下载完以后我们会得到名为“TI_Android_GingerBread_2_3_4_DevKit_2_1.tar.gz ”的解压缩包。
我们将其解压到您所需要的工作目录下(ben@ben-desktop:~/rowboat-android/)我在自己的主目录下创建了一个rowboat-android,ben@ben-desktop:~$ mkdir rowboat-android
cd rowboat-android
ben@ben-desktop:~/rowboat-android$
cp ~/TI_Android_GingerBread_2_3_4_DevKit_2_1.tar.gz ./
tar -xvf TI_Android_GingerBread_2_3_4_DevKit_2_1.tar.gz
解压后会得到一个TI_Android_GingerBread_2_3_4_DevKit_2_1的目录然后我们到该目录下:
cd TI_Android_GingerBread_2_3_4_DevKit_2_1
然后我们查看一下该目录下的文件
并打开Documents目录:
我们能看到该目录下有三个后缀名为.pdf的文件,其中名为
TI-Android-GingerBread-2.3.4-DevKit-2.1_DeveloperGuide.pdf的文件就是我们所要参考的安装的向导文件
2.接下来我们要下载GingerBread 2.3.4版源码,闻其名就知道它是我们本次实验的最核心的东西了,为了方便大家,直接将下载地址列出:
http://software-dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/TI_Android_GingerBread_2_3_4_DevKit_2_1/exports/TI_Android_GingerBread_2_3_4Sources.tar.gz
这个包是一个非常庞大的文件,我下载的解压缩包就有3.9G,不管你信不信,我反正是下了很久!
3.GingerBread 2.3.4需要交叉编译环境,我们选择的是Ubuntu 10.0.4,我在VMWare上安装了Ubuntu 10.0.4,有关Ubuntu 10.0.4的安装网上有大把的,提前提醒大家给Ubuntu准备一个很大的硬盘,比如40G或者以上,我设定的是80G,android源码随便编译一下就有个10多G,同时虚拟机内存也要修改一下我以前用的是512M,后来在编译生成android文件系统过程中出现ld terminated with signal 7,ld terminated with signal 11的错误,特别是编译libwebcore.so 时出错,我一开始也不知道怎么回事,后面查看了网上的资料提示是内存不够产生的,害我在此浪费了大把时间,又不得不重新安装VMWare,注意调整你的Ubuntu的硬盘空间和内存。我安装了Ubuntu之后需要按要求升级Ubuntu,我们最好事先更新一下 $sudo apt-get update
具体升级命令如下,需要注意一下几点:
一:PDF文档中第一行少了一个ubuntu,执行到第二句时出错;
二:安装的java必须是6.0版本的;
$ sudo add-apt-repository "deb http://archive.canonical.com/ubuntu lucid partner"
$ sudo add-apt-repository "deb-src http://archive.canonical.com/ubuntu lucid partner"
$ sudo apt-get update
$ sudo apt-get install git-core gnupg sun-java6-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev minicom tftpd uboot-mkimage expect
$ sudo update-java-alternatives -s java-6-sun
除去第一行需要进行修改后,我们其它的步骤无需进行修改。
4. 接下来要做的是下载repo
Repo是一个能使android和GIT工作环境更简便的工具,关于它更多的信息我们可以参考
接下来我们需要创建一个bin目录,在用户目录新建一个bin目录,并设置到路径中,命令如下:
$ mkdir ~/bin
$ PATH=~/bin:$PATH
接下来我们需要下载Repo 脚本并且确保它是可执行的
其实这步的第一项无需执行,因为我们在下载源码包的时候它已经包含在包里面了。
我们只需要执行:
chmod a+x ~/bin/repo
修改它的权限就可以了。
5.解压android源码:
在Ubuntu的主工作目录上新建一个目录,叫rowboat-android(之前我们已经新建了),(这个目录名可以随便起,我是按照PDF文档来的)然后将下载的TI_Android_GingerBread_2_3_4Sources.tar.gz拷贝到Ubuntu的rowboat-android目录上。
然后解压该文件,命令如下:
$ tar -xvzf TI_Android_GingerBread_2_3_4Sources.tar.gz
解压后进入该文件夹:
解压出来只有一个Readme文件,当然还有一个.repo文件(我们上面提到的)由于它是隐藏的我们当然看不见。
然后执行repo命令从本地同步源码,使用--local-only选项,命令如下:
$ ./.repo/repo/repo sync --local-only
执行成功后可以在TI_Android_GingerBread_2_3_4Sources目录看见同步出来的源文件。我们就能在该目录下看到我们主要的一些目录了
6. 设置工具链(toolchain)
解压出来的源码包括了一套toolchain,需要做的就是将toolchain的路径加入到PATH中,命令如下:
$ export PATH= ~/rowboat-android/TI_Android_GingerBread_2_3_4Sources/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH
(注意:我这里导入的是我自己实验时的工作路径!)
7.1
开始编译x-loader
进入TI_Android_GingerBread_2_3_4Sources下的x-loader目录,根据PDF文档,执行以下命令编译x-loader
$ make CROSS_COMPILE=arm-eabi- distclean
$ make CROSS_COMPILE=arm-eabi- omap3beagle_config
$ make CROSS_COMPILE=arm-eabi-
仔细观察一下这三个指令,相当于我们第一次配置一个新内核或者u-boot时所用到的
第一步相当于 make distclean;
第二步相当于配置开发板,相当于产生“system type”,所以我们选择 omap3beagle_config;
最后一步相当于make;
另外,对于32位的系统,执行前需要将./build/core/main.mk 中的
ifneq (64,$(findstring 64,$(build_arch)))
改为:
ifneq (i686,$(findstring i686,$(build_arch)))
否则会报只支持64位系统的错误。
仔细观察一下x-loader,会发现它其实和我们的u-boot是类似的,功能也是类似的,它起到一些加载和初始化的工作。
执行完make CROSS_COMPILE=arm-eabi-这步之后,我们就进入我们熟悉的编译等待过程了,然后我们会发现新文件的产生
x-load.bin
7.2生成MLO
由于MMC/SB卡的启动需要的是MLO文件,所以我们需要利用signGP这个工具将 x-load.bin 转换成x-load.bin.ift
在改名为MLO
signGP这个工具可以在第一步下载的Devkit包里找到,这个包里面还有很多没有解压的包,我们再次一一将其解压
在Tools/signGP/目录下我们能够找到signGP。
将这个文件拷贝到Ubuntu的x-loader目录上,执行以下命令生成MLO文件
$ ./signGP ./x-load.bin
$ mv x-load.bin.ift MLO
8. 编译u-boot.bin:
进入TI_Android_GingerBread_2_3_4Sources下的u-boot目录
$ cd u-boot
注意,《DeveloperGuide》原文是$ cd u-boot-omap3,目录名不对
通过以下命令编译u-boot.bin
$make distclean ARCH=arm CROSS_COMPILE=arm-eabi-
$make omap3_evm_config ARCH=arm CROSS_COMPILE=arm-eabi-
$ make ARCH=arm CROSS_COMPILE=arm-eabi-
编译提示错误 serial.c出错!
/rowboat-android/TI_Android_GingerBread_2_3_4Sources/u-boot/include/configs$ vim omap3_evm.h
修改串口参数,修改为
/*
* select serial console configuration
*/
#define CONFIG_CONS_INDEX 3
#define CONFIG_SYS_NS16550_COM3 OMAP34XX_UART3
#define CONFIG_SERIAL1 3 /* UART1 on OMAP3 EVM */
修改后执行:
$ make ARCH=arm CROSS_COMPILE=arm-eabi-
9 编译Linux kernel
进入TI_Android_GingerBread_2_3_4Sources下的kernel目录,通过以下命令编译uImage,执行前测试一下mkimage命令是否可以正常执行,该命令在生成uImage文件时要使用到。
$ make distclean ARCH=arm CROSS_COMPILE=arm-eabi-
$ make omap3_evm_android_defconfig ARCH=arm CROSS_COMPILE=arm-eabi-
$ make uImage ARCH=arm CROSS_COMPILE=arm-eabi-
注意:使用的config是 omap3_evm_android_defconfig!
编译成功的话可以在kernel/arch/arm/boot目录找到生成的uImage文件
10.1. 创建Android文件系统
进入TI_Android_GingerBread_2_3_4Sources目录,执行以下命令开始编译生成Android文件系统:
$ make TARGET_PRODUCT=omap3evm OMAPES=3.x -j2
编译过程中可能会提示错误:如:/bin/bash :jar :command not found
这是因为需要下载JAVA的JDK包
http://wwb8.blog.163.com/blog/static/3626349520112175849825/
这个链接有具体的下载方法
根据TI_Android_GingerBread_2_3_4_DevKit_2_1文件夹的PDF文档
查看你的开发板的BeagleBoard版本,根据如果是Beagleboard Rev Cx的话,要使用OMAPES=3.x选项,如果是Beagleboard XM A/B/C 则使用OMAPES=5.x。
-j8选项是指定使用多少个CPU进行编译,也可不加,加上这个会加快编译速度,减少时间,也可不加,具体根据你的CPU而定。
编译需要很长时间,请耐心等待。
编译成功后可以在TI_Android_GingerBread_2_3_4Sources/out/target/product/omap3evm目录找到新生成的文件系统。
10.2. 制作Android文件系统
编译完成后进入out/target/product/omap3evm
$cd ~/Android_build/out/target/product/omap3evm创建一个新的目录Android_RFS将该目录下的system,root,data目录下的内容按如下步骤进行拷贝:
$mkdir ~/Android_RFS
$cp -a root/* ~/Android_RFS
$cp -a data/* ~/Android_RFS/data/
$cp -a system/* ~/ Android_RFS/system/
$cd ~/Android_RFS
$sudo chown -R root.root *
$sudo chmod -R 777 *
13. 制作启动SD卡
在终端输入:wget http://cgit.openembedded.org/cgit.cgi/openembedded/plain/contrib/angstrom/omap3-mkcard.sh
可以下载到一个omap3-mkcard.sh的执行分区脚本
Add execution permission:
$ chmod +x omap3-mkcard.sh
文件编译好了就开始制作启动SD卡,准备一张容量大一点的2/4 G SD卡,通过读卡器连接到Ubuntu上,留意一下该卡mount到那个目录,找到设备名,一般是/dev/sdb。
如果SD卡上有其它资源先将他们全部删除
然后执行 : ./sudo omap3-mkcard.sh /dev/sdb
将需要的文件都拷贝进去,MLO,u-boot.bin,uImage,拷贝到/media/boot目录下;“Android_RFS目录下的内容”拷贝至另外一个目录。
这样一个SD卡制作的android系统就制作成功了 打开minicom
启动开发板按住SD卡启动键然后打开开发板电源:
修改启动参数:
setenv bootargs 'console=ttyO2,115200n8 androidboot.console=ttyO2 mem=256M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=4 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y vram=12M omapfb.vram=0:12M'
#save
在重新启动:
提示:DRAM: 128MiB
VFS: Cannot open root device "mmcblk0p2" or unknown-block(179,2)
我们需要将DRAM 设置为256MIB
还要找到mmcblk0p2出错原因;
TI_Android_GingerBread_2_3_4Sources/u-boot$ vim arch/arm/cpu/arm_cortexa8/omap3/sdrc.c
DRAM的存储值在这个文件里进行修改!
141 writel(/*RASWIDTH_13BITS*/(0x3 <<24) | CASWIDTH_10BITS | ADDRMUXLEGACY |
142 RAMSIZE_128 | BANKALLOCATION | B32NOT16 | B32NOT16 |
143 DEEPPD | DDR_SDRAM, &sdrc_base->cs[cs].mcfg);141 writel(/*RASWIDTH_13BITS*/(0x3 <<24) | CASWIDTH_10BITS | ADDRMUXLEGACY |
142 RAMSIZE_128 | BANKALLOCATION | B32NOT16 | B32NOT16 |
143 DEEPPD | DDR_SDRAM, &sdrc_base->cs[cs].mcfg);
将141行 RASWIDTH_13BITS注释掉添加:0x3 <<24
将183行和188行注释掉!
183 //if ((sysinfo.mtype == DDR_COMBO) || (sysinfo.mtype == DDR_STACKED)) {
184 do_sdrc_init(CS1, NOT_EARLY);
185 make_cs1_contiguous();
186
187 size1 = get_sdr_cs_size(CS1);
188 //}
修改后重新编译u-boot
然后解决:
Cannot open root device "mmcblk0p2" or unknown-block(179,2)
Please append a correct "root=" boot option; here are the available partitions:
1f00 512 mtdblock0 (driver?)
1f01 1920 mtdblock1 (driver?)
1f02 128 mtdblock2 (driver?)
1f03 4096 mtdblock3 (driver?)
1f04 255488 mtdblock4 (driver?)
b300 3887104 mmcblk0 driver: mmcblk
b301 72261 mmcblk0p1 00000000-0000-0000-0000-000000000000mmcblk0p1
b302 3807405 mmcblk0p2 00000000-0000-0000-0000-000000000000mmcblk0p2
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)
这里需要修改SD卡的读写权限:
将TI_Android_GingerBread_2_3_4Sources/kernel/arch/arm/mach-omap2/board-devkit8000.c 改名为 board-omap3evm.c
需要将MACHINE_START(DEVKIT8000, "OMAP3 Devkit8000")
改名为MACHINE_START(OMAP3EVM, "OMAP3 EVM")
修改 SD卡读写权限:将 gpio_wp 注释掉
TI_Android_GingerBread_2_3_4Sources/kernel/arch/arm/mach-omap2$ vim board-omap3evm.c
106 static struct omap2_hsmmc_info mmc[] = {
107 {
108 .mmc = 1,
109 .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
110 //.gpio_wp = 29,
111 },
112 {} /* Terminator */
113 };
然后开始编译内核
编辑内核时提示:
lowmemorykiller.c:(.init.text+0x3868): undefined reference to `get_omap3_evm_rev'
然后查找get_omap3_evm_rev有关的宏和代码 grep -nR get_omap3_evm_rev .
发现它和CONFIG_MACH_OMAP3EVM这个宏有关联
编辑内核时提示:
然后查找get_omap3_evm_rev有关的宏和代码 grep -nR get_omap3_evm_rev .
发现它和CONFIG_MACH_OMAP3EVM这个宏有关联
TI_Android_GingerBread_2_3_4Sources/kernel$ vi arch/arm/plat-omap/include/plat/board.h 提示
170 /* OMAP3EVM revision */
171 #if defined(CONFIG_MACH_OMAP3EVM)
172 u8 get_omap3_evm_rev(void);
173 #else
174 #define get_omap3_evm_rev() (-EINVAL)
因为在MAKEFILE里CONFIG_MACH_OMAP3EVM 对应 obj-$(CONFIG_MACH_OMAP3EVM) += board-omap3evm.o \
hsmmc.o \
board-flash.o
所以/rowboat-android/TI_Android_GingerBread_2_3_4Sources/kernel/arch/arm/mach-omap2$ vim board-omap3evm.c 添加
u8 get_omap3_evm_rev(void)
{
return 0x01;
}
EXPORT_SYMBOL(get_omap3_evm_rev);
修改后重新编译内核,
又提示:ALSA device list:
No soundcards found.
没有创建ALSA节点: 重新配置内核进行如下修改和添加
rowboat-android/TI_Android_GingerBread_2_3_4Sources/kernel/sound/soc/omap$ vim Makefile
obj-$(CONFIG_SND_OMAP_SOC_OMAP3_BEAGLE) += snd-soc-omap3beagle.o
rowboat-android/TI_Android_GingerBread_2_3_4Sources/kernel/sound/soc/omap$ vim Kconfig
config SND_OMAP_SOC_OMAP3_BEAGLE
tristate "SoC Audio support for OMAP3 Beagle and Devkit8000"
depends on TWL4030_CORE && SND_OMAP_SOC
select SND_OMAP_SOC_MCBSP
select SND_SOC_TWL4030
help
Say Y if you want to add support for SoC audio on the Beagleboard or
the clone Devkit8000.
make menuconfig ARCH=arm
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> ALSA for SoC audio support --->
<*> SoC Audio for the Texas Instruments OMAP chips
< > SoC Audio support for OMAP3EVM board
<*> SoC Audio support for OMAP3 Beagle and Devkit8000
< > Build all ASoC CODEC drivers
< > WL1271 Bluetooth Codec support
Symbol: SND_OMAP_SOC_OMAP3EVM [=y] │
│ Type : tristate │
│ Prompt: SoC Audio support for OMAP3EVM board │
│ Defined at sound/soc/omap/Kconfig:75 │
│ Depends on: SOUND [=y] && !M68K && SND [=y] && SND_SOC [=y] && TWL403 │
│ Location: │
│ -> Device Drivers │
│ -> Sound card support (SOUND [=y]) │
│ -> Advanced Linux Sound Architecture (SND [=y]) │
│ -> ALSA for SoC audio support (SND_SOC [=y]) │
│ Selects: SND_OMAP_SOC_MCBSP [=y] && SND_SOC_TWL4030 [=y] │
│
配置完后,然后重新编译内核:
提示:
ALSA device list:
#0: omap3evm 出现以上提示就代表ALSA device 节点已创建;
启动过程中提示如下信息:
[ 30.847961] init: cannot find '/system/bin/sgx/rc.pvr', disabling 'pvr'fa
提示图形加速装置的这个文件没有找到,
回到rowboat-android/TI_Android_GingerBread_2_3_4Sources目录:
make TARGET_PRODUCT=omap3evm sgx BUILD=release OMAPES=3.x
重新编译android文件系统.
启动BeagleBoard
将SD卡插入BeagleBoard,然后上电
发现LCD屏屏幕排布比例不对接下来修改
rowboat-android/TI_Android_GingerBread_2_3_4Sources/kernel$ vim drivers/video/omap2/displays/panel-generic.c
static struct omap_video_timings generic_panel_timings = {
/* 640 x 480 @ 60 Hz Reduced blanking VESA CVT 0.31M3-R */
.x_res = 640,
.y_res = 480,
.pixel_clock = 23500,
.hfp = 48,
.hsw = 32,
.hbp = 80,
.vfp = 3,
.vsw = 4,
.vbp = 7,
};
修改为:
static struct omap_video_timings generic_panel_timings = {
/* 640 x 480 @ 60 Hz Reduced blanking VESA CVT 0.31M3-R */
.x_res = 480,
.y_res = 272,
.pixel_clock = 23500,
.hfp = 48,
.hsw = 32,
.hbp = 80,
.vfp = 3,
.vsw = 4,
.vbp = 7,
};
修改后重新编译uImage
然后拷贝至SD卡重新启动开发板,终于能看到正常的画面显示了。