代码
在某些特殊情况下,我们只是想要读取某个寄存器的值或者某个地址的值,不需要去专门写一个驱动模块来实现,可以使用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函数。其他代码无需改变。