}  准备开发板和相关资料

}  要了解开发板的相关配置(有那些外围设备等)

}  下载内核源码、取得相关工具软件

}  kernel,toolchain  etc.

}  选定参考板

}  选择一个内核中已经支持,且和自己的开发板相似的参考板为模板,进行修改

}  修改开发板相关代码

}  完成BSP的修改移植(过时)

如:arch/arm/mach-exynos/

在内核里有一个结构“struct machine_desc”,内核用这个结构表示一个实际存在的板子,而针对每个板子都会有一个文件定义这个结构体,这个文件叫平台代码;

     如:arch/arm/mach-s5pv21/mach-smdkv210.c(新版本内核中没有基于Exynos4412的平台代码,这里以s5pv210为例)

struct machine_desc {

         unsigned int       nr;        /* architecture number         */

         const char       *name;      /* architecture name   */

         unsigned long      atag_offset; /* tagged list (relative) */

         const char *const     *dt_compat;  /* array of device tree 'compatible' strings        */

         …..

         void            (*init_irq)(void);

         void            (*init_time)(void);

         void            (*init_machine)(void);

};

基于s5pv210的smdkv210的定义:

arch/arm/mach-s5pv210/mach-smdkv210.c中有如下代码:

         MACHINE_START(SMDKV210, "SMDKV210")

                   /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */

                   .atag_offset        = 0x100,

                   .init_irq      = s5pv210_init_irq,

                   .map_io               = smdkv210_map_io,

                   .init_machine      = smdkv210_machine_init,

                   .init_time   = samsung_timer_init,

                   .restart       = s5pv210_restart,

                   .reserve      = &smdkv210_reserve,

         MACHINE_END



 

}  如果使用设备树则修改设备树文件

如:arch/arm/boot/dts/exynos4412-origen.dts

在内核启动过程中设备树中的信息被转换为machine_desc

 

}  arch/arm/mach-exynos

}  arch/arm/plat-samsung

}  arch/arm/tools/mach-types

}  arch/arm/Kconfig

}  arch/arm/Makefile

}  arch/arm/boot/compressed

}  arch/arm/boot/dts/

}  Makefile

 

}  添加驱动

}  闪存驱动(MTD NAND)

}  串口用来打印信息

}  可以在内核启动之前打印信息

}  内核启动后可以通过console打印信息

}  网络支持可以使得开发调试更为方便

}  如挂载网络文件系统

 

}  编译、调试、下载内核

 

 

 

内核的配置和编译

【实验目的】

       了解内核的编译过程及配置选项的内容

       说明:在本系统移植课程实验中命令行提示符 “$”表示是在主机上执行,“#”表示在目标板执行

【实验环境】

•          主机:ubuntu 12.04发行版

•          目标机:FS4412平台

•          交叉编译工具:arm-none-linux-gnueabi-gcc

【实验步骤】

•           $ sudo  apt-get  install  libncurses5-dev

•          解压内核

将linux-3.14.tar.xz拷贝到/home/linux下并解压

$ tar  xvf  linux-3.14.tar.xz

$ cd  linux-3.14

•          修改内核顶层目录下的Makefile

$ vim Makefile

修改:

ARCH             ?= $(SUBARCH)

CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)

为:

ARCH             ?= arm

CROSS_COMPILE ?= arm-none-linux-gnueabi-

•          导入默认配置

$ make  exynos_defconfig

•          配置内核

$ make  menuconfig

System Type  --->

        (2) S3C UART to use for low-level messages

该命令执行时会弹出一个菜单,我们可以对内核进行详细的配置。这里我们先查看一下,内核都提供了那些功能!

•          编译内核

$ make  uImage

通过上述操作我们能够在arch/arm/boot目录下生成一个uImage文件,这就是经过压缩的内核镜像。

如果编译过程中提示缺少mkimage工具,需将第二天编译的uboot源码中的tools/mkimage拷贝到ubuntu的/bin目录下

$ cp  u-boot-2013.01/tools/mkimage  /usr/bin

修改设备树文件

生成设备树文件,以参考板origen的设备数文件为参考。

cp arch/arm/boot/dts/exynos4412-origen.dts  arch/arm/boot/dts/exynos4412-fs4412.dts


添加新文件需修改Makefile才能编译

$ vim arch/arm/boot/dts/Makefile

exynos4412-origen.dtb \

下添加如下内容

exynos4412-fs4412.dtb \

•    编译设备树文件

$ make dtbs

•    拷贝内核和设备树文件到/tftpboot目录下

$ cp  arch/arm/boot/uImage  /tftpboot

$ cp  arch/arm/boot/dts/exynos4412-fs4412.dtb  /tftpboot/

•    修改uboot启动参数

重启板子在系统倒计时是按任意键结束启动,输入如下内容修改uboot环境变量:

# setenv serverip 192.168.9.120

# setenv ipaddr 192.168.9.233

# setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 – 42000000

#setenv bootargs root=/dev/nfs nfsroot=192.168.9.120:/source/rootfs rw console=ttySAC2,115200  init=/linuxrc  ip=192.168.9.233

# saveenv

注意:192.168.9.120 对应Ubuntu的ip

         192.168.9.233 对应板子的ip

      这两个ip应该根据自己的实际情况适当修改

重启开发板查看现象

 

 

 

 

 

网卡驱动的移植

【实验目的】

       通过上面的实验我们能够获得一个内核,但是这个内核只是一个最基本的配置,很多的功能并没有包含。

       网卡是嵌入式产品最常用的设备,这里我们需要完成网卡驱动的移植。FS4412使用的是DM9000网卡,我们通过这个实验能够了解如何在内核中添加网卡驱动及网络功能的基本配置。

    说明:在本系统移植课程实验中命令行提示符 “$”表示是在主机上执行,“#”表示在目标板执行

【实验环境】

•          主机:ubuntu 12.04发行版

•          目标机:FS4412平台

•          交叉编译工具:arm-none-linux-gnueabi-gcc

【实验步骤】

•    设备树文件修改:

$ vim  arch/arm/boot/dts/exynos4412-fs4412.dts

       添加如下内容:

srom-cs1@5000000 {

        compatible = "simple-bus";

        #address-cells = <1>;

        #size-cells = <1>;

        reg = <0x5000000  0x1000000>;

        ranges;


        ethernet@5000000 {

               compatible = "davicom,dm9000";

               reg = <0x5000000 0x2 0x5000004 0x2>;

               interrupt-parent = <&gpx0>;

               interrupts = <6 4>;

               davicom,no-eeprom;

               mac-address = [00 0a 2d a6 55 a2];

        };

};

•    修改文件driver/clk/clk.c

修改

static bool clk_ignore_unused;

static bool clk_ignore_unused = true;

 

•    配置内核:

make menuconfig

[*] Networking support  --->

Networking options  --->

        <*> Packet socket

        <*> Unix domain sockets

        [*] TCP/IP networking

        [*]   IP: kernel level autoconfiguration

Device Drivers  --->

[*] Network device support  --->

        [*]   Ethernet driver support (NEW)  --->

               <*>   DM9000 support

File systems  --->

[*] Network File Systems (NEW)  --->

        <*>   NFS client support

        [*]     NFS client support for NFS version 3

        [*]       NFS client support for the NFSv3 ACL protocol extension

        [*]   Root file system on NFS

 

•    编译内核和设备树

$ make uImage

$ make dtbs

•    测试:

拷贝内核和设备树文件到/tftpboot目录下

$ cp  arch/arm/boot/uImage  /tftpboot

$ cp  arch/arm/boot/dts/exynos4412-fs4412.dtb  /tftpboot/

     启动开发板,修改内核启动参数,通过NFS方式挂载根文件系