linux3.0内核移植(S3C2440)

当我们在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里添加关于启动参数的宏的定义:


然后我们在这一行下加入代码:

linux3.0内核移植(S3C2440)_第1张图片

然后在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函数的定义
<pre style="word-wrap: break-word; white-space: pre-wrap;">+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

当我们执行bootm时,跳到内核运行时,内核会利用mkimage这个工具来压缩生成zImage映像文件,它在生成映像文件时会在原来的可执行映像文件前加一个头记录参数所指定的信息,这样uboot才能识别这个映象是针对哪个CPU体系结构的,哪个OS的,哪种类型,加载内存中的哪个位置, 入口点在内存的那个位置以及映象名。

然后在第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
出现这个界面:linux3.0内核移植(S3C2440)_第2张图片
选择光标所在处,进入如下界面:
linux3.0内核移植(S3C2440)_第3张图片 
 选中后再进入选择板子的类型(*所在处)
linux3.0内核移植(S3C2440)_第4张图片 
之后就退出,保存。接下来Makefile就会根据make menuconfig的配置进行选择性的编译。
我们再make 就可以进行编译生成linuxrom-s3c2440.bin 
然后就用开发板进行试验。
linux3.0内核移植(S3C2440)_第5张图片 
然后run tb,内核就会跑起来:
linux3.0内核移植(S3C2440)_第6张图片 
 
 
 
 




 
 
 
 
 
 

你可能感兴趣的:(linux内核)