Linux 驱动分类 与访问技术

时间:2023-01-16 00:49:27

驱动开发概述

  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 驱动分类 与访问技术的更多相关文章

  1. Linux驱动之内存访问

    <背景> 内存会以分页方式组织内存,而且每页大小和计算机体系结构有关系,Linux中每个页都有对应的struct page{} 与之对应.                         ...

  2. linux驱动面试题2

    1.什么是GPIO? general purpose input/output GPIO是相对于芯片本身而言的,如某个管脚是芯片的GPIO脚,则该脚可作为输入或输出高或低电平使用,当然某个脚具有复用的 ...

  3. linux驱动工程面试必问知识点

    linux内核原理面试必问(由易到难) 简单型 1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化, ...

  4. linux驱动面试题整理

    1.字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件? 答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件. 评:这只是其中一种方式,也 ...

  5. linux驱动面试题目汇总

    http://blog.csdn.net/blueice8601/article/details/7666427 1.linux驱动分类 2.信号量与自旋锁 3.platform总线设备及总线设备如何 ...

  6. Linux驱动经典面试题目

    1.  linux驱动分类 2.  信号量与自旋锁 3.  platform总线设备及总线设备怎样编写 4.  kmalloc和vmalloc的差别 5.  module_init的级别 6.  加入 ...

  7. Linux驱动设计—— 中断与时钟

    中断和时钟技术可以提升驱动程序的效率 中断 中断在Linux中的实现 通常情况下,一个驱动程序只需要申请中断,并添加中断处理函数就可以了,中断的到达和中断函数的调用都是内核实现框架完成的.所以程序员只 ...

  8. (57)Linux驱动开发之三Linux字符设备驱动

    1.一般情况下,对每一种设备驱动都会定义一个软件模块,这个工程模块包含.h和.c文件,前者定义该设备驱动的数据结构并声明外部函数,后者进行设备驱动的具体实现. 2.典型的无操作系统下的逻辑开发程序是: ...

  9. Linux驱动开发概述

    原文出处:http://www.cnblogs.com/jacklu/p/4722563.html Linux设备分类 设备的驱动程序也要像裸机程序那样进行一些硬件操作,不同的是驱动程序需要&quot ...

随机推荐

  1. Android Device Monitor工具的DDMS使用

    Dalvik Debug Monitor Server(DDMS)是主要的Android调试工具之一 1.打开android studio->tools->android device m ...

  2. Git 撤消

    现在添加一个新的文件 t.c, 写一行 int a; 用 git add . 添加跟踪,当前状态 $ git status On branch master Changes to be committ ...

  3. mysql优化技巧《转》

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  4. win7中protel99添加元件库

    protel打开时默认添加Miscellaneous Devices.lib,点击ADD/REMOVE按钮添加所需要的库时,弹出“文件无法识别”. 点击面板右下方“FIND”按钮,弹出如下对话框时不要 ...

  5. (转)介绍几个C&num;正则表达式工具

    推荐三个C#正则表达式工具,理由如下 第一个C#正则表达式工具,REGEX 这个C#正则表达式工具优点是中文的,提供了一些示例 第二个C#正则表达式工具,REGEXBUDDY 这是一个真正专业的REG ...

  6. Unity 触屏缩放模型

    现在的手机都是触屏控制的,那么在游戏中我们想通过手指在屏幕上滑动捕获相应的动作呢?Unity官网API中提供了Input类和Touch类,在该类里提供了许多接口.相信只要我们稍微看下,就可以自己应用了 ...

  7. matlab入门 蜂窝阵列

    B{1,1}=[1,2]; B{1,2}='kitty'; B B = [1x2 double]    'kitty' celldisp(B) B{1} =      1     2 B{2} =   ...

  8. VS Code C&num; 插件离线版 1&period;6&period;2

    VS Code C# 插件离线版,目前最新稳定版为:1.6.2 . 由于在扩展中下载C#插件总是缓慢,或者容易出现错误,特制作离线版本共享出来. 本离线版本为Windows版本,其他系统请在扩展中下载 ...

  9. python装饰器探究与参数的领取

    首先上原文, 现在,假设我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为"装饰器" ...

  10. CSS 渐变色

    CSS linear-gradient() 函数 http://www.runoob.com/cssref/func-linear-gradient.html CSS radial-gradient( ...