Linux设备驱动移植

设备树

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

设备树语法概述

设备树文件

dts  设备树源文件

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

dtb  编译后的设备树文件

设备树语法

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

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

Linux内核驱动移植

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

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

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

实验八  网卡驱动移植

【实验目的】

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

【实验环境】

1 ubuntu 14.04 发行版

2 FS4412 实验平台

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/

实验九  根文件系统移植

【实验目的】

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

【实验环境】

1、 ubuntu 14.04 发行版

2、 FS4412 实验平台

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

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

  1. 嵌入式开发之linux根文件系统移植

    目录 前言 一.创建根文件系统目录 二.添加命令与实用程序 2.1 编译和安装 busybox 2.2 拷贝busybox内的小程序 三.添加lib库文件 3.1 拷贝工具链内的动态库 3.2 拷贝工 ...

  2. linux系统移植篇(四)—— 根文件系统使用介绍

    linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...

  3. 嵌入式编程笔记之六--设备树初体验

    设备树的起源 设备树(Device Tree)是一种描述硬件资源的数据结构,它由 uboot 传递给 Linux 内核,被内核解析,内核根据设备树中的硬件描述信息加载利用相应驱动资源.在引入设备树之前 ...

  4. 我眼中的Linux设备树(五 根节点)

    五 根节点 一个最简单的设备树必须包含根节点,cpus节点,memory节点.根节点的名字及全路径都是"/",至少需要包含model和compatible两个属性.model属性我 ...

  5. 5.3中断系统中的设备树——中断号的演变与irq_domain

    通过上一节我们知道,在内核中有一个irq_desc数组,数组里面的每一项对应一个中断,数组的下标就是对应中断的虚拟中断号(virq). 假设只有一个中断控制器,有32个中断,那么中断和irq_desc ...

  6. 设备树之emmc驱动移植

    硬件设备:itop4412开发板 内核版本linux-3.8.1 设备树方式减少了设备的冗余编码,同时使移植变得更加高效.eMMC作为开发板的基础,十分重要. 设备树用的是内核自带的smdk4412. ...

  7. 嵌入式linux加载引导内核和根文件系统的方法

    总体来说,嵌入式Linux内核和根文件的引导与PC机差不多. 嵌入式linux内核和根文件系统可以存放在各种可能的存储设备中,一般情况下我 们将内核和根文件系统直接烧入到Flash中(包括NOR和NA ...

  8. 十九.Linux开发之根文件系统移植——根文件系统的原理

    有道云笔记地址: 详情看这里链接,记录太多,就不一一排版了. http://note.youdao.com/noteshare?id=f9c7c1b589233d7b6ed661c3749f1ce8& ...

  9. 【易开嵌入式】rt-thread+stm32f407+nandflash,实现RL-FLASHFS文件系统移植

    版权声明:本版面文章皆为原创.或参考其他技术网站.博客后自己动手做实验所得,转载请注明出处. 鸣谢:感谢eric硬汉 商务合作:lz_kwok@foxmail.com 易开嵌入式工作室 基于单片机系统 ...

最新文章

  1. 微软:Windows 7 SP1将于本月正式发布
  2. IntelliJ IDEA 2017.3.2 热加载(Hot Swap)
  3. TextView跑步灯效果及在特殊情况下无效的解决方案
  4. C++实现0-1-knapsack背包问题 (附完整源码)
  5. Magento利用input type=”file”上传图片
  6. iqn怎么查 linux_程序员必备:46个Linux面试常见问题!收藏!
  7. 【线上分享】边缘云跨区域超低延时架构设计与网络优化实践
  8. linux操作指令训练,实验二linux 常用命令练习
  9. linux系统如何创建python文件_Linux搭建python环境详解
  10. python学习-练习题
  11. Bailian2880 句中最长的单词【字符串】
  12. matlab继续截止频率,关于-3db截止频率
  13. java变量同名_Java成员变量与局部变量同名
  14. python做三维图片挑战眼力_查找「儿童大家来找茬图片」安卓应用 - 豌豆荚
  15. 【云原生】灰度发布、蓝绿发布、滚动发布、灰度发布解释
  16. 【开发工具】Windows远程桌面连接
  17. AlphaTest烘焙的阴影不正确
  18. 外包公司值不值得去?外包公司的面试特点
  19. FPGA中高时钟频率计数器设计
  20. 从X240电脑看传统企业的创新陷阱

热门文章

  1. Zigbee联盟推出物联网通用语言Dotdot
  2. php 自动安装sql,JSP_实现自动安装SQLServer数据库,下面简单介绍一下如何在工程 - phpStudy...
  3. XCTF---MISC---Time_losing
  4. 超好用的iOS设备管理软件——iMazing2.16.2功能介绍以及如何使用
  5. 最新今日头条详情页加密参数 __ac_nonce和__ac_signature 解决方案
  6. 【区块链技术工坊47期】众享比特:区块链医疗方案和分布式认证系统
  7. 数据库SQL语言DML语法笔记整理
  8. 计算机辅助设计结课,计算机辅助设计结课报告
  9. SpringBoot:开发工具加速重启项目的速度
  10. [笔记][总结] MIT线性代数 Gilbert Strang 矩阵运算