📄 004f5c867d9e001d14fdda4a5e9541d7
字号:
//BitBlt.c#include "system.h"//#include "altera_avalon_pio_regs.h"#include "alt_types.h"#include <sys/alt_cache.h>#include "anywhere_avalon_lcd_regs.h"#include "anywhere_avalon_bitblt_regs.h"#define TEST_TIMES 4000int main (void) __attribute__ ((weak, alias ("alt_main")));//初始化LCD子程序//这里参考了第七章的设计程序void init_LCD(alt_u32 framebuffer){ alt_u32 nBGOffset; alt_u32 nFG1Offset; alt_u16 nBGWidth; alt_u16 nBGHeight; alt_u16 nFG1Width; alt_u16 nFG1Height; alt_u16 nFG1PosX; alt_u16 nFG1PosY; alt_u8 nFG1Alpha; alt_u16 nFG1TransColor; alt_16 nStepX; alt_16 nStepY; nBGOffset=framebuffer; nBGWidth=640; nBGHeight=480; nFG1Offset=nBGOffset+nBGWidth*nBGHeight*2; nFG1Width=80; nFG1Height=80; nFG1PosX=100; nFG1PosY=100; nFG1Alpha=128; nFG1TransColor=0x1234; nStepX=2; nStepY=2; //initialize LCD Controller //Enable 2 layers IOWR_ANYWHERE_AVALON_LCD_LAYER_EN(ANYWHERE_LCD_CONTROLLER_0_BASE,0x03); //Set read mode IOWR_ANYWHERE_AVALON_LCD_READ_MODE(ANYWHERE_LCD_CONTROLLER_0_BASE,0x03); //Enalbe transparency IOWR_ANYWHERE_AVALON_LCD_TRANS_EN(ANYWHERE_LCD_CONTROLLER_0_BASE,0x02); //Set layer start address IOWR_ANYWHERE_AVALON_LCD_BG_STARTADDR(ANYWHERE_LCD_CONTROLLER_0_BASE,nBGOffset); IOWR_ANYWHERE_AVALON_LCD_FG1_STARTADDR(ANYWHERE_LCD_CONTROLLER_0_BASE,nFG1Offset); //Set foreground layer 1 IOWR_ANYWHERE_AVALON_LCD_FG1_WIDTH(ANYWHERE_LCD_CONTROLLER_0_BASE,nFG1Width); IOWR_ANYWHERE_AVALON_LCD_FG1_HEIGHT(ANYWHERE_LCD_CONTROLLER_0_BASE,nFG1Height); IOWR_ANYWHERE_AVALON_LCD_FG1_X(ANYWHERE_LCD_CONTROLLER_0_BASE,nFG1PosX); IOWR_ANYWHERE_AVALON_LCD_FG1_Y(ANYWHERE_LCD_CONTROLLER_0_BASE,nFG1PosY); IOWR_ANYWHERE_AVALON_LCD_FG1_ALPHA(ANYWHERE_LCD_CONTROLLER_0_BASE,nFG1Alpha); IOWR_ANYWHERE_AVALON_LCD_FG1_TRANSCOLOR(ANYWHERE_LCD_CONTROLLER_0_BASE,nFG1TransColor); //Enable LCD Controller IOWR_ANYWHERE_AVALON_LCD_CTRL(ANYWHERE_LCD_CONTROLLER_0_BASE,0x01);}//纯软件的随机块填充子程序void solid_fill(alt_u32 framebuffer){ alt_u32 framebuffer_offset; framebuffer_offset = framebuffer; alt_u32 data_offset; alt_u32 x_pos; alt_u32 y_pos; alt_u32 width; alt_u32 height; alt_u16 color; int i,j; for(i = 0; i < TEST_TIMES; i++ ) { color = rand(); x_pos = rand() % 640; y_pos = rand() % 480; width = (rand() % 640) % (640 - x_pos); height = (rand() % 480) % (480 - y_pos); data_offset = framebuffer_offset; data_offset += (x_pos + y_pos * 640) * 2; for(j = 0; j < height; j++) { memset(data_offset, color, width); data_offset += 640 * 2; } alt_dcache_flush_all(); }}//BitBlt IP模块的随机块填充子程序void solid_fill_with_HA(alt_u32 framebuffer){ alt_u32 framebuffer_offset; framebuffer_offset = framebuffer; alt_u32 data_offset; alt_u32 x_pos; alt_u32 y_pos; alt_u32 width; alt_u32 height; alt_u16 color; int i,j; for(i = 0; i < TEST_TIMES; i++ ) { color = rand(); x_pos = rand() % 640; y_pos = rand() % 480; width = (rand() % 640) % (640 - x_pos); height = (rand() % 480) % (480 - y_pos); data_offset = framebuffer_offset; data_offset += (x_pos + y_pos * 640) * 2; IOWR_ANYWHERE_AVALON_BITBLT_DEST_START_ADR(ANYWHERE_AVALON_BITBLT_0_BASE,data_offset); //设置BitBLT的目的开始地址 IOWR_ANYWHERE_AVALON_BITBLT_DEST_MEM_OFFSET(ANYWHERE_AVALON_BITBLT_0_BASE,640); //设置BitBLT的目的偏移量 IOWR_ANYWHERE_AVALON_BITBLT_WIDTH(ANYWHERE_AVALON_BITBLT_0_BASE,width); //设置BitBLT的块宽度 IOWR_ANYWHERE_AVALON_BITBLT_HEIGHT(ANYWHERE_AVALON_BITBLT_0_BASE,height); //设置BitBLT的块高度 IOWR_ANYWHERE_AVALON_BITBLT_FOREGROUND(ANYWHERE_AVALON_BITBLT_0_BASE,color); //设置BitBLT的块的颜色(前景层) IOWR_ANYWHERE_AVALON_BITBLT_CMD(ANYWHERE_AVALON_BITBLT_0_BASE,0x03); //向BitBLT IP发送写命令 }}//延时函数int delay(int time){ volatile int i; i = 0; while (i<time) { i++; } return(0);}//main函数int alt_main (void){ alt_u8 led = 0x2; alt_u8 dir = 0; alt_u32 framebuffer_offset; framebuffer_offset = EXT_SSRAM_BASE; init_LCD(framebuffer_offset); while (1) { solid_fill(framebuffer_offset); delay(10000000); solid_fill_with_HA(framebuffer_offset); delay(10000000); } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -