linux内核驱动开发

系列文章目录

主要介绍linux系统下的驱动开发

文章目录


前言

对设备驱动最通俗的解释就是"驱使硬件设备行动"。驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的轮询、中断处理、DMA通信,进重行物理内存向虚拟内存的映射等,最终让通信设备能收发数据,让显示设备能显示文字和画面,让存储设备能记录文件和

数据。

一、驱动是什么?

由此可见,设备驱动充当了硬件和应用软件之间的纽带,应用软件时只需要调用系统软件的应用编程接口(API)就可让硬件去完成要求的工作。在系统没有操作系统的情况下,工程师可以根据硬件设备的特点自行定义接口,如对串口定义SerialSend()、SerialRecv(),对LED定义LightOn()、LightOff(),对Flash定义FlashWr()、FlashRd()等。而在有操作系统的情况下,驱动的架构则由相应的操作系统定义,驱动工程师必须按照相应的架构设计驱动,这样,驱动才能良好地整合入操作系统的内核中。驱动程序负责硬件和应用软件之间的沟通,而驱动工程师则负责硬件工程师和应用软件工程师之间的沟通。

二、主要分类

计算机系统的硬件主要由CPU、存储器和外设组成。随着IC制作工艺的发展,目前,芯片的集成度越来越高,往往在CPU内部就集成了存储器和外设适配器。譬如,相当多的ARM、PowerPC、MIPS等处理器都集成了UART、I2C控制器、SPI控制器、USB控制器、SDRAM控制器等,有的处理器

还集成了GPU(图形处理器)、视频编解码器等。驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设),而不是针对CPU内核。Linux将存储器和外设分为3个基础大类。

·字符设备。那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等

·

块设备。块设备可以按任意顺序进行访问,以块为单位进行操作,如硬盘、eMMC等。

·网络设备,

网络设备面向数据包的接收和发送而设计,它并不倾向于对应于文件系统的节点。内核与网络设备的通信与内核和字符设备、网络设备的通信方式完全不同,前者主要还是使用套接字接口。

2.读入数据

设备驱动与整个系统的关系除网络设备外,字符设备与块设备都被映射到Linux文件系统的文件和目录,通过文件系统的系统调用接口open()、write()、read()、close()等即可访问字符设备和块设备。所有字符设备和块设备都统一呈现给用户。Linux的块设备有两种访问方法:一种是类似dd命令对应的原始块设备,如"/dev/sdb1"等;另外一种方法是在块设备上建立FAT、EXT4、BTRFS等文件系统,然后以文件路径如"/home/barry/hello.txt"的形式进行访问。

3.代码示例

复制代码
Linux下的LED驱动

#include.../

struct light_dev{
struct cdev cdev;/ 字符设备cdev结构体
unsigned char vaule;/ led亮是为1,熄灭时为0/
}
struct light_dev *light_devp;
int light_major =LIGHT_MAJOR;
MODULE_AUTHOR("wuhuaming<whm128@yeah.ney>")
MODULE_LICENSE("Dual BSD/GPL")

int light_open(struct inode *inode,struct file *filp)
{
struct light_dev *dev;
dev=contain_of(inode->i_cdev,struct light_dev,cc)
filp->private_data=dev;
return 0;
}
int light_release(struct inode *inode,struct file *filp)
{
return 0;
}
ssize_t light_read(struct file *filp,char _user *buf,siloff_t *f_pos)
{
struct light_dev *dev=filp->private_data;
if(copy_to_user(buf,&(dev->value),1))
return -EFAULT;
return 1;
ssize_t light_write(struct file *filp,char_user *buf,)

总结

我们只需要有一个感性认识,那就是,上述暂时陌生的元素都是Linux内核为字符设备定义的,以实现驱动与内核接口而定义的。Linux对各类设备的驱动都定义了类似的数据结构和函数。

相关推荐
YYRAN_ZZU1 小时前
Lattice 自定义IP业务逻辑核
嵌入式硬件·fpga开发
FPGA小徐4 小时前
FPGA FIFO一篇完整解释
fpga开发
小此方6 小时前
Re:Linux系统篇(四十二)通信篇·七:SystemV标准三部曲其之三:信号量与并发编程初步认识
linux·运维·驱动开发
I'm a winner12 小时前
【IP核】 Xilinx FPGA LVDS 高速接口,含验证工程与板级测试用例
tcp/ip·fpga开发·测试用例
I'm a winner14 小时前
基于Xilinx FPGA的LVDS高速串行通信系统 - 完整源码解决方案(一)(文末附源码)
fpga开发
国科安芯15 小时前
航天器多路并联大功率电源系统设计与ASP4644均流特性分析
单片机·嵌入式硬件·fpga开发·安全性测试
techdashen2 天前
从网络栈继续往下:micro:bit、2.4GHz、调制方式,以及一个不太靠谱但很有趣的想法
网络·fpga开发
FPGA小徐2 天前
FIR 数字滤波器 --verilog设计实现
fpga开发
zlinear数据采集卡2 天前
从协议解析到波形实时显示:硬核拆解ZLinear采集卡上位机软件的开发架构
arm开发·单片机·嵌入式硬件·fpga开发·架构·开源
pcjiushizhu2 天前
ModelSim 仿真时 Simulate 无反应或只显示 Loading 的解决方法:网卡问题排查
fpga开发