驱动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等操作?
望各位大牛给小弟解疑!
回复 #1 robin23 的帖子
这个要看你在什么地方操作,用户空间看到的是虚拟地址,你直接操作这个地址就不对了 操作的过程都是在驱动里做的,用户空间只是传个数值进去,不知道,这样可行不?回复 #2 dreamice 的帖子
不是说用户空间看到的是虚拟地址,是cpu看到的都是虚拟地址,只是用户空间3G以下,内核空间3g以上回复 #3 robin23 的帖子
arm上面的in(), out()应该都是直接在memory map的方式读写地址。在arm上面是只有统一的memory物理地址空间(4G)没有单独的io地址空间(x86就有64M的)的(用in,out指令访问的物理地址空间)。所以在x86上in, out是翻译成in, out指令,arm上就不用。 嗯,对的。那这样可以用吗?unsigned long *data_addr;
if(request_region(0x1001501c,1, "LCD")==NULL)
{
return -ENOTTY;
}
data_addr=ioremap(0x1001501c, sizeof(unsigned long));
iowrite32(0xffffffff,data_addr);
回复 #6 robin23 的帖子
感觉应该是可以的,最好是尝试一下
页:
[1]