t[obt@®ì
@Linuxª®¢Ä¢éÆAt[obt@ÍA/dev/fb0A/dev/fb1...Ì
@æ¤ÉPÈubNfoCXÅANZXÅ«Ü·B
@»êðȺÌtqkÅmÁ½ÌÅAÈPÉIíé¾ë¤ÆvÁĢܵ½B
@@http://telecom0.eng.niigata-u.ac.jp/index.php?FrameBuffer
@ªAvíÊƱëÅAÍÜÁĵܢܵ½B
@»Ì^ðÐîµÜ·ÌÅA¼RÌÎƵľ³¢Bm(_ _)m
eXgvOdl
@t[obt@ðANZX·é½ßÉÍAvOªKvÅ·B
@»±ÅAæÉÐîµ½tqkðQlÉÌdlð쬵ܵ½B
- qfaðAã©çºÉÑÌæ¤É\¦·é
- QSOC éÌÅAFÍWOC²ÆÉϦé
- t[obt@ANZXs\ÌêAîñð\¦·é
@æÊÍAº}Ìæ¤ÉÈé͸ŷB
@dlªÜêÎAeªðRcRcLq·é¾¯Å·B
Ñ\¦
@WOC²ÆÉAFðÏXµÄ¢¯Îæ¢ÌÅAPÉ
@Qd[vÅ\¬µÜ·B
@ãÅApµâ·¢æ¤ÉA¡ÌsNZÆcÌCð
@}Nè`µÄ¨«Ü·B
#define X_PIXEL_MAX 320
#define Y_LINE_MAX 240
@O[vÍCAà[vÍsNZÉèÄ
@ܸÍA[R[hÅLqÅ·B
for ( y = 0 ; y < Y_LINE_MAX ; y++ ) {
/* Fè */
/* PC */
for ( x = 0 ; x < X_PIXEL_MAX ; x++ ) {
/* i[ÊuvZ */
/*
F */
}
}
@FÍAùÉxÅè`³êÄ¢éƵÄAWOC²ÆÉ
@Vµ¢FðÝèµÜ·B
@#define BORDER1 80
@#define BORDER2 160
tcolor = COLOR_BLUE ;
if ( y > BORDER2 ) {
tcolor = COLOR_RED ;
} else {
if ( y > BORDER1 ) {
tcolor = COLOR_GREEN ;
}
}
@FªÜêÎA»êðRQOsNZÉo·¾¯Å·B
@t[obt@ÌìèûÉ˶µÜ·ªAÊíÍAPsNZÉ
@½rbgèÄé©ÅAPAQASoCgÆANZXû@ªÜ
@ÁĵܢܷB
@¡ñÍAfoCXhCoÌdlÅAPsNZPUrbgÈÌÅ
@[hiQoCgjANZXƵܷB
@PCÍARQOsNZ éÌÅARQO~PUrbgÅ·B
@ÍAoCg²ÆÉAhXðèÄÌÅARQO~Q~Wrbg
@USOoCgÅPCÆÈèÜ·B
@PsNZÍAQoCgðèßéÌÅAt[obt@Ì|C^ð
@fbptrAÌoCg²ÆÉUÁ½AhXðlocationÉüêÄAÌ
@ÅPsNZÌ
FªÅ«Ü·B
*((unsigned short *)(fbptr + location)) = tcolor;
@
@oCg²ÆÌAhXðAȵPUrbgÌAhXÉÏ·µ
@PUrbgðêCÉ«ÝÜ·B
@ÉAoCg²ÆÉUÁ½AhXðßéû@ð¢µÜ·B
@ÊíAt[obt@ÍAAhXvZðÈPÉ·é½ßÉ
@QÌxLæÌÊu©çYCÌf[^ði[µÜ·B
@º}Ìæ¤ÉACÆCÌÔÉAÔª éæ¤ÉÈèÜ·B
@ßñðl¦éÆAԪȢæ¤ÉAµÝÜ·B
@Ç¿çÅ\¬µÄ¢éÌ©ðA[U[ªl¦éÌÍÊ|ÈÌÅ
@LinuxÌêÍA»ÌîñðÖioctlðÀs·éÆ\¢ÌÏÌ
ÉAKvÈîñðüêÄêÜ·B
@ÌQÂ\¢ÌÏðé¾µÄAVXeR[ÖopenÅ
@t[obt@Ìt@CfBXNv^ðæ¾Å«éÆ
@îñðæ¾Å«éõª®¢Ü·B
struct fb_fix_screeninfo finfo;
struct fb_var_screeninfo vinfo;
@finfoÍAVXeÅLÌÅèîñði[µÜ·B
@vinfoÍAXN[²ÆÌÂÏîñði[µÜ·B
@ÀÛÉîñðæ¾·éêÍAÖioctlðpµÜ·B
@±±ÅÍAûüÌItZbglAûüÌItZbglA
@PsNZ ½èÌrbgð澵ܷB
@ÌR[hÅAPsNZ ½èÌrbgÆsNZ·Z
@ÌPC·ð澵Ĩ«Ü·B
vbpp = vinfo.bits_per_pixel ;
line_len = finfo.line_length ;
@[hANZXÌAhXÍAx[XAhX©çÌ
@ItZbgÉ·éÌÅAÌvZÅßçêÜ·B
#define DIV_BYTE 8
location = ((x+vinfo.xoffset) * vbpp / DIV_BYTE) + (y+vinfo.yoffset) * line_len ;
@ƵÄÜÆßéÆAȺÉÈèÜ·B
for ( y = 0 ; y < Y_LINE_MAX ; y++ ) {
/* Fè */
tcolor = COLOR_BLUE ;
if ( y > BORDER2 ) {
tcolor = COLOR_RED ;
} else {
if ( y > BORDER1 ) {
tcolor = COLOR_GREEN ;
}
}
/* PC */
for ( x = 0 ; x < X_PIXEL_MAX ; x++ ) {
/* i[ÊuvZ */
location = ((x+vinfo.xoffset) * vbpp / DIV_BYTE) + (y+vinfo.yoffset) * line_len ;
/*
F */
*((unsigned short *)(fbptr + location)) = tcolor;
}
}
Fwè
@FÍATrueColorÅQSrbgpµÜ·ªALCDfBXvCÍ
@oÍÅ«éFÍATPQFÜÅÈÌÅAPUrbgðg¤±ÆÉ
@µÜ·BifoCXhCoÌdlÅ·Bj
@PUrbgðg¤êÍAqfaÌèL·érbgðǤ·é©ð
@wèµÜ·B
- qFfFaTFTFT
- qFfFaTFUFT
@ÆQÊèÌwèû@ª èÜ·ªAfoCXhCoÌÖWÅTFUFT
@ðg¢Ü·B
@eFªèßérbgªÜéÆAÌæ¤ÉFðè`Å«Ü·B
- #define COLOR_RED 0xf800 /* 11111 000000 00000 */
- #define COLOR_GREEN 0x07e0 /* 00000 111111 00000 */
- #define COLOR_BLUE 0x001f /* 00000 000000 11111 */
- #define COLOR_WHITE 0xffff /* 11111 111111 11111 */
- #define COLOR_BLACK 0x0000 /* 00000 000000 00000 */
- #define COLOR_YELLOW 0xffe0 /* 11111 111111 00000 */
îñæ¾
@t[obt@ðp·é½ßÉÍAt@CfBXNv^ð
@ð澵ȯêÎÈèܹñB»Ì½ßÉAVXeR[Ö
@openðg¢Ü·B
#define DEVICE_NAME "/dev/fb0"
/* ÇÝ«pÉt@CðJ */
fd_framebuffer = open( DEVICE_NAME , O_RDWR);
if ( !fd_framebuffer ) {
send_current_error_msg("Framebuffer device open error !");
exit(1);
}
send_current_information("The framebuffer device was opened !");
@t[obt@ðI[vÅ«È¢ÆA½ðâÁÄà³ÊÈÌÅA
@»ÌÜÜI¹µÜ·B
@t[obt@ÉÖA·éîñðAÖioctlÅ\¢ÌÏÉi[³¹Ü·B
/* ÅèXN[îñæ¾ */
if ( ioctl( fd_framebuffer , FBIOGET_FSCREENINFO , &finfo ) ) {
send_current_error_msg("Fixed information not gotton !");
exit(2);
}
/* Ï®XN[îñæ¾ */
if ( ioctl( fd_framebuffer , FBIOGET_VSCREENINFO , &vinfo ) ) {
send_current_error_msg("Variable information not gotton !");
exit(3);
}
@ÅèAÏÌîñðüèÅ«È¢ÆA³µ¢ªÅ«È¢ÌÅA
@I¹³¹Ü·B
ANZX
@t[obt@ÍAÈÌÅAÖÌANZXÉÌ
@QÂÌÖðpµÜ·B
- foCXðÉ}bv@¨@mmap
- ©çfoCXðA}bv@¨@munmap
@ÖmmapÍAvoid^Ì|C^ðÔ·ÌÅALXgµÄ
@PoCgANZXÌ|C^ÉÏ·µÜ·B
fbptr = (char *)mmap(0,screensize,PROT_READ | PROT_WRITE,MAP_SHARED,fd_framebuffer,0);
@|C^ªNULLÅÍAÉ}bvÅ«È¢ÌÅAG[íÊð
@\¦µÄAI¹³¹Ü·B
if ( (int)fbptr == -1 ) {
send_current_error_msg("Don't get framebuffer device to memory !");
exit(4);
}
send_current_information("The framebuffer device was mapped !");
@ªI¹µ½ÈçÖmunmapÅAððúµÜ·B
munmap(fbptr,screensize);
S\[XR[h
@±êÜÅÌàeðÜÆßÄAÐÆÂÌ\[XR[hɵܷB
/*
* fbtst.c
* 2006.7.19 Kensuke Ooyu
*/
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <linux/fs.h>
#include <sys/mman.h>
#define DEVICE_NAME "/dev/fb0"
#define DIV_BYTE 8
#define X_PIXEL_MAX 320
#define Y_LINE_MAX 240
#define BORDER1 80
#define BORDER2 160
#define COLOR_RED 0xf800
#define COLOR_GREEN 0x07e0
#define COLOR_BLUE 0x001f
#define COLOR_WHITE 0xffff
#define COLOR_BLACK 0x0000
#define COLOR_YELLOW 0xffe0
/* function prototype */
void send_current_error_msg(char *ptr);
void send_current_information(char *ptr);
int main(void)
{
int fd_framebuffer ;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
long int screensize ;
long int location;
char *fbptr ;
char tmp[DIV_BYTE*10];
int x , y ;
int xres,yres,vbpp,line_len;
unsigned short tcolor ;
/* ÇÝ«pÉt@CðJ */
fd_framebuffer = open( DEVICE_NAME , O_RDWR);
if ( !fd_framebuffer ) {
send_current_error_msg("Framebuffer device open error !");
exit(1);
}
send_current_information("The framebuffer device was opened !");
/* ÅèXN[îñæ¾ */
if ( ioctl( fd_framebuffer , FBIOGET_FSCREENINFO , &finfo ) ) {
send_current_error_msg("Fixed information not gotton !");
exit(2);
}
/* Ï®XN[îñæ¾ */
if ( ioctl( fd_framebuffer , FBIOGET_VSCREENINFO , &vinfo ) ) {
send_current_error_msg("Variable information not gotton !");
exit(3);
}
xres = vinfo.xres ;
yres = vinfo.yres ;
vbpp = vinfo.bits_per_pixel ;
line_len = finfo.line_length ;
sprintf( tmp , "%d(pixel)x%d(line), %dbpp(bits per pixel)",xres,yres,vbpp);
send_current_information( tmp );
/* oCgPÊÅÌXN[ÌTCYðvZ */
screensize = xres * yres * vbpp / DIV_BYTE ;
/* foCXðÉ}bv·é */
fbptr = (char *)mmap(0,screensize,PROT_READ | PROT_WRITE,MAP_SHARED,fd_framebuffer,0);
if ( (int)fbptr == -1 ) {
send_current_error_msg("Don't get framebuffer device to memory !");
exit(4);
}
send_current_information("The framebuffer device was mapped !");
/* \¦ */
for ( y = 0 ; y < Y_LINE_MAX ; y++ ) {
/* Fè */
tcolor = COLOR_BLUE ;
if ( y > BORDER2 ) {
tcolor = COLOR_RED ;
} else {
if ( y > BORDER1 ) {
tcolor = COLOR_GREEN ;
}
}
/* PC */
for ( x = 0 ; x < X_PIXEL_MAX ; x++ ) {
/* i[ÊuvZ */
location = ((x+vinfo.xoffset) * vbpp / DIV_BYTE) + (y+vinfo.yoffset) * line_len ;
/*
F */
*((unsigned short *)(fbptr + location)) = tcolor;
}
}
munmap(fbptr,screensize);
close(fd_framebuffer);
return 0;
}
void send_current_error_msg(char *ptr)
{
fprintf( stderr , "%s\n" , ptr );
}
void send_current_information(char *ptr)
{
fprintf( stdout , "%s\n" , ptr );
}
RpCAN
@SH-4pÌ[hW
[ð쬵ܷB
@RpCÍAÈPÅ·B
@$ sh4-linux-gcc -o fbtst fbtst.c
@½x௶±Æð^Cv·é̪Ê|ÈÌÅAÌVF
@XNvgð쬵ܵ½B
@#!/bin/bash
@filename=$1
@#
@if [ -f ${filename}.c ] ; then
@ sh4-linux-gcc -o $filename ${filename}.c
@else
@ echo "${filename}.c not exist !"
@fi
@Às ðtÁµÄ¨«Ü·B
@$ chmod 766 sh4gcc
@g¢ûÍAÌæ¤ÉµÜ·B
@$ ./sh4gcc fbtst
®ìmF
@Àst@CªoãªÁ½ÌÅAÌoHÅCAT760É]Å·B
- coLinuxfBNg@¨@WindowsfBNg@iSambapj
- WindowsfBNg@¨@Fedra MachinefBNg@iFTPpj
- Fedra MachinefBNg@¨@CAT760fBNg@iFTPpj
@Às ðtÁµÄ¨«Ü·B
@$ chmod 766 fbtst
@ÀsµÜ·B
@$ ./fbtst
@±±ÅAG[ªo³êܵ½B
@Framebuffer device open error !
@±ÌÓ¡ÍAt[obt@ª¶ÝµÈ¢Æ¢¤±ÆB
@±êÅA¼úߪðø¦Ä¢Üµ½B
@½ÌÈçAu[gÉAÌæ¤É\¦³êé©çÅ·B
@Àsµ½_ÅAÌæ¤É\¦³êé͸ŷB
@ÅàA\¦ÍAÌÜÜÅ·B
@Framebuffer device open error !
@µâÃÉÈÁÄl¦ÄÝܵ½B
@t[obt@ÍALinux©ç©ÄAfoCXt@CÅ·B
@foCXt@Cª¶ÝµÈ¢ÈçÎA/dev/fb0àȢ͸ŷB
@CAT760ãÌÉA[gt@CVXeª èADebinaSH
@ðRpNgtbV
Å®©µÄ͢ȢÌÅA¡ÜÅÝè
@ÉֵijÚ
ŵ½B
@R}hlsÅAfoCXt@Cð\¦³¹Üµ½B
@$ ls -la /dev/fb*
crw-rw-rw---- 1 root root 2936 Jan 1 0:00 /dev/fb0
@úí©çfoCXt@CðµÁÄ¢élÈçA·®É
@í©é±Æŷ˦B
@foCXhCoÉK{ÌW[ÔA}Ci[Ôª
@ èܹñB¾©çA»ñÈfoCXÍÈ¢ÆAG[ª
@ÔéÌÅ·B(T_T)
@¼ÌLinux}VÅAt[obt@[Ì}Ci[ÔÆ
@W[ÔðmFµÄAÝè·é±Æɵܵ½B
@W[ÔÍQXA}Ci[ÔÍO©çÆÈÁÄ¢é
@ÌÅAÌæ¤ÉìµAVµ¢foCXt@Cðì¬
@µÜµ½B
@$ rm -R /dev/fb0
@$ mknod /dev/fb0 b 29 0
@$ ls -la /dev/fb*
brw---------- 1 root root 29, 0 Jul 18 15:04 /dev/fb0
@$ chmod 666 /dev/fb0
@Cðæè¼µÄAÄ`WÅ·B
@^[~ið©éÆAt[obt@ÌͤÜ
@¢ÁÄ¢éæ¤Å·µAæ¾îñà\¦³êĢܷB
@æÊàAwèµ½àeÅ\¦³êܵ½Bv(^o^)v