当前位置:网站首页>【基于富瀚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");
源码下载
边栏推荐
- Pycharm社区版专业版下载安装环境配置【精细到每一个步骤】
- 在快手工作是一种什么体验
- MySQL: redo log log - notes for personal use
- 2022年8月深圳产品经理认证招生简章(NPDP)
- equals and ==
- The influence law of genes for disease - read the paper
- Introduction to JVM garbage collection mechanism
- Masked AutoEncoder论文及实现
- Improve the user experience and add a small detail to your modal popup
- Harmony OS ets ArkUI 】 【 】 the development basic page layout and data connection
猜你喜欢
How to trim svg and compress
y91.第六章 微服务、服务网格及Envoy实战 -- 服务网格基础(二)
Ali YunTianChi competition problem (machine learning) - O2O coupons prediction (complete code)
[MLT] Analysis of MLT Multimedia Framework Production and Consumption Architecture (2)
安装pytorch和cuda
【Harmony OS】【ArkUI】ets开发 基础页面布局与数据连接
【Harmony OS】【ArkUI】ets开发 图形与动画绘制
【Harmony OS】【ARK UI】轻量级数据存储
必须指定GDAL API版本。提供一个路径使用GDAL_CONFIG gdal-config环境
equals and ==
随机推荐
【暑期每日一题】洛谷 P5724 【深基4.习5】求极差 / 最大跨度值
存储系统架构演变
时序约束基础
2022-08-07 反思
杰理之采用mix out eq 没有作用【篇】
【暑期每日一题】洛谷 P8086 『JROI-5』Music
Construction and practice of full stack code test coverage and use case discovery system
区别如下概念:路径、绝对路径、相对路径、当前目录。系统磁盘上存在某个可执行文件,但在DOS环境输入其文件名却提示没有这个文件,是什么原因?
Efficient review of deep learning DL, CV, NLP
LeetCode - remove consecutive nodes with a sum of zero from a linked list
【HMS Core】【FAQ】【AR Engine】AR Engine FAQ
稳定性测试怎么做,这篇文章彻底讲透了!
Introduction to JVM garbage collection mechanism
供应商对接Chewy的EDI需求
TASSEL software imports plink format file error
杰理之播放最大音量提示音播不出来【篇】
无法通过头文件中的宏定义或全局变量修改动态库中的参数
y91.第六章 微服务、服务网格及Envoy实战 -- 服务网格基础(二)
【Harmony OS】【ARK UI】Date 基本操作
2022年8月深圳产品经理认证招生简章(NPDP)