免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10357 | 回复: 0
打印 上一主题 下一主题

移植Android 到mini2440 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-25 20:04 |只看该作者 |倒序浏览


文件:
内核移植.rar
大小:
13KB
下载:
下载

移植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硬件平台相关的部分。
下载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格式的包.
   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
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校验。 //此段引用别人的   我只是照此修改了
        搜索关键字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
    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一直才能启动。

    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   的机制还不清楚,接下来的几天要弄清楚

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/69999/showart_2036954.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP