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

📄 l2_cdsp.c

📁 台湾凌阳方案300万数码相机源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
      XBYTE[0x2105] = 0x00; //horizontal mirror enable
      XBYTE[0x2103] = 0x24; //horizontal valid shift
      XBYTE[0x2104] = 0x0C; //vertical valid shift
    }
    break;
    case 1:
    {
      //XBYTE[0x2104] = 0x0B; //vertical valid shift
	  XBYTE[0x2104] = 0x0C; //vertical valid shift
    }
    break;
    case 4:
    {
      //XBYTE[0x2104] = 0x0B; //vertical valid shift
	  XBYTE[0x2104] = 0x0C; //vertical valid shift
    }
    break;

    default: break;
  }

  // return
  PRINT_L2("        L2_InitCDSP: Exit\n");

  return(status);
}

//-----------------------------------------------------------------------------
//L2_DoCDSP
//-----------------------------------------------------------------------------
/*
routine description:
    Perform the color processing. The raw data resides in the source address and
  the result will be written to the SDRAM at the destination address.

arguments:
  SrcAddr: specify the source address of the image in the SDRAM
  SrcHsize: the source image width
  SrcVsize: the source image height
  DstAddr: the target image address in the DRAM
  DstHsize: the target image width
  DstVsize: the target image height
  OprMode:
     0: normal mode
     1:Only for AE/AWB window calculation
  DSMode:
   Bit 3 ~ Bit 0:
              0: no horizontal down sample
              1: horizontal down sample 2
              2: horizontal down sample 4
              3: horizontal down sample 8
   Bit 7 ~ Bit 4:
              0: no vertical down sample
              1: vertical down sample 2
              2: vertical down sample 4
              3: vertical down sample 8

return value:
  0x00   - success
  0x01   - general error
  0x02   - parameter error
  others - error
*/

UCHAR L2_DoCDSP(ULONG SrcAddr, USHORT SrcHsize, USHORT SrcVsize,
                ULONG DstAddr, USHORT DstHsize, USHORT DstVsize,
                UCHAR OprMode, UCHAR DSMode) USING_0
{
  UCHAR tmp03, tmp0E, tmp12, tmp49;
  UCHAR tmp53, tmp54, tmp55, tmp56, tmp57, tmp58;
  UCHAR tmp60, tmp61, tmp62, tmp63, tmp64, tmp65, tmp66, tmp67, tmp68;
  UCHAR tmp69, tmp6A, tmp6B, tmp6C, tmp6D, tmp6E;
  UCHAR tmpF0, tmpF1, tmpF2, tmpF3, tmpF4, tmpF5, tmpF6, tmpF7, tmpF8;
  UCHAR tmpF9, tmpFA, tmpFB, tmpFC, tmpFD;
  UCHAR tmp0, tmp1;
  UCHAR CapCount;
  UCHAR status, CapStatus;
  USHORT SrcHoff, DstHoff, LastSrcHsize, LastDstHsize;
  UCHAR tgen, clk1xdiv, clk2xdiv, phase1, phase2, phase3;
  //body
  PRINT_L2("        L2_DoCDSP: Enter\n");
  //Turn Off CCDTG , add by ygliu///////////////////////////////////////
  tgen      = XBYTE[0x2080];
  clk1xdiv  = XBYTE[0x2A81];
  clk2xdiv  = XBYTE[0x2A82];
  phase1    = XBYTE[0x2A83];
  phase2    = XBYTE[0x2023];
  phase3    = XBYTE[0x2022];

  XBYTE[0x2080] = 0x00;		//Enablt TG PLL
  XBYTE[0x2A81] = 0x03;       	//Set Clk1xDiv
  XBYTE[0x2A82] = 0x01;     	//Set Clk2xDiv
  XBYTE[0x2A83] = 0x00;  	//Clk1x Out delay
  XBYTE[0x2023] = 0x00;  	//Clk1x Input delay
  XBYTE[0x2022] = 0x00;  	//Clk2x Input delay
  //////////////////////////////////////////////////////////////////////

  tmp0 = DSMode&0x0F;
  tmp1 = DSMode>>4;
  if(((SrcHsize>>tmp0)<DstHsize) || (((SrcVsize)>>tmp1)<(DstVsize+12)) ||
     (((OprMode!=0) || (DSMode!=0)) && (DstHsize>456)))
  {
    status = L2K_ERROR_PARAMETER;
//    PRINT_CDSP("        L2_DoCDSP: Parameter Error\n");
  }
  else
  {
    //store the parameters for raw/A/B frame buffer
    tmp03 = XBYTE[0x2103];
    tmp0E = XBYTE[0x270E];
    tmp12 = XBYTE[0x2712];
    tmp49 = XBYTE[0x2749];

    tmp53 = XBYTE[0x2753];
    tmp54 = XBYTE[0x2754];
    tmp55 = XBYTE[0x2755];
    tmp56 = XBYTE[0x2756];
    tmp57 = XBYTE[0x2757];
    tmp58 = XBYTE[0x2758];

    tmp60 = XBYTE[0x2760];
    tmp61 = XBYTE[0x2761];
    tmp62 = XBYTE[0x2762];
    tmp63 = XBYTE[0x2763];
    tmp64 = XBYTE[0x2764];
    tmp65 = XBYTE[0x2765];
    tmp66 = XBYTE[0x2766];
    tmp67 = XBYTE[0x2767];
    tmp68 = XBYTE[0x2768];
    tmp69 = XBYTE[0x2769];
    tmp6A = XBYTE[0x276A];
    tmp6B = XBYTE[0x276B];
    tmp6C = XBYTE[0x276C];
    tmp6D = XBYTE[0x276D];
    tmp6E = XBYTE[0x276E];

    tmpF0 = XBYTE[0x27F0];
    tmpF1 = XBYTE[0x27F1];
    tmpF2 = XBYTE[0x27F2];
    tmpF3 = XBYTE[0x27F3];
    tmpF4 = XBYTE[0x27F4];
    tmpF5 = XBYTE[0x27F5];
    tmpF6 = XBYTE[0x27F6];
    tmpF7 = XBYTE[0x27F7];
    tmpF8 = XBYTE[0x27F8];
    tmpF9 = XBYTE[0x27F9];
    tmpFA = XBYTE[0x27FA];
    tmpFB = XBYTE[0x27FB];
    tmpFC = XBYTE[0x27FC];
    tmpFD = XBYTE[0x27FD];

    XBYTE[0x2105] = 0x01; //horizontal mirror enable

    //set operation mode
    XBYTE[0x27FD] &= 0xFE;

    XBYTE[0x27FC] = DSMode; //set down sample mode
    XBYTE[0x2749] = 0x01; //ccdsrcidx=1
    XBYTE[0x270E] = 0x01; //imgtype=YUV422,NC
    XBYTE[0x2712] = 0x01; //set doCDSP

    //raw frame buffer
    //set the start address
    XBYTE[0x2768] = M_LoByteOfDword(SrcAddr);
    XBYTE[0x2769] = M_MidLoByteOfDword(SrcAddr);
    XBYTE[0x276A] = M_MidHiByteOfDword(SrcAddr);

    //set the vertical size
    XBYTE[0x276D] = M_LoByteOfWord(SrcVsize);
    XBYTE[0x276E] = M_HiByteOfWord(SrcVsize);

    //set the horizontal width
    XBYTE[0x27F4] = M_LoByteOfWord(SrcHsize);
    XBYTE[0x27F5] = M_HiByteOfWord(SrcHsize);

    //A frame buffer
    //set the start address
    XBYTE[0x2753] = M_LoByteOfDword(SrcAddr);
    XBYTE[0x2754] = M_MidLoByteOfDword(SrcAddr);
    XBYTE[0x2755] = M_MidHiByteOfDword(SrcAddr);

    //set the vertical size
    XBYTE[0x2762] = M_LoByteOfWord(SrcVsize);
    XBYTE[0x2763] = M_HiByteOfWord(SrcVsize);

    //set the horizontal width
    XBYTE[0x27F0] = M_LoByteOfWord(SrcHsize);
    XBYTE[0x27F1] = M_HiByteOfWord(SrcHsize);

    //B frame buffer
    //set the start address
    XBYTE[0x2756] = M_LoByteOfDword(DstAddr);
    XBYTE[0x2757] = M_MidLoByteOfDword(DstAddr);
    XBYTE[0x2758] = M_MidHiByteOfDword(DstAddr);

    //set the vertical size
    XBYTE[0x2766] = M_LoByteOfWord(DstVsize);
    XBYTE[0x2767] = M_HiByteOfWord(DstVsize);

    //set the horizontal width
    XBYTE[0x27F2] = M_LoByteOfWord(DstHsize);
    XBYTE[0x27F3] = M_HiByteOfWord(DstHsize);

    if(DstHsize<=456) //one time complete
    {
      XBYTE[0x2103] = 0x1C; //hvalidshift

      XBYTE[0x276B] = M_LoByteOfWord(SrcHsize); //rfbhsize
      XBYTE[0x276C] = M_HiByteOfWord(SrcHsize); //rfbhsize
      XBYTE[0x27FA] = 0x00; //rfbhoff
      XBYTE[0x27FB] = 0x00; //rfbhoff

      XBYTE[0x2760] = M_LoByteOfWord(SrcHsize); //afbhsize
      XBYTE[0x2761] = M_HiByteOfWord(SrcHsize); //afbhsize
      XBYTE[0x27F6] = 0x00; //afbhoff
      XBYTE[0x27F7] = 0x00; //afbhoff

      XBYTE[0x2764] = M_LoByteOfWord(DstHsize); //bfbhsize
      XBYTE[0x2765] = M_HiByteOfWord(DstHsize); //bfbhsize
      XBYTE[0x27F8] = 0x00; //bfbhoff
      XBYTE[0x27F9] = 0x00; //bfbhoff

      XBYTE[0x2000] = 0x00; //set to idle mode
      XBYTE[0x2000] = 0x02; //set to dsc mode
      XBYTE[0x27A1] = 0x10; //start CDSP

//      PRINT_CDSP("        L2_DoCDSP: Wait capture done(one time complete)\n");

      do
      {
        CapStatus = XBYTE[0x27B0]&0x02;
      } while(CapStatus!=0x02); // polling until capture done
    }
    else //more than one time complete
    {
      //caputure an sub-image (first)
      XBYTE[0x2103] = 0x1C; //hvalidshift

      XBYTE[0x276B] = 0xC8; //rfbhsize (456)
      XBYTE[0x276C] = 0x01; //rfbhsize (456)
      XBYTE[0x27FA] = 0x00; //rfbhoff (0)
      XBYTE[0x27FB] = 0x00; //rfbhoff (0)

      XBYTE[0x2760] = 0xC8; //afbhsize (456)
      XBYTE[0x2761] = 0x01; //afbhsize (456)
      XBYTE[0x27F6] = 0x00; //afbhoff (0)
      XBYTE[0x27F7] = 0x00; //afbhoff (0)

      XBYTE[0x2764] = 0xC0; //bfbhsize (448)
      XBYTE[0x2765] = 0x01; //bfbhsize (448)
      XBYTE[0x27F8] = 0x00; //bfbhoff (0)
      XBYTE[0x27F9] = 0x00; //bfbhoff (0)

      XBYTE[0x2000] = 0x00; //set to idle mode
      XBYTE[0x2000] = 0x02; //set to dsc mode
      XBYTE[0x27A1] = 0x10; //start CDSP

//      PRINT_CDSP("        L2_DoCDSP: Wait capture done (1)\n");

      do
      {
        CapStatus = XBYTE[0x27B0]&0x02;
      } while(CapStatus!=0x02); // polling until capture done

      CapCount = 2;
      SrcHoff = 440;
      DstHoff = 448;

      //caputure an sub-image (middle)
      while((DstHsize-DstHoff)>448)
      {
        XBYTE[0x2103] = 0x24; //hvalidshift

        XBYTE[0x276B] = 0xC8; //rfbhsize (456)
        XBYTE[0x276C] = 0x01; //rfbhsize (456)

        XBYTE[0x27FA] = M_LoByteOfWord(SrcHoff); //rfbhoff
        XBYTE[0x27FB] = M_HiByteOfWord(SrcHoff); //rfbhoff

        XBYTE[0x2760] = 0xC8; //afbhsize (456)
        XBYTE[0x2761] = 0x01; //afbhsize (456)
        XBYTE[0x27F6] = M_LoByteOfWord(SrcHoff); //afbhoff
        XBYTE[0x27F7] = M_HiByteOfWord(SrcHoff); //afbhoff

        XBYTE[0x2764] = 0xB8; //bfbhsize (440)
        XBYTE[0x2765] = 0x01; //bfbhsize (440)
        XBYTE[0x27F8] = M_LoByteOfWord(DstHoff); //bfbhoff
        XBYTE[0x27F9] = M_HiByteOfWord(DstHoff); //bfbhoff

        XBYTE[0x2000] = 0x00; //set to idle mode
        XBYTE[0x2000] = 0x02; //set to dsc mode
        XBYTE[0x27A1] = 0x10; //start CDSP

//        PRINT_CDSP("        L2_DoCDSP: Wait capture done (%bu)\n", CapCount);

        do
        {
          CapStatus = XBYTE[0x27B0]&0x02;
        } while(CapStatus!=0x02); // polling until capture done

        CapCount++;
        SrcHoff += 440;
        DstHoff += 440;
      }

    //caputure an sub-image (last)
      XBYTE[0x27FD] |= 0x08; //set frcimglast

      XBYTE[0x2103] = 0x24; //hvalidshift

      LastDstHsize = DstHsize-DstHoff; //the last destination horizontal size
      LastSrcHsize = LastDstHsize+8; //the last source horizontal size

      XBYTE[0x276B] = M_LoByteOfWord(LastSrcHsize); //rfbhsize
      XBYTE[0x276C] = M_HiByteOfWord(LastSrcHsize); //rfbhsize
      XBYTE[0x27FA] = M_LoByteOfWord(SrcHoff); //rfbhoff
      XBYTE[0x27FB] = M_HiByteOfWord(SrcHoff); //rfbhoff

      XBYTE[0x2760] = M_LoByteOfWord(LastSrcHsize); //afbhsize
      XBYTE[0x2761] = M_HiByteOfWord(LastSrcHsize); //afbhsize
      XBYTE[0x27F6] = M_LoByteOfWord(SrcHoff); //afbhoff
      XBYTE[0x27F7] = M_HiByteOfWord(SrcHoff); //afbhoff

      XBYTE[0x2764] = M_LoByteOfWord(LastDstHsize); //bfbhsize
      XBYTE[0x2765] = M_HiByteOfWord(LastDstHsize); //bfbhsize
      XBYTE[0x27F8] = M_LoByteOfWord(DstHoff); //bfbhoff
      XBYTE[0x27F9] = M_HiByteOfWord(DstHoff); //bfbhoff

      XBYTE[0x2000] = 0x00; //set to idle mode
      XBYTE[0x2000] = 0x02; //set to dsc mode
      XBYTE[0x27A1] = 0x10; //start CDSP

//      PRINT_CDSP("        L2_DoCDSP: Wait capture done (%bu)\n", CapCount);

      do
      {
        CapStatus = XBYTE[0x27B0]&0x02;
      } while(CapStatus!=0x02); // polling until capture done
    }

    if(OprMode==0) XBYTE[0x2000] = 0x00; //set to idle mode
    XBYTE[0x2105] = 0x00; //horizontal mirror disable

    //restore the parameters for raw/A/B frame buffer
    XBYTE[0x2103] = tmp03;
    XBYTE[0x270E] = tmp0E;
    XBYTE[0x2712] = tmp12;
    XBYTE[0x2749] = tmp49;

    XBYTE[0x2753] = tmp53;
    XBYTE[0x2754] = tmp54;
    XBYTE[0x2755] = tmp55;
    XBYTE[0x2756] = tmp56;
    XBYTE[0x2757] = tmp57;
    XBYTE[0x2758] = tmp58;

    XBYTE[0x2760] = tmp60;
    XBYTE[0x2761] = tmp61;
    XBYTE[0x2762] = tmp62;
    XBYTE[0x2763] = tmp63;
    XBYTE[0x2764] = tmp64;
    XBYTE[0x2765] = tmp65;
    XBYTE[0x2766] = tmp66;
    XBYTE[0x2767] = tmp67;
    XBYTE[0x2768] = tmp68;
    XBYTE[0x2769] = tmp69;
    XBYTE[0x276A] = tmp6A;
    XBYTE[0x276B] = tmp6B;
    XBYTE[0x276C] = tmp6C;
    XBYTE[0x276D] = tmp6D;
    XBYTE[0x276E] = tmp6E;

    XBYTE[0x27F0] = tmpF0;
    XBYTE[0x27F1] = tmpF1;
    XBYTE[0x27F2] = tmpF2;
    XBYTE[0x27F3] = tmpF3;
    XBYTE[0x27F4] = tmpF4;
    XBYTE[0x27F5] = tmpF5;
    XBYTE[0x27F6] = tmpF6;
    XBYTE[0x27F7] = tmpF7;
    XBYTE[0x27F8] = tmpF8;
    XBYTE[0x27F9] = tmpF9;
    XBYTE[0x27FA] = tmpFA;
    XBYTE[0x27FB] = tmpFB;
    XBYTE[0x27FC] = tmpFC;
    XBYTE[0x27FD] = tmpFD;

    status = L2K_SUCCESS;
  }
  //Turn back CCDTG , add by ygliu///////////////////////////////////////
  XBYTE[0x2080] = tgen;		//Enablt TG PLL
  XBYTE[0x2A81] = clk1xdiv;     //Set Clk1xDiv
  XBYTE[0x2A82] = clk2xdiv;     //Set Clk2xDiv
  XBYTE[0x2A83] = phase1;
  XBYTE[0x2023] = phase2;
  XBYTE[0x2022] = phase3;
  //////////////////////////////////////////////////////////////////////
  // return
  PRINT_L2("        L2_DoCDSP: Exit\n");

  return(status);
}

#ifdef TestModeEn

//-----------------------------------------------------------------------------
//L2_TestCDSP
//-----------------------------------------------------------------------------
/*
routine description:
  CDSP module test.

arguments:
  TestLevel: the level of test
          0: all test
          1: register read/write test
          2: SRAM test

return value:
  0x00   - success
  0x01   - general error
  0x02   - parameter error
  others - error
*/

UCHAR L3_TestCDSPSRAM(UCHAR SramNum, UCHAR PageNum, UCHAR ByteNum, UCHAR Mask) USING_0
{
  USHORT tmp;
  UCHAR status;

  status = L2K_SUCCESS;

  //body
  PRINT_L2("            L3_TestCDSPSRAM: Enter\n");

  //test SRAM
  XBYTE[0x2101] = SramNum;

  //page0, byte0
  XBYTE[0x2102] = (PageNum<<4)|ByteNum;

  // test SRAM enable
  XBYTE[0x20E0] = 0x02;

  //test read/write sequence data (write)
  for(tmp=0; tmp<256; tmp++)
    XBYTE[0x2100+tmp] = tmp;

  for(tmp=0; tmp<256 ; tmp++)
    if(XBYTE[0x2100+tmp]!=(UCHAR)tmp&Mask)
      status = 1;

  //test 0x00->0xFF
  for(tmp=0; tmp<256; tmp++)
    XBYTE[0x2100+tmp] = 0xFF;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -