robin23 发表于 2009-11-11 11:37

驱动IO问题

小弟最近在arm9板上写一个驱动,有些疑问,想请教一下各位大牛:
arm控制LCD的物理地址是0x1001501c,我用:
unsigned long data_addr;
if(request_region(0x1001501c,1, "LCD")==NULL)
{
      return -ENOTTY;
}
data_addr=ioremap(0x1001501c, sizeof(unsigned long));
然后,就可以通过data_addr来操作设备了?
第二个问题:
书上说arm支持io端口操作,是否可以不用ioremap(0x1001501c, sizeof(unsigned long));而直接在0x1001501c上用inb,oub等操作?
望各位大牛给小弟解疑!

dreamice 发表于 2009-11-11 12:03

回复 #1 robin23 的帖子

这个要看你在什么地方操作,用户空间看到的是虚拟地址,你直接操作这个地址就不对了

robin23 发表于 2009-11-11 13:09

操作的过程都是在驱动里做的,用户空间只是传个数值进去,不知道,这样可行不?

snail_314 发表于 2009-11-11 13:42

回复 #2 dreamice 的帖子

不是说用户空间看到的是虚拟地址,是cpu看到的都是虚拟地址,只是用户空间3G以下,内核空间3g以上

snail_314 发表于 2009-11-11 13:46

回复 #3 robin23 的帖子

arm上面的in(), out()应该都是直接在memory map的方式读写地址。在arm上面是只有统一的memory物理地址空间(4G)没有单独的io地址空间(x86就有64M的)的(用in,out指令访问的物理地址空间)。所以在x86上in, out是翻译成in, out指令,arm上就不用。

robin23 发表于 2009-11-11 15:10

嗯,对的。那这样可以用吗?
unsigned long *data_addr;
if(request_region(0x1001501c,1, "LCD")==NULL)
{
      return -ENOTTY;
}
data_addr=ioremap(0x1001501c, sizeof(unsigned long));
iowrite32(0xffffffff,data_addr);

dreamice 发表于 2009-11-11 16:16

回复 #6 robin23 的帖子

感觉应该是可以的,最好是尝试一下
页: [1]
查看完整版本: 驱动IO问题