/////////////////////////////////////////////////////////////////////////////// // file : main.c (for display application) // date : may 2014 // author : Alain Greiner /////////////////////////////////////////////////////////////////////////////////////// // This file describes the single thread "display" application. // It uses the external chained buffer DMA to display a stream // of images on the frame buffer. /////////////////////////////////////////////////////////////////////////////////////// #include #include #define FILENAME "misc/images.raw" #define NPIXELS 128 #define NLINES 128 #define NIMAGES 10 #define NBLOCKS (NPIXELS*NLINES/512) // number of blocks per image unsigned char buf0[NPIXELS*NLINES] __attribute__((aligned(512))); unsigned char buf1[NPIXELS*NLINES] __attribute__((aligned(512))); //////////////////////////////////////////// __attribute__((constructor)) void main() //////////////////////////////////////////// { // get processor identifiers unsigned int x; unsigned int y; unsigned int lpid; giet_proc_xyp( &x, &y, &lpid ); int fd; unsigned int image = 0; // parameters checking if ( (NPIXELS != FBUF_X_SIZE) || (NLINES != FBUF_Y_SIZE) ) { giet_exit("[DISPLAY ERROR] Frame buffer size does not fit image size"); } giet_shr_printf("\n[DISPLAY] Processor[%d,%d,%d] starts at cycle %d\n", x, y, lpid, giet_proctime() ); // open file fd = giet_fat_open( FILENAME , 0 ); if ( fd < 0 ) { giet_exit("echec giet_fat_open for misc/images.raw"); } else { giet_shr_printf("\n[DISPLAY] Proc[%d,%d,%d] open file %s at cycle %d\n", x, y, lpid, FILENAME, giet_proctime() ); } // get a Chained Buffer DMA channel giet_fbf_cma_alloc(); // start Chained Buffer DMA channel giet_fbf_cma_start( buf0, buf1, NPIXELS*NLINES ); giet_shr_printf("\n[DISPLAY] Proc[%d,%d,%d] starts CMA at cycle %d\n", x, y, lpid, giet_proctime() ); // Main loop (on images) while ( image < NIMAGES ) { giet_fat_read( fd, buf0, NBLOCKS, image*NBLOCKS ); giet_shr_printf("\n[DISPLAY] Proc[%d,%d,%d] load image %d to buf0 at cycle %d\n", x, y, lpid, image, giet_proctime() ); giet_fbf_cma_display( 0 ); giet_shr_printf("\n[DISPLAY] Proc[%d,%d,%d] display image %d from buf0 at cycle %d\n", x, y, lpid, image, giet_proctime() ); image++; giet_fat_read( fd, buf1, NBLOCKS, image*NBLOCKS ); giet_shr_printf("\n[DISPLAY] Proc[%d,%d,%d] load image %d to buf1 at cycle %d\n", x, y, lpid, image, giet_proctime() ); giet_fbf_cma_display( 1 ); giet_shr_printf("\n[DISPLAY] Proc[%d,%d,%d] display image %d from buf1 at cycle %d\n", x, y, lpid, image, giet_proctime() ); image++; } // stop Chained buffer DMA channel giet_fbf_cma_stop(); giet_exit("display completed"); }