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
的偏移地址,只是使用按位与
来做减法,所以看起来有点难理解