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

📄 dpof.c

📁 台湾凌阳方案300万数码相机源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
     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 + -