Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3547151
  • 博文数量: 1805
  • 博客积分: 135
  • 博客等级: 入伍新兵
  • 技术积分: 3345
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-19 20:01
文章分类

全部博文(1805)

文章存档

2017年(19)

2016年(80)

2015年(341)

2014年(438)

2013年(349)

2012年(332)

2011年(248)

分类: LINUX

2015-02-06 14:54:30

原文地址:对ioremap的理解 作者:镇水铁牛

        对外设的访问不外乎数据寄存器、控制寄存器、状态寄存器。而对外设IO端口一般分IO映射和内存映射两种,为什么会这样呢,主要是外设端口在编址上一般都是连续的(用一段连续空间进行映射,CPU可以像访问内存一样的访问外设)。这两种的差异对于软件来说是透明的,开发者把它们统称为IO内存资源。
       当硬件设计完成后, 硬件外设的I/O内存资源的物理地址就固定了。CPU还没有给这些物理资源分配虚拟地址,并且驱动程序无法直接访问物理地址的IO内存资源,必须要经过映射,将其映射到内核的虚拟地址空间中。
        ioremap用来将I/O内存资源的物理地址映射到内核虚地址空间中,原型如下:

        void * ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags);

        void iounmap(void * addr);用于取消ioremap()所做的映射。
        一个例子如:

        #define gp_dat (volatile unsigned long)ioremap(0x100000,4)
        对寄存器地址0x100000做一个映射。
        再用readl(gp_dat);或writel(gp_dat)进行读写寄存器。
        这里的一些概念,可以参考我前面关于ioport和iomem的分析,做这个分析主要是为后面mmap进行对比分析,mmap是完全不同的概念,弄不清的话容易混淆。


阅读(382) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~