嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)

文章目录

  • 1,配置编译
    • 1.1,下载内核源码
    • 1.2,Linux系统中解压
    • 1.3,修改Makefile指定交叉编译工具链
      • 1.3.1,导入配置 make exynos_defconfig
      • 1.3.2,配置内核 make menuconfig
      • 1.3.3,编译内核 make uImage
      • 1.3.4,编译设备树 make dtbs
  • 2,网卡移植
    • 2.1,开发板上电重启,内核启动以后,发现内核有崩溃信息
    • 2.2,出错分析
    • 2.3,网卡移植---平台无关
      • 2.3.1,配置内核支持网络
      • 2.3.2,配置网络协议支持TCP/IP
      • 2.3.3,配置支持网络文件系统 NFS
      • 2.3.4,配置支持dm9000网卡驱动
    • 2.4,网卡移植---平台相关
      • 2.4.1,配置设备树描述网卡和CPU的链接情况
      • 2.4.2,修改文件driver/clk/clk.c
    • 2.5,CPU与设备连接描述 - 设备树DeviceTree
      • 2.5.1,网卡对应的CPU内部总线节点的描述
        • 2.5.1.1,查看原理图,找出网卡片选信号控制I/O
        • 2.5.1.2,根据控制I/O,产看芯片手册
      • 2.5.2,网卡节点的描述
    • 2.6,CPU与设备连接描述 - 平台设备
  • 3,第三方驱动移植

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/ 找最类似的)
嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第1张图片
直接编译会报错,需要先选配
嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第2张图片

导入配置
在这里插入图片描述
导入配置,发现出错了,需要在Makefile中修改交叉编译工具链
嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第3张图片

再次导入配置
在这里插入图片描述

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

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第4张图片

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

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第5张图片
修改uboot环境变量中设备树描述,和编译生成的一致
嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第6张图片

另一种做法

linux@linux:~/linux-3.14.79/arch/arm/boot/dts$ cp exynos4412-origen.dts exynos4412-fs4412.dts

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第7张图片

然后在源码顶层目录

linux@linux:~/linux-3.14.79$ make dtbs

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第8张图片

开发板上电重启,看编译好的内核能否在开发板上正常运行

2,网卡移植

2.1,开发板上电重启,内核启动以后,发现内核有崩溃信息

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第9张图片

2.2,出错分析

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第10张图片

在这里插入图片描述
在这里插入图片描述

  1. 开发板启动后,BootLoader运行,tftp下载内核,下载内核成功,通过内核挂载根文件系统
  2. uboot环境变量里有个参数bootargs(启动参数),uboot在bootm启动内核之后,会把bootargs传递给内核
  3. 内核通过bootargs知道根文件系统从哪里挂载(在远程的某台电脑上)
  4. 根文件系统是由内核挂载的,内核挂载必须通过网线来进行
  5. 开发板上的网卡,和三星官方发布的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];
	};
};

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第11张图片
嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第12张图片

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第13张图片

2.4.2,修改文件driver/clk/clk.c

static bool clk_ignore_unused;

改为

static bool clk_ignore_unused = true;      //意思是忽略掉没有使用的时钟

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第14张图片

正确做法应该是不修改文件,在开发板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

在这里插入图片描述

修改好后,开发板上电重启
嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第15张图片

make uImage -j2表示双线程编译,加快编译时间

移植成功
嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第16张图片

2.5,CPU与设备连接描述 - 设备树DeviceTree

  1. Device Tree是描述硬件信息的数据结构
    用于管理 硬件拓扑和硬件资源信息。
    Device Tree由一系列被命名的结点(node)和属性(property)组成,而结点本身可包含子结点。
    所谓属性,其实就是成对出现的name和value。
  2. 帮助
    百度: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

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第17张图片

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第18张图片

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第19张图片

2.5.1.2,根据控制I/O,产看芯片手册

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第20张图片

最后可以找出使能1对应的是bank1

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第21张图片

所以地址就是0x5000000,长度就是0x6000000-0x5000000=0x1000000

2.5.2,网卡节点的描述

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第22张图片

查看官方给的案例
嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第23张图片

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第24张图片

嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备)_第25张图片

2.6,CPU与设备连接描述 - 平台设备

在内核里有一个结构“struct machine_desc”,内核用这个结构表示一个实际存在的板子,而针对每个板子都会有一个文件定义这个结构体,这个文件叫平台代码;
如:arch/arm/mach-s5pv21/mach-smdkv210.c(新版本内核中没有基于Exynos4412的平台代码,这里以s5pv210为例)

MACHINE_START(SMDKV210, "SMDKV210")
		/* Maintainer: Kukjin Kim  */
		.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,第三方驱动移植

你可能感兴趣的:(嵌入式Linux-系统移植,嵌入式linux-系统移植,Linux内核移植,配置编译,网卡移植(平台无关,平台相关),CPU与设备连接描述(设备树,平台设备))