lv12 linux设备树、网卡驱动移植

目录

1 设备树

1.1概念 

1.2 设备树文件

1.3 设备树语法

2 Linux内核驱动移植

2.1 步骤

3 实验八网卡驱动移植

3.1 在内核源码的顶层目录下执行如下命令,修改内核配置

3.2 在设备树中添加网卡的硬件信息

3.3 修改时钟相关配置(忽略无用的时钟)

3.4 修改 EMMC 相关配置

3.5  编译内核和设备树

3.6  测试内核和设备树

4 练习


1 设备树

1.1概念 

设备树是一种描述硬件信息的数据结构,Linux内核运行时可以通过设备树将硬件信息直接传递给Linux内核,而不再需要在Linux内核中包含大量的冗余编码

驱动负责逻辑、设备树负责操作寄存器,把两者分开管理移植到其他芯片的时候驱动逻辑不需要变更,只需要修改设备树即可,同时可以使得内核源码大小精简

1.2 设备树文件

dts  设备树源文件    

dtsi 类似于头文件,包含一些公共的信息,可被其它设备树文件引用    

dtb  编译后的设备树文件

1.3 设备树语法

设备树的语法为树状结构,由一系列的节点和属性组成,根节点下包含子节点     子节点下还可以包含子节点,节点内部包含了对应设备的属性

2 Linux内核驱动移植

2.1 步骤

  • 1.在make menuconfig界面中选中要安装的驱动     
  • 2.在设备树中添加/修改相应的设备信息     
  • 3.重新编译内核/设备树

实验八网卡驱动移植

【实验目的】
掌握 Linux 内核配置的基本方法,完成对网卡驱动、 NFS 等相关功能的配置。
注:在开发板上电uboot启动时,可以通过tftp下载,此时时uboot支持网卡驱动,当kernel启动时卡住时内核还不支持
【实验环境】
ubuntu 14.04 发行版
FS4412 实验平台
交叉编译工具: arm-none-linux-gnueabi-
【注意事项】
实验步骤中以“ $ ”开头的命令表示在 ubuntu 环境下执行,以“ # ”开头的命令表
示在开发板下执行
【实验步骤】

3.1 在内核源码的顶层目录下执行如下命令,修改内核配置

$ make menuconfig

给内核选配 DM9000 网卡驱动,然后选择“Save”保存

Device Drivers --->
    [*] Network device support --->
        [*] Ethernet driver support --->
            <*> DM9000 support

因为内核要使用 NFS 去挂载根文件系统,而 NFS 是基于 TCP 协议实现的,所以这里需

要选配 TCP 相关的网络协议(部分功能默认已经选配),然后选择“ Save ”保存
[*] Networking support --->
    Networking options --->
        <*> Packet socket
        <*> Unix domain sockets
        [*] TCP/IP networking
        [*] IP: kernel level autoconfiguration

因为内核要使用 NFS 去挂载根文件系统,所以需要给内核选配 NFS 客户端及相关功能

File systems --->
    [*] Network File Systems --->
        <*> NFS client support
        <*> NFS client support for NFS version 3 (NEW)
        [*] NFS client support for the NFSv3 ACL protocol extension
        [*] Root file system on NFS

设置完成后通过方向键选择‘Save’保存即可,然后选择‘Exit’退出该配置界面

3.2 在设备树中添加网卡的硬件信息

$ vi arch/arm/boot/dts/exynos4412-fs4412.dts

在文件的末尾,最后一个花括号前添加如下内容(即要写在根节点之内)

srom-cs1@5000000 {
    compatible = "simple-bus";
    #address-cells = <1>;
    #size-cells = <1>;
    reg = <0x5000000 0x1000000>;
    ranges;

    ethernet@5000000 {
        compatible = "davicom,dm9000";
        reg = <0x5000000 0x2 0x5000004 0x2>;
        interrupt-parent = <&gpx0>;
        interrupts = <6 4>;
        davicom,no-eeprom;
        mac-address = [00 0a 2d a6 55 a2];
    };
};

3.3 修改时钟相关配置(忽略无用的时钟)

$ vi drivers/clk/clk.c

static bool clk_ignore_unused;

修改为以下内容,然后保存退出

static bool clk_ignore_unused=true;

3.4 修改 EMMC 相关配置

$ vi drivers/mmc/core/mmc.c

if (card->ext_csd.rev > 7) {
    pr_err("%s: unrecognised EXT_CSD revision %d\n",
        mmc_hostname(card->host), card->ext_csd.rev);
    err = -EINVAL;
    goto out;
}

修改为以下内容,然后保存退出

#if 0
if (card->ext_csd.rev > 7) {
#else
if (card->ext_csd.rev > 8) {
#endif
    pr_err("%s: unrecognised EXT_CSD revision %d\n",
        mmc_hostname(card->host), card->ext_csd.rev);
    err = -EINVAL;
    goto out;
}

3.5  编译内核和设备树

$ make uImage
$ make dtbs

3.6  测试内核和设备树

将编译生成的内核和设备树拷贝到 tftp 的工作目录
$ sudo cp arch/arm/boot/uImage /tftpboot
$ sudo cp arch/arm/boot/dts/exynos4412-fs4412.dtb /tftpboot/
$ sudo chmod 777 /tftpboot/*

tftp nfs 服务器

$ sudo service tftpd-hpa restart
$ sudo service nfs-kernel-server restart

重启开发板查看现象,如图所示,此时 Linux 内核已经能通过 NFS 去挂载根文件系统

在终端下执行‘ ls ’命令我们就能看到根文件系统中的内容
lv12 linux设备树、网卡驱动移植_第1张图片

4 练习

1.简述设备树的作用以及使用设备树的优势是什么?
2.简述在Linux内核上移植一个驱动程序(内核源码支持)需要做哪些事? 

1设备树是一种描述硬件信息的数据结构,Linux内核运行时可以通过设备树将硬件信息直接传递给Linux内核,而不再需要在Linux内核中包含大量的冗余编码

2
  1.在make menuconfig界面中选中要安装的驱动     
  2.在设备树中添加/修改相应的设备信息     
  3.重新编译内核/设备树

你可能感兴趣的:(嵌入式开发,linux,arm开发,linux移植)