当前位置: 技术问答>linux和unix
请教ioremap之后操作硬件地址的问题
来源: 互联网 发布时间:2016-02-25
本文导语: 我想测试一下经过ioremap之后的地址是否可以直接对寄存器直接操作。 测试3个功能: 1、是否可以对一个物理地址进行多次ioremap 2、ioremap返回的地址是否可以直接对物理寄存器进行操作 3、多个虚拟地址是否都可以正...
我想测试一下经过ioremap之后的地址是否可以直接对寄存器直接操作。
测试3个功能:
1、是否可以对一个物理地址进行多次ioremap
2、ioremap返回的地址是否可以直接对物理寄存器进行操作
3、多个虚拟地址是否都可以正常操作一个物理地址。
先放上代码
这是测试能否操作寄存器的一段代码
我通过对同一个寄存器两次ioremap,得到两个虚拟地址vaddr1和vaddr2,他们都对应一个真实的物理地址ULCON1.
在第一个vaddr1处写入一个数6,然后再从vaddr2处读出来。
可是运行结果打印如下:
结果说明vaddr1根本没有改变寄存器ULCON1的值(*vaddr1:0)。
请教高人,这是什么原因。我还需要做什么?多谢
(补充:代码运行在嵌入式平台,芯片是s3c2440)
测试3个功能:
1、是否可以对一个物理地址进行多次ioremap
2、ioremap返回的地址是否可以直接对物理寄存器进行操作
3、多个虚拟地址是否都可以正常操作一个物理地址。
先放上代码
#define ULCON1 ((volatile unsigned *)0x50004000)
unsigned long* vaddr1;
unsigned long* vaddr2;
u32 tmp;
vaddr1 = ioremap(ULCON1,4);
printk("vaddr1:%x:%xn",vaddr1,*vaddr1);
*vaddr1=0xff;
udelay(100);
printk("*vaddr1:%xn",*vaddr1);
printk("ioread32:%xn",ioread32(vaddr1));
vaddr2 = ioremap(ULCON1,4);
printk("vaddr2:%x:%xn",vaddr2,*vaddr2);
tmp = ioread32(vaddr2);
printk("tmp:%xn",tmp);
这是测试能否操作寄存器的一段代码
我通过对同一个寄存器两次ioremap,得到两个虚拟地址vaddr1和vaddr2,他们都对应一个真实的物理地址ULCON1.
在第一个vaddr1处写入一个数6,然后再从vaddr2处读出来。
可是运行结果打印如下:
vaddr1:c4812000:0
*vaddr1:0
ioread32:0
vaddr2:c4814000:0
tmp:0
结果说明vaddr1根本没有改变寄存器ULCON1的值(*vaddr1:0)。
请教高人,这是什么原因。我还需要做什么?多谢
(补充:代码运行在嵌入式平台,芯片是s3c2440)
|
LZ忘了一点,在嵌入式CPU上,有些寄存器可读不可写,有些可写不可读,有些读出的值与写入的值是不同的。