使用riu_r和riu_w读写寄存器的方法

riu_r和riu_w都是16bit width offset。

例如写这个寄存器:riu_w 101E 03 FFFF

读这个寄存器:riu_r 101E 03

(需要注意(101E)03才是16bit-width offset,(101E)06/07是8bit-width offset)

内核和uboot对GPIO操作的代码请参考mhal_gpio.c

内核和uboot读写寄存器的代码请参考platform.h

常用的有以下几个:

#define OUTREGMSK8(x, y, z) OUTREG8(x, ((INREG8(x)&~(z))|((y)&(z))))

#define OUTREGMSK16(x, y, z) OUTREG16(x, ((INREG16(x)&~(z))|((y)&(z))))

#define INREG8(x) ms_readb(x)

#define OUTREG8(x, y) ms_writeb((u8)(y), x)

#define INREG16(x) ms_readw(x)

#define OUTREG16(x, y) ms_writew((u16)(y), x)

#define ms_readb(a) (*(volatile unsigned char *)IO_ADDRESS(a))

#define ms_readw(a) (*(volatile unsigned short *)IO_ADDRESS(a))

#define ms_writeb(v,a) (*(volatile unsigned char *)IO_ADDRESS(a) = (v))

#define ms_writew(v,a) (*(volatile unsigned short *)IO_ADDRESS(a) = (v))

以上x传的是32位内存地址。如何根据规格书转换寄存器的内存地址,方法如下:

举例:如果客户想操作PAD_SAR_GPIO2引脚:

a) 先从mhal_gpio.c里很快能找到对应的寄存器定义:

#define GPIO100_PAD PAD_SAR_GPIO2

#define GPIO100_OEN 0x1423, BIT2

#define GPIO100_IN 0x1425, BIT2

#define GPIO100_OUT 0x1424, BIT2

从以上可以看出,output enable对应bank 0x14 地址0x23(8bit)的bit2,写0表示output,写1表示input。

input data 对应bank 0x14地址0x25(8bit)的bit2,output data 对应bank 0x14 地址0x24(8bit)的bit2。

b) 从mhal_gpio.c里的MHal_GPIO_Pad_Set()函数里发现,使用PAD_SAR_GPIO2引脚还需要先disable SAR。

MHal_SAR_GPIO_WriteRegBit(REG_SAR_MODE,DISABLE,BIT2);—>

MHal_SAR_GPIO_REG(REG_SAR_MODE) &= (~BIT2); —>

其中:

        #define MHal_SAR_GPIO_REG(addr) (*(volatile U8*)(gSarBaseAddr + (((addr) & ~1)<<1) + (addr & 1)))

        #define REG_SAR_MODE       0x22

        U32 gSarBaseAddr = 0x1F002800;

可以知道,把bank (0x2800>>8)>>1 ,也就是bank 0x14的0x22(8bit)的bit2写0.

c)综合上述:在Uboot里增加代码把PAD_SAR_GPIO2拉高

OUTREGMSK8( 0x1F000000+( (0x14)<<8+0x22&(~1))<<1 + 0x22&(1) , 0 ,1<<2 );

OUTREGMSK8( 0x1F000000+( (0x14)<<8+0x23&(~1))<<1 + 0x23&(1) , 0 , 1<<2);

OUTREGMSK8( 0x1F000000+( (0x14)<<8+0x25&(~1))<<1 + 0x25&(1) , 0 , 1<<2);

OUTREGMSK8( 0x1F000000+( (0x14)<<8+0x24&(~1))<<1 + 0x24&(1) , 4 ,1<<2 );

把PAD_SPI0_DI拉低或者拉高:

OUTREGMSK8( 0x1F000000+( (0x101E)<<8+0x0F&(~1))<<1 + 0x0F&(1) , 0 ,1<<4 );

OUTREGMSK8( 0x1F000000+( (0x101E)<<8+0x0F&(~1))<<1 + 0x0F&(1) , 0 ,1<<5 );

OUTREGMSK8( 0x1F000000+( (0x103C)<<8+0xE4&(~1))<<1 + 0xE4&(1) , 0 , 1<<5);

OUTREGMSK8( 0x1F000000+( (0x103C)<<8+0xE4&(~1))<<1 + 0xE4&(1) , 1<<4, 1<<4);

把PAD_FUART_RTS拉高:

OUTREGMSK8(0x1F20785C,0<<5,1<<5);

OUTREGMSK8 (0x1F20785C,0<<4,1<<4);

OUTREGMSK8 (0x1F20785C,1<<0,1<<0);//拉高

OUTREGMSK8 (0x1F20785C,1<<0,1<<0);//拉低