前一阵子,一直在做有关Linux内核移植方面的工作。使用的是Linux-2.6.28的源码包,配合飞思卡尔官方提供的补丁。通过移植工作,最终完成了任务。但是由于硬件条件所限,还有官方提供的补丁打上也有错误存在,所以现将针对内核源码的修改步骤详细的写出,与大家分享。
1.linux/arch/arm/mach-mx25/Makefile.boot 所有的地址都改成9开头的。
2.linux/arch/arm/plat-mxc/include/mach/mx25.h 中的SDRAM基地址 改为CSD_1的。
3.linux/drivers/serial/mxc_uart_early.c中的mxcuart_console_write_chev 注释一部分。
再修改while循环中的寄存器为UTS
修改部分:
#define UTS_TXEMPTY (1<<6) //增加的部分
static void __init mxcuart_console_write_char(struct uart_port *port, int ch)
{
unsigned int status;
//do {
// status = readl(port->membase + MXC_UARTUSR1);
//} while ((status & MXC_UARTUSR1_TRDY) == 0);
do { //增加的部分
status = readl(port->membase + MXC_UARTUTS); //增加的部分
} while ((status & UTS_TXEMPTY) == 0); //增加的部分
writel(ch, port->membase + MXC_UARTUTXD);
}
4.linux/arch/arm/plat-mxc/include/mach/memory.h的38行 PHYS_OFFSET 改为0×90000000。
5.注释用到的expo
在文件linux-2.6.28/arch/arm/mach-mx25/mx25_3stack_cpld.c 中,注释最后一句话。因为在加上此模块后,内核将无法正常启动,会卡死在这个模块的程序中。
这样修改之后,重新编译内核,配合之前的uboot,就可以在目标板上成功启动内核了。但是启动后,会停在kernel panic处,这是提示要挂在根文件系统才行。
根文件系统的使用:
首先,要编译好跟文件系统,这个资料很多。
我使用的是根文件系统名字为ramfs。
其次,我是将根文件系统直接编译进内核的,直接放在目标的ram中运行了,这样操作比较简单快捷。
在内核的源文件根目录下,进行配置,即:make menuconfig
在General Setup中,选择Initied RAM file system and RAM disk (initramfs/initrd) support,
在下面的Initramfs Source file(s)中,写入根文件系统所在的绝对路径,这样一来,就可以把根文件系统编译入内核了。
这样一,经过重新编译,再加载新内核,就会在目标平台上启动内核并进入文件系统了。