⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 btvid3.c

📁 BT878 图象显示 VxWorks 驱动程序
💻 C
📖 第 1 页 / 共 4 页
字号:
/**** 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 + -