#include <stdint.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <errno.h>
#include <string.h>
#include <sys/fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdint.h>
#define DEV_FB0 "/dev/fb0"
static void *mem_fb = NULL;
static int fb_map(int fd, size_t smem_len_old, size_t smem_len_new)
{
if(mem_fb != NULL)
{
munmap(mem_fb, smem_len_old);
mem_fb = NULL;
}
mem_fb = mmap(NULL, smem_len_new, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, fd, 0);
if (mem_fb == MAP_FAILED)
{
printf("[%s][%s][%d]mmap failed:%s\n", __FILE__, __FUNCTION__, __LINE__, strerror(errno));
return -1;
}
return fd;
}
#define LCD_WIDTH(vi) (vi.xres)
#define LCD_HEIGHT(vi) (vi.yres)
#define LCD_BPP(vi) (vi.bits_per_pixel)
#define LCD_SIZE(vi) (vi.xres * vi.yres * vi.bits_per_pixel/8)
int main(int argc, char *argv[])
{
int err, seg_len, seg_num, tmp_seg_len;
int x,y,fb0, location;
struct fb_var_screeninfo vinfo;
uint8_t r, g, b;
uint16_t rgb;
printf("Begin the OSD test!\n");
fb0 = open(DEV_FB0, O_RDWR);
if(fb0 < 0)
{
printf("open fb0 err!\n");
return -1;
}
err = ioctl(fb0, FBIOGET_VSCREENINFO, &vinfo);
if(err < 0) printf("ioctl get fb0 var err =%d",err);
fb_map(fb0, 0, LCD_SIZE(vinfo));
seg_len = vinfo.yres/6;
#if 1
seg_len = vinfo.yres/6;
for (seg_num = 0; seg_num < 6; seg_num++)
{
if (seg_num == 5)
{
tmp_seg_len = vinfo.yres - seg_len*5;
}
else
{
tmp_seg_len = seg_len;
}
for (y = 0; y < tmp_seg_len; y++)
{
for (x = 0; x < vinfo.xres; x++)
{
location = seg_num*seg_len*vinfo.xres*2 + (y*vinfo.xres+ x)*2;
switch (seg_num)
{
case 0:
r = 0xff;
g = (0xff/seg_len)*y;
b = 0;
break;
case 1:
r = (0xff/seg_len)*(seg_len-y);
g = 0xff;
b = 0;
break;
case 2:
r = 0;
g = 0xff;
b = (0xff/seg_len)*y;
break;
case 3:
r = 0;
g = (0xff/seg_len)*(seg_len-y);
b = 0xff;
break;
case 4:
r = (0xff/seg_len)*y;
g = 0;
b = 0xff;
break;
case 5:
r = 0xff;
b = (0xff/seg_len)*(seg_len-y);
g = 0;
break;
default:
printf("%s--%d:unknown seg_num %d\n", __FILE__, __LINE__);
break;
}
r = (r*0x1f)/0xff;
g = (g*0x3f)/0xff;
b = (b*0x1f)/0xff;
rgb = (r << 11) | (g << 5) | b;
*((unsigned short*)(mem_fb + location)) = rgb;
}
}
}
sleep(2);
seg_len = vinfo.yres/6;
for (seg_num = 0; seg_num < 6; seg_num++)
{
if (seg_num == 5)
{
tmp_seg_len = vinfo.yres - seg_len*5;
}
else
{
tmp_seg_len = seg_len;
}
for (y = 0; y < tmp_seg_len; y++)
{
for (x = 0; x < vinfo.xres; x++)
{
location = seg_num*seg_len*vinfo.xres*2 + (y*vinfo.xres+ x)*2;
switch (seg_num)
{
case 0://grey
r = 100;
g = 100;
b = 100;
break;
case 1: //black
r = 0x00;
g = 0x00;
b = 0x00;
break;
case 2://white
r = 0xff;
g = 0xff;
b = 0xff;
break;
case 3://red
r = 0xff;
g = 0;
b = 0;
break;
case 4: //green
r = 0;
g = 0xff;
b = 0;
break;
case 5: //blue
r = 0;
g = 0;
b = 0xff;
break;
default:
printf("%s--%d:unknown seg_num %d\n", __FILE__, __LINE__);
break;
}
r = (r*0x1f)/0xff;
g = (g*0x3f)/0xff;
b = (b*0x1f)/0xff;
rgb = (r << 11) | (g << 5) | b;
*((unsigned short*)(mem_fb + location)) = rgb;
}
}
}
#endif
#if 1
sleep(2);
seg_len = vinfo.xres/6;
for (seg_num = 0; seg_num < 6; seg_num++)
{
if (seg_num == 5)
{
tmp_seg_len = vinfo.xres - seg_len*5;
}
else
{
tmp_seg_len = seg_len;
}
for (x = 0; x < tmp_seg_len; x++)
{
for (y = 0; y < vinfo.yres; y++)
{
location = y*vinfo.xres*2 + (seg_num*seg_len + x)*2;
switch (seg_num)
{
case 0:
r = 0xff;
g = (0xff/seg_len)*x;
b = 0;
break;
case 1:
r = (0xff/seg_len)*(seg_len-x);
g = 0xff;
b = 0;
break;
case 2:
r = 0;
g = 0xff;
b = (0xff/seg_len)*x;
break;
case 3:
r = 0;
g = (0xff/seg_len)*(seg_len-x);
b = 0xff;
break;
case 4:
r = (0xff/seg_len)*x;
g = 0;
b = 0xff;
break;
case 5:
r = 0xff;
g = 0;
b = (0xff/seg_len)*(seg_len-x);
break;
default:
printf("%s--%d:unknown seg_num %d\n", __FILE__, __LINE__);
break;
}
r = (r*0x1f)/0xff;
g = (g*0x3f)/0xff;
b = (b*0x1f)/0xff;
rgb = (r << 11) | (g << 5) | b;
*((unsigned short*)(mem_fb + location)) = rgb;
}
}
}
sleep(2);
seg_len = vinfo.xres/6;
/* white black gray red green blue */
for (seg_num = 0; seg_num < 6; seg_num++)
{
if (seg_num == 5)
{
tmp_seg_len = vinfo.xres - seg_len*5;
}
else
{
tmp_seg_len = seg_len;
}
for (x = 0; x < tmp_seg_len; x++)
{
for (y = 0; y < vinfo.yres; y++)
{
location = y*vinfo.xres*2 + (seg_num*seg_len + x)*2;
switch (seg_num) {
case 0://grey
r = 100;
g = 100;
b = 100;
break;
case 1://black
r = 0;
g = 0;
b = 0;
break;
case 2: //white
r = 0xff;
g = 0xff;
b = 0xff;
break;
case 3://red
r = 0xff;
g = 0;
b = 0;
break;
case 4: //green
r = 0;
g = 0xff;
b = 0;
break;
case 5: //blue
r = 0;
g = 0;
b = 0xff;
break;
default:
printf("%s--%d:unknown seg_num %d\n", __FILE__, __LINE__);
break;
}
r = (r*0x1f)/0xff;
g = (g*0x3f)/0xff;
b = (b*0x1f)/0xff;
rgb = (r << 11) | (g << 5) | b;
*((unsigned short*)(mem_fb + location)) = rgb;
}
}
}
#endif
close(fb0);
return 0;
}