简介:本文主要介绍了Linux内核的选配编译过程,并加入dm9000网卡驱动,通过nfs挂载根文件系统。由于本人为初学者,这是我的一篇学习笔记,有错误或不足之处还望您提出宝贵的建议。
平台介绍:
CPU:SAMSUNG Exynos-4412
开发板:iTop系列。
Linux内核版本:linux3.19.1
交叉编译器版本:arm-linux-gcc-4.6.4
宿主系统:REHL6.0
1、选平台,指定交叉编译工具链:
(1)、在Makefile中指定:
源码顶层目录下Makefile
ARCH ?=$(SUBARCH)
CROSS_COMPILE ?=$(CONFIG_CROSS_COMPILE:"%"=%)
改为:
ARCH ?=arm
CROSS_COMPILE ?=arm-linux-
(2)、编译时指定:
# make ARCH=armCROSS_COMPILE=/opt/arm-linux-gcc-4.6.4/bin/arm-linux-
2、导出缺省配置:
(1)、直接把缺省配置文件改成 ”.config“:
把“源码/arch/arm/configs”目录下的“xxxx_defconfig“(例如:”exynos_defconfig“)配置文件拷贝到源码顶层目录下,并改名为”.config“。
(2)、使用make生成缺省配置:
# make exynos_defconfig
#执行该命令后系统会在源码顶层目录下自动生成 ”.config“文件:
#configuration written to .config
3、往设备树文件中添加dm9000网卡驱动:
(1)、参考与自己板子最接近的demo板的设备树文件生成自己的设备树文件(直接拷贝修改)。
设备树文件在”源码目录/arch/arm/boot/dts/exynos4412-fs4412.dts“
(2)、在设备树文件中添加网卡设备驱动信息(参考网卡厂商提供的范例代码):
示例代码在”Documentation/devicetree/bindings/net/davicom-dm9000.txt “,如下:
Davicom DM9000 Fast Ethernet controller
Required properties:
- compatible = "davicom,dm9000";
- reg : physical addresses and sizes of registers,must contain 2 entries:
first entry: address register,
secondentry : data register.
- interrupt-parent : interrupt controller to whichthe device is connected
- interrupts : interrupt specifier specific tointerrupt controller
Optional properties:
- davicom,no-eeprom : Configuration EEPROM is notavailable
- davicom,ext-phy : Use external PHY
Example:
ethernet@18000000 {
compatible = "davicom,dm9000";
reg = <0x18000000 0x2 0x18000004 0x2>;
interrupt-parent = <&gpn>;
interrupts = <7 4>;
local-mac-address = [00 00 de ad be ef];
davicom,no-eeprom;
};
修改并添加:
ethernet@05000000 {
compatible ="davicom,dm9000";
reg = <0x050000000x2 0x05000004 0x2>;/*0x05000000为4412处理器的srom片选地址,详见手册*/
interrupt-parent = <&gpx0>;/*继承父节点*/
interrupts = <6 4>;/*gpx0节点中断中的第6个,4是标志*/
local-mac-address = [00 00 dead be ef];/*网卡地址*/
davicom,no-eeprom;
pinctrl@11000000 {
...
gpx0: gpx0 {
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
interrupt-parent =<&gic>;
interrupts = <0 160>, <0 17 0>, <0 18 0>, <0 19 0>,/*中断<类型 中断号 中断标志>*/
<0 20 0>, <0 21 0>, <0 220>, <0 23 0>;
#interrupt-cells = <2>;
};
...
}
4、修改设备树的Makefile文件:
设备树的Makefile文件在”xxx/linux-3.19.1/arch/arm/boot/dts“目录下。
(1)、直接添加:
(2)、为了加快编译速度,删除其他多余的设备树文件,仅保留自己的设备树文件:
5、内核选配:
(1)、执行make menuconfig命令通过图形界面方式选配(在源码顶层目录下执行):
(2)、添加网络协议支持:
(3)、添加dm9000网卡设备驱动:
(4)、添加nfs文件系统支持
6、保存配置,编译内核:
在源码顶层目录下执行”make“命令编译内核:
7,制作内核镜像:
gcc--编译内核-->vmlinux(elf头)--去elf头--->Image--压缩-->zImage----加u-boot特定格式头---->uImage
u-boot源码的tools会编译出一个x86下运行的应用程序”mkimage“打包uImage
把arch/arm/boot/zImage文件拷贝到源码根目录下,然后执行如下命令(要先把uboot生成的mkimage工具拷贝到源码根目录下):
./mkimage -A arm -O linux -T kernel -C none-a 0x41000000 -e 0x41000040 -n 'linux-3.19.1@wnavy' -dzImage uImage
8、tftp下载内核镜像并通过nfs挂载根文件系统:
把编译好的内核景象uImage和设备树exnos4412-fs4412.dtb拷贝到tftp目录下,打开开发版电源启动内核并挂载文件系统。