📄 btvid3.c
字号:
/**** RGB32 MICROCODE BUFFER **** 488 * NUMFRAMES microcode instructions + 2 for jump****/#define MCSIZE 488unsigned int dma_microcode[(NUMFRAMES*MCSIZE)+2];/* 126 * NUMFRAMES*/#define PUNYMCSIZE 126unsigned int dma_puny_microcode[(NUMFRAMES*PUNYMCSIZE)+2];/**** RGB32 MICROCODE BUFFER **** 968 * NUMFRAMES microcode instructions****/#define LGMCSIZE 968unsigned int dma_large_microcode[(NUMFRAMES*LGMCSIZE)+2];/******************************** END DMA MC ****************/void print_mc(int mc){ int i; if(mc == RGB32_640x480_MICROCODE) { for(i=0;i<(sizeof(dma_large_microcode)/(sizeof(unsigned int)));i++) { logMsg("%4d 0x%8x @ 0x%8x\n", i, dma_large_microcode[i], &(dma_large_microcode[i]),0,0,0); } } if(mc == TEST_MICROCODE) { for(i=0;i<(sizeof(dma_test_microcode)/(sizeof(unsigned int)));i++) { logMsg("%4d 0x%8x @ 0x%8x\n", i, dma_test_microcode[i], &(dma_test_microcode[i]),0,0,0); } } else if(mc == RGB32_320x240_MICROCODE) { for(i=0;i<(sizeof(dma_microcode)/(sizeof(unsigned int)));i++) { logMsg("%4d 0x%8x @ 0x%8x\n", i, dma_microcode[i], &(dma_microcode[i]),0,0,0); } }}/**** RGB32 FRAME BUFFER for 640x480 frame LGFRAME 307200 ****/UINT large_frame_buffer[NUMFRAMES][307200];/**** RGB32 FRAME BUFFER for 320x240 frame ****/UINT frame_buffer[NUMFRAMES][76800];UINT y8_frame_buffer[NUMFRAMES][19200];UINT save_buffer[76800];UINT y8_save_buffer[19200];/**** Y8 FRAME BUFFER for 80x60 frame ****/UINT puny_frame_buffer[NUMFRAMES][1200];void write_y8_save_buffer(void){ int fd, i; char *savebuffbyteptr = (char *)&(y8_save_buffer[0]); fd = open("/tgtsvr/testy8frame.out", O_RDWR|O_CREAT, 0644); write(fd,"P5\n",3); write(fd,"#test\n",6); write(fd,"320 240\n",8); write(fd,"255\n",4); /* Write out RED channel */ for(i=0;i<76800;i++) { write(fd,(savebuffbyteptr+1),1); savebuffbyteptr+=4; } close(fd);}char SaveBuffer[320*240*3];void write_save_buffer(int bo){ int fd, i; char *savebuffbyteptr = (char *)&(save_buffer[0]); char *pWriteBuf; //wvEvent(1,0,0); fd = open("/tgtsvr/testframe.ppm", O_RDWR|O_CREAT, 0644); write(fd,"P6\n",3); write(fd,"#test\n",6); write(fd,"320 240\n",8); write(fd,"255\n",4); pWriteBuf = SaveBuffer; if(bo == 0) { /* Write out NO-ALPHA, RED, GREEN, BLUE pixels */ for(i=0;i<76800;i++) { *pWriteBuf =savebuffbyteptr[2]; pWriteBuf++; *pWriteBuf =savebuffbyteptr[1]; pWriteBuf++; *pWriteBuf =savebuffbyteptr[0]; pWriteBuf++; savebuffbyteptr+=4; } write(fd,SaveBuffer,3*320*240); /* write everything at once, speed it up a bit */ } else { /* Write out NO-ALPHA, RED, GREEN, BLUE pixels */ for(i=0;i<76800;i++) { write(fd,(savebuffbyteptr+1),1); write(fd,(savebuffbyteptr+2),1); write(fd,(savebuffbyteptr+3),1); savebuffbyteptr+=4; } } close(fd);}UINT check_buffers(int fsize){ int i,j; unsigned int test = 0; for(i=0;i<NUMFRAMES;i++) { if(fsize==1) { for(j=0;j<307199;j++) test |= large_frame_buffer[i][j]; } else if(fsize==0) { for(j=0;j<7679;j++) test |= frame_buffer[i][j]; } } printf("OR of all pixels = %d\n", test); return test;}void clear_buffers(int fsize){ int i,j; for(i=0;i<NUMFRAMES;i++) { bzero(&(large_frame_buffer[i]),(307200*4)); bzero(&(frame_buffer[i]), (76800*4)); } bzero(&(test_buffer[0]),(320*4));}void initialize_test_mc(void){ int j; dma_test_microcode[0] = DMA_MC_SYNC_FM1_WORD_0; dma_test_microcode[1] = DMA_MC_SYNC_WORD_1; /* Initialize the 240 lines of ODD and EVEN microcode */ /* odd lines */ for(j=2;j<482;j+=2) { dma_test_microcode[j] = DMA_MC_SKIP_1280_SOL; dma_test_microcode[j+1] = DMA_MC_SKIP_1280_EOL; } j=482; dma_test_microcode[j] = DMA_MC_SYNC_VRE_WORD_0; j++; dma_test_microcode[j] = DMA_MC_SYNC_WORD_1; j++; dma_test_microcode[j] = DMA_MC_SYNC_FM1_WORD_0; j++; dma_test_microcode[j] = DMA_MC_SYNC_WORD_1; j++; /* even line */ for(j=486;j<966;j+=2) { dma_test_microcode[j] = DMA_MC_SKIP_1280_SOL; dma_test_microcode[j+1] = DMA_MC_SKIP_1280_EOL; } j=966; dma_test_microcode[j] = DMA_MC_SYNC_VRO_WORD_0_IRQ; j++; dma_test_microcode[j] = DMA_MC_SYNC_WORD_1; j++; dma_test_microcode[j] = DMA_MC_JUMP_TO_BEG; j++; dma_test_microcode[j] = (unsigned int)&(dma_test_microcode[0]); j++;}void initialize_frame_mc(int fsize){ int mcidx, i,j, k; if(fsize==NTSC_80_X_60) { /* For NUMFRAMES Frames */ for(i=0;i<NUMFRAMES;i++) { mcidx = PUNYMCSIZE * i; j = 0; /* FIELD SYNC */ dma_puny_microcode[mcidx+j] = DMA_MC_SYNC_FM1_WORD_0; j++; dma_puny_microcode[mcidx+j] = DMA_MC_SYNC_WORD_1; j++; /* Initialize 30 lines of ODD microcode */ for(j=2,k=0;j<32;j+=2,k++) { /* odd line */ if(replace_write_with_skip) { dma_puny_microcode[mcidx+j] = DMA_MC_SKIP_40_SOL; dma_puny_microcode[mcidx+j+1] = DMA_MC_SKIP_40_EOL; } else { dma_puny_microcode[mcidx+j] = DMA_MC_WRITE_80_LINE; dma_puny_microcode[mcidx+j+1] = (unsigned int)&(puny_frame_buffer[i][(20+(k*40))]); } } j=32; /* VRE FIELD SYNC */ dma_puny_microcode[mcidx+j] = DMA_MC_SYNC_VRE_WORD_0; j++; dma_puny_microcode[mcidx+j] = DMA_MC_SYNC_WORD_1; j++; dma_puny_microcode[mcidx+j] = DMA_MC_SYNC_FM1_WORD_0; j++; dma_puny_microcode[mcidx+j] = DMA_MC_SYNC_WORD_1; j++; /* Initialize 30 lines of EVEN microcode */ for(j=36,k=0;j<66;j+=2,k++) { /* even line */ if(replace_write_with_skip) { dma_puny_microcode[mcidx+j] = DMA_MC_SKIP_40_SOL; dma_puny_microcode[mcidx+j+1] = DMA_MC_SKIP_40_EOL; } else { dma_microcode[mcidx+j] = DMA_MC_WRITE_80_LINE; dma_microcode[mcidx+j+1] = (unsigned int)&(puny_frame_buffer[i][0+(k*40)]); } } j = 66; dma_puny_microcode[mcidx+j] = DMA_MC_SYNC_VRO_WORD_0_IRQ; j++; dma_puny_microcode[mcidx+j] = DMA_MC_SYNC_WORD_1; j++; } dma_puny_microcode[(NUMFRAMES*PUNYMCSIZE)] = DMA_MC_JUMP_TO_BEG; dma_puny_microcode[(NUMFRAMES*PUNYMCSIZE)+1] = (unsigned int)&(dma_microcode[0]); } else if(fsize==NTSC_320_X_240_GS) { /* For NUMFRAMES Frames */ for(i=0;i<NUMFRAMES;i++) { mcidx = MCSIZE * i; j = 0; /* FIELD SYNC */ dma_microcode[mcidx+j] = DMA_MC_SYNC_FM1_WORD_0; j++; dma_microcode[mcidx+j] = DMA_MC_SYNC_WORD_1; j++; /* Initialize 120 lines of ODD microcode */ for(j=2,k=0;j<242;j+=2,k++) { /* odd line */ if(replace_write_with_skip) { dma_microcode[mcidx+j] = DMA_MC_SKIP_40_SOL; dma_microcode[mcidx+j+1] = DMA_MC_SKIP_40_EOL; } else { dma_microcode[mcidx+j] = DMA_MC_WRITE_80_LINE; dma_microcode[mcidx+j+1] = (unsigned int)&(y8_frame_buffer[i][(80+(k*160))]); } } j=242; /* VRE FIELD SYNC */ dma_microcode[mcidx+j] = DMA_MC_SYNC_VRE_WORD_0; j++; dma_microcode[mcidx+j] = DMA_MC_SYNC_WORD_1; j++; dma_microcode[mcidx+j] = DMA_MC_SYNC_FM1_WORD_0; j++; dma_microcode[mcidx+j] = DMA_MC_SYNC_WORD_1; j++; /* Initialize 120 lines of EVEN microcode */ for(j=246,k=0;j<486;j+=2,k++) { /* even line */ if(replace_write_with_skip) { dma_microcode[mcidx+j] = DMA_MC_SKIP_40_SOL; dma_microcode[mcidx+j+1] = DMA_MC_SKIP_40_EOL; } else { dma_microcode[mcidx+j] = DMA_MC_WRITE_80_LINE; dma_microcode[mcidx+j+1] = (unsigned int)&(y8_frame_buffer[i][0+(k*160)]); } } j = 486; dma_microcode[mcidx+j] = DMA_MC_SYNC_VRO_WORD_0_IRQ; j++; dma_microcode[mcidx+j] = DMA_MC_SYNC_WORD_1; j++; } dma_microcode[(NUMFRAMES*MCSIZE)] = DMA_MC_JUMP_TO_BEG; dma_microcode[(NUMFRAMES*MCSIZE)+1] = (unsigned int)&(dma_microcode[0]); } /* For NUMFRAMES Frames */ else if(fsize==NTSC_320_X_240) { /* For NUMFRAMES Frames */ for(i=0;i<NUMFRAMES;i++) { mcidx = MCSIZE * i; j = 0; /* FIELD SYNC */ dma_microcode[mcidx+j] = DMA_MC_SYNC_FM1_WORD_0; j++; dma_microcode[mcidx+j] = DMA_MC_SYNC_WORD_1; j++; /* Initialize 120 lines of ODD microcode */ for(j=2,k=0;j<242;j+=2,k++) { /* odd line */ if(replace_write_with_skip) { dma_microcode[mcidx+j] = DMA_MC_SKIP_640_SOL; dma_microcode[mcidx+j+1] = DMA_MC_SKIP_640_EOL; } else { dma_microcode[mcidx+j] = DMA_MC_WRITE_1280_LINE; dma_microcode[mcidx+j+1] = (unsigned int)&(frame_buffer[i][(320+(k*640))]); } } j=242; /* VRE FIELD SYNC */ dma_microcode[mcidx+j] = DMA_MC_SYNC_VRE_WORD_0; j++; dma_microcode[mcidx+j] = DMA_MC_SYNC_WORD_1; j++; dma_microcode[mcidx+j] = DMA_MC_SYNC_FM1_WORD_0; j++; dma_microcode[mcidx+j] = DMA_MC_SYNC_WORD_1; j++; /* Initialize 120 lines of EVEN microcode */ for(j=246,k=0;j<486;j+=2,k++) { /* even line */ if(replace_write_with_skip) { dma_microcode[mcidx+j] = DMA_MC_SKIP_640_SOL; dma_microcode[mcidx+j+1] = DMA_MC_SKIP_640_EOL; } else { dma_microcode[mcidx+j] = DMA_MC_WRITE_1280_LINE; dma_microcode[mcidx+j+1] = (unsigned int)&(frame_buffer[i][0+(k*640)]); } } j = 486; dma_microcode[mcidx+j] = DMA_MC_SYNC_VRO_WORD_0_IRQ; j++; dma_microcode[mcidx+j] = DMA_MC_SYNC_WORD_1; j++; } dma_microcode[(NUMFRAMES*MCSIZE)] = DMA_MC_JUMP_TO_BEG; dma_microcode[(NUMFRAMES*MCSIZE)+1] = (unsigned int)&(dma_microcode[0]); } else if(fsize==NTSC_640_X_480) { /* For NUMFRAMES Frames */ for(i=0;i<NUMFRAMES;i++) { mcidx = LGMCSIZE * i; j = 0; /* FIELD SYNC */ dma_large_microcode[mcidx+j] = DMA_MC_SYNC_FM1_WORD_0; j++; dma_large_microcode[mcidx+j] = DMA_MC_SYNC_WORD_1; j++; /* Initialize 240 lines of ODD microcode */ for(j=2,k=0;j<482;j+=2,k++) { /* odd line */ dma_microcode[mcidx+j] = DMA_MC_SKIP_1280_SOL; dma_microcode[mcidx+j+1] = DMA_MC_SKIP_1280_EOL; } j=482; /* VRE FIELD SYNC */ dma_large_microcode[mcidx+j] = DMA_MC_SYNC_VRE_WORD_0; j++; dma_large_microcode[mcidx+j] = DMA_MC_SYNC_WORD_1; j++; dma_large_microcode[mcidx+j] = DMA_MC_SYNC_FM1_WORD_0; j++; dma_large_microcode[mcidx+j] = DMA_MC_SYNC_WORD_1; j++; /* Initialize 240 lines of EVEN microcode */ for(j=486;j<966;j+=2) { /* even line */ dma_microcode[mcidx+j] = DMA_MC_SKIP_1280_SOL; dma_microcode[mcidx+j+1] = DMA_MC_SKIP_1280_EOL; } j = 966; dma_large_microcode[mcidx+j] = DMA_MC_SYNC_VRO_WORD_0_IRQ; j++; dma_large_microcode[mcidx+j] = DMA_MC_SYNC_WORD_1; j++; } /* end for NUMFRAMES */ dma_large_microcode[(NUMFRAMES*LGMCSIZE)] = DMA_MC_JUMP_TO_BEG; dma_large_microcode[(NUMFRAMES*LGMCSIZE)+1] = (unsigned int)&(dma_microcode[0]); } /* end else 640x480 */}int configure_ntsc(int fsize){ unsigned int testval = 0; /* Software Reset */ PCI_WRITE(RESET_REG,0x0,0x00000001); /* Set the oscillator frequency for NTSC 0x00000020 = xtal 0 input 0x00000000 = CLKx1 */ PCI_READ(TIMING_GEN_REG,0x0,&testval); printf("Timing Gen Ctl Reg = 0x%x\n", testval); PCI_WRITE(TIMING_GEN_REG,0x0,0x00000000); if((fsize==NTSC_320_X_240)) { /* Set up the delay and active registers so that they cover full resolution. Scaled pixels / line = 323 Crop 2 on left, 1 on right for 320 pixels / line For 320x240, want: MSB_CROP= 0x0000011 Hactive= 0x00000140 (320) Vactive= 0x000001e0 (480) Hdelay= 0x0000003c (60) Vdelay= 0x00000016 (22) Hscale= 0x00001555 Vscale= 0x00007e00 */ PCI_WRITE(MSB_CROP_EVEN_REG,0x0,0x00000011); PCI_WRITE(MSB_CROP_ODD_REG,0x0,0x00000011); PCI_WRITE(HACTIVE_LO_EVEN_REG,0x0,0x00000040); PCI_WRITE(HACTIVE_LO_ODD_REG,0x0,0x00000040); PCI_WRITE(VACTIVE_LO_EVEN_REG,0x0,0x000000E0); PCI_WRITE(VACTIVE_LO_ODD_REG,0x0,0x000000E0); PCI_WRITE(VDELAY_LO_EVEN_REG,0x0,0x00000016); PCI_WRITE(VDELAY_LO_ODD_REG,0x0,0x00000016); PCI_WRITE(HDELAY_LO_EVEN_REG,0x0,0x0000003C); PCI_WRITE(HDELAY_LO_ODD_REG,0x0,0x0000003C); /* Set HSCALE for 320 pixels per line */ PCI_WRITE(HSCALE_EVEN_MSB_REG,0x0,0x00000015); PCI_WRITE(HSCALE_ODD_MSB_REG,0x0,0x00000015); PCI_WRITE(HSCALE_EVEN_LSB_REG,0x0,0x00000055); PCI_WRITE(HSCALE_ODD_LSB_REG,0x0,0x00000055); /* Set VSCALE for 240 lines per frame */ PCI_WRITE(VSCALE_EVEN_MSB_REG,0x0,0x0000007E); PCI_WRITE(VSCALE_ODD_MSB_REG,0x0,0x0000007E); PCI_WRITE(VSCALE_EVEN_LSB_REG,0x0,0x00000000); PCI_WRITE(VSCALE_ODD_LSB_REG,0x0,0x00000000); PCI_WRITE(COLOR_FORMAT_REG,0x0,0x00000000); acq_type = NTSC_320_X_240; } if((fsize==NTSC_320_X_240_GS)) { /* Set up the delay and active registers so that they cover full resolution. Scaled pixels / line = 323 Crop 2 on left, 1 on right for 320 pixels / line For 320x240, want:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -