- 论坛徽章:
- 0
|
我想测试一下经过ioremap之后的地址是否可以直接对寄存器直接操作。
测试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:%x\n",vaddr1,*vaddr1);
*vaddr1=0xff;
udelay(100);
printk("*vaddr1:%x\n",*vaddr1);
printk("ioread32:%x\n",ioread32(vaddr1));
vaddr2 = ioremap(ULCON1,4);
printk("vaddr2:%x:%x\n",vaddr2,*vaddr2);
tmp = ioread32(vaddr2);
printk("tmp:%x\n",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) |
|