xifanlover 发表于 2013-08-14 10:15

iowrite32和at91_sys_write的区别?

at91_sys_write(AT91_PIOC+PIO_IDR,(uint32)0xff<<19);
iowrite32(31040, (at91tc0_base + AT91_TC_RC));
我发现这2个函数都可以向某个寄存器写入数据,那这2个有什么区别吗?

wwxxxxll 发表于 2013-08-14 11:03

static inline void at91_sys_write(unsigned int reg_offset, unsigned long value)
{
      void __iomem *addr = (void __iomem *)AT91_VA_BASE_SYS;

      __raw_writel(value, addr + reg_offset);
}

#define writel(b,addr) __raw_writel(__cpu_to_le32(b),addr)

#define iowrite32(v, addr)      writel((v), (addr))

没什么大区别, iowrite32有小端转换,如果cpu就是小端,那就真没区别了
还有的形式上的区别,就是iowrite32是linux系统提供的

at91_sys_write是at91平台提供的



xifanlover 发表于 2013-08-14 15:12

本帖最后由 xifanlover 于 2013-08-14 15:20 编辑

谢谢大哥的回答,哥,我顺着这个问题再问下:
iowrite32(31040, (at91tc0_base + AT91_TC_RC));这个命令里的参数(at91tc0_base + AT91_TC_RC)我知道是虚拟地址,但是
at91_sys_write(AT91_PIOC+PIO_IDR,(uint32)0xff<<19); 这个命令里的参数AT91_PIOC+PIO_IDR我怎么感觉是物理地址呀!
AT91_PIOC头文件是这么定义的:#define AT91_BASE_SYS0xffffe800#define AT91_PIOC        (0xfffff800 - AT91_BASE_SYS);
PIO_IDR头文件是这么定义的:#define PIO_IDR                0x44        /* Interrupt Disable Register */
不知道我这个理解对不对?(感觉是错的,哈哈,linux都是处理虚拟地址的。)
另外,这个定义#define AT91_PIOC        (0xfffff800 - AT91_BASE_SYS);AT91_PIOC是取多少?是0x1000吗?











回复 2# wwxxxxll


   

wwxxxxll 发表于 2013-08-14 15:55

1 首先我说一下,虚拟地址和物理地址,不是从值来区分的,它们可能是一样的值。一般寄存器是一样的
让你看个mmu的映射实例
我们群的一位同志用的,mmu映射表,0xE000_0000 -- 0xFFFF_FFFF寄存器地址,虚拟地址和物理地址值一样
* MMU Table for SMDKC110
* 0x0000_0000 -- 0xBFFF_FFFF => Not Allowed
* 0xB000_0000 -- 0xB7FF_FFFF => A:0xB000_0000 -- 0xB7FF_FFFF        --->128M
* 0xC000_0000 -- 0xC7FF_FFFF => A:0x3000_0000 -- 0x37FF_FFFF        --->128M
* 0xC800_0000 -- 0xDFFF_FFFF => Not Allowed
* 0xE000_0000 -- 0xFFFF_FFFF => A:0xE000_0000 -- 0XFFFF_FFFF       --->512M

2 0xfffff800 - 0xffffe800 = 0x1000,有什么问题

可以加入我们群,问题会更快得到回复!
群号:163617970

xifanlover 发表于 2013-08-14 16:02

了解了,十分感谢!qq群肯定是要加的哦,哈哈!回复 4# wwxxxxll


   
页: [1]
查看完整版本: iowrite32和at91_sys_write的区别?