socfpga地址映射解析

socfpga地址映射解析


示例

#define HW_REGS_BASE ( ALT_STM_OFST )     //0xfc00 0000 STM基地址
#define HW_REGS_SPAN ( 0x04000000 ) 
#define HW_REGS_MASK ( HW_REGS_SPAN - 1 ) //0x03ff ffff代表STM地25位到0位的掩码

#define USER_IO_DIR     (0x01000000)
#define BIT_LED         (0x01000000)
#define BUTTON_MASK     (0x02000000)

virtual_base = mmap( NULL, HW_REGS_SPAN, ( PROT_READ | PROT_WRITE ), MAP_SHARED, fd, HW_REGS_BASE );

alt_setbits_word((virtual_base + ((uint32_t)( ALT_GPIO1_SWPORTA_DDR_ADDR ) & (uint32_t)( HW_REGS_MASK))), USER_IO_DIR);

解析

#define ALT_STM_OFST 0xfc000000

#define ALT_CAST(type, ptr)  ((type) (ptr))
#define ALT_GPIO1_OFST 0xff709000
#define ALT_HPS_ADDR        0
#define ALT_GPIO1_ADDR ALT_CAST(void *, (ALT_CAST(char *, ALT_HPS_ADDR) + ALT_GPIO1_OFST))

#define ALT_GPIO_SWPORTA_DDR_OFST 0x4
#define ALT_GPIO_SWPORTA_DDR_ADDR(base)  ALT_CAST(void *, (ALT_CAST(char *, (base)) + ALT_GPIO_SWPORTA_DDR_OFST))

#define ALT_GPIO1_SWPORTA_DDR_ADDR ALT_GPIO_SWPORTA_DDR_ADDR(ALT_GPIO1_ADDR)



//展开宏
ALT_GPIO1_SWPORTA_DDR_ADDR = 0xff709004
//就是gpio_swporta_ddr的寄存器地址

//得到gpio_swporta_ddr相对STM的偏移地址
((uint32_t)( ALT_GPIO1_SWPORTA_DDR_ADDR ) & (uint32_t)( HW_REGS_MASK))) ==>
(0xff709004) & 3ffffff = 3709004 相当于 0xff709004 - 0xfc000000 = 3709004 

总结

重点在于求gpio_swporta_ddr相对STM的偏移地址,只是使用按位与来做减法,所以看起来有点难理解

猜你喜欢

转载自blog.csdn.net/wyy626562203/article/details/81129990