物联网之系统移植四(内核移植)
内核移植笔记:https://blog.****.net/weixin_39148042/article/details/82494980
Linux内核移植
1、配置编译
2、网卡移植
3、第三方驱动移植
Linux内核 配置编译
内核移植之一 配置编译:
• 下载内核源码 (谷歌搜索 linux-3.14.tar.xz ,会很快找到有许多内核版本的列表)
• Linux系统中解压 ( tar -xvf linux-3.14.tar.xz 注意不能在与window的共享目录解压)
• 修改Makefile指定交叉编译工具链
• 导入配置 make exynos_defconfig(配置列表见 arch/arm/configs/ 找最类似的)
• 配置内核 make menuconfig
• 编译内核 make uImage
• 编译设备树 make dtbs
网卡移植
NFS 服务:
网卡移植 平台无关:
• 配置内核支持网络
$ make menuconfig
• 配置网络协议支持TCP/IP
[*] Networking support ---> //注意要先输入y 选择该菜单,再按enter键,才能看到下面的选项
Networking options --->
<*> Packet socket
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: kernel level autoconfiguration
• 配置支持网络文件系统 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
• 配置支持dm9000网卡驱动
Device Drivers --->
[*] Network device support --->
[*] Ethernet driver support --->
<*> DM9000 support
网卡移植 平台相关:
• 配置设备树描述网卡和CPU的链接情况
$ vim arch/arm/boot/dts/exynos4412-fs4412.dts 在 regulators 前添加下面代码
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x5000000 0x1000000>; 对应芯片手册 3 Memory Map 的0x0500_0000 和 16 MB ranges;
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];
};
};
• 修改文件driver/clk/clk.c static bool clk_ignore_unused;改为static bool clk_ignore_unused = true;
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
CPU与设备连接描述 - 平台设备:
在内核里有一个结构“struct machine_desc”,内核用这个结构表示一个实际存在的板子,而针对每个板子都会有一个文件定义这个结构体,这个文件叫平台代码;
如:arch/arm/mach-s5pv21/mach-smdkv210.c(新版本内核中没有基于Exynos4412的平台代码,这里以s5pv210为例)
MACHINE_START(SMDKV210, "SMDKV210")
/* Maintainer: Kukjin Kim <[email protected]> */
.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
第三方驱动移植
第三方驱动 黑盒移植:
• 编译驱动进内核
a. 选择驱动存放目录 (或任意目录)
b. 改Makefile
c. 改Kconfig (界面可配置)
• 编译驱动为独立的模块
a. 配置为模块方式
b. make modules 编译为模块
c. 创建设备节点(应用访问驱动的入口)
d. 运行测试驱动的应用程序
第三方驱动 白盒移植:
• 打印跟踪
• 驱动框架
字符设备框架: