logo资料库

android移植到2440.pdf

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
Android 计划系列文档 移植 Android 到 mini2440 By Jeef 2009 年 7 月 17 日 Author:JeefJiang Central South University
Android 计划系列文档 1 移植环境: Target:友善之臂 mini2440 HOST OS:Fedora 8 kernel Version:Linux-2.6.25 编译器:mini2440 光盘所提供的编译器 2 内核移植(一): 2.1 参考资料 感谢一下大侠提供的资料,链接如下. http://blog.chinaunix.net/u2/85263/showart_1729098.html http://blog.chinaunix.net/u/26691/showart_468007html http://embstudy.org/home/space.php?uid=5 http://blog.csdn.net/tekkamanitachi 2.2 进展与缺陷: 时间:JUL,17th,2009 进展: (1)能够显示 Android 的 Home 界面,大钟已经显示在屏幕上; (2)驱动程序方面实现了,触摸屏、LCD,RTC 的驱动 缺陷: (1)触摸屏触摸后监管在控制台上打印坐标,不过 Android 无任何反应 (2)时钟也静止在那里 2.2 移植准备 在移植之前要对移植的对象有一个大致的了解。如果你从网站上下载一个主线纯净的内核, 这个移植主要要实现两个方面的内容,一是 Android 与主线内核不同的部分,二是与你移 植的硬件平台相关的部分。我采用的思路是下载 Android 发布的内核,然后去了 Android 中与 G1 手机硬件平台相关的部分,留下 Android 内核对主线内核更改但与硬件平台无关 的部分,并添加与 mini2440 硬件平台相关的部分。 下 载Android 内 核 : http://code.google.com/p/android/downloads/list 上 下 载 linux-2.6.25-android-1.0_r1.tar.gz 关于 Android 内核与主线 Linux 内核不同的地方,夜猫子大侠已经做了分析,分析的 比较到位,现在拷贝在这里,标注红色的为与硬件相关的,标注蓝色的是硬件无关的,黑色 的部分是笔者目前还不清楚的,有待研究: (1)基于 ARM 架构增加 Gold-Fish 平台,相应增加的目录如下: kernel/arch/arm/mach-goldfish kernel/include/asm-arm/arch-goldfish (2)增加了 yaffs2 FLASH 文件系统,相应增加的目录为: Author:JeefJiang Central South University
Android 计划系列文档 kernel/fs/yaffs2 实际上,Android 包经过编译后生成的 system.img 和 ramdisk.img 文件就是 yaffs2 格式的包. 3. 增加了 Android 的相关 Driver,相应目录为: kernel/drivers/android 主要分为: Android IPC 系统: Binder (binder.c) Android 日志系统: Logger (logger.c) Android 电源管理: Power (power.c) Android 闹钟管理: Alarm (alarm.c) Android 内存控制台: Ram_console (ram_console.c) Android 时钟控制的 gpio: Timed_gpio (timed_gpio.c) 4. 增加了 switch 处理, 相应的目录为: kernel/drivers/switch/ 5. 增加了一种新的共享内存处理方式, 相应增加的文件为: kernel/mm/ashmem.c 6. 其他为 Linux-2.6.25 内核所做的补丁等等,例如 BlueTooth, 在此不做详细分析 另外 GoldFish 平台相关的驱动文件如下: 1. 字符输出设备: kernel/drivers/char/goldfish_tty.c 2. 图象显示设备: (Frame Buffer) kernel/drivers/video/goldfishfb.c 3. 键盘输入设备: kernel/drivers/input/keyboard/goldfish_events.c 4. RTC 设备: (Real Time Clock) kernel/drivers/rtc/rtc-goldfish.c 5. USB Device 设备: kernel/drivers/usb/gadget/android_adb.c 这里只要用了支持 Android 的 ADB 工具,用于调试 6. SD 卡设备: kernel/drivers/mmc/host/goldfish.c 7. FLASH 设备: kernel/drivers/mtd/devices/goldfish_nand.c kernel/drivers/mtd/devices/goldfish_nand_reg.h 8. LED 设备: kernel/drivers/leds/ledtrig-sleep.c 9. 电源设备: kernel/drivers/power/goldfish_battery.c 10. 音频设备: kernel/arch/arm/mach-goldfish/audio.c 11. 电源管理: kernel/arch/arm/mach-goldfish/pm.c 12. 时钟管理: kernel/arch/arm/mach-goldfish/timer.c Author:JeefJiang Central South University
Android 计划系列文档 2.3 移植过程: 以下内容摘自mini2440 论坛http://www.arm9home.com/bbs/read.php?tid-1342.html,我的内核版本是 2.6.25, 是通常内核移植的基本步骤,红色部分是我 Anroid 系统对内核的特性要求 一、解压下载的内核, 二、修改内核源码根目录下的 Makefile 文件 #ARCH ?= arm #CROSS_COMPILE ?=arm-linux- 三、修改 arch/arm/plat-s3c24xx/common-smdk.c 文件,修改 Nand Flash 的分区信息和 Nand Flash 的硬 件信息。 (1) static struct mtd_partition smdk_default_nand_part[] = { [0] = { .name = "vivi", .size = SZ_16K*20, .offset = 0, }, [1] = { .name = "kernel", .offset = SZ_16K*20, //SZ_16K*20 开始为 SZ_32K*10,不过 make 时出错,换成为 SZ_16K*20 就 OK 了 不知道为什么 .size = SZ_2M, }, [2] = { .name = "yaffs2", .offset = SZ_2M+SZ_16K*20, .size = SZ_2M*20, // SZ_2M*20 是我随便写的 不想再算了 呵呵 }, 此处的分区一定要与 supervivi 的分区一致 我是用的 [x] bon part 0 320k 2368k 所以只分了三个区 (2) static struct s3c2410_platform_nand smdk_nand_info = { .tacls = 0, .twrph0 = 30, //这 三个数字要改的 以前是 20 60 20 .twrph1 = 0, .nr_sets = ARRAY_SIZE(smdk_nand_sets), .sets = smdk_nand_sets, }; 四、 修改 drivers/mtd/nand/s3c2410.c,去掉 nand flash 的 ECC。 我的内核是通过 U-BOOT 写到 Nand Flash 的, U-BOOT 通过的软件 ECC 算法产生 ECC 校验码, 这 与内核校验的 ECC 码不一样, 内核中的 ECC 码是由 S3C2410 中 Nand Flash 控制器产生的。所以,我在 这里选择禁止内核 ECC 校验。 //此段引用别人的 我只是照此修改了 Author:JeefJiang Central South University
Android 计划系列文档 搜索关键字 NAND_ECC_SOFT,在 s3c2410_nand_init_chip 函数里,修改 NAND_ECC_SOFT 为 NAND_ECC_NONE 五、增加 Yaffs2 文件系统的支持 解压 Yaffs2 并将其加入 Linux 内核(打补丁的方式) #cd yaffs2 #./patch-ker.sh c /mnt/linux-2.6.22.2/ 六、系统初始化时的芯片晶振频率的修改,修改 arch/arm/mach-s3c2440/mach-smdk2440.c ...... static void __init smdk2440_map_io(void) { s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc)); s3c24xx_init_clocks(12000000); s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs)); } 七、配置内核 先拷贝 s3c2410 开发板的默认配置到内核根目录下,以简化配置过程 # cp arch/arm/configs/s3c2410_defconfig .config # make menuconfig 1.General setup ---> [*] Configure standard kernel features (for small systems) ---> 选上这项,否则文件系统中的一些选项不会出现 2. System Type ----> [*] S3C2410 DMA support [*] Support ARM920T processor S3C2410 Machines ---> [*] SMDK2410/A9M2410 S3C2440 Machines ---> [*] SMDK2440 [*] SMDK2440 with S3C2440 CPU module 接下来是配置 Android 内核部分: (一) 取消选择与 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 (二) 选择 S3C2410 LCD 相关的内容 Device Drivers ---> Graphics support ---> Support for frame buffer devices ---> <*> S3C2410 LCD framebuffer support Author:JeefJiang Central South University
Android 计划系列文档 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 (三) 选中 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 (四) 尽量选中 Android 内核可选选项 Device Drivers ---> Android ---> [*] RAM buffer console Device Drivers ---> Android ---> [*] Android timed gpio driver Device Drivers ---> Android ---> [*] Only allow certain groups to create sockets (五)添加对触摸屏的支持 Device Drivers-INPUT--TOUCHSCREEN--S3C2410TS 2.4 经验教训 一、Android 需要配置成 EABI 特性,EABI 改善了浮点运算的速度,是一种软件 加速的方法.如果内核不用 EABI 编译,而 BUSYBOX 用 EABI 编译,内核启动后, 不能进入控制台,无法调用 BUSYBOX 命令。我就遇到这样的事情,内核释放完初 始化内存后,就停下来了,进不了命令行 二、在移植的时候我是直接将 MINI2440 的 2.6.29 文件拷贝到 2.6.25 下,需要 注意的是内核计划到 2.6.29 后头文件的位置发生了变化。需要做相应更改 三、 S3C2410 Machines ---> [*] SMDK2410/A9M2410 S3C2440 Machines ---> [*] SMDK2440 [*] SMDK2440 with S3C2440 CPU module 这几个选项必须一起选才能编译过,这是不明白的地方 四、如果使用 mini2440 自带的 boot,需要注意 SMDK2440 与 MINI2440 所注册的 MACHINE ID 是不同的,只有内核和 UBOOT 的 MACHINE ID 一直才能启动。 Author:JeefJiang Central South University
Android 计划系列文档 3 内核移植二————触摸屏问题解决(初步) 时间:JUL,20th,2009 进展 针对上次遗留问题 (1)能够显示 Android 的 Home 界面,大钟已经显示在屏幕上; (2)驱动程序方面实现了,触摸屏、LCD,RTC 的驱动 缺陷: (3)触摸屏触摸后监管在控制台上打印坐标,不过 Android 无任何反应 (4)时钟也静止在那里 遗留问题(1)已经解决,原因是没将其加入平台设备 遗留问题(2)(3)已经基本解决,能够看到漂亮的画面,但是滚动条还是不好用 添加了 USB 鼠标功能,但是好像只有 ESC 和 HOME 键有用,其他键没有用。 下一步计划 (1):解决滚动条触摸问题 (2)添加 SD 卡驱动 (3)由于能源管理的原因,系统经常进入休眠,没办法唤醒。用键盘上的键好像没作用 触摸屏问题解决思路: (一) 在 mini2440 触摸屏驱动的基础上,将其变成平台设备,注意平台设备有一个很关键 的地方需要注意, static struct platform_drivers 3c2410ts_driver = { .driver = { .nam e = "s3c2410_ts", .bus = &platform_bus_type, }, .probe = s3c2410ts_probe, .remove = s3c2410ts_remove }; struct platform_device s3c_device_ts = { .name = "s3c2410_ts", 注意红色的部分要匹配,后者无法注册 (二) 触摸屏的校准问题,触摸屏校准的关键是获取 top-left 和 botton-right 的坐标,并注 意在 Android 的系统中,top-left 是源点,至于怎么获取,在笔者的《mini2440 触摸 屏驱动中已经提供了测试程序,自己去试试便知道 (三) Android 的校准一直以来很伤头,在获取 top-left 和 botton-right 的坐标后,就知道 了 X,Y 轴的坐标范围了,采用下面的方法进行设置。 input_set_abs_params(mtouch->dev, ABS_X, MTOUCH_MIN, MTOUCH_MAX_XC, 0, 0); input_set_abs_params(mtouch->dev, ABS_Y, MTOUCH_MIN_YC, MTOUCH_MAX_YC, 0, 0); (四)Android 的 POWER 选项一定要选上,我就在这上面折腾了好久,至于为什么,希望 有高手能说明一下 Author:JeefJiang Central South University
分享到:
收藏