其实从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的背光曾出现问题,不过那发生在几天前,当时懒惰了一下就没记录问题解决过程,现在记不得了。