Linux 驱动分类 与访问技术
驱动开发概述
1.驱动分类
1.1 常规分析法
1.1.1 字符设备
字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,
这样的驱动通常实现open, close, read和write 系统调用。例:串口,LED,按键。
1.1.2 块设备
在大部分的Unix系统中, 块设备定义为:以块(通常是512字节)为最小传输单位的设备,块设备不能按字节处理数据。
而Linux则允许块设备传送任意数目的字节。因此, 块和字符设备的区别仅仅是驱动的与内核的接口不同。常见的块设备包括硬盘,flash,SD卡……
1.1.3 网络设备
网络接口可以是一个硬件设备,如网卡; 但也可以是一个纯粹的软件设备, 比如回环接口(lo).一个网络接口负责发送和接收数据报文。
1.2 总线分类法
USB设备,PCI设备,平台总线设备
2.驱动学习方法
2.1 驱动模型
2.2 驱动操作
硬件访问技术
1. 访问流程
1.1 地址映射
在Linux系统中,无论是内核程序还是应用程序,都只能使用虚拟地址,而芯片手册中给出的硬件寄存器地址或者RAM地址则是物理地址,无法直接使用,因 此,我们读写寄存器的第1步就是将它的物理地址映射为虚拟地址。
1.2 读写寄存器
2. 地址映射
2.1 动态映射
所谓动态映射,是指在驱动程序中采用ioremap函数将物理地址映射为虚拟地址。
原型:void * ioremap(physaddr, size)
参数:Physaddr:待映射的物理地址Size:映射的区域长度
返回值:映射后的虚拟地址
2.2 静态映射
所谓静态映射,是指Linux系统根据用户事先指定的映射关系,在内核启动时,自动地将物理地址映射为虚拟地址。
1.如何事先指定映射关系?
2.内核启动时,在什么地方完成自动映射?
在静态映射中,用户是通过map_desc结构来指明物理地址与虚拟地址的映射关系。
struct map_desc
{
unsigned long virtual; /* 映射后的虚拟地址*/
unsigned long pfn; /* 物理地址所在的页帧号*/
unsigned long pfn; /* 物理地址所在的页帧号*/
unsigned long length;/* 映射长度*/
unsigned int type;/* 映射的设备类型*/
};
pfn: 利用__phys_to_pfn(物理地址)可以计算出物理地址所在的物理页帧号在静态映射中,
用户是通过map_desc结构来指明物理地址与虚拟地址的映射关系。
3. 寄存器读写
在完成地址映射后,就可以读写寄存器了,Linux内核提供了一系列函数,来读写寄存器。
unsignedioread8(void *addr)
unsignedioread16(void *addr)
unsignedioread32(void *addr)
unsignedreadb(address)
unsignedreadw(address)
unsignedreadl(address)
voidiowrite8(u8 value, void *addr)
voidiowrite16(u16 value, void *addr)
voidiowrite32(u32 value, void *addr)
voidwriteb(unsigned value, address)
voidwritew(unsigned value, address)
voidwritel(unsigned value, address)
Linux 驱动分类 与访问技术的更多相关文章
- Linux驱动之内存访问
<背景> 内存会以分页方式组织内存,而且每页大小和计算机体系结构有关系,Linux中每个页都有对应的struct page{} 与之对应. ...
- linux驱动面试题2
1.什么是GPIO? general purpose input/output GPIO是相对于芯片本身而言的,如某个管脚是芯片的GPIO脚,则该脚可作为输入或输出高或低电平使用,当然某个脚具有复用的 ...
- linux驱动工程面试必问知识点
linux内核原理面试必问(由易到难) 简单型 1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化, ...
- linux驱动面试题整理
1.字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件? 答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件. 评:这只是其中一种方式,也 ...
- linux驱动面试题目汇总
http://blog.csdn.net/blueice8601/article/details/7666427 1.linux驱动分类 2.信号量与自旋锁 3.platform总线设备及总线设备如何 ...
- Linux驱动经典面试题目
1. linux驱动分类 2. 信号量与自旋锁 3. platform总线设备及总线设备怎样编写 4. kmalloc和vmalloc的差别 5. module_init的级别 6. 加入 ...
- Linux驱动设计—— 中断与时钟
中断和时钟技术可以提升驱动程序的效率 中断 中断在Linux中的实现 通常情况下,一个驱动程序只需要申请中断,并添加中断处理函数就可以了,中断的到达和中断函数的调用都是内核实现框架完成的.所以程序员只 ...
- (57)Linux驱动开发之三Linux字符设备驱动
1.一般情况下,对每一种设备驱动都会定义一个软件模块,这个工程模块包含.h和.c文件,前者定义该设备驱动的数据结构并声明外部函数,后者进行设备驱动的具体实现. 2.典型的无操作系统下的逻辑开发程序是: ...
- Linux驱动开发概述
原文出处:http://www.cnblogs.com/jacklu/p/4722563.html Linux设备分类 设备的驱动程序也要像裸机程序那样进行一些硬件操作,不同的是驱动程序需要" ...
随机推荐
- TCP客户机-服务器
1 僵尸进程 2 信号处理 信号: 1 由一进程发往另一进程 2 由内核发往某进程 僵尸状态: 父进程取回子进程的相关信息,进程的ID,终止状态,子进程的资源利用信息 编程时: 1 当派生子进 ...
- center os 6.5 vsftpd 登陆出现 530 错误拒绝 解决方法
别管那么多 把 /etc/vsftpd/ftpusers 里面的用户名删掉就好了.
- 用ICSharpCode.SharpZipLib进行压缩
今天过中秋节,当地时间(2013-09-08),公司也放假了,正好也闲着没事,就在网上学习学习,找找资料什么的.最近项目上可能会用到压缩的功能,所以自己就先在网上学习了,发现一个不错的用于压缩的DLL ...
- jquery的匿名函数研究
jQuery片段: ? 1 2 3 ( function (){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在 ...
- HDU 5573 Binary Tree 构造
Binary Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5573 Description The Old Frog King lives ...
- cdoj 65 CD Making 水题
CD Making Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/65 De ...
- Topcomponent --sighoff
Topcomponent --sighoff 实现一个置于右边框的Topcomponent: 1.可远程同步更新(根据远程的xml文件),修改(增删)该xml文件,查看.刷新等 2.打包工程,记录该打 ...
- 【UML】具体解释六种关系
UML中包括六中关系.各自是:关联(Association).聚合(Aggregation).组合(Composition).泛化(Generalization).依赖(Dependency).实现( ...
- MHA 安装过程 原创
root@monitor yum.repos.d]# cat CentOS-Base.repo [base]name=CentOS-$releasever - Basefailovermethod=p ...
- [设计模式3]--工厂(Factory)模式
原文出处:http://blog.csdn.net/lwbeyond/article/details/7528309 工厂模式属于创建型模式,大致可以分为三类,简单工厂模式.工厂方法模式.抽象工厂模式 ...