Tool/software: Linux
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <cmem.h>
#define BUF_WIDTH (1280)
#define BUF_HEIGHT (720)
typedef struct _cmem_info {
off_t phy_addr;
void * vaddr;
int fd;
}cmeminfo;
int cmem_use(int bpp,cmeminfo *info)
{
int ret_val = 0;
assert(info);
printf("CMEM_allocPhys2 begin...\n");
CMEM_AllocParams params;
params.type = CMEM_HEAP;
params.alignment = 0;
params.flags = CMEM_CACHED;
info->phy_addr = CMEM_allocPhys2(CMEM_CMABLOCKID, BUF_WIDTH * BUF_HEIGHT * bpp / 8, ¶ms);
if(((void *)(info->phy_addr)) == NULL ) {
printf("blind area CMEM_allocPhys2 fail,info->phy_addr 0x%x \n",info->phy_addr);
ret_val = -1;
goto end;
}
printf("blind area pa 0x%x \n",info->phy_addr);
info->vaddr = CMEM_map(info->phy_addr, BUF_WIDTH*BUF_HEIGHT*bpp/8);
if(info->vaddr == NULL) {
printf("blind area CMEM_map fail \n");
ret_val = -2;
goto end;
}
printf("blind area vaddr 0x%x \n",info->vaddr);
info->fd = CMEM_export_dmabuf(info->vaddr);
if(info->fd <= 0) {
printf("blind area CMEM_export_dmabuf fail \n");
ret_val = -3;
goto end;
}
printf("CMEM_allocPhys2 end...\n");
end:
return ret_val;
}
int cmem_free(int bpp,cmeminfo *info)
{
int ret = 0;
assert(info);
CMEM_AllocParams params;
params.type = CMEM_HEAP;
params.alignment = 0;
params.flags = CMEM_CACHED;
ret = CMEM_unmap(info->vaddr,BUF_WIDTH * BUF_HEIGHT * bpp / 8);
if(ret != 0) {
printf("blind area CMEM_unmap fail,ret = %d\n",ret);
goto end;
}
ret = CMEM_freePhys(info->phy_addr,¶ms);
if(ret != 0) {
printf("blind area CMEM_freePhys fail,ret = %d\n",ret);
goto end;
}
end:
return ret;
}
int main(int argc,char *argv[])
{
printf("%s build %s %s\n",argv[0],__DATE__,__TIME__);
int ret = 0;
cmeminfo info;
memset(&info,0,sizeof(info));
/**
* cmem init
*/
ret = CMEM_init();
if (ret != 0 ){
printf("CMEM_init failed , ret : %d \n",ret);
}
ret = cmem_use(24,&info);
if (ret != 0 ){
printf("cmem_use failed , ret : %d \n",ret);
}
ret = cmem_free(24,&info);
if (ret != 0 ){
printf("cmem_use failed , ret : %d \n",ret);
}
/**
* cmem exit
*/
ret = CMEM_exit();
if (ret != 0 ){
printf("CMEM_exit failed , ret : %d \n",ret);
}
return ret;
}
run error log:
6601.88> ./cmem_test build Aug 6 2018 16:02:40
6601.88> CMEM_allocPhys2 begin...
6601.88> blind area pa 0xbbe00000 [ 1914.639501] CMEMK Error: Failed to free memory at 0xbe86dc08bbe00000
6601.88>
6601.88> blind area vaddr 0xb6bba000
6601.88> CMEM_allocPhys2 end...
6601.90> MCEM Erro: freePhys: Failed to free buffer at physical address 0xffffffffbbe00000
6601.90> blind area CMEM_freePhys fail,ret = -1
6601.90> cmem_use failed , ret : -1