一、Linux 设备驱动介绍及开发环境搭建
1.1 Linux 设备驱动介绍
1.1.1 分类及特点
- 计算机系统的硬件主要由 CPU、存储器和外设组成。
- 当前 CPU 内部都集成有存储器和外设适配器。
- 外设适配器有入 UART、IIC 控制器、SPI 控制器、USB 控制器、SDRAM 控制器等,有的 CPU 还集成有 GPU(图形处理器)、视频编辑器等。
- 驱动针对的对象是存储器和外设(包含 CPU 内部集成的存储器和外设),而不是针对 CPU 内核。Linux 将存储器和外设分为 3 个基础大类:
- 字符设备:必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等。
- 块设备:可以按任意顺序进行访问,以块为单位进行操作,如硬盘、eMMC等
- 网络设备:面向数据包的接收和发送而设计,并不倾向于对应于文件系统的节点。
1.1.2 设备驱动与整个软硬件的系统的关系
- 除网络设备外,字符设备与块设备都被映射到 Linux 文件系统的文件和目录,通过文件系统的系统调用接口 open()、write() 等即可访问字符设备和块设备。所有字符设备和块设备都统一呈现给用户。
- Linux 的块设备有两种访问方法:
- 一种是类似于 dd 命令对应的原始块设备,如 ”/dev/sdb1“ 等
- 另一种方式是在块设备上建立 FAT、EXT4、BTRFS 等文件系统,然后以文件路径如 "/home/barry/hello.txt" 的形式进行访问
- 在 Linux 中,针对 NOR、NAND 等提供了独立的内存技术设备( Memory Technology Device,MTD) 子系统,其上裕兴 YAFFS2、JFFS2、UBIFS 等具备擦除和负载均衡能力的文件系统
- 针对磁盘或者 Flash 设备的 FAT、EXT4、YAFFS2、JFFS2、UBIFS 等文件系统定义了文件和目录在存储介质上的组织。
- Linux 的虚拟文件系统对上述进行了统一的抽象
- 应用程序可以使用 Linux 的系统调用接口编程,也可以使用 C 库函数。
1.2 QEMU 环境建立
1.2.1 虚拟机环境搭建
略过
1.2.2 安装 uboot-tools
- 用来生成 u-boot 引导的镜像文件
- sudo apt-get install u-boot-tools
1.2.3 安装交叉编译工具链
- 交叉编译是一种计算机环境中编译程序,在另一种环境下运行。或者说在一个平台上编译生成在另一个平台上运行的可执行代码
- ABI 和 EABI
- ABI:二进制应用程序接口(Application Binary Interface(ABI) for the ARM Architecture),在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口,涵盖了数据类型的大小,布局和对齐,调用约定
- EABI:嵌入式 ABI,嵌入式应用二进制接口指定了文件格式,数据类型,寄存器使用,堆积组织优化和在一个嵌入式软件中的参数的标准约定
- arm-none-gnueabi-linux 比 arm-linux-gcc 要好,在可移植性、兼容性上面
- 早期的 u-boot 和 linux 编译可能使用的都不是一个 arm-linux-gcc 版本
- 安装
- sudo apt-get install gcc-arm-linux-gnueabi
- sudo apt-get install gcc-arm-linux-gnueabihf
- sudo apt-get install g++-arm-linux-gnueabi
- sudo apt-get install g++-arm-linux-gnueabihf
1.2.4 QEMU 安装
- QEMU 是一个模拟器,可以模拟CPU,ARM、X86、MIPS 等架构
- 可以仿真 ARM 处理器:ARM926E、ARM1136,cortex-A8/A9 等
- 模拟真实的开发板、外设:串口、LCD、网卡、USB、SD 卡...
- 使用 QEMU 可以做的事情:
- 研究内核虚拟化
- 模拟 CPU, 对于芯片公司,流片之前在 QEMU 上做验证、仿真、软硬件协同设计,开发 BSP 和驱动
- 模拟开发板,在模拟平台上进行系统软件开发、驱动开发
- 学生、工程师可以利用 qemu-system-arm 学习嵌入式开发、研究 bootloader、Linux 内核\驱动开发、应用开发等。
- 联网安装:sudo apt-get install qemu qemu-system-common qemu-system qemu-system-arm
- 输入命令显示支持的设备:qemu-system-arm -machine help
- 启动设备:qemu-system-arm -M vexpress-a9 -m 512M -kernel ./zImage -dtb ./vexpress-v2p-cap.dtb -nographic -append "console=ttyAMA0"
- -M 指定开发板
- -m 指定内存大小
- -kernel 指定 kernel 镜像
- -dtb 指定设备树
- -nographic 不使用图形界面,使用串口控制台
- -append 指定串口控制台参数
- 实验用得是 vexpress-a9 得四核处理器开发板,板上集成了 Flash、SD、IIC、LCD 等设备。
- 查看 QEMU 版本:qemu-system-arm --version
1.2.5 开发板选择
- 选用的是 vexpress-a9 开发板,这是ARM 公司推出的一款开发板,全称为 versatile express family
- 主要用于 SOC 厂商设计、验证和测试自己的 SOC 芯片
- 采用主板 + 子板的设计,主板提供各种外围接口,子板提供 CPU 运算
- Vexpress 系列支持的 CPU
- cortex-a9:处理器子板 Express A9 x 4(v2p-ca9 x 4)
- cortex-a5:处理器子板 Express A5 x 4(v2p-ca5 x 2s)
- cortex-r5:
- cortex-a15:处理器子板 Express A15 x 4(v2p-ca15 x 2)
- 开发板:
- 系统框图
- 子板框图
1.2.5 编译内核和 dtb 文件
下载地址:https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/
也可以下载其他版本得内核,这里选择得是 Linux-4.20.0 版本,发布日期是2018-12-24
下载下来后,解压,修改主目录下的 Makefile:
原始的:
修改后:
配置开发板,主要是生成 .config 文件,可以在 arch/arm/configs 中查看默认配置,执行 make vexpress_defconfig。
执行 make zImage -j8 进行编译,-j8 是使用多线程编译。
编译内核模块:make modules -j8
编译 dts 文件:make dtbs
运行开发板:
qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0”
可以看到内核已经起来,但是无文件系统。
1.2.6 使用 busybox 制作根文件系统
- 文件系统
- 对存储设备上的数据进行组织的机制
- 为什么要使用文件系统
- Linux的哲学:一切皆文件
- 用户与操作系统进行交互的主要工具:文件系统调用
- 用户和底层存储的接口
- 根文件系统
- Linux内核启动后第一个挂载的文件系统
- 主要由基本的shell命令、各种库、字符设备、配置脚本组成
- 提供了根目录 /
- RFS可以放在: nor/nand flash、 SD卡、磁盘、网络空间上
- 什么是busybox?
- 一个集成100多个Linux常用命令和工具的软件
- 一个适合制作嵌入式文件系统的软件工具
- 编译安装
- 下载源代码: http://www.busybox.net/downloads/
- 修改Makefile: ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
- 配置: make defconfig ; make menuconfig
- 注意要将跟文件系统作为静态库生成:
- 编译: make
- 安装: make install
- 所有生成的二进制文件都在 _install 目录下
- 制作根文件系统
- $ mkdir rootfs
- $ mkdir rootfs/lib
- $ cp –r _install/* rootfs
- 跟文件系统的库存放在编译工具链中的:$ cp -p /usr/arm-linux-gnueabi/lib/* rootfs/lib
- 创建设备:$ mkdir -p rootfs/dev/
- 创建串口节点,串口节点用的比较频繁,所以创建的比较多
- $ mknod –m 666 tty1 c 4 1
- $ mknod –m 666 tty2 c 4 2
- $ mknod –m 666 tty3 c 4 3
- $ mknod –m 666 tty4 c 4 4
- $ mknod –m 666 console c 5 1
- $ mknod –m 666 null c 1 3
- 制作SD卡文件系统镜像
- 生成虚拟文件镜像: dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
- if 输入
- of 输出
- bs 块大小
- count 多少个块
- 格式化为exts文件系统: mkfs.ext3 rootfs.ext3
- 生成虚拟文件镜像: dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
- 往SD卡拷贝东西,将各种文件拷贝到文件系统镜像中:
- 执行挂载:$ mount -t ext3 rootfs.ext3 /mnt/ -o loop
- $ cp -r rootfs/* /mnt
- 卸载:$ umount /mnt/
- 启动内核,挂载rootfs
- $ qemu-system-arm -M vexpress-a9 -m 512M -dtb ./vexpressv2p-ca9.dtb -kernel ./zImage -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfs.ext3
- -append 参数做了修改,root是在 /dev/mmcblk0 上启动的,可读写权限,mmcblk0 是 SD 卡的设备节点
- -sd 挂载SD卡
- $ qemu-system-arm -M vexpress-a9 -m 512M -dtb ./vexpressv2p-ca9.dtb -kernel ./zImage -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfs.ext3
- 完善文件系统:
- rcS 文件完善
- 修改完成后,再重新走《制作 SD 卡文件系统映像步骤》,mount 步骤,结果如下
- 图形化启动内核
- $ qemu-system-arm -M vexpress-a9 -m 512M -dtb ./vexpressv2p-ca9.dtb -kernel ./zImage -append "root=/dev/mmcblk0 rw
console=tty0" -sd rootfs.ext3
- $ qemu-system-arm -M vexpress-a9 -m 512M -dtb ./vexpressv2p-ca9.dtb -kernel ./zImage -append "root=/dev/mmcblk0 rw
启动命令脚本(无LCD)
qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel /home/ubuntu/work/kernel/linux-./arch/arm/boot/zImage \
-dtb /home/ubuntu/work/kernel/linux-./arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-nographic \
-append "root=/dev/mmcblk0 rw console=ttyAMA0" \
-sd /home/ubuntu/work/rootfs.ext3
启动命令脚本(LCD)
qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel /home/ubuntu/work/kernel/linux-./arch/arm/boot/zImage \
-dtb /home/ubuntu/work/kernel/linux-./arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-append "root=/dev/mmcblk0 rw console=tty0" \
-sd /home/ubuntu/work/rootfs.ext3
一、Linux 设备驱动介绍及开发环境搭建的更多相关文章
- 一、Linux 设备驱动介绍及开发环境搭建(续)
1.2.6 uboot 编译安装 嵌入式 bootloader 的功能: 功能类似于 PC 的 BIOS.硬件检测是否正常 加载操作系统镜像到 RAM 设置不同的启动方式 常见的启动方式: NOR/N ...
- Linux虚拟机中 Node.js 开发环境搭建
Node.js 开发环境搭建: 1.下载CentOS镜像文件和VMWare虚拟机程序; 2.安装VMWare——>添加虚拟机——>选择CentOS镜像文件即可默认安装带有桌面的Linux虚 ...
- (0)ASP.NET Core 简单介绍 和开发环境搭建 - ASP.NET从MVC5升级到MVC6
ASP.NET从MVC5升级到MVC6 总目录 ASP.NET Core 首先,ASP原本只是一种技术,这种技术从上个世纪90年代就有了. Active Service Page 和 Java Ser ...
- 1. React介绍 React开发环境搭建 React第一个程序
什么是 React React 是 Facebook 发布的 JavaScript 库,以其高性能和独特的设计理念受到了广泛关注. React的开发背景 Faceboo ...
- Eclipse rap 富客户端开发总结(1) :rap简单介绍和开发环境搭建
一.rap简单介绍 1 基本概念 RAP可以让开发人员使用JAVA API和按照Eclipse 插件的开发模式构建基于AJAX的Web 2.0应用程序, RAP的工作原理是采用交叉编译的方式将 ...
- Linux Ubuntu系统下Java开发环境搭建
操作系统:Linux x64 / Ubuntu 14.04 Java JDK版本:jdk-8u65-linux-x64.tar.gz 声明:转载请注明出处及本文链接 1. 前往ORACLE官网下载最新 ...
- LINUX下QT FOR ARM开发环境搭建过程 (使用qt-x11-opensource-src-4.5.2.tar.gz进行编译)
在PC上,我们需要得到两个版本的Qt,分别是:Qt-4.5.2和QtEmbedded-4.5.2-arm.前者包括了Qt Designer等基本工具,用于在PC上对程序的开发调试,使我们能确保程序放到 ...
- centos 7 lamp (linux+apache+mysql+php)开发环境搭建(转+原创)
准备篇:CentOS 7.0系统安装配置图解教程 http://www.jb51.net/os/188487.html 一.配置防火墙,开启80端口.3306端口 CentOS 7.0默认使用的是fi ...
- linux python 图形编程 qt开发环境搭建
我的系统是 ubuntu14.04 我们使用的是python2.7,建议安装qt4+pyqt4+eric4 eric是pyqt的界面设计器的代码生成软件. 1.安装sip 这个是python和qt之间 ...
随机推荐
- flutter Waiting for another flutter command to release the startup lock…
flutter安装完成后执行flutter doctor ,一直提示如下: Waiting for another flutter command to release the startup loc ...
- linux 代码更新-打包-重启脚本
#! /bin/sh base=/home/project/myblog cd $base git pull ] then echo "Error in git pull!!! Stop d ...
- 戴尔服务器IDRAC命令配置IP地址
在工作中我们可能会遇到,在配置管理卡的时候,由于疏忽,把网关配置错误(但是你肯定的是IP没有错),导致不能正常连接管理卡,这是有两个办法,第一:你去机房,进行查看进行修改,第二:你登陆交换机,从交换机 ...
- linux:vi替换命令
linux:vi替换命令 vi/vim 中可以使用 :s 命令来替换字符串.以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询 ...
- Python 测试代码覆盖率统计工具 coverage.py
安装 您可以通常的方式安装coverage.py.最简单的方法是使用pip: $ pip install coverage 要安装预发布版本,您需要指定--pre: $ pip install --p ...
- Unity旋转问题的总结
1.物体的直接旋转 transform.Rotate();这个函数是在当前状态下网某个方向旋转.并且这里可以设置为世界空间或者自身空间. transform.rotation;这里可以通过直接定义一个 ...
- SpringCloud 和 Dubbo 有哪些区别?
首先,他们都是分布式管理框架. dubbo 是二进制传输,占用带宽会少一点.SpringCloud是http 传输,带宽会多一点,同时使用http协议一般会使用JSON报文,消耗会更大. ...
- 【神经网络与深度学习】caffe静态链接库“Unknown layer type: Convolution (known types: )”和“ 磁盘空间不足”问题的解决办法
这一段时间把caffe在windows环境下编译了一下,tool里面的cpp全部编译成了exe.再用的时候有两个问题让我头疼了好长时间! 第一个问题 "db_lmdb.hpp:14] Che ...
- Go语言代码结构与语法基础(二)
任何一门语言,都是从打印 hello world 开始的. 最简单的go代码: package main // 声明 main 包,表明当前是一个可执行程序 import "fmt" ...
- Mybatis 1.原理流程图
仅用来做个人笔记记录. 总流程: 根据配置文件(全局配置文件和sql映射文件)初始化configuration对象. 创建一个defaultSqlSession对象,包含Configuration及E ...