void USB_Mode(void) { gb_cmd_timeout=0; set_clock_mode(CLOCK_MODE_USB); PowerOn_Init_USB(); Fill_EndpointDataTable_Into_ExRamBase(); USBInitialize(); Init_Flash_Reg(); Init_Flash_Variable(); gc_WriteProof = 0x00; InitFlash(); USB_REG[0x27] = 0x00; // 080304 jay change for new fpga GLOBAL_REG[0x17] = 0x01; // UDC O/P IE = 0x83; gdw_USB_CountDown = USB_DETECT_TIMEOUT; EA=1; while(!gc_USBRST_ISR_Detected) // Bulk_In_Out 將跳出while 迴圈 //20090630 chiayen modify { USB_PlugDetect(); if((--gdw_USB_CountDown==0)) //080925chiayen add { gb_cmd_timeout=1; break; } if(!gbt_USB_Detected) { break; } } EA=0; if(gb_cmd_timeout==1) //080925chiayen modify { USB_DisConnect(); set_clock_mode(CLOCK_MODE_MP3); InitFlash(); return; } if(!gb_cmd_timeout) { LCM_clear(); LCM_Disp_PC(); LCM_Disp_PCConnect(); LCM_Disp_MyMP3Logo(); } for(;;) { USB_PlugDetect(); if(!gbt_USB_Detected) {//usb connected USB_DisConnect(); set_clock_mode(CLOCK_MODE_MP3); InitFlash(); break; } else { if (gc_USBStage == CBWStage) { if(gbt_USB_Connect_Flag) { //tdw_CMD_In_Count =0x02FFFFF; } else { gdw_USB_CountDown =0x01FFFF; //081208 detect charge first } EA=1; while (!gbt_USB_CMD_IN) // Bulk_In_Out 將跳出while 迴圈 { USB_PlugDetect(); if(!gbt_USB_Detected) { break; } if(gbt_USB_Connect_Flag) { if(gbt_USER_Remove_Flag) { gb_cmd_timeout=1; break; } } else { if((--gdw_USB_CountDown==0)&&(!gb_USB_ISR_Detected)) { gb_cmd_timeout=1; break; } } } EA=0; // 表示有 SCSI CMD 進入 關閉中斷避免常常進入 if((!gbt_USB_Detected)||(gb_cmd_timeout==1)) //080925chiayen modify { USB_DisConnect(); set_clock_mode(CLOCK_MODE_MP3); InitFlash(); break; } gbt_USB_CMD_IN = 0; SD_Card_Detect(); gbt_USB_Connect_Flag =1; // 081208 jay add Save_CBW_Packet(); Decode_CBW_Command(); // 解CBW和記錄相關手續 } if(gw_USBDisplayTime==0) { USB_Mode_Disp(); } if (gc_USBStage == BulkInReadSectorsStage) { USB_REG[0xD2] &= 0xDD; //Disable Bulk-Out中斷 ReadSectors(); USB_REG[0xE9] = 0x11; if (gc_ErrorCode == SET_ABRT) { gc_RequestSenseCode = 0x06; //ECC Error gdw_dCBW_DataXferLength.LW = ((LWORD)TotalXferPageNum.WD) << 9; gc_bCSWStatus = 0x01; } else if (gc_ErrorCode == ID_NOT_FND) { gc_RequestSenseCode = 0x07; //over range gdw_dCBW_DataXferLength.LW = ((LWORD)TotalXferPageNum.WD) << 9; gc_bCSWStatus = 0x01; } else { gdw_dCBW_DataXferLength.LW = 0; } gc_USBStage = CSWStage; // 進入Comand Status Wrapper } if (gc_USBStage == BulkOutWriteSectorsStage) { USB_REG[0xD2] &= 0xDD; //Disable Bulk-Out中斷 USB_REG[0x11] = 0x01; //HW auto ACK WriteSectors(); USB_REG[0x11] = 0x00; USB_REG[0xE9] = 0x22; if (gc_ErrorCode == SET_ABRT) { gc_bCSWStatus = 0x01; gc_RequestSenseCode = 0x08; // write error } else if (gc_ErrorCode == ID_NOT_FND) { gc_RequestSenseCode = 0x07; //over range gc_bCSWStatus = 0x01; } else { gc_bCSWStatus = 0x00; gc_RequestSenseCode = 0xFF; // normal } gdw_dCBW_DataXferLength.LW = 0; gc_USBStage = CSWStage; } if (gc_USBStage == BulkInResponseStage) { // '4' BulkInProcess USB_REG[0xD2] &= 0xDD; //Disable Bulk-Out中斷 if (gbt_XferNormalResponseData_or_ModeSense) { // '1':Normal if (COMD_IN[0] == 0x23) { gdw_dCBW_DataXferLength.WD[1] = 0x00; USB_REG[0x16] = 0x00; USB_REG[0x15] = 0x0C; USB_REG[0xA1] |= 0x01; while (USB_REG[0xA1] & 0x01) { USB_PlugDetect(); // 081014 Jay add for usb plug out if(!gbt_USB_Detected) break; } USB_REG[0xE9] = 0x01; } else { while (gdw_dCBW_DataXferLength.WD[1]) { if (gdw_dCBW_DataXferLength.WD[1] > 64) { gdw_dCBW_DataXferLength.WD[1] = gdw_dCBW_DataXferLength.WD[1] - 64; USB_REG[0x16] = 0x00; USB_REG[0x15] = 0x40; } else { USB_REG[0x16] = gdw_dCBW_DataXferLength.BY[2] & 0x0F; USB_REG[0x15] = gdw_dCBW_DataXferLength.BY[3]; gdw_dCBW_DataXferLength.WD[1] = 0x00; } USB_REG[0xA1] |= 0x01; while (USB_REG[0xA1] & 0x01) { //081014 Jay add for usb plug out USB_PlugDetect(); if(!gbt_USB_Detected) break; } USB_REG[0xE9] = 0x01; } } } else { if (COMD_IN[0] == 0x1A) { gdw_dCBW_DataXferLength.WD[1] = 0x00; USB_REG[0x15] = 0x04; USB_REG[0x16] = 0x00; USB_REG[0xA1] |= 0x01; while (USB_REG[0xA1] & 0x01) { //081014 Jay add for usb plug out USB_PlugDetect(); if(!gbt_USB_Detected) break; } USB_REG[0xE9] = 0x01; } else { gdw_dCBW_DataXferLength.WD[1] = 0x00; USB_REG[0x15] = 0x08; USB_REG[0x16] = 0x00; USB_REG[0xA1] |= 0x01; while (USB_REG[0xA1] & 0x01) { //081014 Jay add for usb plug out USB_PlugDetect(); if(!gbt_USB_Detected) break; } USB_REG[0xE9] = 0x01; } gbt_XferNormalResponseData_or_ModeSense = NormalResponseData;// 將預設設為一般型 } gc_USBStage = CSWStage; } if (gc_USBStage == BulkStallStage) { StallBulkRW(); gc_USBStage = CSWStage; } if (gc_USBStage == BulkInReadBufferStage) { USB_REG[0xD2] &= 0xDD; //Disable Bulk-Out中斷 NoCard_ReadSectors(); USB_REG[0xE9] = 0x11; gdw_dCBW_DataXferLength.LW = 0; gc_USBStage = CSWStage; // 進入Comand Status Wrapper } if (gc_USBStage == BulkOutWriteBufferStage) { USB_REG[0xD2] &= 0xDD; //Disable Bulk-Out中斷 USB_REG[0x11] = 0x01; //HW auto ACK NoCard_WriteSectors(); USB_REG[0x11] = 0x00; USB_REG[0xE9] = 0x22; gdw_dCBW_DataXferLength.LW = 0; gc_USBStage = CSWStage; } if (gc_USBStage == CSWStage) { gc_USBStage = CBWStage; // 重新準備收下一筆command USB_BUF_Bank0[ 0] = 'U'; // 以下由SetCSWData expand USB_BUF_Bank0[ 1] = 'S'; USB_BUF_Bank0[ 2] = 'B'; USB_BUF_Bank0[ 3] = 'S'; USB_BUF_Bank0[ 4] = dCBW_Tag[0]; USB_BUF_Bank0[ 5] = dCBW_Tag[1]; USB_BUF_Bank0[ 6] = dCBW_Tag[2]; USB_BUF_Bank0[ 7] = dCBW_Tag[3]; USB_BUF_Bank0[ 8] = gdw_dCBW_DataXferLength.BY[3]; // LSB 記錄剩下未被傳輸的資料 USB_BUF_Bank0[ 9] = gdw_dCBW_DataXferLength.BY[2]; // 記錄剩下未被傳輸的資料 USB_BUF_Bank0[10] = gdw_dCBW_DataXferLength.BY[1]; // 記錄剩下未被傳輸的資料 USB_BUF_Bank0[11] = gdw_dCBW_DataXferLength.BY[0]; // MSB 記錄剩下未被傳輸的資料 USB_BUF_Bank0[12] = gc_bCSWStatus; // Command Status 見BulkOnly P.15說明各種碼的情形 USB_REG[0x2B] = 0x00; USB_REG[0x16] = 0x00; USB_REG[0x15] = 0x0D; USB_REG[0xA1] |= 0x01; while (USB_REG[0xA1] & 0x01) { //081014 Jay add for usb plug out USB_PlugDetect(); if(!gbt_USB_Detected) break; } } USB_REG[0xE9] = 0x01; USB_REG[0xD2] |= 0x02; //Enable Bulk-Out中斷 USB_REG[0xA1] |= 0x02; //下一筆31Byte Bulk-Out } } }
void main(void) { // XBYTE[0xB091]=0x01; // 1.8v/3.3v regulator turn on XBYTE[0xB092]=0x78; // 3.2V & 2.0V // XBYTE[0xB093]=0x00; // LVR=2.4V // DSP initial XBYTE[0xB010]&=0xFE; // Disable DSP clock, Jimi 080729 for pop noise as 1st time play XBYTE[0xB002]&=0xFE; // Release DSP Reset, Jimi 080729 for pop noise as 1st time play XBYTE[0xB08a]|=0x08; //(JC)MCU:audio DAC on XBYTE[0xB08a]|=0x10; //(JC)MCU:Headphone driver on XBYTE[0xB08a]|=0x20; //(JC)MCU:Headphone driver DD comm-mode bias o/p XBYTE[0xB0ED]|=0x02; //(Jimi 091027)Audio DA zero cross reset bypass on XBYTE[0xB0C1]=0xB0; //(Jimi 091027)Pre-mux , post-mux and internal XCK select XBYTE[0xB0C4]=2; //(Jimi 091027)LCH speaker volume(i.e LCH OP Gain) XBYTE[0xB0C5]=2; //(Jimi 091027)RCH speaker volume(i.e RCH OP Gain) //SAR ADC init XBYTE[0xB05E] = 0; // disable SAR FS clock XBYTE[0xB05F] = 0x5F; // SAR clock = 12MHz/16/6 = 125kHz = 8us //-------------------------------------------- // gbt_Force_USB_FullSpeed =FALSE; gbt_USB_Detected = 0; gc_CardDetect = 0x00 ; gc_CardExist = 0x00 ; // bit 0 : Nand Flash bit 1: SD_Card gc_CardType = 0x01 ; // default Flash Interface gc_CardChangeStage =0x00; // bit 0 : Nand bit 1 : SD_Card gw_FileSkipNumber=0; gb_TriggerFileSkip=0; gb_FindFile=0; gbt_Support_Dummy_Capacity =0; // default disable dummy capacity function gc_bCBWLUN=0; gbt_enableCDROM =0; //09/04/24,joyce gc_CDROM_Size=0 ; init_system(); USB_PlugDetect(); // Detect USB plug //----------------------------------------------// Initial Flash module Init_Flash_Reg(); Init_Flash_Variable(); //-------------- Need search Bank,Dsp ,hzk block info ,first---------// FDBP.cFDev = 0; XBYTE[0xB40F] = FDBP.cFDev; FlashReadID(); Flash_State_Initial(); Search_BankCode_Block(); InitFlash(); Timer0_init(); XBYTE[0xB09F]|=0x06;//(JC)Vref Fast setup mode 'n Internal reference voltage power control gc_Vrefinit_Timer=60; XBYTE[0xB421]=0x13; // dbprintf("tftinit\n"); TFT_init(); #ifdef CAR_48 XBYTE[0xB102]|=0x3C; #else XBYTE[0xB102] |= 0x01; #endif // dbprintf("tftinit end\n"); TFT_PowerOnlogo(); if(gbt_USB_Detected) { USB_Task(); } gb_Host_Exist=1; gb_SD_Exist=1; if(!Host_DetectDevice()) { if(!Host_Initial()) { gc_CurrentCard = CURRENT_MEDIA_HOST; gb_FindFlag = 0; } else { gc_CurrentCard=0; } } else { if(SD_Card_Detect()) { if(SD_Identification_Flow()) { gc_CardExist |=0x02; gc_CurrentCard=2; } else { gc_CurrentCard=0; gc_CardExist &=0xFD; gb_FindFlag = 0; } } else { gb_SD_Exist=0; gc_CurrentCard = 0; } } XBYTE[0xB400] =0x01; XBYTE[0xB010]&=0xFE; // Disable DSP clock, Jimi 080729 for pop noise as 1st time play XBYTE[0xB002]&=0xFE; // Release DSP Reset, Jimi 080729 for pop noise as 1st time play XBYTE[0xB08a]|=0x08;//(JC)MCU:audio DAC on XBYTE[0xB08a]|=0x10;//(JC)MCU:Headphone driver on XBYTE[0xB08a]|=0x20;//(JC)MCU:Headphone driver DD comm-mode bias o/p //SAR ADC init XBYTE[0xB05E] = 0; // disable SAR FS clock XBYTE[0xB05F] = 0x5f; // SAR clock = 12MHz/16/6 = 125kHz = 8us Get_LogData_PageIndex(); //chiayen0808 USER_LogFile_ReadWrite(0);//use reserveblock for log if((gw_FM_frequency<875) || (gw_FM_frequency>1080)) { gw_FM_frequency=875; } FM_initial(); FM_drive(); gc_SetNumber = gw_PagesPerBlock >> 2; //1set=4pages for dir management, Ching 080816 //20090107 chiayen add gc_SetIndex = 0; //Ching 080816 //20090107 chiayen add USER_GetUISetIndex(); //for DIR table index //20090107 chiayen add gb_FindFlag = 0; if (DOS_Initialize()) //20090803 chiayen modify { gdw_HOSTStartSectorRead=0xFFFFFFF0; if(gc_CurrentCard==CURRENT_MEDIA_HOST) { if(SD_Card_Detect()) { gb_SD_Exist=1; if(SD_Identification_Flow()) { gc_CardExist |=0x02; gc_CurrentCard=2; } else { DEVICE_REG[0x00]= 0x01; gc_CurrentCard=0; gc_CardExist &=0xFD; gb_FindFlag = 0; } } else { DEVICE_REG[0x00]= 0x01; gb_SD_Exist=0; gc_CurrentCard = 0; } } else { DEVICE_REG[0x00]= 0x01; //20090730 chiayen add gc_CurrentCard=0; gc_CardExist &=0xFD; gb_FindFlag = 0; InitFlash(); } DOS_Initialize(); } gc_CurrentCard_backup=gc_CurrentCard; //20090803 chiayen move here gs_File_FCB[0].dw_FDB_StartCluster = gdw_DOS_RootDirClus; DOS_Search_File(C_File_All|C_Cnt_FileNo, C_MusicFileType, C_CmpExtName|C_Next);//(JC)count music file no. in root ir_init(); EA = 1; gc_Task_Current=C_Task_Play; gc_Task_Next=C_Task_Play; gc_PhaseInx=0; gw_init_needed=0xffff; Detect_USB(); Polling_TaskEvents(); if(gc_Task_Current!=gc_Task_Next) { gc_Task_Current=gc_Task_Next; } while(1) { switch(gc_Task_Current) { case C_Task_Play: Play_Task(); break; case C_Task_USB: USB_Task(); break; case C_Task_Dir: //20090107 chiayen add Dir_Task(); break; case C_Task_Jpeg: //20090107 chiayen add Jpeg_Task(); break; case C_Task_Mjpeg: //20090107 chiayen add Mjpeg_Task(); break; case C_Task_PlayMenu: //20090107 chiayen add // PlayMenuProcess(); break; case C_Task_PlayMenu_IR: //20090107 chiayen add // PlayMenuProcess_IR(); break; case C_Task_Setting: //20090107 chiayen add SetupMenuProcess(); break; case C_Task_Menu: MainMenuProcess(); break; case C_Task_PowerOff: PowerOffProcess(); break; } } }