嵌入式系统移植-05Linux内核移植及网卡移植

文章目录

  • Linux内核 配置编译
    • 下载内核源码
    • Linux系统中解压
    • 修改Makefile指定交叉编译工具链
      • 导入配置 make exynos_defconfig
      • 配置内核 make menuconfig
      • 编译内核 make uImage
      • 编译设备树 make dtbs
  • 网卡移植
    • 开发板上电重启,内核启动以后,卡在了 Starting kernel ...
    • 更换uboot之后重新上电,内核启动以后,发现内核有崩溃信息
    • 出错分析
    • 网卡移植—平台无关
      • 配置内核支持网络
      • 配置网络协议支持TCP/IP
      • 配置支持网络文件系统 NFS
      • 配置支持dm9000网卡驱动
    • 网卡移植—平台相关
      • 置设备树描述网卡和CPU的链接情况
      • 修改文件driver/clk/clk.c
    • CPU与设备连接描述 - 设备树DeviceTree
      • 网卡对应的CPU内部总线节点的描述
        • 查看原理图,找出网卡片选信号控制I/O
        • 根据控制I/O,产看芯片手册
      • 网卡节点的描述
    • CPU与设备连接描述 - 平台设备
  • 参考

Linux内核 配置编译

下载内核源码

(谷歌搜索 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

Linux系统中解压

( tar -xvf linux-3.14.tar.xz 注意不能在与window的共享目录解压)

linux@linux:~$ ls
deja-dup  develop    Downloads         gcc-4.6.4         linux-3.14.79      linux-5.1.8   Music   Pictures  sdfuse_q   u-boot-2013.01-fs4412         u-boot-fs4412.bin  Videos                未命名文件夹
Desktop   Documents  examples.desktop  gcc-4.6.4.tar.xz  linux-3.14-fs4412  linux_kernel  myfifo  Public    Templates  u-boot-2013.01-fs4412.tar.gz  uImage             vmware-tools-distrib
linux@linux:~$ cd linux-3.14.79/
linux@linux:~/linux-3.14.79$ ls
arch   COPYING  crypto         drivers   fs       init  Kbuild   kernel  MAINTAINERS  mm               modules.order   net     REPORTING-BUGS  scripts   sound       tools  virt     vmlinux.o
block  CREDITS  Documentation  firmware  include  ipc   Kconfig  lib     Makefile     modules.builtin  Module.symvers  README  samples         security  System.map  usr    vmlinux
linux@linux:~/linux-3.14.79$ 

修改Makefile指定交叉编译工具链

导入配置 make exynos_defconfig

(配置列表见 arch/arm/configs/ 找最类似的)
在这里插入图片描述
直接编译会报错,需要先选配
在这里插入图片描述
导入配置
在这里插入图片描述
导入配置,发现出错了,需要在Makefile中修改交叉编译工具链
在这里插入图片描述
再次导入配置
在这里插入图片描述

配置内核 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

在这里插入图片描述

编译内核 make uImage

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

出现如下信息表示编译成功

linux@linux:~/linux-3.14.79$ make uImage -j2
CHK     include/config/kernel.release
CHK     include/generated/uapi/linux/version.h
CHK     include/generated/utsrelease.h
make[1]: “include/generated/mach-types.h”是最新的。
CALL    scripts/checksyscalls.sh
CHK     include/generated/compile.h
Kernel: arch/arm/boot/Image is ready
Kernel: arch/arm/boot/zImage is ready
Image arch/arm/boot/uImage is ready
linux@linux:~/linux-3.14.79$ 

编译设备树 make dtbs

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

网卡移植

开发板上电重启,内核启动以后,卡在了 Starting kernel …

在这里插入图片描述
原因:
因为原来的uboot里面没有电源管理单元的驱动,所以导致起不来。需要更换uboot ,现在的uboot是有电源管理驱动,可以解决卡在starting kernel的问题。

更换uboot之后重新上电,内核启动以后,发现内核有崩溃信息

在这里插入图片描述

出错分析

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

  1. 开发板启动后,BootLoader运行,tftp下载内核,下载内核成功,通过内核挂载根文件系统
  2. uboot环境变量里有个参数bootargs(启动参数),uboot在bootm启动内核之后,会把bootargs传递给内核
  3. 内核通过bootargs知道根文件系统从哪里挂载(在远程的某台电脑上)
  4. 根文件系统是由内核挂载的,内核挂载必须通过网线来进行
  5. 开发板上的网卡,和三星官方发布的demo板(origen板)的网卡不一样,所以需要对网卡部分作出修改

网卡移植—平台无关

配置内核支持网络

   $ make menuconfig

配置网络协议支持TCP/IP

    [*] Networking support   --->     //注意要先输入y  选择该菜单,再按enter键,才能看到下面的选项
     	Networking options  ---> 
                <*> Packet socket
                <*> Unix domain sockets
	            [*] TCP/IP networking
               	[*]   IP: kernel level autoconfiguration
               	[*]     IP: BOOTP support   

配置支持网络文件系统 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-origen.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];
    };
};

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

修改文件driver/clk/clk.c

static bool clk_ignore_unused;

改为

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

在这里插入图片描述
修改好后,开发板上电重启
make uImage -j2表示双线程编译,加快编译时间
移植成功
在这里插入图片描述

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

网卡对应的CPU内部总线节点的描述

查看原理图,找出网卡片选信号控制I/O

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

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

在这里插入图片描述
最后可以找出使能1对应的是bank1
在这里插入图片描述

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

网卡节点的描述

在这里插入图片描述
查看官方给的案例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

参考

https://blog.csdn.net/m0_37542524/article/details/86373792

你可能感兴趣的:(嵌入式系统移植)