ioremap

来源:互联网 发布:昆明行知中学宿舍 编辑:程序博客网 时间:2024/05/19 16:05

原型: 

  1. void *ioremap(unsigned long phys_addr, unsigned long size)  
  2. void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)  

入口: phys_addr:要映射的起始的IO地址;

  size:要映射的空间的大小;

          ioremap 依靠 __ioremap实现,它只是在__ioremap中以第三个参数为0调用来实现.

  flags:要映射的IO空间的和权限有关的标志;

          phys_addr:是要映射的物理地址,

          size:是要映射的长度,

功能:将一个IO地址空间映射到内核的虚拟地址空间上去,便于访问;函数专门用来为I/O内存区域分配虚拟地址。经过ioremap之后,设备驱动即可访问任意的I/O内存地址。有了ioremap (和iounmap),设备就可以访问任何I/O内存空间,不论它是否直接映射到虚拟地址空间。但是,这些地址永远不能直接使用(指物理地址),而要用readb这种函数。

    ioremap是内核提供的用来映射外设寄存器到主存的函数,我们要映射的地址来源于CPU的用户开发手册。硬件的跳线或者是物理连接方式决定了硬件上的内存映射到的cpu物理地址。映射完了有什么效果呢,举个例子,比如某个网卡有100个寄存器,他们都是连在一块的,位置是固定的,加入每个寄存器占4个字节,那么一共400个字节的空间被映射到内存成功后,ioaddr就是这段地址的开头(ioaddr = ioremap (mmio_start, mmio_len);注意ioaddr是虚拟地址,而mmio_start是物理地址,它是开发手册中提供的,肯定是物理地址,而保护模式下CPU不认物理地址,只认虚拟地址),ioaddr+0就是第一个寄存器的地址,ioaddr+4就是第二个寄存器地址(每个寄存器占4个字节),以此类推,我们就能够在内存中访问到所有的寄存器进而操控他们了。

    访问I/O内存的正确方式是通过一系列专用于此目的的函数(在<asm/io.h>中定义的):

/*I/O内存读函数*/ 

  1. unsigned int ioread8(void*addr); 
  2. unsigned int ioread16(void*addr);
  3.  unsigned int ioread32(void*addr); 
  4. /*addr是从ioremap获得的地址(可能包含一个整型偏移量),返回值是从给定I/O内存读取的值*/

 /*对应的I/O内存写函数*/

  1. void iowrite8(u8value,void*addr); 
  2. void iowrite16(u16value,void*addr);
  3. void iowrite32(u32value,void*addr); 

/*读和写一系列值到一个给定的I/O内存地址,从给定的buf读或写count个值到给定的addr*/

  1. void ioread8_rep(void *addr, void *buf, unsigned long count); 
  2. void ioread16_rep(void *addr, void *buf, unsigned long count); 
  3. void ioread32_rep(void *addr, void *buf, unsigned long count); 
  4. void iowrite8_rep(void *addr, const void *buf, unsigned long count); 
  5. void iowrite16_rep(void *addr, const void *buf, unsigned long count); 
  6. void iowrite32_rep(void *addr, const void *buf,unsigned long count); 

/*需要操作一块I/O地址,使用一下函数*/

  1. void memset_io(void *addr, u8 value, unsigned int count); 
  2. void memcpy_fromio(void *dest,void *source, unsigned int count); 
  1. void memcpy_toio(void *dest, void *source, unsigned int count) 

/*旧函数接口,仍可工作,但不推荐。*/

  1. unsigned readb(address); 
  2. unsigned readw(address); 
  3. unsigned readl(address); 
  4. void writeb(unsigned value,address); 
  5. void writew(unsigned value,address); 
  6. void writel(unsigned value,address); 

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 成都安全员证原件丢了并过期怎么办 记不施工员证书号了怎么办 优易学车学员版登录不了怎么办 先科移动dvd主板坏了怎么办 离职单位不出劳动解除书怎么办 离职后一级建造师注册证怎么办 京牌货车报废挂靠公司不给办怎么办 二建挂靠注册证书到期了怎么办 二建证书挂靠公司不给钱怎么办 二建拿到证书原单位不解锁怎么办 凯云软件清单锁定只读了怎么办 苹果笔记本鼠标触摸板没反应怎么办 苹果笔记本键盘和触摸板失灵怎么办 苹果手机输入密码显示已停用怎么办 苹果7p手机刷机黑屏了怎么办 苹果5s来电接听屏幕卡顿怎么办? 手机摔了一下触屏失灵怎么办 小米手机摔了一下触屏失灵怎么办 苹果6sp触摸ic坏了怎么办 苹果4s屏幕摔裂了怎么办 新换的手机内屏颜色太亮怎么办 苹果手机摔了一下屏幕失灵怎么办 苹果手机6s屏幕坏了怎么办 苹果6s屏幕摔坏了怎么办 苹果手机屏幕进油了屏幕变暗怎么办 苹果手机不小心屏幕进油了怎么办 苹果6充电插口螺丝口坏了怎么办 苹果5s手机安装屏幕翘边怎么办 苹果手机摔了一下触摸屏失灵怎么办 苹果手机摔了下触摸屏失灵怎么办 苹果6老是屏幕失灵或者闪屏怎么办 华为荣耀8手触摸屏乱跳失灵怎么办 苹果5s屏幕有半边竖纹怎么办 苹果5s电源键坏了怎么办 苹果6s手机触屏失灵怎么办 不能取电池的手机触屏不灵怎么办? 7p主板触摸ic坏了怎么办 小米六手机摔了一下屏幕失灵怎么办 魅蓝5s触屏失灵怎么办 苹果手机键盘字母顺序乱了怎么办 红米手机进水后屏幕失灵怎么办