My c code is as follow, I want to use FB device to display something:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <linux/kd.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <string.h>
#include <errno.h>
#include "omapfb.h"
#include "ti81xxfb.h"
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
char *frameBuffer = 0;
//打印fb驱动中fix结构信息,注:在fb驱动加载后,fix结构不可被修改。
void printFixedInfo ()
{
printf ("Fixed screen info:\n"
"\tid: %s\n"
"\tsmem_start:0x%lx\n"
"\tsmem_len:%d\n"
"\ttype:%d\n"
"\ttype_aux:%d\n"
"\tvisual:%d\n"
"\txpanstep:%d\n"
"\typanstep:%d\n"
"\tywrapstep:%d\n"
"\tline_length: %d\n"
"\tmmio_start:0x%lx\n"
"\tmmio_len:%d\n"
"\taccel:%d\n"
"\n",
finfo.id, finfo.smem_start, finfo.smem_len, finfo.type,
finfo.type_aux, finfo.visual, finfo.xpanstep, finfo.ypanstep,
finfo.ywrapstep, finfo.line_length, finfo.mmio_start,
finfo.mmio_len, finfo.accel);
}
//打印fb驱动中var结构信息,注:fb驱动加载后,var结构可根据实际需要被重置
void printVariableInfo ()
{
printf ("Variable screen info:\n"
"\txres:%d\n"
"\tyres:%d\n"
"\txres_virtual:%d\n"
"\tyres_virtual:%d\n"
"\tyoffset:%d\n"
"\txoffset:%d\n"
"\tbits_per_pixel:%d\n"
"\tgrayscale:%d\n"
"\tred: offset:%2d, length: %2d, msb_right: %2d\n"
"\tgreen: offset:%2d, length: %2d, msb_right: %2d\n"
"\tblue: offset:%2d, length: %2d, msb_right: %2d\n"
"\ttransp: offset:%2d, length: %2d, msb_right: %2d\n"
"\tnonstd:%d\n"
"\tactivate:%d\n"
"\theight:%d\n"
"\twidth:%d\n"
"\taccel_flags:0x%x\n"
"\tpixclock:%d\n"
"\tleft_margin:%d\n"
"\tright_margin: %d\n"
"\tupper_margin:%d\n"
"\tlower_margin:%d\n"
"\thsync_len:%d\n"
"\tvsync_len:%d\n"
"\tsync:%d\n"
"\tvmode:%d\n"
"\n",
vinfo.xres, vinfo.yres, vinfo.xres_virtual, vinfo.yres_virtual,
vinfo.xoffset, vinfo.yoffset, vinfo.bits_per_pixel,
vinfo.grayscale, vinfo.red.offset, vinfo.red.length,
vinfo.red.msb_right,vinfo.green.offset, vinfo.green.length,
vinfo.green.msb_right, vinfo.blue.offset, vinfo.blue.length,
vinfo.blue.msb_right, vinfo.transp.offset, vinfo.transp.length,
vinfo.transp.msb_right, vinfo.nonstd, vinfo.activate,
vinfo.height, vinfo.width, vinfo.accel_flags, vinfo.pixclock,
vinfo.left_margin, vinfo.right_margin, vinfo.upper_margin,
vinfo.lower_margin, vinfo.hsync_len, vinfo.vsync_len,
vinfo.sync, vinfo.vmode);
}
//画大小为width*height的同色矩阵,8alpha+8reds+8greens+8blues
void drawRect_rgb32 (int x0, int y0, int width,int height, int color)
{
const int bytesPerPixel = 4;
const int stride = finfo.line_length / bytesPerPixel;
int *dest = (int *) (frameBuffer)
+ (y0 + vinfo.yoffset) * stride + (x0 + vinfo.xoffset);
int x, y;
for (y = 0; y < height; ++y)
{
for (x = 0; x < width; ++x)
{
dest[x] = color;
}
dest += stride;
}
}
//画大小为width*height的同色矩阵,5reds+6greens+5blues
void drawRect_rgb16 (int x0, int y0, int width,int height, int color)
{
const int bytesPerPixel = 2;
const int stride = finfo.line_length / bytesPerPixel;
const int red = (color & 0xff0000) >> (16 + 3);
const int green = (color & 0xff00) >> (8 + 2);
const int blue = (color & 0xff) >> 3;
const short color16 = blue | (green << 5) | (red << (5 +6));
short *dest = (short *) (frameBuffer)
+ (y0 + vinfo.yoffset) * stride + (x0 +vinfo.xoffset);
int x, y;
for (y = 0; y < height; ++y)
{
for (x = 0; x < width; ++x)
{
dest[x] = color16;
}
dest += stride;
}
}
//画大小为width*height的同色矩阵,5reds+5greens+5blues
void drawRect_rgb15 (int x0, int y0, int width,int height, int color)
{
const int bytesPerPixel = 2;
const int stride = finfo.line_length / bytesPerPixel;
const int red = (color & 0xff0000) >> (16 + 3);
const int green = (color & 0xff00) >> (8 + 3);
const int blue = (color & 0xff) >> 3;
const short color15 = blue | (green << 5) | (red << (5 + 5))| 0x8000;
short *dest = (short *) (frameBuffer)
+ (y0 + vinfo.yoffset) * stride + (x0 + vinfo.xoffset);
int x, y;
for (y = 0; y < height; ++y)
{
for (x = 0; x < width; ++x)
{
dest[x] = color15;
}
dest += stride;
}
}
void drawRect (int x0, int y0, int width, int height, int color)
{
switch (vinfo.bits_per_pixel)
{
case 32:
drawRect_rgb32 (x0, y0, width, height, color);
printf("xilisong\n");
break;
case 16:
drawRect_rgb16 (x0, y0, width, height, color);
break;
case 15:
drawRect_rgb15 (x0, y0, width, height, color);
break;
default:
printf ("Warning: drawRect() not implemented for color depth%i\n",
vinfo.bits_per_pixel);
break;
}
}
#define PERFORMANCE_RUN_COUNT 5
void performSpeedTest (void *fb, int fbSize)
{
int i, j, run;
struct timeval startTime, endTime;
unsigned long long results[PERFORMANCE_RUN_COUNT];
unsigned long long average;
unsigned int *testImage;
unsigned int randData[17] = {
0x3A428472, 0x724B84D3, 0x26B898AB,0x7D980E3C, 0x5345A084,
0x6779B66B, 0x791EE4B4, 0x6E8EE3CC, 0x63AF504A, 0x18A21B33,
0x0E26EB73, 0x022F708E, 0x1740F3B0, 0x7E2C699D, 0x0E8A570B,
0x5F2C22FB, 0x6A742130
};
printf ("Frame Buffer Performance test...\n");
for (run = 0; run < PERFORMANCE_RUN_COUNT; ++run)
{
/* Generate test image with random(ish) data: */
testImage = (unsigned int *) malloc (fbSize);
j = run;
for (i = 0; i < (int) (fbSize / sizeof (int)); ++i)
{
testImage[i] = randData[j];
j++;
if (j >= 17)
j = 0;
}
gettimeofday (&startTime, NULL);
memcpy (fb, testImage, fbSize);
gettimeofday (&endTime,NULL);
long secsDiff = endTime.tv_sec - startTime.tv_sec;
results[run] =
secsDiff * 1000000 +(endTime.tv_usec - startTime.tv_usec);
free (testImage);
}
average = 0;
for (i = 0; i < PERFORMANCE_RUN_COUNT; ++i)
average += results[i];
average = average / PERFORMANCE_RUN_COUNT;
printf (" Average: %llu usecs\n", average);
printf (" Bandwidth: %.03f MByte/Sec\n",
(fbSize / 1048576.0) / ((double) average / 1000000.0));
printf (" Max. FPS: %.03f fps\n\n",
1000000.0 / (double) average);
/* Clear the framebuffer back to black again: */
memset (fb, 0, fbSize);
}
int main (int argc, char **argv)
{
const char *devfile = "/dev/fb2";
long int screensize = 0;
int fbFd = 0;
unsigned int i=0;
/* Open the file for reading and writing */
fbFd = open (devfile, O_RDWR);
if (fbFd == -1)
{
perror ("Error: cannot open framebuffer device");
exit (1);
}
//获取finfo信息并显示
if (ioctl (fbFd, FBIOGET_FSCREENINFO, &finfo) == -1)
{
perror ("Error reading fixed information");
exit (2);
}
printFixedInfo ();
//获取vinfo信息并显示
if (ioctl (fbFd, FBIOGET_VSCREENINFO, &vinfo) == -1)
{
perror ("Error reading variable information");
exit (3);
}
printVariableInfo ();
/* Figure out the size of the screen in bytes */
screensize = finfo.smem_len;
struct ti81xxfb_region_params regp;
if (ioctl(fbFd, TIFB_GET_PARAMS, ®p) < 0) {
perror("TIFB_GET_PARAMS\n");
close(fbFd);
exit(1);
}
/* Disable the Transparency Keying */
regp.transen = TI81XXFB_FEATURE_DISABLE;
/* if (ioctl(fbFd, TIFB_SET_PARAMS, ®p) < 0) {
perror ("TIFB_SET_PARAMS.\n");
close(fbFd);
exit(1);
}*/
// struct ti81xxfb_region_params regp;
/*if (ioctl(fbFd, TIFB_GET_PARAMS, ®p) < 0) {
perror("TIFB_GET_PARAMS\n");
close(fbFd);
exit(1);
}*/
/*Disable Alpha Blending*/
regp.blendtype = TI81XXFB_BLENDING_NO;
if (ioctl(fbFd, TIFB_SET_PARAMS, ®p) < 0) {
perror ("TIFB_SET_PARAMS.\n");
close(fbFd);
exit(1);
}
/* Map the device to memory */
frameBuffer =
(char *) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,
fbFd, 0);
if (frameBuffer == MAP_FAILED)
{
perror ("Error: Failed to map framebuffer device to memory");
exit (4);
}
//测试virt fb的性能
performSpeedTest (frameBuffer, screensize);
printf ("Will draw 3 rectangles on the screen,\n"
"they should be coloredred, green and blue (in that order).\n");
drawRect (vinfo.xres / 8, vinfo.yres / 8,
vinfo.xres / 4, vinfo.yres /4, 0x000000ff);
drawRect (vinfo.xres * 3 / 8, vinfo.yres * 3 / 8,
vinfo.xres / 4, vinfo.yres / 4,0x0000ff00);
drawRect (vinfo.xres * 5 / 8, vinfo.yres * 5 / 8,
vinfo.xres / 4, vinfo.yres /4, 0x00ff0000);
while(1){
/* drawRect (vinfo.xres * 5 / 8, vinfo.yres * 5 / 8,
vinfo.xres / 4, vinfo.yres /4, i);
i++;
printf("%d\n",i);*/
}
sleep (5);
printf (" Done.\n");
munmap (frameBuffer, screensize); //解除内存映射,与mmap对应
close (fbFd);
return 0;
}
the printf is as follow:
Fixed screen info:
id: ti81xxfb
smem_start:0x86c00000
smem_len:1048576
type:0
type_aux:0
visual:2
xpanstep:1
ypanstep:1
ywrapstep:0
line_length: 2880
mmio_start:0x0
mmio_len:0
accel:0
Variable screen info:
xres:720
yres:364
xres_virtual:720
yres_virtual:364
yoffset:0
xoffset:0
bits_per_pixel:32
grayscale:0
red: offset:16, length: 8, msb_right: 0
green: offset: 8, length: 8, msb_right: 0
blue: offset: 0, length: 8, msb_right: 0
transp: offset:24, length: 8, msb_right: 0
nonstd:0
activate:0
height:-1
width:-1
accel_flags:0x0
pixclock:18518
left_margin:68
right_margin: 12
upper_margin:41
lower_margin:5
hsync_len:64
vsync_len:5
sync:0
vmode:1
but the question is the screen's display has no colour, why?