当我们在u-boot上做了关于nandflash、dm9000网卡、SDRAM和一些基本配置的修改和添加后,我们要让自己修改后的u-boot能启动linux内核,还要做哪些相应的修改呢?
下面我们先来看一下linux内核是怎样被u-boot引导加载的:
我们都知道在u-boot中是通过bootm命令来启动linux内核的,bootm会调用do_bootm_linux()这个函数,它会把入口地址复制给内核,然后就调用 theKernel (0, machid, bd->bi_boot_params),这个函数会提供给内核板子的ID号和uboot需传递给内核的启动参数所位于的地址。当我们要让u-boot成功启动内核时,我们就要在u-boot里添加关于启动参数的宏的定义:
然后我们在这一行下加入代码:
然后在u-boot的
board/lingyun/fl2440/fl2440.c下修改USB的时钟设置和FCLK的频率
#define M_MDIV 0xC3 #define M_PDIV 0x4 #define M_SDIV 0x1
-#elif FCLK_SPEED==1
-#define M_MDIV 0xA1 -#define M_PDIV 0x3 -#define M_SDIV 0x1
+#elif FCLK_SPEED==1
+#define M_MDIV 0x7f +#define M_PDIV 0x2 +#define M_SDIV 0x1 #endif之后我们要进入u-boot的
arch/arm/cpu/arm920t/s3c24x0/speed.c下修改时钟源相关的代码
p = ((r & 0x003F0) >> 4) + 2; s = r & 0x3;
+#if defined(CONFIG_S3C2440)
+ if (pllreg == MPLL) + return ((CONFIG_SYS_CLK_FREQ * m * 2) /(p << s)); + else if (pllreg == UPLL) +#endif
return (CONFIG_SYS_CLK_FREQ * m) / (p << s);然后在78行删除
- return (readl(&clk_power->CLKDIVN) & 2) ? get_FCLK() / 2 : get_FCLK(); -} - -/* return PCLK frequency */ -ulong get_PCLK(void) -{ - struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power(); 第100行后修改
- return (readl(&clk_power->CLKDIVN) & 1) ? get_HCLK() / 2 : get_HCLK(); + return (readl(&clk_power->CLKDIVN) & 2) ? get_FCLK() / 2 : get_FCLK();
然后在FCLK的函数末尾添加PCLK函数的定义
+ulong get_PCLK(void)
+{
+ struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
+
+ return (readl(&clk_power->CLKDIVN) & 1) ? get_HCLK() / 2 : get_HCLK();
+}
+
上面这几步完成后,内核移植u-boot代码的修改部分就差不多了。接下来我们就要对内核做相应的修改,在网上取得linux内核的源码包后(我用的是linux-3.0.2的源码包),
解压进入内核的根目录,我们主要修改三个部分:Makefile,driver,arch.
接下来就 vi Makefile 在第11行加入编译器的路径和处理器型号:
ARCH ?= arm CROSS_COMPILE ?= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-
第559下加入
all: vmlinux + cp arch/arm/boot/zImage . -f + mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n "Linux Kernel" -d zImage linuxrom-s3c2440.bin + rm -f zImagm
然后在第1207行加入
@rm -f linuxrom-s3c2440.bin
如果我们要让mkimage命令生效,就要进行如下操作:
接下来我们就vi arch/arm/mach-s3c2440/mach-smdk2440.c改晶振频率
找到163行改成s3c24xx_init_clocks(12000000);
再vi drivers/tty/serial/samsung.c改串口
55行改成 #define S3C24XX_SERIAL_NAME "ttyS"
接下来该机器的ID号: vi arch/arm/tools/mach-types
将第88行的362改为1999;第359行改为362。
最后我们就要对menuconfig 文件进行配置,
先 cp arch/arm/configs/mini2440_defconfig .config
再 export TERM=vt100
make menuconfig
出现这个界面:
选择光标所在处,进入如下界面:
选中后再进入选择板子的类型(*所在处)
之后就退出,保存。接下来Makefile就会根据make menuconfig的配置进行选择性的编译。
我们再make 就可以进行编译生成linuxrom-s3c2440.bin
然后就用开发板进行试验。
然后run tb,内核就会跑起来: