📄 old_main.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 + -