將Android 移植到FS2410 開發板上
轉載請註明源自 嵌入式學習網 - 王安
http://embstudy.org/home/space.php?uid=5&do=blog&id=46
一、目前進展
1 . Android 已經可以通過 NFS 在 FS2410 開發板上運行
二、目前缺陷
1 .觸摸屏沒有校準
2 . Android 中時鐘停止,結束 zygote 進程,系統重啓,時鐘更新,但再次停止不動
3 .串口無法與 GPRS 模塊通訊
三、移植步驟
一、移植 Android 內核到 FS2410 開發板上
1 、從 http://code.google.com/p/android/downloads/list 上下載 linux-2.6.25-android-1.0_r1.tar.gz
2 、將內核解壓到用戶目錄,如 /home/wangan/kernel.git
3 、進入 kernel.git 文件夾,如 cd ~/kernel.git/
4 、修改 arch/arm/plat-s3c24xx/common-smdk.c 文件中的 nand flash 分區設置,如 gedit arch/arm/plat-s3c24xx/common-smdk.c
修改 static struct mtd_partition smdk_default_nand_part[] 結構體爲:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "Boot Agent",
.size = SZ_256K,
.offset = 0,
},
[1] = {
.name = "Linux Kernel",
.offset = SZ_256K,
.size = SZ_2M - SZ_256K,
},
[2] = {
.name = "File System",
.offset = SZ_2M,
.size = SZ_32M - SZ_2M,
},
[3] = {
.name = "Other",
.offset = SZ_32M,
.size = SZ_32M,
}
};
5 、在 http://www.codesourcery.com/gnu_toolchains/arm/portal/release644 網站上下載 IA32 GNU/Linux TAR 。
6 、將文件解壓到用戶目錄,如 /home/wangan/arm-2008q3
7 、進入 arm-2008q3/bin 文件夾,如 cd ~/arm-2008q3/bin/
8 、添加當前路徑進入環境變量,如 export PATH=$PWD:$PATH ,或修改 ~/.bashrc 文件並重新登錄
9 、進入內核文件夾,如 cd ~/kernel.git/
10 、修改 Makefile 文件,如 gedit Makefile
更改 ARCH 和 CROSS_COMPILE
#ARCH ?= $(SUBARCH)
ARCH ?= arm
#CROSS_COMPILE ?= arm-eabi-
CROSS_COMPILE ?= arm-none-eabi-
11 、從華清遠見 Linux-2.6.8.1 內核壓縮包中提取 .config 文件(注意: config 前面有個“ . ”)放入 kernel.git 文件夾
12 、運行 make menuconfig
(1) 確保 System Type ---> ARM system type () 中的內容爲 Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442, S3C2443
(2) 確保 System Type ---> S3C2410 Machines ---> [*] SMDK2410/A9M2410 被勾選
(3) 取消選擇與 Goldfish 相關的內容
Device Drivers ---> Character devices ---> < > Goldfish TTY Driver
Device Drivers ---> Power supply class support ---> < > Goldfish battery driver (NEW)
Device Drivers ---> Real Time Clock ---> < > GOLDFISH (NEW)
Device Drivers ---> Graphics support ---> Support for frame buffer devices ---> < > Goldfish Framebuffer
(4) 選擇 S3C2410 LCD 相關的內容
Device Drivers ---> Graphics support ---> Support for frame buffer devices ---> <*> S3C2410 LCD framebuffer support
Device Drivers ---> Graphics support ---> [*] Bootup logo ---> [*] Standard black and white Linux logo
Device Drivers ---> Graphics support ---> [*] Bootup logo ---> [*] Standard 16-color Linux logo
Device Drivers ---> Graphics support ---> [*] Bootup logo ---> [*] Standard 224-color Linux logo
(5) 選中 Android 內核必須選項
Kernel Features ---> [*] Use the ARM EABI to compile the kernel
General setup ---> [*] Use full shmem filesystem
General setup ---> [*] Enable Android's Shared Memory Subsystem
System Type ---> [*] Support Thumb user binaries
Device Drivers ---> Android ---> [*] Android log driver
Device Drivers ---> Android ---> <*> Binder IPC Driver
(6) 儘量選中 Android 內核可選選項
Device Drivers ---> Android ---> [*] RAM buffer console
Device Drivers ---> Android ---> [*] Android timed gpio driver
Device Drivers ---> Android ---> [*] Only allow certain groups to create sockets
(7) 其餘 CONFIG 選項,如系統支持請一併選擇
CONFIG_ANDROID_POWER =y
CONFIG_ANDROID_POWER_STAT =y
CONFIG_ANDROID_POWER_ALARM =y
(可以在 Kconfig 文件中查找 ANDROID_POWER 等字段進行選擇,或者直接修改 .config 文件)
13 、退出並保存 .config
二、移植 LCD 驅動到 Linux-2.6.25 內核
1 、 進入 kernel.git 文件夾,如 cd ~/kernel.git/
2 、 修改 arch/arm/mach-s3c2410/mach-smdk2410.c 文件,如 gedit arch/arm/mach-s3c2410/mach-smdk2410.c
(1) 增加頭文件 #include <asm/arch/fb.h>
(2) 增加兩給結構體
static struct s3c2410fb_display smdk2410_lcd_cfg __initdata = {
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
.type = S3C2410_LCDCON1_TFT,
.width = 320,
.height = 240,
.pixclock = 174757,
.xres = 320,
.yres = 240,
.bpp = 16,
.left_margin = 16,
.right_margin = 59,
.hsync_len = 9,
.upper_margin = 2,
.lower_margin = 6,
.vsync_len = 16,
};
static struct s3c2410fb_mach_info smdk2410_fb_info __initdata = {
.displays = &smdk2410_lcd_cfg,
.num_displays = 1,
.default_display = 0,
.gpccon = 0xaa955699,
.gpccon_mask = 0xffc003cc,
.gpcup = 0x0000ffff,
.gpcup_mask = 0xffffffff,
.gpdcon = 0xaa95aaa1,
.gpdcon_mask = 0xffc0fff0,
.gpdup = 0x0000faff,
.gpdup_mask = 0xffffffff,
.lpcsel = 0xf82,
};
(3) 在 smdk2410_init ()函數中增加 s3c24xx_fb_set_platdata(&smdk2410_fb_info);
三、移植觸摸屏驅動到 Linux-2.6.25 內核(參見 《基於 linux-2.26.5內核的 FS2410開發板觸摸屏驅動移植》 )並製作 zImage 文件,如 make
這裏提一下,確保已經勾選 Device Drivers ---> Input device support ---> <*> Event interface ,本人曾經在這裏徘徊,感謝遊老師悉心教誨!
四、製作支持 ARMv4 的 Android 根文件系統
1 、從 http://www.rayfile.com/files/d4660882-de04-11dd-af0d-0014221b798a/ 下載 Android 的 ARMv4 版本根文件
2 、在 /dev 下增加 null 和 console 兩個設備節點
mknod -m 660 null c 1 3
mknod -m 660 console c 5 1
3 、在 U-boot 中修改啓動參數 init 爲 /init ,完整的命令行如: root=nfs nfsroot=169.254.7.118:/source/rootfs ip=169.254.7.119 console=ttySAC0,115200 init=/init
4 、修改 /init.rc 文件,去除除 mount tmpfs tmpfs /sqlite_stmt_journals size=4m 之外的所有 mount 命令
系統製作完成,現在應該可以看到漂亮的大表了。首次啓動需要創建文件,大約 17 分鐘。然後每次啓動只需要 2 分鐘。