3-3.linux 驱动开发
无操作系统的设备驱动
有操作系统的设备驱动
linux 设备驱动
开发环境
完整的基于 linux 的产品开发过程
1.开发环境
Linux 开发主机
串口终端调试工具(开发板控制台)
NFS 服务(传输文件)
2.bootloader
根据开源的代码修改芯片
编译烧录
3.linux kernel
根据芯片供应商提供的源码修改
4.建立根文件系统
5.添加设备驱动程序
6.开发应用程序
linux 设备与驱动模型
linux 设备与驱动模型是一种把设备和驱动组织到总线上的一种方式,这样的好处
通过将设备驱动与控制器驱动分离、将硬件描述从驱动中剥离等方式,使代码组织更整洁
提供了查看系统中所有设备及其状态和功耗的能力。能够查看设备连接到哪个总线并决定为其使用哪个驱动。
能够为系统中的所有设备构造一个完整有效的树状结构,包括所有的总线与连接
提供了将设备和驱动互相关联的能力
设备:连接到总线上的物理或者虚拟对象。
驱动:负责探测并关联设备的代码实体,也可以执行部分管理功能
总线:为其他设备提供接入点的设备
3 个主要的数据结构组织
bus_type
数据结构表示某种类型的总线(USB、PCI、I2C)device_driver
数据结构表示一个能处理总线上设备的驱动程序device
数据结构表示一个连接到总线上的设备
总线核心驱动
每个内核支持的总线都有一个对应的通用总线核心驱动。总线是处理器与设备之间的通道。为了统一设备模型,所有的设备都通过总线连接,哪怕它是一个内部的、抽象的“平台”总线。
总线核心驱动会分配一个 bus_type
数据结构,并将这个数据结构注册到内核的总线类型链表中。bus_type
数据结构定义在include/linux/device.h
中,用来表示一类总线(USB、PCI、I2C等)。把总线注册到系统中是通过调用 bus_register()
函数来完成的。
总线控制器驱动
设备驱动
设备树
开发板
使用正点原子 imx6ull-mini 开发板,8GB eMMC,512 MB DDR。
开发环境
ubuntu 的任意版本,debian 等,基于 linux 的,应该都可以。
工具链
下载后解压,一般放在 /usr/local/arm
目录中
还需要把路径导出的环境变量中,在 /etc/profile
中新增一行
或者在相应的终端工具启动执行文件里新增脚本,都可以的。
安装依赖库
如果是一个全新安装的系统,需要安装所有用到的东西
NFS 服务
主机安装
sudo apt install nfs-kernel-server
sudo vim /etc/exports
配置要共享的文件夹,增加配置项/home/xym/ws_linux *(rw,sync,no_root_squash)
/home/xym/ws_linux
目录*
所有网段,也可设置为 10.0.0.0/24 指定网段rw
可读可写sync
同步缓存no_root_squash
访问者给 root 权限
sudo /etc/init.d/nfs-kernel-server restart
重启一下 nfs 服务showmount -e
可以看到挂载的共享目录
开发板挂载共享文件系统
mount -t nfs 10.0.0.10:/home/xym/ws_linux /mnt
mount -t nfs -o nolock,nfsvers=3 10.0.0.10:/home/xym/ws_linux /mnt
tftp 服务
uboot里用来加载 内核等到 DDR 中
sudo apt install xinetd
若无
/etc/xinetd.conf
文件,新建一个,内容在后面sudo apt install tftp-hpa tftpd-hpa
配置共享文件夹
sudo vim /etc/default/tftpd-hpa
一些源码的下载地址
内核编译
vscode 远程 ssh 的环境变量,可以手动设置 set PATH $PATH /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/
,拼接一个 gcc 的路径上去。
桌面版 linux 使用串口控制台
启动一个串口终端
加上一些配置
更新 grub 设置
重启
学习路线
应用开发,比如多线程、网络开发,shell 脚本,基本的 linux 使用之类的,放到计算机的学习笔记里,这里只记录和嵌入式强相关的。
野火的开发板为实验板。
传统的linux的学习路线
linux + c 进阶
arm 裸机开发
linux 移植(boot,kernel,文件系统)
linux 驱动开发
linux 应用开发
项目实战
很系统,周期也很长。
基础很重要。linux 内核使用的是 GNU C ,和 C99 还是有区别的。此外写单片机时的面向过程的思维,如果还用这个思路去研究内核代码,也会很难懂。
烧系统
最后更新于