📄 dpof.c
字号:
/*++
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 + -