1 移植环境: Target:友善之臂mini2440 HOST OS:Fedora 8 kernel Version:Linux-2.6.25 编译器:mini2440光盘所提供的编译器 2 内核移植(一): 2.1 参考资料 感谢一下大侠提供的资料,链接如下. http://blog./u2/85263/showart_1729098.html http://blog./u/26691/showart_468007html 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文件系统,相应增加的目录为: kernel/fs/yaffs2 实际上,Android包经过编译后生成的system.img和ramdisk.img文件就是yaffs2格式的包. Android 电源管理: Power (power.c) Android 闹钟管理: Alarm (alarm.c) kernel/drivers/switch/ 这里只要用了支持Android的ADB工具,用于调试 2.3 移植过程: 以下内容摘自mini2440论坛http://www./bbs/read.php?tid-1342.html,我的内核版本是2.6.25, 是通常内核移植的基本步骤,红色部分是我Anroid系统对内核的特性要求 一、解压下载的内核, 二、修改内核源码根目录下的Makefile文件
接下来是配置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 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 ---> 这几个选项必须一起选才能编译过,这是不明白的地方 四、如果使用mini2440自带的boot,需要注意SMDK2440与MINI2440所注册的MACHINE ID是不同的,只有内核和UBOOT的MACHINE ID一直才能启动。
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选项一定要选上,我就在这上面折腾了好久,至于为什么,希望有高手能说明一下
JUL,21th,2009——SD卡移植 今天成功的搞定了SD卡的移植,SD卡的驱动程序还是用了mini2440的驱动程序,不过因为移植到得内核是Linux2.6.25,所以需要做相应的头文件位置更改,另外在ARCH文件夹中要做如下更改: SC324XX.C中做如下更改: void __init s3c244x_map_io(struct map_desc *mach_desc, int size) { /* register our io-tables */
iotable_init(s3c244x_iodesc, ARRAY_SIZE(s3c244x_iodesc)); iotable_init(mach_desc, size);
/* rename any peripherals used differing from the s3c2410 */ s3c_device_sdi.name= "s3c2440-sdi"; s3c_device_i2c.name = "s3c2440-i2c"; s3c_device_nand.name = "s3c2440-nand"; s3c_device_usbgadget.name = "s3c2440-usbgadget"; } 在commonsmdk.c中做如下更改: static struct platform_device __initdata *smdk_devs[] = { &s3c_device_nand, &smdk_led4, &smdk_led5, &smdk_led6, &smdk_led7, & s3c_device_sdi, }; 关于内核配置,一下选项是必须的: #NATIVE LANGUAGE CONFIG_NLS_DEFAULT="iso8859-1" CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_ISO8859_1=y # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" 关于根文件的配置文件如下: /etc/mountd.conf ## mountd configuration file
## add a mount entry for each mount point to be managed by mountd mount { ## root block device with partition map or raw FAT file system block_device /dev/block/mmcblk0p1 这里必须是mmcblk0p1而不是mmcblk0,尽管/dev/block下有这个文件
## mount point for block device mount_point /sdcard
## true if this mount point can be shared via USB mass storage enable_ums true }
/etc/vold.conf ## vold configuration file for the emulator/SDK
volume_sdcard { ## This is the direct uevent device path to the SD slot on the device ##emu_media_path /devices/platform/goldfish_mmc.0/mmc_host/mmc0 emu_media_path /devices/platform/s3c2440-sdi/mmc_host:mmc0 这个可以查询/SYS下得到类似的 media_type mmc mount_point /sdcard ums_path /devices/platform/usb_mass_storage/lun0 } 虽然移植上去了,不过对于MMC LAYER 的机制还不清楚,接下来的几天要弄清楚 |
|
来自: LeoSea > 《mini2440之路》