海小白 2020-04-28 14:17 采纳率: 0%
浏览 609

Android 将数据通过framebuffer显示(root 过的手机设备)

int main2 ()
{
const char *devfile = "/dev/graphics/fb0";
long int screensize = 0;
int fbFd = 0;

/* Open the file for reading and writing */
fbFd = open (devfile, O_RDWR);
LOGI("NativeFramebuffer 2 fbFd = %d",fbFd);
if (fbFd == -1)
{
    perror ("Error: cannot open framebuffer device");
    exit (1);
}

// int b = ioctl (fbFd, FBIOBLANK , &vinfo);//表示调用sep4020fb_blank函数清空液晶屏;
// LOGI("NativeFramebuffer 2 FBIOBLANK = %d ", b);
//获取finfo信息并显示
if (ioctl (fbFd, FBIOGET_FSCREENINFO, &finfo) == -1)
{
perror ("Error reading fixed information");
exit (2);
}

// printFixedInfo ();
//获取vinfo信息并显示
if (ioctl (fbFd, FBIOGET_VSCREENINFO, &vinfo) == -1)
{
perror ("Error reading variable information");
exit (3);
}
// printVariableInfo ();

/* Figure out the size of the screen in bytes */
screensize = finfo.smem_len;//fb的缓存长度

// screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;;
LOGI("NativeFramebuffer 2 vinfo.xoffset = %ld ,yoffset = %d "
",xres_virtual = %d, xres = %d , yres = %d ,yres_virtual = %d",
vinfo.xoffset, vinfo.yoffset,vinfo.xres_virtual,vinfo.xres, vinfo.yres, vinfo.yres_virtual);
LOGI("NativeFramebuffer 2 screensize = %ld",screensize);
LOGI("NativeFramebuffer 2 vinfo.yoffset = %d",vinfo.yoffset);
// if ( toggle ){
// vinfo.yoffset = 1;
// pDstBuf = FB_PAddress+g_u32VpostBufMapSize/2;
// } else {
// vinfo.yoffset = vinfo.yres;
// pDstBuf = FB_PAddress;
// }

// int a = ioctl (fbFd, FBIOPAN_DISPLAY, &vinfo);
// LOGI("NativeFramebuffer 2 FBIOPAN_DISPLAY = %d",a);
/* Map the device to memory */
frameBuffer =(char *) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,fbFd, 0);
if (frameBuffer == MAP_FAILED)
{
perror ("Error: Failed to map framebuffer device to memory");
exit (4);
}
// memset(frameBuffer, 0, screensize);
//drawRect_rgb16 (vinfo.xres *3 / 8, vinfo.yres * 3 / 8,vinfo.xres / 4, vinfo.yres / 4,0xff00ff00);//实现画矩形

drawline_rgb16(50,80,260,0,0xffff0000,0);

drawline_rgb16(160,10,0,180,0xff00ff00,1);//可以画出一个交叉的十字,坐标都是自己设的。
sleep (2);
printf (" Done.\n");

// int a = ioctl (fbFd, FBIOPAN_DISPLAY, &vinfo);
// LOGI("NativeFramebuffer 2 FBIOPAN_DISPLAY = %d ", a);
munmap (frameBuffer, screensize); //解除内存映射,与mmap对应
close (fbFd);
return 0;
}

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2020-09-26 15:58
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除
  • ¥15 使用MATLAB进行余弦相似度计算加速
  • ¥15 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题
  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术
  • ¥15 DockerSwarm跨节点无法访问问题