驱动开发概述

  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. ActiveMQ讯息传送机制以及ACK机制详解

    [http://www.ylzx8.cn/ruanjiangongcheng/software-architecture-design/11922.html] AcitveMQ:消息存储和分发组件,涉 ...

  2. iOS 消息推送实现 APNS

    本文只是记录一下如何在自己的电脑上配置APNS推送环境,其它的如推送的原理,流程什么的这里就不写了. 一. 去Apple 开发者中心,创建App ID.注意App ID不能使用通配符.并注意添加Pus ...

  3. Android Studio 错误 Duplicate files copied in APK META-INF/LICENSE.txt

    1 .Duplicate files copied in APK META-INF/LICENSE.txt   android { packagingOptions { exclude 'META-I ...

  4. 深入Delphi -- Windows 消息机制

    http://www.txsz.net/xs/delphi/3/Windows%20%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6.htm Windows 消息机制 by m ...

  5. Delphi Data Types

    http://docwiki.embarcadero.com/RADStudio/XE6/en/Delphi_Data_Types Integer Data Types Type Descriptio ...

  6. Myeclipse如何改变编码方式

    Windows---->Preferences---->myeclipse Enterprise Workbench---->File and Editors----->JSP ...

  7. C++学习笔记之继承

    一.基类和派生类 很多时候,一个类的对象也“是”另一个类的对象,如矩形是四边形,在C++中,矩形类Rectangle可以由四边形类Quad继承而来,于是,四边形类Quad是基类,矩形类Rectangl ...

  8. AIM Tech Round (Div. 2) D. Array GCD dp

    D. Array GCD 题目连接: http://codeforces.com/contest/624/problem/D Description You are given array ai of ...

  9. cocos2d-x jsbinding 资源下载实现

    cocos2dx没有直接给出资源下载的api,可能是因为资源的管理每个项目的需求不太一样,所以完整的资源下载功能需要我们自己去实现. 资源下载分为两部分,一部分是资源请求,另一部分是资源文件写入.资源 ...

  10. error C2440:“类型转换":无法从“void (__thiscall Play1::* )(int *)”转换为“cocos2d::SEL_CallFucN

    转自:http://zhidao.baidu.com/link?url=VfSSkA0xfTVwNKaKh4tqW_sXlcsK-Rb16nEtQw5zaq5_306lnwJN3Kdb-rFp-r4L ...