smdk210 内核移植

smdk210 内核移植
一.掌握:
.tar.bz2
解压:tar jxvfFileName.tar.bz2
压缩:tar jcvfFileName.tar.bz2 DirName
 第一部分:基本移植
1.1、内核编译体验
修改Makefile
cp android_kernel_2.6.35_smdkv210.tar.bz2 
解压之,  # tar -jxvf android_kernel_2.6.35_smdkv210.tar.bz2
重命名,  # mv android-kernel-samsung-dev gxa210-kernel-2.6.35.7
修改Makefile,添加以下两行以指定平台和交叉编译工具链。
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH            ?= $(SUBARCH)
CROSS_COMPILE   ?=
CROSS_COMPILE   ?= $(CONFIG_CROSS_COMPILE:"%"=%)
ARCH  = arm
CROSS_COMPILE =arm-linux-
# Architecture as present in compile.h
UTS_MACHINE     := $(ARCH)
SRCARCH         := $(ARCH)
配置, # makesmdkv210_android_defconfig
进一步配置, # make menuconfig
编译 # make zImage
经过漫长(机器好点三五分钟,差的十来分钟)时间的编译,完成后在 arch/arm/boot/目录下即会生成zImage文件,这个压缩内核就是我们的目标了。
将之copy到/tftpboot目录下(要根据你的ubuntu中tftp服务器的搭建来确定,我这里tftp服务器的下载目录就是/tftpboot),然后从uboot中下载,运行:
# tftp 0x20008000 zImage
#bootm 0x20008000
                                                                                    二.
可以看到内核并未启动起来。其实这时内核已经运行了,只是因为配置中串口选择不对造成的,于是乎我们对其进行必要修改。
1.2、make menuconfig中基本选项
1.2.1、串口配置,选择串口0
System Type --->
  (0) S3C UART to use for low-level messages
Kernel hacking  --->
(0) S3C UART to use for low-level debug
1.3、确定机器码
vi arch/arm/tools/mach-types
在2443行可以看出,SMDKV210评估板的机器码是2456(16进制是0x998):
2443 smdkv210        MACH_SMDKV210           SMDKV210                2456
该机器码与uboot中使用的相同,因此不需修改。
1.4、确定内核的加载地址与参数地址
vi arch/arm/mach-s5pv210/Makefile.boot
可以看出,内核的加载地址和参数地址分别为0x20008000和0x20000100,bootloader启动内核前应该将内核拷贝到0x20008000,并将参数放到0x20000100。
     zreladdr-y  +=0x20008000
params_phys-y   := 0x20000100
1.5、修改Nand分区
drivers\mtd\nand\s3c_nand.c定义好了NandFlash的分区表,需要修改drivers\mtd\nand\s3c_nand.c文件:
vi drivers/mtd/nand/s3c_nand.c
struct mtd_partition s3c_partition_info[] ={
 {
                   .name                = "uboot",
                   .offset                = 0,          /* for bootloader */
                   .size          = (1*SZ_1M),
                   .mask_flags     = MTD_CAP_NANDFLASH,
         },
         {
                   .name                = "recovery",
                   .offset                = MTDPART_OFS_APPEND,
                   .size          = (5*SZ_1M),
         },
         {
                   .name                = "kernel",
                   .offset                = MTDPART_OFS_APPEND,
                   .size          = (5*SZ_1M),
         },
         {
                   .name                = "ramdisk",
                   .offset                = MTDPART_OFS_APPEND,
                   .size          = (3*SZ_1M),
         },
         {
                   .name                = "root",
                   .offset                = MTDPART_OFS_APPEND,
                   .size          = MTDPART_SIZ_FULL,
         },
};
我们把512MB的分成了以下几个区,每个分区用于存放不同的内容:
分区名     起始地址         结束地址         大小

分区名

起始地址

结束地址

大小

uboot

0x000000000000

0x000000100000

0x000000100000   1MB

recovery

0x000000100000

0x000000600000

0x000000500000   5MB

kernel

0x000000600000

0x000000b00000

0x000000500000   5MB

ramdisk

0x000000b00000

0x000000e00000

0x000000300000   3MB

root

0x000000e00000

0x000020000000

0x00001F200000   498MB

 
1.6、编译
 直接make -j4以得到zImage,
1.7、zImage下载启动
首先复制文件到tftp下载目录, # cp arch/arm/boot/zImage  /tftpboot/ –f
然后开发板端启动uboot,首先设置内核传参, setenv bootargs root=/dev/mtdblock4console=ttySAC0,115200 rootfstype=yaffs rw
然后tftp下载内核                   # tftp0x20008000 zImage
待下载完成后启动之, # bootm0x20008000
看到如下启动信息。(当然,最终内核启动是失败的,那是因为我们并未提供对应的根文件系统。当提供了相应的根文件系统后启动即会成功
仔细查看以上错误信息,可以看到一些关键字如“LR is at max8698_pmic_probe+0x150/0x32c”可以,内核崩溃发生在max8698相关部分。
                                                                 一。
Max8698是SMDKV210开发板上使用的电源管理芯片,而我们的开发板上并未使用。因此之前在移植uboot时我们屏蔽了该PMIC相关代码,现在移植kernel,也需要做相应处理,即在makemenuconfig中去掉max8698模块。
Device Drivers  --->
         [*]Voltage and Current Regulator Support --->
                   <>   Maxim 8698 voltage regulator
[*]Multifunction device drivers  --->
[ ]   Maxim SemiconductorMAX8698 PMIC Support
重新make zImage,tftp下载运行。
这回内核终于可以正常运行了。不过因为我们并没有下载根文件系统,因此最终挂载根文件系统时发生还是会发生错误。
 第二部分:加入开发板GXA210
经过以上的移植,我们已经借助SMDKV210的在内核中的bsp编译了一个可以在我们的开发板上跑起来的内核了。但是我们的开发板GXA210和三星官方的
1、在KBuild系统中增加GXA210开发板的配置菜单
vi arch/arm/mach-s5pv210/Kconfig
在MACH_SMDKV210修改:
config MACH_GXA210
        bool"GXA210"
       select CPU_S5PV210
       select ARCH_SPARSEMEM_ENABLE
       select S3C_DEV_WDT
       select HAVE_S3C2410_WATCHDOG
       select S3C_DEV_I2C1
       select S3C_DEV_I2C2
       select HAVE_PWM
       select S3C_DEV_HSMMC
        select S3C_DEV_HSMMC1 if !S5PV210_SD_CH0_8BIT
       select S3C_DEV_HSMMC3 if !S5PV210_SD_CH2_8BIT
       select S5PV210_SETUP_SDHCI
       select S5PV210_POWER_DOMAIN
        help
         Machine support for GXA210
2、配置内核,加入GXA210开发板的支持
make menuconfig
选上下面一项,加入GXA210开发板的支持:
System Type --->
Board selection(SMDKV210)  ---> 
[*] GXA210
SMDKV210毕竟有很多不同存在,因此直接在SMDKV210上移植有诸多不便,比较普遍的做法是在内核中添加GXA210进去。
3、加入了GXA210开发板的支持
修改arch/arm/mach-s5pv210/Makefile文件
vi arch/arm/mach-s5pv210/Makefile
在“# machine support”下面加入:
obj-$(CONFIG_MACH_GXA210)       += mach-gxa210.o smdkc110-rtc.o
如果在配置内核时加入了GXA210开发板的支持,则CONFIG_MACH_GXA210=y, mach-gxa210.c和smdkc110-rtc.c文件会被编译进内核。
4、创建开发板源文件
复制mach-smdkc110.c为mach-gxa210.c
cp arch/arm/mach-s5pv210/mach-smdkc110.carch/arm/mach-s5pv210/mach-gxa210.c
5、修改开发板型号
将arch/arm/mach-s5pv210/mach-gxa210.c文件的末尾
修改成如下(就是将SMDKV210改成GXA210):
#ifdef CONFIG_MACH_SMDKC110
MACHINE_START(SMDKC110,"SMDKC110")
#elif CONFIG_MACH_GXA210
MACHINE_START(GXA210,"GXA210")
#endif
         /*Maintainer: Kukjin Kim <[email protected]> */
         .phys_io   = S3C_PA_UART & 0xfff00000,
         .io_pg_offst     = (((u32)S3C_VA_UART) >> 18) &0xfffc,
         .boot_params = S5P_PA_SDRAM + 0x100,
         .init_irq    = s5pv210_init_irq,
         .map_io             = smdkc110_map_io,
         .init_machine  = smdkc110_machine_init,
         .timer                = &s5p_systimer,
MACHINE_END
         2.1关闭蜂鸣器
            struct s3c_pwm_data pwm_data[] = {
          {
           .gpio_no = S5PV210_GPD0(0),
            .gpio_name  = "GPD",
            .gpio_set_value = 0,//S5PV210_GPD_0_0_TOUT_0,
          },
6、添加GXA210的机器码
在arch/arm/tools/mach-types中添加GXA210的机器码。在这里我们暂时自己分配一个临时编码给GXA210,注意尽量不要和既有的编码冲突。
即,在文件末尾添加一行:
gxa210  MACH_GXA210GXA210 9999
7、uboot中修改机器码。
由于内核的机器码由SMDKV210(2456)修改为GXA210(9999),因此uboot端也需要修改机器码,否则引导过程会校验机器码错误。修改方法有两种:
第一,可以修改uboot源码。在配置文件gxa210.h中修改机器码的配置,再重新配置编译。这种方法比较彻底,但是相对麻烦。而且每更换一个机器码不同的kernel就得重新编译一次uboot,不够灵活。

第二,不修改uboot源码,增加一个环境变量machid即可(# set machid 0x270f)。查看uboot的源码,在do_bootm_linux函数中可以看到,uboot启动kernel时传递的机器码为machid局部变量,该局部变量会被环境变量machid所覆盖。

8、修改内存物理地址
vi arch/arm/mach-s5pv210/include/mach/memory.h
修改第16行为:
#if defined(CONFIG_MACH_SMDKV210) || defined(CONFIG_MACH_GXA210)
#define PHYS_OFFSET             UL(0x20000000)
#else
#define PHYS_OFFSET             UL(0x30000000)
#endif
7、修改内存映射
vi arch/arm/mach-s5pv210/include/mach/map.h
修改第156行,增加GXA210
#if defined(CONFIG_MACH_SMDKV210) || defined(CONFIG_MACH_GXA210)
#define S5PV210_PA_SDRAM (0x20000000)
#else
#define S5PV210_PA_SDRAM (0x30000000)
#endif
10、添加LCD支持(如果不添加会导致启动时内核OOPS错误)
vi drivers/video/samsung/Kconfig
修改第77行,增加MACH_GXA210
config FB_S3C_LTE480WV
         bool "LTE480WV"
         depends on (MACH_SMDKV210 || MACH_SMDKC110 ||MACH_GXA210)
         ---help---
           This enables support for Samsung LTE480WV 4.8\" WVGA LCD panel
然后 make menuconfig,确认driver中LTE480WV被选中。
Device Drivers  --->  
         Graphicssupport  --->
                   <*>Support for frame buffer devices  --->
                            SelectLCD Type (LTE480WV)  --->
11、重新编译,下载内核
make –j4
重新下载运行后,包含了GXA210专用bsp的内核便在开发板上跑起来了。
至此,内核基本移植已经完成。

 

第三部分:常用设备驱动的移植
1、DM9000驱动移植
GXA210核心板板载了DM9000网卡芯片,只要内核中增加了相应的驱动,即可实现有线上网。对于linux内核来说,网络功能极其重要,只有开发板有了网络连接能力,才能与主开发机进行通信。后面我们要进行的根文件系统制作、驱动编写调试、应用程序开发调试等均依赖于网络功能。
GXA210上的DM9000网卡移植很容易,主要原因有二:
第一,我们移植的起点,三星的SMDKV210中也使用了DM9000网卡,因此很多配置信息都是现成的。第二,linux的总线驱动模型实现了驱动和设备的分离,因此DM9000的驱动本身是可以复用的(uboot中使用的DM9000驱动就来自于linux中)。
基于以上两点,因此我们的移植工作主要在于设备端。移植的方法是根据GXA210与SMDKV210开发板的DM9000网卡硬件接线的不同,修改必要的设备信息即可。

上图是GXA210原理图中DM9000网卡芯片的部分原理图。重要的信息如下:
1、CS(37脚)连接了Xm0CSn1
2、CMD(32脚)连接了Xm0ADDR2
3、INT(34脚)连接了XEINT7
相应的代码部分修改如下:
(1)修改网卡物理地址,对应上面1
vi arch/arm/mach-s5pv210/include/mach/map.h
//#define S5PV210_PA_DM9000       (0xA8000000)
#define S5PV210_PA_DM9000       (0x88000000)
(2)修改命令线和外部中断配置,分别对应上面2和3。
Arch/arm/plat-s5p/devs.c
static struct resources5p_dm9000_resources[] = {
         [0]= {
                   .start= S5P_PA_DM9000,
                   .end   = S5P_PA_DM9000,
                   .flags= IORESOURCE_MEM,
         },
         [1]= {
#if defined(CONFIG_DM9000_16BIT)
                   //.start = S5P_PA_DM9000 + 2,
                   //.end   =S5P_PA_DM9000 + 2,
                   .start = S5P_PA_DM9000 + 8,
                   .end   =S5P_PA_DM9000 + 8,
                   .flags= IORESOURCE_MEM,
#else
                .start= S5P_PA_DM9000 + 1,
                   .end   = S5P_PA_DM9000 + 1,
                   .flags= IORESOURCE_MEM,
#endif
         },
         [2]= {
                   //.start = IRQ_EINT9,
                   //.end   =IRQ_EINT9,
                   .start = IRQ_EINT7,
                   .end   =IRQ_EINT7,
                   .flags= IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
         }
};
重新make,下载运行,可以看到如下启动信息:
Ifconfig查看并设置网卡地址,然后ping主机测试,结果如下:
可见,网络已经工作起来了,网卡移植成功!
 
第三部分:启用NFS文件系统
为调试方便:使能内核支持nfs作为rootfs
内核中默认配置并未使能nfs作为根文件系统,这导致我们只能将做好的根文件系统镜像烧录到Nand中启动,很麻烦。因此我们将对内核做适当配置,使其支持从nfs挂载根文件系统。
未配置前从NFS启动的报错信息如下:
(1)、配置网络部分,主要是使能CONFIG_IP_PNP以在2中能够看到Root file system onNFS选项
[*] Networking support
         Networkingoptions
                   [*]TCP/IP networking
                            [*]IP: kernel level autoconfiguration
                                     [*]IP: DHCP support
                                     [*]IP: BOOTP support
(2)、配置开启nfs服务
File systems  --->  
         NetworkFile Systems  --->
                   <*>NFS client support
              [*]NFS client support for NFS version 3                                
  [*] NFS clientsupport for the NFSv3 ACL protocol extension
                        [*]NFS client support for NFS version 4 (EXPERIMENTAL)
                      [*]NFS client support for NFSv4.1 (DEVELOPER ONLY)
                        [*]Root file system on NFS 

                                              

 

 

 

你可能感兴趣的:(smdk210 内核移植)