zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    晃动提示效果
    弹出框(dialog)制作
    日期选择组件
    背景图合并
    css小常识
    学习总结
    新学习的开始
    河马搞笑GIF动态图网站(http://gif.hemaj.com)上线,老司机快上车!
    新项目上线,河马体育(http://www.hemaj.com)-足球即时比分、足球比分、足球比分直播、足球直播
    正规表达
  • 原文地址:https://www.cnblogs.com/lvxiaoning/p/5061333.html
Copyright © 2011-2022 走看看