在TI-Omap3530上移植Android GingerBread 2.3.4

实现功能:在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卡重新启动开发板,终于能看到正常的画面显示了。


你可能感兴趣的:(安卓移植,android,ubuntu,audio,vim,path,build)