复制代码- #include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/ioctl.h>
- #include <sys/mman.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <string.h>
- #include <linux/fb.h>
-
- /*
- * ---top---
- * fb0 -> win2
- * fb3 -> win0
- * ---bottom---
- */
- #define FBDEV_0 "/dev/fb0"
- #define FBDEV_3 "/dev/fb3"
- #define G2DDEV "/dev/sec-g2d"
-
- /* copy from drivers/media/samsung/g2d/fimg2d_3x.h start */
- #define G2D_MINOR 240
- #define G2D_IOCTL_MAGIC 'G'
- #define G2D_BLIT _IO(G2D_IOCTL_MAGIC, 0)
-
- enum G2D_ROT_DEG {
- G2D_ROT_0 = 0,
- G2D_ROT_90,
- G2D_ROT_180,
- G2D_ROT_270,
- G2D_ROT_X_FLIP,
- G2D_ROT_Y_FLIP
- };
-
- enum G2D_ALPHA_BLENDING_MODE {
- G2D_ALPHA_BLENDING_MIN = 0, /* wholly transparent */
- G2D_ALPHA_BLENDING_MAX = 255, /* 255 */
- G2D_ALPHA_BLENDING_OPAQUE = 256, /* opaque */
- };
-
- enum G2D_COLORKEY_MODE {
- G2D_COLORKEY_NONE = 0,
- G2D_COLORKEY_SRC_ON,
- G2D_COLORKEY_DST_ON,
- G2D_COLORKEY_SRC_DST_ON,
- };
-
- enum G2D_BLUE_SCREEN_MODE {
- G2D_BLUE_SCREEN_NONE = 0,
- G2D_BLUE_SCREEN_TRANSPARENT,
- G2D_BLUE_SCREEN_WITH_COLOR,
- };
-
- enum G2D_ROP_TYPE {
- G2D_ROP_SRC = 0,
- G2D_ROP_DST,
- G2D_ROP_SRC_AND_DST,
- G2D_ROP_SRC_OR_DST,
- G2D_ROP_3RD_OPRND,
- G2D_ROP_SRC_AND_3RD_OPRND,
- G2D_ROP_SRC_OR_3RD_OPRND,
- G2D_ROP_SRC_XOR_3RD_OPRND,
- G2D_ROP_DST_OR_3RD,
- };
- enum G2D_THIRD_OP_MODE {
- G2D_THIRD_OP_NONE = 0,
- G2D_THIRD_OP_PATTERN,
- G2D_THIRD_OP_FG,
- G2D_THIRD_OP_BG
- };
- enum G2D_COLOR_SPACE {
- G2D_RGB_565 = 0,
- G2D_RGBA_8888,
- G2D_ARGB_8888,
- G2D_BGRA_8888,
- G2D_ABGR_8888,
- };
- struct g2d_rect {
- unsigned int x;
- unsigned int y;
- unsigned int w;
- unsigned int h;
- unsigned int full_w;
- unsigned int full_h;
- int color_format;
- unsigned int phys_addr;
- unsigned char *virt_addr;
- };
-
- struct g2d_flag {
- unsigned int rotate_val;
- unsigned int alpha_val;
- unsigned int blue_screen_mode;
- unsigned int color_key_val;
- unsigned int color_val;
- unsigned int third_op_mode;
- unsigned int rop_mode;
- unsigned int mask_mode;
- };
-
- struct g2d_params {
- struct g2d_rect *src_rect;
- struct g2d_rect *dst_rect;
- struct g2d_flag *flag;
- };
- /* copy from drivers/media/samsung/g2d/fimg2d_3x.h end */
-
- int main( int argc, char *argv[] )
- {
- int fd;
- struct fb_var_screeninfo var;
- int blank;
- int x,y;
- int *p;
- int ret;
- struct g2d_rect src_rect;
- struct g2d_rect dst_rect;
- struct g2d_flag flag;
- struct g2d_params params;
-
-
- /* initial */
- blank = FB_BLANK_UNBLANK;
- memset( ¶ms, 0, sizeof( params ) );
-
- /********************************************************
- * Operation on /dev/fb0
- *******************************************************/
- /* open fb0 */
- fd = open( FBDEV_0, O_RDWR );
- if( fd < 0 ){
- printf( "open %s failed\n", FBDEV_0 );
- return;
- }
-
- /* get var-screen-info from fb0 */
- ret = ioctl( fd, FBIOGET_VSCREENINFO, &var );
- if( ret < 0 ){
- printf( "ioctl %s FBIOGET_VSCREENINFO failed\n", FBDEV_0 );
- }
-
- /* set no back-buffer */
- var.activate = FB_ACTIVATE_FORCE;
- var.yres_virtual = var.yres;
-
- /* set fb0 no back-buffer */
- ret = ioctl( fd, FBIOPUT_VSCREENINFO, &var );
- if( ret < 0 ){
- printf( "ioctl %s FBIOPUT_VSCREENINFO failed\n", FBDEV_0 );
- return;
- }
-
- /* map fb0's video buffer */
- p = mmap( NULL, var.xres*var.yres*4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0 );
- if( !p ){
- printf( "mmap %s video buffer failed\n", FBDEV_0 );
- return;
- }
-
- /* draw white screen */
- for( y = 0; y < var.yres; y++ ){
- for( x = 0; x < var.xres; x++ ){
- *( p + y * var.xres + x ) = 0x00FFFFFF; /* alpha: all pass , FFFFFF: white */
- }
- }
-
- /* draw red line 800x100 fb0 */
- for( y = 0; y < 100; y++ ){
- for( x = 0; x < var.xres; x++ ){
- *( p + y * var.xres + x ) = 0x80FF0000; /* alpha : 128 */
- }
- }
- /* draw green line 800x100 fb0 */
- for( y = 100; y < 200; y++ ){
- for( x = 0; x < var.xres; x++ ){
- *( p + y * var.xres + x ) = 0x8000FF00;
- }
- }
- /* draw blue line 800x100 fb0 */
- for( y = 200; y < 300; y++ ){
- for( x = 0; x < var.xres; x++ ){
- *( p + y * var.xres + x ) = 0x800000FF;
- }
- }
-
- /* munmap fb0's video buffer */
- munmap( p, var.xres*var.yres*4 );
-
- /* enable fb0 */
- ret = ioctl( fd, FBIOBLANK, blank );
- if( ret < 0 ){
- printf( "ioctl %s FBIOBLANK failed\n", FBDEV_0 );
- return;
- }
-
- /********************************************************
- * Operation on /dev/fb3
- *******************************************************/
- /* open fb3 */
- fd = open( FBDEV_3, O_RDWR );
- if( fd < 0 ){
- printf( "open %s failed\n", FBDEV_3 );
- return;
- }
-
- /* set fb3 no back-buffer */
- ret = ioctl( fd, FBIOPUT_VSCREENINFO, &var );
- if( ret < 0 ){
- printf( "ioctl %s FBIOPUT_VSCREENINFO failed\n", FBDEV_3 );
- return;
- }
-
- /* map fb3's video buffer */
- p = mmap( NULL, var.xres*var.yres*4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0 );
- if( !p ){
- printf( "mmap %s video buffer failed\n", FBDEV_3 );
- return;
- }
-
- /* draw white screen */
- for( y = 0; y < var.yres; y++ ){
- for( x = 0; x < var.xres; x++ ){
- *( p + y * var.xres + x ) = 0x00FFFFFF;
- }
- }
-
- /* munmap fb0's video buffer */
- munmap( p, var.xres*var.yres*4 );
-
- /* enable fb3 */
- ret = ioctl( fd, FBIOBLANK, blank );
- if( ret < 0 ){
- printf( "ioctl %s FBIOBLANK failed\n", FBDEV_3 );
- return;
- }
-
- /********************************************************
- * Operation on /dev/sec-g2d
- *******************************************************/
- /* open sec-g2d */
- fd = open( G2DDEV, O_RDWR );
- if( fd < 0 ){
- printf( "open %s failed\n", G2DDEV );
- return;
- }
-
- params.src_rect = &src_rect;
- params.dst_rect = &dst_rect;
- params.flag = &flag;
- /* ( 0,0 ) - 480 x 300 */
- params.src_rect->x = 0;
- params.src_rect->y = 0;
- params.src_rect->w = 480;
- params.src_rect->h = 300;
- params.src_rect->full_w = var.xres;
- params.src_rect->full_h = var.yres;
- params.src_rect->color_format = G2D_ARGB_8888;
- params.src_rect->phys_addr = 0x3C795000;
- params.src_rect->virt_addr = NULL;
- /* ( 0,0 ) - 300 x 480 */
- params.dst_rect->x = 0;
- params.dst_rect->y = 0;
- params.dst_rect->w = 300;
- params.dst_rect->h = 480;
- params.dst_rect->full_w = var.xres;
- params.dst_rect->full_h = var.yres;
- params.dst_rect->color_format = G2D_ARGB_8888;
- params.dst_rect->phys_addr = 0x3C330000;
- params.dst_rect->virt_addr = NULL;
- /* rotete 90 degree */
- params.flag->rotate_val = G2D_ROT_90;
- params.flag->alpha_val = G2D_ALPHA_BLENDING_OPAQUE;
- params.flag->blue_screen_mode = G2D_BLUE_SCREEN_NONE;
- params.flag->color_key_val = 0;
- params.flag->color_val = 0;
- params.flag->third_op_mode = G2D_THIRD_OP_NONE;
- params.flag->rop_mode = G2D_ROP_SRC;
- params.flag->mask_mode = 0;
-
- /* 2D hardware blit */
- ret = ioctl( fd, G2D_BLIT, ¶ms );
- if( ret < 0 ){
- printf( "ioctl %s G2D_BLIT failed\n", G2DDEV );
- return;
- }
-
- getchar();
-
- /* all opened fd will be close when process exit */
- return 0;
- }
|