} 准备开发板和相关资料
} 要了解开发板的相关配置(有那些外围设备等)
} 下载内核源码、取得相关工具软件
} 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方式挂载根文件系