直接在Android上写入framebuffer [英] Writing to framebuffer directly on Android

查看:761
本文介绍了直接在Android上写入framebuffer的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的手机植根于Android 4.2.2.我想使用使用的minui API(源

I've a rooted phone with Android 4.2.2. I'd like to use minui API used (source here) in bootloader code to draw stuff on the screen. minui is much simpler than native OpenGL and I don't need any complex functionality exposed by OpenGL.

问题是我无法直接将内容写入fb0设备. FBIOPUT_VSCREENINFO由于未知原因失败.

The problem is that I can't write stuff directly to fb0 device. FBIOPUT_VSCREENINFO fails for unknown reason.

如何在Android上直接绘制为fb0,或者如何在引导加载程序模式之外使用minui?

How can I draw directly to fb0 on Android, or how can I use minui outside the bootloader mode?

推荐答案

设备节点:/dev/graphics/fb0

device node:/dev/graphics/fb0

您可以在Android树中进行构建,也可以使用arm-linux-gcc.

you can build in Android tree or use arm-linux-gcc.

arm-linux-gcc -D__ANDROID__ fb-test.c -static

喜欢普通的嵌入式linux,有一个示例:

likes a normal embeded linux, there is a sample:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
struct fb_fix_screeninfo FixedInfo;
struct fb_var_screeninfo OrigVarInfo;
static int FrameBufferFD = -1;
void *FrameBuffer = (void *) -1;

#ifndef __ANDROID__
#define FRAMEBUFFER "/dev/fb0"
#else
#define FRAMEBUFFER "/dev/graphics/fb0"
#endif //__ANDROID__

void openFBDEV(void)
{
    /* open the framebuffer device */
    FrameBufferFD = open(FRAMEBUFFER, O_RDWR);
    if (FrameBufferFD < 0)
    {
        fprintf(stderr, "Error opening %s\n", FRAMEBUFFER);
        exit(1);
    }
    /* Get the fixed screen info */
    if (ioctl(FrameBufferFD, FBIOGET_FSCREENINFO, &FixedInfo))
    {
        fprintf(stderr, "error: ioctl(FBIOGET_FSCREENINFO) failed\n");
        exit(1);
    }
    /* get the variable screen info */
    if (ioctl(FrameBufferFD, FBIOGET_VSCREENINFO, &OrigVarInfo))
    {
        fprintf(stderr, "error: ioctl(FBIOGET_VSCREENINFO) failed\n");
        exit(1);
    }

    if (FixedInfo.visual != FB_VISUAL_TRUECOLOR
            && FixedInfo.visual != FB_VISUAL_DIRECTCOLOR)
    {
        fprintf(stderr,
                "non-TRUE/DIRECT-COLOR visuals (0x%x) not supported by this demo.\n",
                FixedInfo.visual);
        exit(1);
    }
    /*
     * fbdev says the frame buffer is at offset zero, and the mmio region
     * is immediately after.
     */
    /* mmap the framebuffer into our address space */
    FrameBuffer = (void *) mmap(0, /* start */
    FixedInfo.smem_len, /* bytes */
    PROT_READ | PROT_WRITE, /* prot */
    MAP_SHARED, /* flags */
    FrameBufferFD, /* fd */
    0 /* offset */);
    if (FrameBuffer == (void *) -1)
    {
        fprintf(stderr, "error: unable to mmap framebuffer\n");
        exit(1);
    }
}
void closeFBDEV(void)
{
    munmap(FrameBuffer, FixedInfo.smem_len);
    close(FrameBufferFD);
}
int main()
{
    openFBDEV();
    fprintf(stderr, "openFBDEV finish\n");
    memset(FrameBuffer, 128, FixedInfo.smem_len);
    sleep(5);
    closeFBDEV();
    fprintf(stderr, "closeFBDEV finish\n");
    return 0;
}

这篇关于直接在Android上写入framebuffer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆