static void *_sys_mmap(k_u64 phys_addr, k_u32 size)
{
void *virt_addr = NULL;
void *mmap_addr = NULL;
k_u32 page_size = sysconf(_SC_PAGESIZE);
k_u64 page_mask = (page_size - 1);
k_u32 mmap_size = ((size) + (phys_addr & page_mask) + page_mask) & ~(page_mask);
if (g_mmap_fd_tmp == 0)
{
g_mmap_fd_tmp = open("/dev/mem", O_RDWR | O_SYNC);
}
mmap_addr = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, g_mmap_fd_tmp, phys_addr & ~page_mask);
if (mmap_addr != (void *)-1)
virt_addr = (void*)((char*)mmap_addr + (phys_addr & page_mask));
else
{
mapi_aenc_error_trace("mmap addr error: %d %s.\n", mmap_addr, strerror(errno));;
}
return virt_addr;
}
static k_s32 _sys_munmap(k_u64 phy_addr, void *virt_addr,k_u32 size)
{
if (g_mmap_fd_tmp == 0)
{
return -1;
}
k_u32 ret;
k_u32 page_size = sysconf(_SC_PAGESIZE);
k_u64 page_mask = page_size - 1;
k_u32 mmap_size = ((size) + (phy_addr & page_mask) + page_mask) & ~(page_mask);
ret = munmap((void *)((k_u64)(virt_addr) & ~page_mask), mmap_size);
if (ret == -1) {
mapi_aenc_error_trace("munmap error.\n");
}
return 0;
}
上述实现:为了达到linux上mmap 起始地址和size都4k对齐。