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

📄 dpof.c

📁 台湾凌阳方案300万数码相机源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/*++

Copyright (c) 2001 Sunplus Technology Co., Ltd.

Module Name:

        dpof.c

Abstract:

        Module related to chip initialization

Environment:

        Keil C51 Compiler

Revision History:

        04/01/2002      Leeada    created

--*/

//=============================================================================
//Header file
//=============================================================================
//patch3.2@ada@0401 For DPOF
#include "general.h"

#include "dpof.h"
#include "dpofcon.h"
#include "doslink.h"
#include "dosusr.h"
#include "doserr.h"
#include "initio.h"
#include "main.h"
#include "sdramhw.h"
#include "cardfunc.h"
#include "cardcon.h"
#include "cardlink.h"
#include "exifhdr.h"
#include "cardui.h"

//=============================================================================
//Symbol
//=============================================================================

//-----------------------------------------------------------------------------
//Constant
//-----------------------------------------------------------------------------
     
//-----------------------------------------------------------------------------
//Variable
//-----------------------------------------------------------------------------
USHORT G_DPOF_Dir0Cluster;
ULONG PreviousDpofFileDramAddr;
ULONG PreviousDpofFileByteCount;
ULONG NewDpofFileDramAddr;
ULONG NewDpofFileByteCount;
USHORT NewDpofJobSectionPRTPID;
USHORT TotalSunplusDpofFileNumber;
UCHAR Dpof_File_Modify;
UCHAR Need_Build_DpofFloder;
UCHAR Other_DpofJobSection_Exist;

//patch4.5@ada@Fix DPOF error begin
//UCHAR DpofDir1Name[8];
UCHAR DpofDir1Name[9];
//patch4.5@ada@Fix DPOF error end

//UCHAR DpofFileName[4];

//=============================================================================
//Program
//=============================================================================

//-----------------------------------------------------------------------------
//DPOF_SetDpofDir0Name
//-----------------------------------------------------------------------------
void DPOF_SetDpofDir0Name(UCHAR* name) USING_0
{
     UCHAR i;

	for (i = 0; i < 12; i++)
     {          
    	     name[i]  = DPOF_Dir0Name[i];
     }
}

//-----------------------------------------------------------------------------
//DPOF_SetDpofFileName
//-----------------------------------------------------------------------------
void DPOF_SetDpofFileName(UCHAR* name) USING_0
{
     UCHAR i;

     for (i = 0; i < 12; i++)
     {
	    name[i] = DPOF_FileName[i];
     }
}

//-----------------------------------------------------------------------------
//DPOF_ClearDramDpofArea
//-----------------------------------------------------------------------------
//version4.0@ada@0513 for DPOF
void DPOF_ClearDramDpofArea(void) USING_0
{
     L2_FillDRAM(K_SDRAM_DPOF1_BufAddr,(USHORT)(K_SDRAM_DPOF1_BufSize / 2),0x00,0x00);
     L2_FillDRAM(K_SDRAM_DPOF1_BufAddr + (K_SDRAM_DPOF1_BufSize / 2),(USHORT)(K_SDRAM_DPOF1_BufSize / 2),0x00,0x00);
     //L2_FillDRAM(K_SDRAM_DPOF2_BufAddr,(USHORT)K_SDRAM_DPOF2_BufSize,0x00,0x00);
     L2_FillDRAM(K_SDRAM_DPOF3_BufAddr,(USHORT)(K_SDRAM_DPOF3_BufSize / 2),0x00,0x00);
     L2_FillDRAM(K_SDRAM_DPOF3_BufAddr + (K_SDRAM_DPOF3_BufSize / 2),(USHORT)(K_SDRAM_DPOF3_BufSize / 2),0x00,0x00);
     L2_FillDRAM(K_SDRAM_DPOF4_BufAddr,(USHORT)(K_SDRAM_DPOF4_BufSize / 2),0x00,0x00);
     L2_FillDRAM(K_SDRAM_DPOF4_BufAddr + (K_SDRAM_DPOF4_BufSize / 2),(USHORT)(K_SDRAM_DPOF4_BufSize / 2),0x00,0x00);
}

//-----------------------------------------------------------------------------
//DPOF_GetDpofDir1Name
//-----------------------------------------------------------------------------
//version4.0@ada@0513 for DPOF
void DPOF_GetDpofDir1Name(void) USING_0
{
     UCHAR tmp1;

     //version4.0@ada@0513 for Multi-Directory
     #if (SINGLE_DIRECTORY == 0)
     UCHAR i,tmp2;
     #endif

     #if (SINGLE_DIRECTORY)
     tmp1 = (UCHAR)(G_USR_Dir1Count / 100);
     DpofDir1Name[0] = tmp1 + '0';
     DpofDir1Name[1] = (UCHAR)((G_USR_Dir1Count % 100) / 10) + '0';
     DpofDir1Name[2] = (UCHAR)(G_USR_Dir1Count % 10) + '0';

     //patch4.4@ada@DPOF begin
     DpofDir1Name[3] = C_USR_Dir0Name[0];
     DpofDir1Name[4] = C_USR_Dir0Name[1];
     DpofDir1Name[5] = C_USR_Dir0Name[2];
     DpofDir1Name[6] = C_USR_Dir0Name[3];
     DpofDir1Name[7] = C_USR_Dir0Name[4];

     /*
     DpofDir1Name[3] = 'M';
     DpofDir1Name[4] = 'E';
     DpofDir1Name[5] = 'D';
     DpofDir1Name[6] = 'I';
     DpofDir1Name[7] = 'A';
     */
     //patch4.4@ada@DPOF end
     
     #else
     //patch4.4@ada@DirectoryIndexOrder begin
     //L2_DRAMSetStartAddr((K_SDRAM_DcfDirBufAddr + ((ULONG)G_USR_Dir1CountIndex - 1) * 7 + 3),K_SDRAM_Prefetch);               
     L2_DRAMSetStartAddr((K_SDRAM_DcfDirBufAddr + ((ULONG)G_USR_Dir1Count - 100) * 8 + 2),K_SDRAM_Prefetch);               
     //patch4.4@ada@DirectoryIndexOrder end

     for (i = 0; i < 8; i += 2)
     {
          L2_DRAMReadWord(&tmp1,&tmp2);     
	     DpofDir1Name[i] = tmp1;
	     DpofDir1Name[i + 1] = tmp2;
          //printf("DpofDir1Name[%bd] = %c\n",i,DpofDir1Name[i]);
          //printf("DpofDir1Name[%bd] = %c\n",i + 1,DpofDir1Name[i + 1]);
     }
     #endif
}

//-----------------------------------------------------------------------------
//DPOF_DirInitialize
//-----------------------------------------------------------------------------
UCHAR DPOF_DirInitialize(void) USING_0
{
     UCHAR sts = TRUE;
     UCHAR name[12];
     USHORT startCluster;

     //printf("DPOF initialize\n");

     NewDpofJobSectionPRTPID = 1;
     TotalSunplusDpofFileNumber = 0;
     Dpof_File_Modify = 0;
     PreviousDpofFileByteCount = 0;
     PreviousDpofFileDramAddr = 0;
     NewDpofFileByteCount = (ULONG)K_DPOF_HDR_SIZE;
     NewDpofFileDramAddr = K_SDRAM_DPOF4_BufAddr + (NewDpofFileByteCount >> 1);
     Need_Build_DpofFloder = 0;
     Other_DpofJobSection_Exist = 0;

     DPOF_SetDpofDir0Name(name);

     DPOF_GetDpofDir1Name();

     DPOF_CheckJpgFileExist();

     if ((startCluster = DOS_RootFindName(name)) > 0)
     {
          //printf("MISC is found\n");
          G_DPOF_Dir0Cluster = startCluster;

          DOS_SetCurrDir(startCluster);

          DPOF_FileInitialize();

          //Back to .\DCIM\******** folder
          DOS_SetCurrDir(G_USR_Dir1Cluster);
     }
     else
     {
          Need_Build_DpofFloder = 1;
     }

     return sts;
}

//patch4.4@ada@DPOF begin
//-----------------------------------------------------------------------------
//DPOF_FileInitialize
//-----------------------------------------------------------------------------
void DPOF_CheckJpgFileExist(void) USING_0
{
     //patch4.4@ada@DPOF begin
     UCHAR tmp1,tmp2;
     USHORT NowFileIndex;
     //patch4.4@ada@DPOF end

     DPOF_ClearDramDpofArea();

     NowFileIndex = G_USR_FirstFileIndex;

     //printf("G_USR_FirstFileIndex = %d\n",G_USR_FirstFileIndex);
     //printf("G_USR_FileCount = %d\n",G_USR_FileCount);

     if (G_USR_FileCount > 0)
     {
          do
          {  
			//patch4.5@ada@Record DCF file name begin
               L2_DRAMSetStartAddr((K_SDRAM_JPG_FdbParameterBufAddr + (((ULONG)NowFileIndex) - 1) * 10 + 2),K_SDRAM_Prefetch);         
               //L2_DRAMSetStartAddr((K_SDRAM_JPG_FdbParameterBufAddr + (((ULONG)NowFileIndex) - 1) * 8 + 2),K_SDRAM_Prefetch);         
			//patch4.5@ada@Record DCF file name end

               L2_DRAMReadWord(&tmp1,&tmp2);           
               //printf("tmp1 = %bd, tmp2 = %bd\n",tmp1,tmp2);

               //check file type
               if (tmp2 == K_USR_JPG_TYPE)
               {
                    //printf("File %d exist\n",NowFileIndex);
                    L2_DRAMSetStartAddr((K_SDRAM_DPOF3_BufAddr + (((ULONG)NowFileIndex) - 1) * 3),K_SDRAM_NoPrefetch);         
                    L2_DRAMWriteWord(0xff,0x00);
               }

			//patch4.5@ada@Record DCF file name begin
               L2_DRAMSetStartAddr((K_SDRAM_JPG_FdbParameterBufAddr + (((ULONG)NowFileIndex) - 1) * 10 + 9),K_SDRAM_Prefetch);         
               //L2_DRAMSetStartAddr((K_SDRAM_JPG_FdbParameterBufAddr + (((ULONG)NowFileIndex) - 1) * 8 + 7),K_SDRAM_Prefetch);         
			//patch4.5@ada@Record DCF file name end

               L2_DRAMReadWord(&tmp1,&tmp2);              
               NowFileIndex = (USHORT)tmp1 | (((USHORT)tmp2) << 8);

          } while (NowFileIndex > 0);
     }
}
//patch4.4@ada@DPOF end

//-----------------------------------------------------------------------------
//DPOF_FileInitialize
//-----------------------------------------------------------------------------
//version4.0@ada@0513 for DCF
UCHAR DPOF_FileInitialize(void) USING_0    
{
     UCHAR sts = TRUE;
     USHORT fHandle;

	M_DOS_ClearError();

     //If AUTPRINT.MRK file exists,then temprarily put it to
     //DRAM address K_SDRAM_DPOF1_BufAddr(K_SDRAM_DPOF1_BufSize words range)
     //If AUTPRINT.MRK file does not exist,then create one.
     //and temperarily read to DRAM address K_SDRAM_DPOF1_BufAddr

     if (DPOF_OpenDpofFile(DPOF_FileName,&fHandle,0) == TRUE)
     {
          //printf("Open the DPOF file\n");
          DPOF_RecordDpofJobSection();
     }

     if (fHandle)
     {
          File_Close(fHandle, DPOF_FileName, K_DOS_ReadFile, 0);
     }

     return sts;
}

//-----------------------------------------------------------------------------
//DPOF_OpenDpofFile
//-----------------------------------------------------------------------------
UCHAR DPOF_OpenDpofFile(UCHAR *name,USHORT *fHandle,USHORT startCluster) USING_0
{
     UCHAR sts = FALSE;

     *fHandle = File_Open(name,K_DOS_ReadFile,startCluster);

     //Only 256k bytes DRAM area is reserved for loading AUTPRINT.MRK
     if ((*fHandle) & (G_DOS_FileSize <= 0x00040000))
     {
          sts = M_Card_File_Read(*fHandle,K_DOS_DstDram,G_DOS_FileSize,K_SDRAM_DPOF1_BufAddr,0);   
     }

     return sts;
}

//-----------------------------------------------------------------------------
//DPOF_WriteDpofFileHeaderSection
//-----------------------------------------------------------------------------
//patch3.2@ada@0401 For Date & Time Update
void DPOF_WriteDpofFileHeaderSection(void) USING_0 
{
     UCHAR i;
     UCHAR tmp1,tmp2;

     //Load Sunplus default components of DPOF file header section,including GEN_REV,GEN_CRT,GEN_DTM
     for (i = 0; i < K_DPOF_HDR_SIZE; i++)
     {
          G_ucStorData[i] = DPOF_HeaderSectionContent[i];
     }

     //ada@0401 For Date & Time Update
     USR_UpdateRtcTime();

     L2_RTCTransferText(&G_DATEINFO,&G_ucStorData[K_DPOF_HDR_GEN_DTM_START_INDEX]);

⌨️ 快捷键说明

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