代碼
在某些特殊情況下,我們只是想要讀取某個寄存器的值或者某個地址的值,不需要去專門寫一個驅動模塊來實現,可以使用mmap函數配合/dev/mem設備來把物理地址映射到虛擬地址中。
代碼中,mmap參數0,代表讓系統分配地址(映射的地址)。0x1000爲映射區域大小,BASE_ADDR爲想要映射的物理地址,CPLD_VER_BCD等是相對於BASE_ADDR的偏移量。
/*read physical address*/
/*author:LK*/
int open_phy_addr()
{
int map_fd = open("/dev/mem", O_RDWR);
if(map_fd < 0)
{
printf("cannot open /dev/mem.\n");
return -1;
}
void *start = mmap(0, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, (BASE_ADDR));
if(start == MAP_FAILED)
{
printf("mmap failed!\n");
return -1;
}
//printf("start:0x%x\t\n",start);
printf("BCD:\t");
printf("%04x,", *(uint *)(start+CPLD_VER_BCD));
printf("\n");
printf("B0 :\t");
printf("%04x,", *(uint *)(start+SEC_CODE_B0));
printf("\n");
printf("B1 :\t");
printf("%04x,", *(uint *)(start+SEC_CODE_B1));
printf("\n");
printf("B2 :\t");
printf("%04x,", *(uint *)(start+SEC_CODE_B2));
printf("\n");
printf("B3 :\t");
printf("%04x,", *(uint *)(start+SEC_CODE_B3));
printf("\n");
if(munmap(start, 0x1000) == -1)
{
printf("munmap error!\n");
return -1;
}
close(map_fd);
return 0;
}
64位報錯
當使用mmap函數在一塊板卡上映射物理地址時,始終報錯。最終發現mmap函數僅支持32位地址。需要使用mmap64來代替mmap函數。其他代碼無需改變。