驱动开发概述

  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设备分类 设备的驱动程序也要像裸机程序那样进行一些硬件操作,不同的是驱动程序需要" ...

随机推荐

  1. 用JS或jQuery访问页面内的iframe,兼容IE/FF

    用JS或jQuery访问页面内的iframe,兼容IE/FF js或者jQuery访问页面中的框架也就是iframe.注意:框架内的页面是不能跨域的! 假设有两个页面,在相同域下. index.htm ...

  2. window8家庭版上的RationalRose

    来点儿小插曲儿,本是继续Java系列文章的续集的,但是最近要用到UML,在网上看了看,查了查推荐的到是不少,最终还是选择了rose,哈哈,一半是冲着名字去的,一半看看了与其它的UML的比较,最终中意r ...

  3. Cross-Browser HTML5 Placeholder Text

    One of the nice enhancement in HTML5 web form is being able to add placeholder text to input fields. ...

  4. 测试HAPROXY的文件分流办法

    测试HAPROXY的文件分流办法 http://blog.chinaunix.net/uid-20553497-id-3054980.html http://blog.sina.com.cn/s/bl ...

  5. Yeoman+Express+Angular在Linux上开发配置方法

    $mkdir ExpressWithAngularTest $cd ExpressWithAngularTest choose needed components you'd like to add ...

  6. 关于对defer的理解.

    代码 <script defer> function init(){ document.getElementById("div").innerHTML="OK ...

  7. 百度UEditor组件出现Parameters: Invalid chunk &#39;&#39; ignored警告的分析

    使用百度UEditor在线编辑器组件时,出现Parameters: Invalid chunk '' ignored的警告,之前的项目使用却没有.两个项目的环境应该是一样的. 没有时间去对照两项目使用 ...

  8. ls显示文件大小时显示单位

    在Linux中显示文件大小的时候,通常的做法是使用“ls -l”,显示的大小是文件的字节大小. 但是,如果文件比较大的话,显示起来不是特别易读,这个时候,可以使用“ls -lh”,就可以使用比较接近文 ...

  9. oracle连接错误

    公司用的数据库,动不动会出现一些问题.但是都是大家比较常见的.所以,贴出来给大家看看1,oracle启动数据库时报错:SQL> startup;ORA-01078: failure in pro ...

  10. uboot 网络不通问题解决一例1

    平台:Hi3531 PHY:RTL8211 现象:在uboot中执行ping命令的时候,总是超时. 过程: 使用uboot自带的phy操作命令mii读出的数据全是0xff.这里要介绍一下uboot中的 ...