当前位置:网站首页>【基于富瀚6630使用/dev/fb0显示设备和TDE模块渲染bmp图像】
【基于富瀚6630使用/dev/fb0显示设备和TDE模块渲染bmp图像】
2022-08-09 04:53:00 【I&You】
基于富瀚6630使用/dev/fb0显示设备和TDE模块渲染bmp图像
- 主要流程
- FY_MPI_VO_GetVideoLayerAttr(SAMPLE_VO_LAYER_VHD0, &stLayerAttr)获取视频层信息
- FY_MPI_SYS_MmzAlloc(&(g_stBackGround.u32PhyAddr), ((void**)&g_pu8BackGroundVir), "ui_bg", NULL, BACKGROUNGD_WIDTH*BACKGROUNGD_HEIGHT*byteDep)申请MMZ缓存
- ioctl(fd, FBIOPUT_SHOW_FYFB, &bShow)关闭显示
- ioctl(fd, FBIOPUT_COMPRESSION_FYFB, &bCompress)关闭图片压缩功能
- ioctl(fd, FBIOGET_VSCREENINFO, &var)获取屏幕信息
- ioctl(fd, FBIOPUT_VSCREENINFO, &var)设置屏幕属性
- ioctl(fd, FBIOGET_FSCREENINFO, &fix)获取屏幕起始帧缓冲内存物理地址
- ioctl(fd, FBIOPUT_SHOW_FYFB, &bShow)使能设备开启显示
- mmap(NULL, stFixInfo.smem_len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)//内存映射
- ioctl(fd, FBIOPUT_ALPHA_FYFB, &stAlpha)//设置叠加层的不透明度
- FY_TDE2_Open()//打开TDE设备
- TDE_CreateSurfaceFromFile(pszBgNames[i++], &g_stBackGround, g_pu8BackGroundVir)//读取bmp图片数据
- TDE_DrawUiBySize//开始渲染bmp图片
- 代码
- 源码下载
主要流程
FY_MPI_VO_GetVideoLayerAttr(SAMPLE_VO_LAYER_VHD0, &stLayerAttr)获取视频层信息
FY_MPI_SYS_MmzAlloc(&(g_stBackGround.u32PhyAddr), ((void**)&g_pu8BackGroundVir), “ui_bg”, NULL, BACKGROUNGD_WIDTHBACKGROUNGD_HEIGHTbyteDep)申请MMZ缓存
ioctl(fd, FBIOPUT_SHOW_FYFB, &bShow)关闭显示
ioctl(fd, FBIOPUT_COMPRESSION_FYFB, &bCompress)关闭图片压缩功能
ioctl(fd, FBIOGET_VSCREENINFO, &var)获取屏幕信息
ioctl(fd, FBIOPUT_VSCREENINFO, &var)设置屏幕属性
ioctl(fd, FBIOGET_FSCREENINFO, &fix)获取屏幕起始帧缓冲内存物理地址
ioctl(fd, FBIOPUT_SHOW_FYFB, &bShow)使能设备开启显示
mmap(NULL, stFixInfo.smem_len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)//内存映射
ioctl(fd, FBIOPUT_ALPHA_FYFB, &stAlpha)//设置叠加层的不透明度
FY_TDE2_Open()//打开TDE设备
TDE_CreateSurfaceFromFile(pszBgNames[i++], &g_stBackGround, g_pu8BackGroundVir)//读取bmp图片数据
TDE_DrawUiBySize//开始渲染bmp图片
代码
s32Ret = FY_MPI_VO_GetVideoLayerAttr(SAMPLE_VO_LAYER_VHD0, &stLayerAttr);
if(s32Ret)
{
printf("failed to get vo layer(%d) info!\n", SAMPLE_VO_LAYER_VHD0);
return FY_NULL;
}
fd = open("/dev/fb0", O_RDWR, 0);
if(fd < 0)
{
printf("open /dev/fb0 failed!\n");
return FY_NULL;
}
bComSupport = FY_TRUE;
prctl(PR_SET_NAME, "UI_HD");
screanWidth = stLayerAttr.stImageSize.u32Width;
screanHeight = stLayerAttr.stImageSize.u32Height;
//在用户态申请 MMZ 内存。。
if (FY_FAILURE == FY_MPI_SYS_MmzAlloc(&(g_stBackGround.u32PhyAddr), ((void**)&g_pu8BackGroundVir), "ui_bg", NULL, BACKGROUNGD_WIDTH*BACKGROUNGD_HEIGHT*byteDep))
{
printf("allocate memory 0 (%d bytes) failed\n", BACKGROUNGD_WIDTH*BACKGROUNGD_HEIGHT*byteDep);
goto exitFb;
}
//把缓存置零清除一下数据
memset(g_pu8BackGroundVir, 0x00, BACKGROUNGD_WIDTH*BACKGROUNGD_HEIGHT*byteDep);
bShow = FY_FALSE;
if (ioctl(fd, FBIOPUT_SHOW_FYFB, &bShow) < 0)
{
SAMPLE_PRT("FBIOPUT_SHOW_FYFB failed!\n");
goto exitMmz;
}
if(bComSupport){
bCompress = FY_FALSE;
if (ioctl(fd, FBIOPUT_COMPRESSION_FYFB, &bCompress) < 0)//是否启动图层压缩功能
{
printf(" FBIOPUT_COMPRESSION_FYFB failed!\n");
goto exitMap;
}
}
/* get the variable screen info */
if (ioctl(fd, FBIOGET_VSCREENINFO, &stVarInfo) < 0)
{
printf("Get variable screen info failed!\n");
goto exitMmz;
}
stVarInfo.xres_virtual = ALIGN_UP(screanWidth, 8);//虚拟屏幕一行有多少个像素点
stVarInfo.yres_virtual = screanHeight;//虚拟屏幕一列有多少个像素点
stVarInfo.xres = ALIGN_UP(screanWidth, 8);//定义屏幕一行有多少个像素点
stVarInfo.yres = screanHeight;//定义屏幕一列有多少个像素点
stVarInfo.activate = FB_ACTIVATE_NOW;
stVarInfo.bits_per_pixel = bitDep; //每个像素多少字节
stVarInfo.xoffset = 0;
stVarInfo.yoffset = 0;
stVarInfo.red = s_red;
stVarInfo.green = s_gre;
stVarInfo.blue = s_blu;
stVarInfo.transp = s_alp;
if (ioctl(fd, FBIOPUT_VSCREENINFO, &stVarInfo) < 0)
{
printf("process frame buffer device error\n");
goto exitMmz;
}
if (ioctl(fd, FBIOGET_FSCREENINFO, &stFixInfo) < 0)
{
printf("process frame buffer device error\n");
goto exitMmz;
}
//获取fb缓冲内存的开始地址(物理地址)
u32PhyAddr = stFixInfo.smem_start;
//用mmap映射出fb缓存的虚拟地址
//smem_len----fb缓冲的长度
pShowScreen = mmap(NULL, stFixInfo.smem_len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if (NULL == pShowScreen)
{
printf("mmap fb0 failed!\n");
goto exitMmz;
}
memset(pShowScreen, 0x00, stFixInfo.smem_len);//清理fb缓存、因为物理地址不能直接操作需要mmap一下
g_stScreen.enColorFmt = COLOR_FORMAT;//颜色的格式 这里是RGB1555
g_stScreen.u32PhyAddr = u32PhyAddr;//fb缓冲内存的开始地址(物理地址)
g_stScreen.u32Width = screanWidth;//位图宽度
g_stScreen.u32Height = screanHeight;//位图高度
g_stScreen.u32Stride = stFixInfo.line_length;//一行的字节长度
g_stScreen.bAlphaMax255 = FY_TRUE;//不透明度
g_stScreen.bAlphaExt1555 = FY_TRUE;//不透明度
g_stScreen.u8Alpha0 = 0;//不透明度
g_stScreen.u8Alpha1 = 255;//不透明度
bShow = FY_TRUE;
if (ioctl(fd, FBIOPUT_SHOW_FYFB, &bShow) < 0)
{
printf("FBIOPUT_SHOW_FYFB failed!\n");
goto exitMap;
}
stAlpha.bAlphaChannel = FY_TRUE;
stAlpha.bAlphaEnable = FY_TRUE;
stAlpha.u8Alpha0 = 0;
stAlpha.u8Alpha1 = 255;
stAlpha.u8GlobalAlpha = 128;
if (ioctl(fd, FBIOPUT_ALPHA_FYFB, &stAlpha) < 0)
{
printf("Put alpha info failed!\n");
goto exitMap;
}
//打开 TDE 设备
s32Ret = FY_TDE2_Open();
if(s32Ret)
{
printf("Open tde failed!\n");
ui_state = FY_FAILURE;
goto exitMap;
}
if(ui_mode == 0){
num_color = (FY_S32)((sizeof (pszBgNames) / sizeof (pszBgNames[0])));
}else{
num_color = 1;
pszBgNames[0] = pColorNames;
printf("UI open file named %s\n", pszBgNames[0]);
}
i = 0;
TDE_CreateSurfaceFromFile(pszBgNames[i++], &g_stBackGround, g_pu8BackGroundVir);
//设置g_stBackGround 图片的宽高还有1像素所占的字节
//把图片数据读到g_pu8BackGroundVir MMZ虚拟地址上
if(i > num_color - 1)
i = 0;
//g_stScreen有fb缓冲内存的开始地址(物理地址)
//g_stBackGround有mmz的物理地址
s32Ret = TDE_DrawUiBySize(fd, &g_stScreen, &g_stBackGround, 0, &stVarInfo);
if(s32Ret)
printf("draw globle UI failed!\n");
源码下载
边栏推荐
- php uses phpoffice/phpspreadsheet to import and export excel tables
- y91.第六章 微服务、服务网格及Envoy实战 -- 服务网格基础(二)
- 还不了解什么是商业智能(BI)?看完这篇文章就懂了
- Dingding conflicts with RStudio shortcuts--Dingding shortcut settings
- 供应商对接Chewy的EDI需求
- 【Harmony OS】【FAQ】鸿蒙问题合集1
- 基于ABP和Magicodes实现Excel导出操作
- Masked AutoEncoder论文及实现
- 杰理之开关降噪语音识别没有用【篇】
- Efficient review of deep learning DL, CV, NLP
猜你喜欢
TCP/IP协议中分包与重组原理介绍、分片偏移量的计算方法、IPv4报文格式
2022下半年深圳信息系统项目管理师认证招生简章
Introduction to JVM garbage collection mechanism
【HMS core】【Ads Kit】Huawei Advertising——Overseas applications are tested in China. Official advertisements cannot be displayed
单元测试覆盖率怎么算?
[OpenCV] - Find and draw contours
软件测试的发展趋势
存储系统架构演变
Ali YunTianChi competition problem (machine learning) - O2O coupons prediction (complete code)
ABP 6.0.0-rc.1的新特性
随机推荐
`英语` 2022/8/8
全栈代码测试覆盖率及用例发现系统的建设和实践
Disappearance of heritability - wiki
Correct use of BaseDexClassLoader
杰理之播放最大音量提示音播不出来【篇】
【MLT】MLT多媒体框架生产消费架构解析(二)
程序设计6大原则
JS-DOM-全局、局部、隐式变量,数组()\函数、 prompt输入对话框、confirm(确定用户的决定-弹出对话框)
算法---优美的排列(Kotlin)
杰理之开关降噪语音识别没有用【篇】
C进阶-C语言文件操作
【Harmony OS】【ARK UI】ETS 上下文基本操作
B. Arrays Sum
How to trim svg and compress
【暑期每日一题】洛谷 P5729 【深基5.例7】工艺品制作
perl基础语法归纳
[OpenCV] - Find and draw contours
2022年8月深圳产品经理认证招生简章(NPDP)
【UNR #6 A】面基之路(最短路)
The influence law of genes for disease - read the paper