#include <stdio.h>
#include <stdlib.h>/* for exit */
#include <unistd.h> /* for open/close.. */
#include <fcntl.h> /* for O_RDONLY */
#include <sys/ioctl.h> /* for ioctl*/
#include <sys/types.h> /* for lseek() */
#include <linux/fb.h> /*for fb_var_screeninfo, FBIOGET_VSCREENINFO*/
#define FBDEVFILE "/dev/fb"
typedef unsigned char ubyte;
unsigned short makepixel(ubyte r, ubyte g, ubyte b)
{return (unsigned short)(((r>>3)<<11)|((g>>2)<<5)|(b>>3));}
int main(){
int fbfd;
int ret;
struct fb_var_screeninfo fbvar;
unsigned short pixel;
int offset;
fbfd= open(FBDEVFILE, O_RDWR);
if(fbfd< 0){
perror("fbdev open");exit(1);
}
ret = ioctl(fbfd, FBIOGET_VSCREENINFO, &fbvar);
if(ret< 0) {
perror("fbdev ioctl");
exit(1);
}
if(fbvar.bits_per_pixel!=16) {
fprintf(stderr, "bpp is not 16\n");
exit(1);
}
if(lseek(fbfd, 0, SEEK_SET) < 0){
perror("fbdev lseek");
exit(1);
}
pixel = makepixel(255, 0, 0); /*red pixel*/
write(fbfd, &pixel, 2); /*write 2bytes (16bit)*/
offset = 50*fbvar.xres*(16/8)+100*(16/8);
if(lseek(fbfd, offset, SEEK_SET) < 0){
perror("fbdev lseek");
exit(1);
}
pixel = makepixel(0, 255, 0); /*green pixel */
write(fbfd, &pixel, 2); /*write 2bytes (16bit)*/
offset = 100*fbvar.xres*(16/8)+50*(16/8);
if(lseek(fbfd, offset, SEEK_SET)<0){
perror("fbdev lseek");
exit(1);
}
pixel = makepixel(0,0,255); /*blue pixel */
write(fbfd, &pixel, 2); /*write 2bytes (16bit)*/
offset = 100*fbvar.xres*(16/8)+100*(16/8);
if(lseek(fbfd, offset, SEEK_SET) < 0){
perror("fbdev lseek");
exit(1);
}
pixel = makepixel(255, 255, 255); /*white pixel */
write(fbfd, &pixel, 2); /*write 2byte(16 bit)*/
close(fbfd);
exit(0);
return 0;
} // end of main