视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
android移植到2440
2025-10-02 18:48:27 责编:小OO
文档
移植Android 到mini2440

By Jeef

2009年7月17日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硬件平台相关的部分。

内http://code.google.com/p/android/downloads/list上下载下载Android核:

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文件系统,相应增加的目录为: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.c2.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校验。 //此段引用别人的我只是照此修改了搜索关键字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 supportDevice 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一直才能启动。

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下载本文

显示全文
专题