zoukankan      html  css  js  c++  java
  • Linux内核硬件访问技术

    ① 驱动程序控制设备,主要是通过访问设备内的寄存器来达到控制目的。因此我们讨论如何访问硬件,就成了如何访问这些寄存器。

    ② 在Linux系统中,无论是内核程序还是应用程序,都只能使用虚拟地址,而芯片手册中给出的硬件寄存器地址或者Ram地址则是物理地址,无法直接使用。因此,我们读写寄存器的第一步就是将它的物理地址映射为虚拟地址。

    (1)动态映射:指在驱动程序中采用ioremap函数将物理地址映射为虚拟地址

      void* ioremap(physaddr, size);

      phyaddr: 待映射的物理地址

      size: 映射区域长度

      返回值:映射后的虚拟地址

    (2)静态映射:指在Linux系统根据用户事先指定的映射关系,在内核启东时,自动地将物理地址映射为虚拟地址

      * 用户通过map_desc结构来指明物理地址与虚拟地址的映射关系

    struct map_desc {
        unsigned long virtual;  /* 映射后的虚拟地址 */
        unsigned long pfn;    /* 物理地址所在的页帧号 */
        unsigned long length;  /* 映射长度 */
        unsigned int type;    /* 映射的设备类型 */
    };

      * pfn: 利用宏__phys_to_pfn可以根据物理地址计算出物理地址所在的页帧号

    ③ Linux内核提供了一系列函数来读写寄存器(映射之后的虚拟地址)

    (1)read

      unsigned ioread8(void* addr)

      unsigned ioread16(void* addr)

      unsigned ioread32(void* addr)

      unsigned readb(address)

      unsigned readw(address)

      unsigned readl(address)

    (2)write

      unsigned iowrite8(u8 value, void* addr)

      unsigned iowrite16(u16 value, void* addr)

      unsigned iowrite32(u32 value, void* addr)

      unsigned writeb(address)

      unsigned writew(address)

      unsigned writel(address)

  • 相关阅读:
    【PHP】php重写session的存储机制
    【Javascript】原生js 全特效微博发布面板效果实现
    【Javascript】原生js百叶窗效果的实现及原理介绍
    【jQuery】jquery全屏滚动插件【fullPage.js】API 使用方法总结
    从百度音乐和酷狗音乐的分类想到的
    jQuer __Ajax DOM
    面向对象闭包 继承
    Git
    设计模式
    html5标签大全
  • 原文地址:https://www.cnblogs.com/wulei0630/p/9496834.html
Copyright © 2011-2022 走看看