Username: Password:

I/O内存内存操作
来源: ChinaUnix博客  作者: 发布时间:2008-01-01 16:19:00


               
I/O内存内存操作
访问寄存器和访问普通的SDRAM是不同的。
特别寄存器在2410上映射在虚拟地址的0xf0000000开始的地方。
具体能够参考map.h的定义。
#define ioread8(p)    ({ unsigned int __v = __raw_readb(p); __v; })
#define ioread16(p)    ({ unsigned int __v = le16_to_cpu(__raw_readw(p)); __v; })
#define ioread32(p)    ({ unsigned int __v = le32_to_cpu(__raw_readl(p)); __v; })
#define iowrite8(v,p)    __raw_writeb(v, p)
#define iowrite16(v,p)    __raw_writew(cpu_to_le16(v), p)
#define iowrite32(v,p)    __raw_writel(cpu_to_le32(v), p)
(1)任何的读写指令所赋的地址必须都是虚拟地址,您有两种选择:使用内核已定义好的地址,如
S3C2440_GPJCON等等,这些都是内核定义好的虚拟地址,有兴趣的能够看源码。更有一种方法就是使用自己用ioremap映射的虚拟地址。绝对
不能使用实际的物理地址,否则会因为内核无法处理地址而出现oops。
(2)在使用I/O指令时,能够不使用request_region和request_mem_region,而直接使用outb、ioread等指令。因为request的功能只是告诉内核端口被谁占用了,如再次request,内核会制止。
(3)在使用I/O指令时,所赋的地址数据有时必须通过强制类型转换为 unsigned long ,不然会有警告(具体原因请看Linux设备驱动程式学习(7)-内核的数据类型) 。虽然您的程式可能也能够使用,但是最好还是不要有警告为妙。
(4)在include\asm-arm\arch-s3c2410\hardware.h中定义了很多io口的操作函数,有需要能够在驱动中直接使用,很方便。
另外一个方式是采用ioremap,为了以后兼容性的考虑,我觉得最好采用这个方式。
               
               
               
               
               

本文来自ChinaUnix博客,假如查看原文请点:http://blog.chinaunix.net/u1/49088/showart_493596.html

喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅