📄 main.c
字号:
XBYTE[0x2000] = 0x00;
//Joe@2003.3.12 9:22 add end
//patch4.5@richie@isp upload mode
XBYTE[0x2000] = 0x06;
//richie@0125
XBYTE[0x25a1] = K_USB_AP_OUT_OPEN;//0x10;
//patch5.0@richie@usbisp begin
UI_PrintOSDString("Dnld.0000/", 0, 1, UI_MENU_BG_COLOR_ON | UI_MENU_TITLE_TEXT_COLOR);
UI_PrintOSDNumber(G_ISPSecCnt, 10, 1, 4);
//patch5.0@richie@usbisp end
while (G_BulkSize > 1024)
{
L2_SetUSBDMA(K_USB_AP_DMA_OUT, K_DMA_UsbDontCare);//for ap
L2_SetDRAMDMA(G_BulkDRAMAddr + (dSize / 2));
//async
L2_DoDMA(K_DMA_USB,K_DMA_DRAM,1024,1,0);
for (bi = 0;bi < 16;bi++)
{
while (XBYTE[K_USB_AP_OUT_BUF_SIZE] > 0) ; //wait for 0 in bulk buffer
XBYTE[0x25a1] = K_USB_AP_OUT_OPEN;//0x10;//open bulk out
while ((XBYTE[0x25c2] & K_USB_AP_OUT_ACK_MASK) == 0) ; //wait pc ack
XBYTE[0x25c2] = XBYTE[0x25c2] & K_USB_AP_OUT_ACK_RESET;//reset 0x25c2
}
while (XBYTE[K_USB_AP_OUT_BUF_SIZE] > 0) ; //wait for 0 in bulk buffer
G_BulkSize -= 1024;
dSize += 1024;
//patch5.0@richie@usbisp begin
UI_PrintOSDNumber((G_ISPSecCnt - (G_BulkSize / 256)), 5, 1, 4);
//patch5.0@richie@usbisp end
}
if (G_BulkSize > 0)
{
L2_SetUSBDMA(K_USB_AP_DMA_OUT, K_DMA_UsbDontCare);//for ap
L2_SetDRAMDMA(G_BulkDRAMAddr + (dSize / 2));
//async
L2_DoDMA(K_DMA_USB,K_DMA_DRAM,G_BulkSize,1,0);
for (bi = 0;bi < (G_BulkSize/64);bi++)
{
while (XBYTE[K_USB_AP_OUT_BUF_SIZE] > 0) ; //wait for 0 in bulk buffer
XBYTE[0x25a1] = K_USB_AP_OUT_OPEN;//0x10;//open bulk out
while ((XBYTE[0x25c2] & K_USB_AP_OUT_ACK_MASK) == 0) ; //wait pc ack
XBYTE[0x25c2] = XBYTE[0x25c2] & K_USB_AP_OUT_ACK_RESET;//reset 0x25c2
}
while (XBYTE[K_USB_AP_OUT_BUF_SIZE] > 0) ; //wait for 0 in bulk buffer
}
//patch5.0@richie@usbisp begin
UI_PrintOSDNumber(G_ISPSecCnt, 5, 1, 4);
//UI_PrintOSDString(" ", 0, 1, UI_MENU_BG_COLOR_ON | UI_MENU_TITLE_TEXT_COLOR);
//patch5.0@richie@usbisp end
//patch4.3@richie@je0531 begin check SUNP flag in DRAM
//patch4.4@richie@isp for osdfont offset
L2_DRAMSetStartAddr(G_ISPDRAMAddr + (0xF0 >> 1),1);
L2_DRAMReadWord(&tmp1,&tmp2);
L2_DRAMReadWord(&tmp3,&tmp4);
if ( (tmp1 == 'S') && (tmp2 == 'u') && (tmp3 == 'N') && (tmp4 == 'p')
&& (G_ISP == 1) && (G_ucISPCheck1 == 0x55) && (G_ucISPCheck2 == 0xAA) )
{
//DbgPrint("MAIN_PreDpc: ISP begin\n");
G_ucISPCheck2 = 0xBB;
//patch4.5@richie@checksum isp begin
#if (ISPCHECKSUM_OPTION)
{
ULONG len,i;
WORD checksum;
ULONG binLen;
checksum = 0;
L2_DRAMSetStartAddr(G_ISPDRAMAddr,1);
printf("checksum begin\n");
binLen = (ULONG)G_ISPSecCnt << 7;
for (i = 0;i < binLen;i++)
{
L2_DRAMReadWord(&tmp1,&tmp2);
checksum += tmp1;
checksum += tmp2;
}
printf("i = %ld,checksum (word) = %x,G_usISPCheckSum = %x\n",i,checksum,G_usISPCheckSum);
if (G_usISPCheckSum != checksum)
{
UI_PrintOSDString(" Dram CheckSum ", 0, 1, UI_MENU_BG_COLOR_ON | UI_MENU_TITLE_TEXT_COLOR);
UI_PrintOSDString(" ", 0, 2, UI_MENU_BG_COLOR_ON | UI_MENU_TITLE_TEXT_COLOR);
UI_PrintOSDULong ((ULONG)checksum , 0, 2, UI_MENU_BG_COLOR_ON | UI_MENU_TITLE_TEXT_COLOR);
UI_PrintOSDString(" 0x" , 0, 2, UI_MENU_BG_COLOR_ON | UI_MENU_TITLE_TEXT_COLOR);
UI_PrintOSDString(" ", 0, 3, UI_MENU_BG_COLOR_ON | UI_MENU_TITLE_TEXT_COLOR);
UI_PrintOSDString(" CheckSum Err ", 0, 4, UI_MENU_BG_COLOR_ON | UI_MENU_TITLE_TEXT_COLOR);
while (1) ;
}
}
#endif
//patch4.5@richie@checksum isp end
L1_ISP(G_ISPDRAMAddr, G_ISPROMAddr, G_ISPSecAddr, G_ISPSecCnt);
}
else
{
//DbgPrint("MAIN_PreDpc: ISP Download to DRAM fail\n");
//patch4.4@richie@isp for download fail
UI_PrintOSDString(" FAIL ", 0, 4, UI_MENU_BG_COLOR_ON | UI_MENU_TITLE_TEXT_COLOR);
while (1) ;
G_ISP = 0;
EA = 1;
}
//patch4.3@richie@je0531 end check SUNP flag in DRAM
}
//richie@isp0426 mark
/*
if ((G_ISP == 1) && (G_LastBulk == 1))
{
G_LastBulk = 0;
G_ISP = 1;
DbgPrint("MAIN_PreDpc: ISP has begun\n");
//richie@isp 0326
EA = 0;
L1_ISP(G_ISPDRAMAddr, G_ISPROMAddr, G_ISPSecAddr, G_ISPSecCnt);
}
*/
}
//richie@si0418
//if (G_ui_status == K_UI_mass_storage)
if ( ((G_UIStatus & 0xff00) == K_UISTATUS_USBMODE_MASS) //yichang@replace
&& (G_CameraOptions.Storage == K_UIOPTION_STORAGE_MSDC) )
//richie@mi 0409
USBMSDC_ReadWriteData();
//richie@si0418
#if (USBSIDC_OPTION == 1)
//if (G_ui_status == K_UI_still_image_class)
if ( ((G_UIStatus & 0xff00) == K_UISTATUS_USBMODE_MASS) //yichang@replace
&& (G_CameraOptions.Storage == K_UIOPTION_STORAGE_SIDC) )
SIDC_ReadWriteData();
#endif
}
//-----------------------------------------------------------------------------
//MAIN_PostDpc
//-----------------------------------------------------------------------------
void MAIN_PostDpc(void) USING_0
/*++
Routine Description:
post-processing after deferred procedure call
Arguments:
none
Return Value:
none
--*/
{
#if AAA_OPTION
#ifdef ICM107B
//richie@ae0304
//STROBE_Charge();
#endif
#endif
}
//-----------------------------------------------------------------------------
//MAIN_EventPreDpc cch@10/15
//-----------------------------------------------------------------------------
void MAIN_EventPreDpc(void) USING_0
/*++
Routine Description:
pre-processing before deferred procedure call
Arguments:
none
Return Value:
none
--*/
{
/*
UCHAR temp_key;
L2_ConfigGPIOBit(1,0);
L2_GetGPIOBit(1,&temp_key);
//XBYTE[2038] &= 0xfd;
//temp_key = XBYTE[0x2040] & 0x02;
if(temp_key > 0)
{
G_UI_USBConnect = K_UI_USB_DISCONNECT; //yichang
////printf("USB connect=%bx\n",temp_key);
}
else
{
G_UI_USBConnect = K_UI_USB_CONNECT; //yichang
////printf("USB connect=%bx\n",temp_key);
}
*/
G_ucState &= 0xf0; //set FW idle
G_ucState2 |= 0x01; //set FW Event Ready
G_ucState |= 0x01; //set FW ready
//ada@0415 test ui
TIMER0_Stop();
// EA = 0;
/////!!! DbgPrint("MAIN_EventPreDpc: Start operation\n");
P1 = 0x00;
}
//-----------------------------------------------------------------------------
//MAIN_EventPostDpc
//-----------------------------------------------------------------------------
void MAIN_EventPostDpc(void) USING_0
/*++
Routine Description:
post-processing after deferred procedure call
Arguments:
none
Return Value:
none
--*/
{
// EA = 1;
G_bRequestLock = 0; //clear G_bRequestLock
G_ucState &= 0xf0 ; //set FW idle
//ada@0415 test ui
//patch4.2@richie@0528
if (G_UI_USBConnect == K_UI_USB_DISCONNECT)
TIMER0_Start();
/////!!! DbgPrint("MAIN_EventPostDpc: Stop operation\n");
P1 = 0xff;
}
#if AAA_OPTION
//richie@ae0304
//-----------------------------------------------------------------------------
//STROBE_Charge
//-----------------------------------------------------------------------------
#if 0 //liliuhai
void STROBE_Charge(void) USING_0
/*++
Routine Description:
check charge of strobe
Arguments:
none
Return Value:
none
--*/
{
//charge output enable
//XBYTE[0x2038] |= 0x08;
//ready output disable
//XBYTE[0x2038] &= 0xef;
//strobe tri enable
//XBYTE[0x2039] |= 0x10;
//led output enable
//XBYTE[0x203a] |= 0x08;
//led off
//XBYTE[0x2032] &= 0xf7;
//// G_ucStrobeCnt++;
//// if (G_ucStrobeCnt < 0x03) return;
//// G_ucStrobeCnt = 0;
if ((XBYTE[0x2040] & 0x10) == 0) //charge complete
{
//led on
// XBYTE[0x2032] |= 0x08;
G_ucStrobeRdy++;
if (G_ucStrobeRdy > 20)
{
//don't charge
XBYTE[0x2030] &= 0xf7;
G_ucStrobeRdy = 0;
}
}
else
{
//led off
// XBYTE[0x2032] &= 0xf7;
G_ucStrobeRdy = 0;
//yichang@replace
/*
if ((G_pvconfig[K_UI_Preview_Strobe] == K_UI_Preview_Strobe_Auto)
|| (G_pvconfig[K_UI_Preview_Strobe] == K_UI_Preview_Strobe_Fill)
|| (G_pvconfig[K_UI_Preview_Strobe] == K_UI_Preview_Strobe_Redeye))
//charge
XBYTE[0x2030] |= 0x08;
else
*/
//don't charge
XBYTE[0x2030] &= 0xf7;
}
}
#endif
#endif
//richie@mi 0409
UCHAR USBMSDC_ReadWriteData(void) USING_0
{
if (G_ucBulkPhase == K_InDataPhaseRead)
{
//patch4.5@richie@mlun begin
#if (MLUN_OPTION)
//##
MLUN_CheckCard();
#endif
//patch4.5@richie@mlun end
//patch4.2@richie@0528 marked
//TIMER0_Stop();
//richie@mi 0409
XBYTE[0x25d2] &= K_USB_CLASS_IN_ACK_RESET; //Bulk in 1 acked interrupt disable
P1 = 0xf5;
DOS_ReadMoreSector(K_DOS_DstUsb,G_USBMSDC_ulLogicalBlockAddress,G_USBMSDC_ulSdramBufferAddress,G_ulStorDataLength);
P1 = 0xff;
G_USBMSDC_ucSenseCodeIdx = 0x00;
G_USBMSDC_ucCSWStatus = K_USBMSDC_CommandPassed;
USBMSDC_SendStatus();
G_ucBulkPhase = K_InCompletionPhase;
XBYTE[0x25a1] |= K_USB_CLASS_IN_OPEN;//0x01; //open bulk in to send status
XBYTE[0x25d2] |= K_USB_CLASS_IN_ACK_MASK; //Bulk in 1 acked interrupt enable
//patch4.2@richie@0528 marked
//TIMER0_Start();
}
else if (G_ucBulkPhase == K_OutDataPhaseWrite)
{
//patch4.5@richie@mlun begin
#if (MLUN_OPTION)
//##
MLUN_CheckCard();
#endif
//patch4.5@richie@mlun end
//patch4.2@richie@0528 marked
//TIMER0_Stop();
//richie@mi 0409
XBYTE[0x25d2] &= K_USB_CLASS_OUT_ACK_RESET; //Bulk out 1 acked interrupt disable
P1 = 0x5f;
DOS_WriteMoreSector(K_DOS_DstUsb,G_USBMSDC_ulLogicalBlockAddress,G_USBMSDC_ulSdramBufferAddress,G_ulStorDataLength);
P1 = 0xff;
G_USBMSDC_ucSenseCodeIdx = 0x00;
G_USBMSDC_ucCSWStatus = K_USBMSDC_CommandPassed;
USBMSDC_SendStatus();
G_ucBulkPhase = K_InCompletionPhase;
XBYTE[0x25a1] |= K_USB_CLASS_IN_OPEN;//0x01; //open bulk in to send status
XBYTE[0x25d2] |= K_USB_CLASS_OUT_ACK_MASK; //Bulk out 1 acked interrupt enable
//patch4.2@richie@0528 marked
//TIMER0_Start();
}
return TRUE;
}
UCHAR USBMSDC_SendStatus(void) USING_0
{
PUSBMSDC_CSW pCSW;
UCHAR i;
pCSW = (PUSBMSDC_CSW) G_ucStorData;
//richie@1129
pCSW->dCSWSignature = 0x55534253;
pCSW->dCSWTag = G_USBMSDC_pCBW->dCBWTag;
//???
pCSW->dCSWDataResidue = 0;//M_ByteSwapOfDword(G_USBMSDC_ulAllocateLength - G_ulStorDataIndex);
pCSW->bCSWStatus = G_USBMSDC_ucCSWStatus;
for (i = 0; i < K_USBMSDC_CSW_SIZE; i++)
XBYTE[K_USB_CLASS_IN_DATA] = G_ucStorData[i];
return TRUE;
}
// wyeo@0521, patch 4.2
#if (NANDF_OPTION == 1 && CARD_OPTION == 1)
#include "asicreg.h"
#if K_TEST_RESERVE_BLOCK
xdata UCHAR G_Match;
void SDRAM_CardSetStartAddress(ULONG address, BYTE prefetch);
//-----------------------------------------------------------------------------
// TestReserveBlock
//-----------------------------------------------------------------------------
// Eample for nand reserve block testing
BYTE TestReserveBlock(void) USING_0
{
BYTE sts;
WORD k;
BYTE ent0, ent1;
BYTE match;
ULONG ramAddr;
BYTE blkNumber;
BYTE pageNumber;
BYTE pageCount;
G_Match =0;
match = FALSE;
// use dram address at 0 for temporary buffer
ramAddr = 0x0;
// Don't turn this part on, unless you have reformat the nand using
// this 4.2 version code. Older version just reserve 0th block.
// This part of code write block 7.
#if 0
blkNumber = 7;
pageNumber = 8;
pageCount = 1;
SDRAM_CardSetStartAddress(ramAddr, FALSE);
// set dram to 0, 255
for (k=0; k < 256; k+=2)
{
M_DRAM_WriteWord(k, k+1);
}
// write block 7, page 8
sts = TRUE;
sts = NANDF_AccessReserveBlock(K_NANDF_Reserve_DramToFlash, blkNumber, pageNumber, pageCount, ramAddr);
if (sts)
{
// clear dram
SDRAM_CardSetStartAddress(ramAddr, FALSE);
for (k=0; k < 256; k+=2)
{
M_DRAM_WriteWord(0, 0);
}
// read block 7, page 8
sts = NANDF_AccessReserveBlock(K_NANDF_Reserve_FlashToDram, blkNumber, pageNumber, pageCount, ramAddr);
if (sts)
{
// compare if read back page is 0 to 255
SDRAM_CardSetStartAddress(ramAddr, TRUE);
match = TRUE;
for (k=0; k < 256; k+=2)
{
M_DRAM_ReadWord(ent0, ent1);
if (ent0 != k)
match = FALSE;
if (ent1 != k+1)
match = FALSE;
DbgPrint("7th block %bx\n", ent0);
DbgPrint("7th block %bx\n", ent1);
}
if (match)
G_Match = 1;
}
}
#endif
// use sram address G_ucDataBuffer as temporary buffer
// write 0th block
#if 1
match = FALSE;
blkNumber = 0;
pageNumber = 8;
pageCount = 1;
// set sram to 0, 255
for (k=0; k < 256; k++)
G_ucStorData[k]=k;
// write block 0, page 8
sts = TRUE;
sts = NANDF_AccessReserveBlock(K_NANDF_Reserve_SramToFlash, blkNumber, pageNumber, pageCount, 0x0);
if (sts)
{
// clear sram
for (k=0; k < 256; k++)
G_ucStorData[k]=0;
// read block 0, page 8
sts = NANDF_AccessReserveBlock(K_NANDF_Reserve_FlashToSram, blkNumber, pageNumber, pageCount, 0x0);
if (sts)
{
// compare if read back page is 0 to 255
match = TRUE;
for (k=0; k < 256; k++)
{
DbgPrint("0th block %bx\n", G_ucStorData[k]);
if (G_ucStorData[k] != k)
match = FALSE;
}
if (match)
G_Match++;
}
}
#endif
DbgPrint("TestReserveBlock: %bd\n", G_Match);
return sts;
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -