📄 dpof.c
字号:
L2_DRAMSetStartAddr(K_SDRAM_DPOF4_BufAddr,K_SDRAM_NoPrefetch);
for (i = 0; i < (K_DPOF_HDR_SIZE >> 1); i++)
{
L2_DRAMWriteWord(G_ucStorData[i * 2],G_ucStorData[i * 2 + 1]);
}
if (K_DPOF_HDR_SIZE & 0x0001)
{
L2_DRAMSetStartAddr((K_SDRAM_DPOF4_BufAddr + (K_DPOF_HDR_SIZE >> 1)),K_SDRAM_Prefetch);
L2_DRAMReadWord(&tmp1,&tmp2);
L2_DRAMSetStartAddr((K_SDRAM_DPOF4_BufAddr + (K_DPOF_HDR_SIZE >> 1)),K_SDRAM_NoPrefetch);
L2_DRAMWriteWord(G_ucStorData[K_DPOF_HDR_SIZE - 1],tmp2);
}
}
//-----------------------------------------------------------------------------
//DPOF_RecordDpofJobSection
//-----------------------------------------------------------------------------
UCHAR DPOF_RecordDpofJobSection(void) USING_0
{
ULONG NewDramAddr;
ULONG ByteCount;
UCHAR sts = TRUE;
ULONG JobSection_StartDramAddr = 0;
ULONG JobSection_StartByteCount = 0;
ULONG JobSection_EndDramAddr = 0;
ULONG JobSection_EndByteCount = 0;
ULONG JobSection_Length = 0;
ULONG JobSection_TmpDramAddr = 0;
ULONG JobSection_TmpByteCount = 0;
USHORT PrtPid;
UCHAR PrtTyp;
USHORT PrtQty;
UCHAR ImgFmt;
USHORT ImgSrcIdx;
ULONG TmpByteCount;
ULONG DpofTmpDramAddr;
UCHAR tmp1,tmp2,tmp3,tmp4;
NewDramAddr = K_SDRAM_DPOF1_BufAddr;
ByteCount = 0;
while ((ByteCount < (G_DOS_FileSize - 2)) && (sts == TRUE))
{
if (DPOF_FindDpofJobSection(&NewDramAddr,&ByteCount,&JobSection_StartDramAddr,&JobSection_StartByteCount))
{
JobSection_TmpDramAddr = NewDramAddr; //Backup
JobSection_TmpByteCount = ByteCount;
PrtPid = 0;
PrtTyp = 0;
PrtQty = 0;
ImgFmt = 0;
ImgSrcIdx = 0;
//This job section is created by this camera
if (DPOF_FindDpofIMGSRC(&NewDramAddr,&ByteCount,&ImgSrcIdx))
{
//printf("TotalSunplusDpofFileNumber + 1\n");
TotalSunplusDpofFileNumber += 1;
NewDramAddr = JobSection_TmpDramAddr; //Restore
ByteCount = JobSection_TmpByteCount;
if (DPOF_FindDpofPRTPID(&NewDramAddr,&ByteCount,&PrtPid))
{
if (DPOF_FindDpofPRTTYP(&NewDramAddr,&ByteCount,&PrtTyp))
{
if (DPOF_FindDpofPRTQTY(&NewDramAddr,&ByteCount,&PrtQty))
{
if (DPOF_FindDpofIMGFMT(&NewDramAddr,&ByteCount,&ImgFmt))
{
//patch4.5@ada@Not necessary call begin
//DPOF_FindDpofIMGSRC(&NewDramAddr,&ByteCount,&ImgSrcIdx);
//patch4.5@ada@Not necessary call end
if (DPOF_CheckDpofJobFileExist(ImgSrcIdx))
{
DPOF_RecordDpofJobParameter(ImgSrcIdx,/*PrtPid,*/PrtTyp,PrtQty,ImgFmt);
}
//version4.0@ada@0513 for DPOF
else
{
Dpof_File_Modify = 1;
}
}
else
{
sts = FALSE;
}
}
else
{
sts = FALSE;
}
}
else
{
sts = FALSE;
}
}
else
{
sts = FALSE;
}
}
else //This job section is created by other camera
{
NewDramAddr = JobSection_TmpDramAddr; //Restore
ByteCount = JobSection_TmpByteCount;
DPOF_ModifyDpofPRTPID(NewDramAddr,ByteCount);
//Copy area between two JOB heads
if (DPOF_FindDpofJobSection(&NewDramAddr,&ByteCount,&JobSection_EndDramAddr,&JobSection_EndByteCount))
{
JobSection_Length = (JobSection_EndByteCount - JobSection_StartByteCount);
DPOF_CopyJobSection(JobSection_StartDramAddr,JobSection_Length,(JobSection_StartByteCount - 1));
NewDramAddr = JobSection_TmpDramAddr; //Restore
ByteCount = JobSection_TmpByteCount;
}
else //Copy area from this JOB head to the end of the file
{
JobSection_Length = ((G_DOS_FileSize + 1) - JobSection_StartByteCount);
DPOF_CopyJobSection(JobSection_StartDramAddr,JobSection_Length,(JobSection_StartByteCount - 1));
TmpByteCount = (NewDpofFileByteCount - 2);
DpofTmpDramAddr = K_SDRAM_DPOF4_BufAddr + (TmpByteCount >> 1);
if (TmpByteCount & 0x00000001)
{
L2_DRAMSetStartAddr(DpofTmpDramAddr,K_SDRAM_Prefetch);
L2_DRAMReadWord(&tmp1,&tmp2);
L2_DRAMReadWord(&tmp3,&tmp4);
if ((tmp2 != 0x0d) && (tmp3 != 0x0a)) //File ended with no 0x0d & 0x0a
{
NewDpofFileDramAddr = K_SDRAM_DPOF4_BufAddr + (NewDpofFileByteCount >> 1);
L2_DRAMSetStartAddr(NewDpofFileDramAddr,K_SDRAM_Prefetch);
L2_DRAMReadWord(&tmp1,&tmp2);
L2_DRAMSetStartAddr(NewDpofFileDramAddr,K_SDRAM_NoPrefetch);
L2_DRAMWriteWord(tmp1,0x0d);
L2_DRAMWriteWord(0x0a,0x00);
NewDpofFileByteCount += 2;
NewDpofFileDramAddr = K_SDRAM_DPOF4_BufAddr + (NewDpofFileByteCount >> 1);
}
}
else
{
L2_DRAMSetStartAddr(DpofTmpDramAddr,K_SDRAM_Prefetch);
L2_DRAMReadWord(&tmp1,&tmp2);
if ((tmp1 != 0x0d) && (tmp2 != 0x0a))
{
NewDpofFileDramAddr = K_SDRAM_DPOF4_BufAddr + (NewDpofFileByteCount >> 1);
L2_DRAMSetStartAddr(NewDpofFileDramAddr,K_SDRAM_NoPrefetch);
L2_DRAMWriteWord(0x0d,0x0a);
NewDpofFileByteCount += 2;
NewDpofFileDramAddr = K_SDRAM_DPOF4_BufAddr + (NewDpofFileByteCount >> 1);
}
}
break;
}
}
}
}
if (Other_DpofJobSection_Exist)
{
PreviousDpofFileByteCount = NewDpofFileByteCount;
PreviousDpofFileDramAddr = NewDpofFileDramAddr;
}
return sts;
}
//-----------------------------------------------------------------------------
//DPOF_WriteSunplusImageField
//-----------------------------------------------------------------------------
void DPOF_WriteSunplusImageField(void) USING_0
{
UCHAR PrtTyp;
USHORT PrtQty;
UCHAR ImgFmt;
USHORT ImgSrcIdx;
USHORT i;
UCHAR tmp1,tmp2,tmp3,tmp4;
ULONG TmpByteCount;
ULONG DpofTmpDramAddr;
TmpByteCount = NewDpofFileByteCount;
DpofTmpDramAddr = NewDpofFileDramAddr;
TmpByteCount -= 4;
DpofTmpDramAddr = K_SDRAM_DPOF4_BufAddr + (TmpByteCount >> 1);
if (TmpByteCount & 0x00000001)
{
L2_DRAMSetStartAddr(DpofTmpDramAddr,K_SDRAM_Prefetch);
L2_DRAMReadWord(&tmp1,&tmp2);
L2_DRAMReadWord(&tmp3,&tmp4);
if ((tmp2 == 0x0d) && (tmp3 == 0x0a))
{
NewDpofFileByteCount -= 2;
NewDpofFileDramAddr = K_SDRAM_DPOF4_BufAddr + (NewDpofFileByteCount >> 1);
L2_DRAMSetStartAddr(NewDpofFileDramAddr,K_SDRAM_Prefetch);
L2_DRAMReadWord(&tmp1,&tmp2);
L2_DRAMSetStartAddr(NewDpofFileDramAddr,K_SDRAM_NoPrefetch);
L2_DRAMWriteWord(tmp1,0x00);
L2_DRAMWriteWord(0x00,0x00);
}
}
else
{
L2_DRAMSetStartAddr(DpofTmpDramAddr,K_SDRAM_Prefetch);
L2_DRAMReadWord(&tmp1,&tmp2);
if ((tmp1 == 0x0d) && (tmp2 == 0x0a))
{
NewDpofFileByteCount -= 2;
NewDpofFileDramAddr = K_SDRAM_DPOF4_BufAddr + (NewDpofFileByteCount >> 1);
L2_DRAMSetStartAddr(NewDpofFileDramAddr,K_SDRAM_NoPrefetch);
L2_DRAMWriteWord(0x00,0x00);
}
}
i = TotalSunplusDpofFileNumber;
//version4.0@ada@0513 for DPOF
//patch4.5@ada@Fix DPOF bug after delete all begin
for (ImgSrcIdx = 1; ((ImgSrcIdx < 10000) && (TotalSunplusDpofFileNumber > 0)); ImgSrcIdx++)
//for (ImgSrcIdx = 1; ImgSrcIdx < 10000; ImgSrcIdx++)
//patch4.5@ada@Fix DPOF bug after delete all end
{
if (DPOF_CheckDpofJobFieldExist(ImgSrcIdx) == TRUE)
{
DPOF_ReadDpofJobParameter(ImgSrcIdx,/*&PrtPid,*/&PrtTyp,&PrtQty,&ImgFmt);
DPOF_BuildOneDpofFileJobSection(ImgSrcIdx,PrtTyp,PrtQty,ImgFmt);
i --;
if (i == 0)
{
break;
}
}
}
}
//-----------------------------------------------------------------------------
//DPOF_BuildDpofFile
//-----------------------------------------------------------------------------
//patch3.2@ada@0401 For Date & Time Update
UCHAR DPOF_BuildDpofFile(void) USING_0
{
UCHAR sts = TRUE;
UCHAR name[12];
USHORT startCluster;
//printf("Dpof_File_Modify = %bx\n",Dpof_File_Modify);
//printf("TotalSunplusDpofFileNumber = %x\n",TotalSunplusDpofFileNumber);
//printf("Other_DpofJobSection_Exist = %bx\n",Other_DpofJobSection_Exist);
if ((Dpof_File_Modify == 1) && ((TotalSunplusDpofFileNumber > 0) || (Other_DpofJobSection_Exist == 1))) //ada@0325
{
//Make MISC folder if never exists
if (Need_Build_DpofFloder)
{
DPOF_SetDpofDir0Name(name);
//ada@0401 For Date & Time Update
USR_UpdateRtcTime();
if ((startCluster = DOS_RootMakeDir(name, 1)) == 0)
{
DOS_SetCurrDir(G_USR_Dir1Cluster);
return FALSE;
}
Need_Build_DpofFloder = 0;
G_DPOF_Dir0Cluster = startCluster;
}
if (Other_DpofJobSection_Exist)
{
NewDpofFileByteCount = PreviousDpofFileByteCount;
NewDpofFileDramAddr = PreviousDpofFileDramAddr;
}
else
{
NewDpofFileByteCount = (ULONG)K_DPOF_HDR_SIZE;
NewDpofFileDramAddr = K_SDRAM_DPOF4_BufAddr + (NewDpofFileByteCount >> 1);
}
DPOF_WriteDpofFileHeaderSection();
DPOF_WriteSunplusImageField();
DPOF_SetDpofFileName(name);
DOS_SetCurrDir(G_DPOF_Dir0Cluster);
DPOF_DeleteFile(name);
//printf("Make DPOF file\n");
sts = File_Make(K_File_SrcDataDram2Card,K_SDRAM_DPOF4_BufAddr,name,NewDpofFileByteCount);
DOS_SetCurrDir(G_USR_Dir1Cluster);
}
else
{
if ((TotalSunplusDpofFileNumber == 0) && (Other_DpofJobSection_Exist == 0) && (Dpof_File_Modify == 1))
{
DPOF_SetDpofFileName(name);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -