⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 old_main.c

📁 TI dm6446 video subsytem window blending programme
💻 C
字号:
/*
 *  A framebuffer test for davinci video fb device.
 *
 *  Mon Jul 10 13:57:42 CST 2006  
 *  Author Yang Yong, mailto <yongyoung.yang@ge.com>
 * 
 *  VID0  - 16bits, TRIPLE_BUF        [full screen]
 *  VID1  - 16bits, TRIPLE_BUF        [bottom right]
 *  OSD0 - 16bits, DOUBLE_BUF      [top         left]
 *  OSD1 -  4bits,  DOUBLE_BUF      [full screen]        <attribute>
 *
 *  fb0: dm_osd0_fb frame buffer device
 *  fb1: dm_vid0_fb frame buffer device
 *  fb2: dm_osd1_fb frame buffer device
 *  fb3: dm_vid1_fb frame buffer device
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <asm/page.h>

#include "fbtools.h"

#define TRUE 	1
#define FALSE	0
#define MAX(x,y)        ((x)>(y)?(x):(y))
#define MIN(x,y)        ((x)<(y)?(x):(y))

struct Zoom_Params
{
	u_int32_t WindowID;
	u_int32_t Zoom_H;
	u_int32_t Zoom_V;
};
#define FBIO_SETZOOM _IOW('F', 0x24, struct Zoom_Params)
#define WIN_NUM 0 //VID0
struct Zoom_Params zoom_setting = {WIN_NUM, 1, 1};

int Zoom_window(PFBDEV pFbdev)
{
    if (-1 == ioctl(pFbdev->fb,FBIO_SETZOOM,&zoom_setting))
    {
        printf("ioctl FBIO_SETZOOM\n");
        return FALSE;
    }
	return TRUE; 
}

#define FBIO_SETPOSX _IOW('F', 0x22, u_int32_t)
#define FBIO_SETPOSY _IOW('F', 0x23, u_int32_t)

int set_pos_x(PFBDEV pFbdev, int x)
{
	int xpos_ = x;
    if (-1 == ioctl(pFbdev->fb,FBIO_SETPOSX,xpos_))
    {
        printf("ioctl FBIO_SETPOSX failed\n");
        return FALSE;
    }
    return TRUE;
}

int set_pos_y(PFBDEV pFbdev, int y)
{
    int ypos_ = y;
    if (-1 == ioctl(pFbdev->fb,FBIO_SETPOSY,ypos_))
    {
        printf("ioctl FBIO_SETPOSY failed\n");
        return FALSE;
    }
    return TRUE;
}

//open & init a frame buffer
int fb_open(PFBDEV pFbdev)
{
	pFbdev->fb = open(pFbdev->dev, O_RDWR);
	if(pFbdev->fb < 0)
	{
		printf("Error opening %s: %m. Check kernel config\n", pFbdev->dev);
		return FALSE;
	}
	if (-1 == ioctl(pFbdev->fb,FBIOGET_VSCREENINFO,&(pFbdev->fb_var)))
	{
		printf("ioctl FBIOGET_VSCREENINFO\n");
		return FALSE;
	}
	
	if (-1 == ioctl(pFbdev->fb,FBIOGET_FSCREENINFO,&(pFbdev->fb_fix)))
	{
		printf("ioctl FBIOGET_FSCREENINFO\n");
		return FALSE;
	}

	//map physics address to virtual address
	printf("FIX: smem_strat=0x%x, len=0x%x\n", pFbdev->fb_fix.smem_start,pFbdev->fb_fix.smem_len);
	pFbdev->fb_mem_offset = (unsigned long)(pFbdev->fb_fix.smem_start) & (~PAGE_MASK);
	pFbdev->fb_mem = (unsigned long int)mmap(NULL, 
  	                  pFbdev->fb_fix.smem_len + pFbdev->fb_mem_offset,
		              PROT_READ | PROT_WRITE, MAP_SHARED, pFbdev->fb, 0);
	if (-1L == (long) pFbdev->fb_mem) 
	{
		printf("mmap error! mem:0x%x offset:0x%x\n", (unsigned int)pFbdev->fb_mem, 
			   (unsigned int)pFbdev->fb_mem_offset);
		return FALSE;
	}
	
	return TRUE;
}

//close frame buffer
int fb_close(PFBDEV pFbdev)
{
	close(pFbdev->fb);
	pFbdev->fb=-1;
	return 0;
}

//get display depth
int get_display_depth(PFBDEV pFbdev)
{
	if(pFbdev->fb<=0)
	{
		printf("fb device not open, open it first\n");
		return FALSE;
	}
	return pFbdev->fb_var.bits_per_pixel;
}

//full screen clear
void fb_memset (void *addr, int c, size_t len)
{
    memset(addr, c, len);
}

//use by test
//./fbtest /dev/fb/0 A +
#define FB_SCOPE_0 'A'
#define FB_SCOPE_1 'B'
#define FB_SCOPE_2 'C'
#define FB_SCOPE_3 'D'

#define X_RES 720
#define Y_RES 480
#define bits_per_pixel 16
#define REAL_FB_SIZE (X_RES * Y_RES / 8 * bits_per_pixel)

int main(int argc, char *argv[])
{
	FBDEV fbdev;
	int zoom_factor = 1;

	int maskval = 0;
	char fb_scope = 'a';
	char *fb_name = NULL;

    memset(&fbdev, 0, sizeof(FBDEV));

	if(argc == 4)
	{	
		fb_name = argv[1];
		printf("fb_name = %s\n", fb_name);

        fb_scope = (argv[2])[0]; // A B C D
        printf("fb_scope = %c.\n", fb_scope);

		maskval = (argv[3])[0];
		printf("mask value = %c\n", maskval);
		if(maskval == '0')
			maskval = 0;
		else if(maskval == '9')
			maskval = 255;
	}	
		 
	strcpy(fbdev.dev, fb_name);
	
	if(fb_open(&fbdev)==FALSE)
	{
		printf("open frame buffer error\n");
		return 0;
	}
	printf("open dev %s successfully.\n", fb_name);

	if(0)
	{
		Zoom_window(&fbdev);
		zoom_factor = (1 << zoom_setting.Zoom_H) * (1 << zoom_setting.Zoom_V);
		if(zoom_factor == 0)
			zoom_factor = 1;

		printf("zoom_factor = %d\n", zoom_factor);
	}

	if(0)
	{
		set_pos_x(&fbdev, 50);
		//set_pos_y(&fbdev, 50);
	}

	{
		unsigned long fb_memlen_4 = REAL_FB_SIZE / 4 / zoom_factor;
		int fb_scope_index = fb_scope - FB_SCOPE_0;
		fb_memset((char *)fbdev.fb_mem + fbdev.fb_mem_offset + fb_scope_index * fb_memlen_4,
				  maskval, fb_memlen_4);
	}

	printf("Closing dev %s, please wait...\n\n", fb_name);
	fb_close(&fbdev);
	
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -