文章目录
1,配置编译
1.1,下载内核源码
(谷歌搜索 linux-3.14.tar.xz ,会很快找到有许多内核版本的列表)
- Linux Kernel 3.17.4/3.14.25/3.10.61 发布下载:
https://www.linuxidc.com/Linux/2014-11/109721.htm - Linux Kernel 3.14.79:
https://www.oschina.net/news/77032/linux-kernel-3-14-79-longterm
1.2,Linux系统中解压
( tar -xvf linux-3.14.tar.xz 注意不能在与window的共享目录解压)
linux@linux:~$ cp /mnt/hgfs/Linuxsharexiaomei/linux-3.14.79.tar.xz .
linux@linux:~$ tar -vxf linux-3.14.79.tar.xz
ux@linux:~$ cd linux-3.14.79/
linux@linux:~/linux-3.14.79$ ls
arch CREDITS drivers include Kbuild lib mm REPORTING-BUGS security usr
block crypto firmware init Kconfig MAINTAINERS net samples sound virt
COPYING Documentation fs ipc kernel Makefile README scripts tools
1.3,修改Makefile指定交叉编译工具链
1.3.1,导入配置 make exynos_defconfig
(配置列表见 arch/arm/configs/ 找最类似的)
直接编译会报错,需要先选配
导入配置
导入配置,发现出错了,需要在Makefile中修改交叉编译工具链
再次导入配置
1.3.2,配置内核 make menuconfig
编译内核之前需要激活配置
linux@linux:~/linux-3.14.79$ make menuconfig
*** Unable to find the ncurses libraries or the
*** required header files.
*** 'make menuconfig' requires the ncurses libraries.
***
*** Install ncurses (ncurses-devel) and try again.
***
make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
make: *** [menuconfig] Error 2
激活时出错 Unable to find the ncurses libraries
解决方法:
linux@linux:~/linux-3.14.79$ sudo apt-get install ncurses-dev
linux@linux:~/linux-3.14.79$ make menuconfig
1.3.3,编译内核 make uImage
linux@linux:~/linux-3.14.79$ make uImage
出现如下信息表示编译成功
Image Name: Linux-3.14.79
Created: Sat Jan 12 20:45:46 2019
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2773456 Bytes = 2708.45 kB = 2.64 MB
Load Address: 40008000
Entry Point: 40008000
Image arch/arm/boot/uImage is ready
//如果编译报错:缺mkimage
sudo cp -raf mkimage /usr/bin/
sudo chmod 777 /usr/bin/
重新在make uImage
1.3.4,编译设备树 make dtbs
linux@linux:~/linux-3.14.79$ make dtbs
修改uboot环境变量中设备树描述,和编译生成的一致
另一种做法
linux@linux:~/linux-3.14.79/arch/arm/boot/dts$ cp exynos4412-origen.dts exynos4412-fs4412.dts
然后在源码顶层目录
linux@linux:~/linux-3.14.79$ make dtbs
开发板上电重启,看编译好的内核能否在开发板上正常运行
2,网卡移植
2.1,开发板上电重启,内核启动以后,发现内核有崩溃信息
2.2,出错分析
- 开发板启动后,BootLoader运行,tftp下载内核,下载内核成功,通过内核挂载根文件系统
- uboot环境变量里有个参数bootargs(启动参数),uboot在bootm启动内核之后,会把bootargs传递给内核
- 内核通过bootargs知道根文件系统从哪里挂载(在远程的某台电脑上)
- 根文件系统是由内核挂载的,内核挂载必须通过网线来进行
- 开发板上的网卡,和三星官方发布的demo板(origen板)的网卡不一样,所以需要对网卡部分作出修改
2.3,网卡移植—平台无关
2.3.1,配置内核支持网络
$ make menuconfig
2.3.2,配置网络协议支持TCP/IP
[*] Networking support ---> //注意要先输入y 选择该菜单,再按enter键,才能看到下面的选项
Networking options --->
<*> Packet socket
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: kernel level autoconfiguration
[*] IP: BOOTP support
2.3.3,配置支持网络文件系统 NFS
File systems --->
[*] Network File Systems --->
<*> NFS client support
<*> NFS client support for NFS version 2
[*] NFS client support for NFS version 3
[*] NFS client support for the NFSv3
ACL protocol extension
[*] Root file system on NFS
2.3.4,配置支持dm9000网卡驱动
Device Drivers --->
[*] Network device support --->
[*] Ethernet driver support --->
<*> DM9000 support (网卡驱动里面可以只选择这个,把其他的都去掉)
2.4,网卡移植—平台相关
2.4.1,配置设备树描述网卡和CPU的链接情况
$ vim arch/arm/boot/dts/exynos4412-fs4412.dts 在 regulators 前添加下面代码
srom-cs1@5000000 {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x5000000 0x1000000>; 对应芯片手册 3 Memory Map 的0x0500_0000 和 16 MB
ranges;
ethernet@5000000 {
compatible = "davicom,dm9000"; 内核通过该名字来匹配驱动
reg = <0x5000000 0x2 0x5000004 0x2>; 寄存器地址和数据宽度
interrupt-parent = <&gpx0>; 继承于 中断控制器gpx0
interrupts = <6 4>; 6 对应中断源 DM9000_IRQ -> XEINT6 。4对应 active high level-sensitive
davicom,no-eeprom;
mac-address = [00 0a 2d a6 55 a2];
};
};
2.4.2,修改文件driver/clk/clk.c
static bool clk_ignore_unused;
改为
static bool clk_ignore_unused = true; //意思是忽略掉没有使用的时钟
正确做法应该是不修改文件,在开发板uboot环境变量中设置
FS4412 # setenv bootargs root=/dev/nfs nfsroot=192.168.199.100:/nfs/rootfs rw console=ttySAC2,115200 clk_ignore_unused init=/linuxrc ip=192.168.199.200 clk_ignore_unused
FS4412 # saveenv
修改好后,开发板上电重启
make uImage -j2
表示双线程编译,加快编译时间
移植成功
2.5,CPU与设备连接描述 - 设备树DeviceTree
- Device Tree是描述硬件信息的数据结构
用于管理 硬件拓扑和硬件资源信息。
Device Tree由一系列被命名的结点(node)和属性(property)组成,而结点本身可包含子结点。
所谓属性,其实就是成对出现的name和value。 - 帮助
百度:linux Device Tree 详解
官网:http://www.devicetree.org 和 http://elinux.org/Device_Tree
源码实例:
说明: Documentation/devicetree/bindings/arm
源码: arch/arm/boot/dts/exynos4412-origen.dts
2.5.1,网卡对应的CPU内部总线节点的描述
2.5.1.1,查看原理图,找出网卡片选信号控制I/O
2.5.1.2,根据控制I/O,产看芯片手册
最后可以找出使能1对应的是bank1
所以地址就是0x5000000,长度就是0x6000000-0x5000000=0x1000000
2.5.2,网卡节点的描述
查看官方给的案例
2.6,CPU与设备连接描述 - 平台设备
在内核里有一个结构“struct machine_desc”,内核用这个结构表示一个实际存在的板子,而针对每个板子都会有一个文件定义这个结构体,这个文件叫平台代码;
如:arch/arm/mach-s5pv21/mach-smdkv210.c(新版本内核中没有基于Exynos4412的平台代码,这里以s5pv210为例)
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
3,第三方驱动移植