现在的位置: 首页 > 综合 > 正文

linux-3.1.4 在micro2440(mini2440)上的移植(一)(by liukun321咕唧咕唧)

2013年10月11日 ⁄ 综合 ⁄ 共 4521字 ⁄ 字号 评论关闭

       其实从2.6.32版本的内核开始就已经添加了对mini2440的支持,新版本的3.1.4不能说对mini2440完美支持,但至少只要正确配置内核配置选项,实现内核的启动不费什么功夫的。只要你熟悉mini2440的基本配置,就可以把内核轻松的启动起来。当然启动内核不是我们的目的,我们要做的是实现3.1.4下mini2440所有的驱动。其实有一部分驱动在driver hacker的努力下已经实现了。剩下我们要做的是修改bug,并完成剩余的驱动。这篇文章首先介绍用nfs根文件系统启动内核,DM9000驱动的移植,和LCD驱动的修改。

1.移植内核的第一步,需要确定uboot的机器号是否和内核的机器号对应,我是将内核的机器号修改成与uboot对应,id号定义在内核源码目录下arch/arm/tools/mach-types 下。359行mini2440  MACH_MINI2440  MINI2440  1999  当我们在配置内核,选择

 System Type  --->

               S3C2440 and S3C2442 Machines  --->

                                          [*] MINI2440 development board

按上述配置,

#define MACHINE_START(_type,_name)   \
static const struct machine_desc __mach_desc_##_type \
 __used       \
 __attribute__((__section__(".arch.info.init"))) = { \
 .nr  = MACH_TYPE_##_type,  \
 .name  = _name,

#define MACHINE_END    \
};   位于arch/arm/include/asm/mach

机器号将通过这个宏定义在内核中声明,uboot在启动时启动信息中的机器号将于内核中的机器号匹配,匹配成功才进入后面的启动过程。否则终止。

2.如果内核停在Uncompressing Linux..... done, booting the kernel. 怎么办?首先我们需要确定串口驱动是否配置,

     Device Drivers  --->

                       Character devices  --->

                                         Serial drivers  ---> 

                                                         <*> Samsung SoC serial support                                     
                                                          [*] Samsung SoC serial debug                                     
                                                          [*] Support for console on Samsung SoC serial port                

                                                         <*> Samsung S3C2440/S3C2442/S3C2416 Serial port support

然后开启内核debug,即开启内核的调试打印输出

    Kernel hacking  --->

                        (7) Default message log level (1-7) 
                        [*] Enable __deprecated logic

                        [*] Enable __must_check logic
                        。。。。
                        [*] Kernel debugging
                        [*] Collect scheduler debugging info
                        [*] Mutex debugging: basic checks
                        [*] Enable stack unwinding support (EXPERIMENTAL) 
                        [*] Verbose user fault messages 
                        [*] Kernel low-level debugging functions

                        (0) S3C UART to use for low-level debug

配置完后编译,若因机器号匹配错误导致无法启动,内核将打印出错误信息。

3.其余配置选项可以参考,mini2440缺省的配置文件,或SMDK2440的配置文件,我在这里就不赘述了。关于DM9000的配置:

Device Drivers  ---> 
                   [*] Network device support  --->
                               [*]   Ethernet (10 or 100Mbit)  --->
                                              <*>   DM9000 support                                           
                                               (4)     DM9000 maximum debug level 

配置好选项,编译,用NFS根文件文件系统启动。发现内核信息到dm9000 dm9000: eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
就执行不了,然后内核panic并提示无法挂载NFS文件系统,就无其他提示了,这是首先确定是内核是否配置了NFS文件系统的支持

       File systems  ---> 
                     [*] Network File Systems  ---> 
                              <*>   NFS client support                                        
                                [*]     NFS client support for NFS version 3  
                              [*]   Root file system on NFS                                                                         

如果配置好了仍无法启动,你就可以考虑网络的问题了,像是线路连接啊,服务器端的防火墙是否关了呀等等。不过移植3.1.4内核,无法启动是因为DM9000驱动的问题,以为3.1.4.的DM9000的驱动并不是通用的,往mini2440上移植需作些许修改。如下:

在dm9000.c文件中1693行处添加:

unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;
 unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;
 *((volatile unsigned int *)S3C2410_BWSCON) =
   (oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
 *((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;

因为DM9000是挂在2440的总线上,在模块加载时,我们需要对总线进行初始化。不过你也可以将上述代码加在mach-mini2440.c的模块初始化函数里,这个你可以随意。

在1582行加入下述红字:

memcpy(ndev->dev_addr, "\x08\x90\x90\x90\x90\x90", 6);//配置DM9000的软MAC地址
 if (!is_valid_ether_addr(ndev->dev_addr)) {
  dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "
    "set using ifconfig\n", ndev->name);

  random_ether_addr(ndev->dev_addr);
  mac_src = "random";
 }

保存并编译内核,内核即可成功挂载NFS根文件系统。

4.下面该看LCD了,如果你配置文件已经勾了LCD的相关配置,启动完内核,你会发现lcd有了LOGO,但是歪了。看mach-mini2440.c文件,LCD的相关配置都在这,找到3.5寸屏,因为我的屏是统宝的,我们需要修改:(见红字)

static struct s3c2410fb_display mini2440_lcd_cfg[] __initdata = {
 [0] = { /* mini2440 + 3.5" TFT + touchscreen */
  _LCD_DECLARE(
   7,   /* The 3.5 is quite fast */
   240, 1, 26, 6,  /* x timing */
   320, 4, 4, 2,  /* y timing */
   60),   /* refresh rate */
  .lcdcon5 = (S3C2410_LCDCON5_FRM565 |
       S3C2410_LCDCON5_INVVLINE |
       S3C2410_LCDCON5_INVVFRAME |
       S3C2410_LCDCON5_INVVDEN |
       S3C2410_LCDCON5_PWREN),
 },
编译启动OK,屏幕显示正常。并启动了缺省的QT文件系统,显示没问题了。

     今天先写到这,记录了linux-3.1.4最小系统的启动和DM9000,LCD驱动的修改,记得在移植时LCD的背光曾出现问题,不过那发生在几天前,当时懒惰了一下就没记录问题解决过程,现在记不得了。

抱歉!评论已关闭.