Beispiel #1
0
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
		}
	}
}
Beispiel #2
0
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;
        }
    }
}