Handy PS3 Linux Framebuffer Utilities
Mike Acton
March 31, 2007
March 31, 2007
While the documentation within Sony's vsync example should be enough to get you started with writing to the framebuffer, here's a couple of handy functions to test the framebuffer settings, open the virtual terminal and get access the the frame buffer.
Open the virtual terminal:
cp_vt.h
cp_vt.c
Open the framebuffer:
cp_fb.h
cp_fb.c
Dump framebuffer info:
fb_info.c
Example output from fb_info
Example of using cp_vt and cp_fb
For example - for 480i the output should look something like this:
Open the virtual terminal:
cp_vt.h
cp_vt.c
Open the framebuffer:
cp_fb.h
cp_fb.c
Dump framebuffer info:
fb_info.c
Example output from fb_info
Example of using cp_vt and cp_fb
Files should be compiled with:
ppu-gcc -std=c99 -pedantic -W -Wall -O3
fb_info
fb_info dumps the current settings for the framebuffer setup on the PS3.For example - for 480i the output should look something like this:
FBIOGET_VBLANK:
flags:
FB_VBLANK_VBLANKING : FALSE
FB_VBLANK_HBLANKING : FALSE
FB_VBLANK_HAVE_VBLANK : FALSE
FB_VBLANK_HAVE_HBLANK : FALSE
FB_VBLANK_HAVE_COUNT : FALSE
FB_VBLANK_HAVE_VCOUNT : FALSE
FB_VBLANK_HAVE_HCOUNT : FALSE
FB_VBLANK_VSYNCING : FALSE
FB_VBLANK_HAVE_VSYNC : TRUE
count : 0
vcount : 1
hcount : 0
-------------------------------------
FBIOGET_FSCREENINFO:
id : "PS3 FB"
smem_start : 0x00000000
smem_len : 18874368
type : FB_TYPE_PACKED_PIXELS (0)
type_aux : N/A
visual : FB_VISUAL_TRUECOLOR (2)
xpanstep : 1
ypanstep : 1
ywrapstep : 1
line_length : 2880
mmio_start : 0x00000000
mmio_len : 0
accel : FB_ACCEL_NONE (0)
-------------------------------------
PS3FB_IOCTL_SCREENINFO:
xres : 720
yres : 480
xoff : 72
yoff : 48
num_frames : 2
-------------------------------------
Using cp_vt and cp_fb
These functions are very simple to use. The user running them should have read/write access to the framebufer (/dev/fb0) and the main console (/dev/console).
{
cp_vt vt;
cp_fb fb;
cp_vt_open_graphics(&vt);
cp_fb_open(&fb);
uint32_t frame_ndx = 0;
while (1)
{
uint32_t* const restrict frame_top = (uint32_t*)fb.draw_addr[ frame_ndx ];
// Write pixel to the frame buffer ...
// x and y are image position
// rgb24 is 32bit pixel value (where top 8 bits are unused)
frame_top[ ( y * fb.stride ) + x ] = rgb24;
// At the vsync, the previous frame is finished sending to the CRT
cp_fb_wait_vsync( &fb );
// Send the frame just drawn to the CRT by the next vblank
cp_fb_flip( &fb, frame_ndx );
frame_ndx = frame_ndx ^ 0x01;
}
cp_vt_close(&vt);
cp_fb_close(&fb);
}
A more complete example: fb_test.c