嵌入式系统移植【8】——设备树和根文件系统移植

Linux设备驱动移植

设备树

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

设备树语法概述

设备树文件

    dts  设备树源文件

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

    dtb  编译后的设备树文件

设备树语法

    设备树的语法为树状结构,由一系列的节点和属性组成,根节点下包含子节点

    子节点下还可以包含子节点,节点内部包含了对应设备的属性

Linux内核驱动移植

  1.在make menuconfig界面中选中要安装的驱动

  2.在设备树中添加/修改相应的设备信息

  3.重新编译内核/设备树

实验八  网卡驱动移植

【实验目的】

掌握 Linux 内核配置的基本方法,完成对网卡驱动、NFS 等相关功能的配置

【实验环境】

1ubuntu 14.04 发行版

2FS4412 实验平台

3交叉编译工具:arm-none-linux-gnueabi-

【注意事项】

1、实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行,以“#”开头的命令表示在开发板下执行

【实验步骤】

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 客户端及相关功能

[*]     Root file system on NFS

NFS client support for the NFSv3 ACL protocol extension

[*]

NFS client support for NFS version 3 (NEW)

<*>

File systems    --->

[*] Network File Systems    --->

<*>     NFS client support

 

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

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修改时钟相关配置(忽略无用的时钟)

$ vi    drivers/clk/clk.c                                                                                                    

static bool clk_ignore_unused;                                                                                         

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

static bool clk_ignore_unused=true;                                                                                                                                                                                 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;

}

 

5、 编译内核和设备树

$ make    uImage

$ make    dtbs

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’命令我们就能看到根文件系统中的内容

根文件系统

        根文件系统是内核启动后挂载的第一个文件系统系统引导程序会在根文件系统挂载后从中把一些基本的初始化脚本和服务等加载到内存中去运行。

根文件系统内容

n bin   shell 命令 ( elf格式 )( 通过busybox编译生成 )
n dev  设备文件 ( 内核 启动 后会将设备信息写入该目录 )
n etc  内核配置文件
n lib  共享库 (elf 格式 )( 从交叉编译工具链中获取)
n linuxrc  内核运行的第一个应用程序 ( 通过busybox编译生成)
n mnt  挂载目录(非必要)
n proc  进程相关文件 ( 内核 启动 后会将 进程 信息写入该目录 )
n root  超级用户 目录(非必要)
n sbin     系统管理 shell 命令 ( elf格式 )( 通过busybox编译生成 )
n sys  驱动 相关文件 ( 内核 启动 后会将 驱动 信息写入该目录 )
n usr   shell 命令 ( elf格式 )( 通过busybox编译生成 )

根文件系统移植

BusyBox

        BusyBox将很多常用的工具集成到一个很小的可执行文件中,为普通用户提供大多数常用的命令,BusyBox实现的命令都是精简版的,很多扩展都不支持( 命令后面加杠的拓展有部分不支持)。BusyBox被称为Linux工具里的瑞士军刀。

BusyBox 的获取

        https://busybox.net/downloads/

实验九  根文件系统移植

【实验目的】

熟悉根文件系统的目录结构,构建自己的根文件系统

【实验环境】

1ubuntu 14.04 发行版

2FS4412 实验平台

3交叉编译工具:arm-none-linux-gnueabi-

【注意事项】

1、实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行

【实验步骤】

一、构建自己的根文件系统

1、 在 busybox 官网下载 busybox 源码(这里我们下载 busybox-1.22.1.tar.bz2

Index of /downloads

2、 拷贝 busybox 源码包到 ubuntu 的家目录下,解压并进入其顶层目录

$ tar    xvf    busybox-1.22.1.tar.bz2

$ cd    busybox-1.22.1/

 

3、 进入 busybox 配置界面(与 Linux 内核配置方法一样)

$ make    menuconfig                                                                                                     

4、 参考如下信息配置 busybox

Busybox Settings    ---> Build Options    --->

[*] Build BusyBox as a static binary (no shared libs)

[ ] Build with Large File Support (for accessing files > 2 GB) (arm-none-linux-gnueabi-) Cross Compiler prefix

 

配置完成后通过方向键选择‘Exit’退出,并保存配置信息

5、 编译 busybox

$ make                                                                                                                          

编译完成后在源码的顶层目录下会生成 busybox 文件

6、 安装 busybox

$ make    install                                                                                                             

安装完成后在源码的顶层目录下会生成 _install 目录

7、 进入到安装目录下查看生成的文件

$ cd    _install/

$ ls

 

如下图所示,在安装目录下生成了根文件系统中所需的 shell 命令文件

8、 将交叉编译工具链中的库文件拷贝到_install 目录下

$ cp /home/linux/Linux_4412/toolchain/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/ . -a   

如下图所示,在安装目录下就有了根文件系统中所需的库文件

 

9、 删除库文件中的静态库

$ sudo    su

$ /home/linux/Linux_4412/toolchain/gcc-4.6.4/bin/arm-none-linux-gnueabi-strip   lib/*

$ exit

$ sudo    rm   lib/*.a                                                                                                       

10、删除共享库中的符号表(需要在 root 用户下操作


11 、将资料中“移植相关文件”下的 etc 目录(配置文件)拷贝到当前目录下

12、给 etc/init.d/下的 rcS 脚本添加可执行权限

$ chmod    +x   etc/init.d/rcS                                                                                           

13、创建其他目录

$ mkdir    dev    mnt    proc    root   sys    tmp    var                                                           

如下图所示,至此我们就构建好了自己的根文件系统

14、删除原来的根文件系统

$ sudo    rm   -rf   /opt/4412/rootfs/*                                                                               

15、将自己制作的根文件系统拷贝到 NFS 的工作目录下测试

$ sudo    cp    -rf   ./*    /opt/4412/rootfs                                                                           

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值