main.c
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <stdint.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <linux/fb.h> #include <linux/omapfb.h> #include <sys/time.h> #define W 800 #define H 480 #define FB_MAP_SIZE (W * H * 4 * 2) static int fd = -1; static void *pixels = NULL; static int pre_fb(void) { struct omapfb_mem_info mi = { 0 }; struct omapfb_plane_info pi = { 0 }; struct fb_var_screeninfo vinfo = { 0 }; struct fb_fix_screeninfo finfo = { 0 }; fd = open("/dev/fb1", O_RDWR); ioctl(fd, OMAPFB_QUERY_MEM, &mi); ioctl(fd, OMAPFB_QUERY_PLANE, &pi); ioctl(fd, FBIOGET_VSCREENINFO, &vinfo); ioctl(fd, FBIOGET_FSCREENINFO, &finfo); pi.enabled = 0; ioctl(fd, OMAPFB_SETUP_PLANE, &pi); mi.size = FB_MAP_SIZE; ioctl(fd, OMAPFB_SETUP_MEM, &mi); pi.enabled = 1; pi.pos_x = 0; pi.pos_y = 0; pi.out_width = W; pi.out_height = H; ioctl(fd, OMAPFB_SETUP_PLANE, &pi); vinfo.xoffset = 0; vinfo.yoffset = 0; vinfo.xres = W; vinfo.yres = H; vinfo.xres_virtual = W; vinfo.yres_virtual = H * 2; ioctl(fd, FBIOPUT_VSCREENINFO, &vinfo); close(fd); return 0; } static int init_fb(void) { struct omapfb_mem_info mi = { 0 }; struct omapfb_plane_info pi = { 0 }; struct fb_var_screeninfo vinfo = { 0 }; struct fb_fix_screeninfo finfo = { 0 }; fd = open("/dev/fb1", O_RDWR); ioctl(fd, OMAPFB_QUERY_MEM, &mi); ioctl(fd, OMAPFB_QUERY_PLANE, &pi); ioctl(fd, FBIOGET_VSCREENINFO, &vinfo); ioctl(fd, FBIOGET_FSCREENINFO, &finfo); pi.enabled = 0; ioctl(fd, OMAPFB_SETUP_PLANE, &pi); mi.size = FB_MAP_SIZE; ioctl(fd, OMAPFB_SETUP_MEM, &mi); pi.enabled = 1; pi.pos_x = 0; pi.pos_y = 0; pi.out_width = W; pi.out_height = H; ioctl(fd, OMAPFB_SETUP_PLANE, &pi); pixels = mmap(0, FB_MAP_SIZE, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0); vinfo.xoffset = 0; vinfo.yoffset = 0; vinfo.xres = W; vinfo.yres = H; vinfo.xres_virtual = W; vinfo.yres_virtual = H * 2; ioctl(fd, FBIOPUT_VSCREENINFO, &vinfo); return 0; } static void deinit_fb(void) { struct omapfb_mem_info mi = { 0 }; struct omapfb_plane_info pi = { 0 }; ioctl(fd, OMAPFB_QUERY_MEM, &mi); ioctl(fd, OMAPFB_QUERY_PLANE, &pi); pi.enabled = 0; ioctl(fd, OMAPFB_SETUP_PLANE, &pi); munmap(pixels, mi.size); mi.size = 0; ioctl(fd, OMAPFB_SETUP_MEM, &mi); close(fd); } int main(int argc, char *args[]) { int x = 0; int y = 0; int r = 0; int off = 0; int cnt = 600; uint32_t *p = NULL; uint32_t col[] = { 0xff0000, 0xff00, 0xff }; struct fb_var_screeninfo vinfo = { 0 }; pre_fb(); init_fb(); ioctl(fd, FBIOGET_VSCREENINFO, &vinfo); while (cnt--) { p = (uint32_t *)pixels + (W * H * (cnt % 2)); for (y = 0; y < H; y++) { for (x = 0; x < W; x++) { *p++ = col[cnt % 3]; } } vinfo.yoffset = H * (cnt % 2); ioctl(fd, FBIOPAN_DISPLAY, &vinfo); ioctl(fd, FBIO_WAITFORVSYNC, &r); } deinit_fb(); return 0; }