U8 CheckUSBPlugIN(void) { U8 i; XBYTE[0xB011] |= 0x20; //bit 4 turn on usb_device clk XBYTE[0xB016] = 0x04; // power on default is 0x04 XBYTE[0xB0E9] &= 0xFE; // Enable usb pll clk USER_DelayDTms(5); // ㄏノDelay よΑぃノpollingよΑ XBYTE[0xB01D] =0x00; XBYTE[0xB002] |= 0x04; //bit 3 turn on USB_SW_RESET XBYTE[0xB002] &= 0xFB; //bit 3 trun off USB_SW_RESET XBYTE[0xB002] |= 0x02; //bit 2 turn on USB_host_SW_RESET XBYTE[0xB5e6] = 0x00; //bulksram gated clock XBYTE[0xB522] = 0x01; //USB2.0 UTMI clock mode set XBYTE[0xB018] = 0x01; //USB clock select //TONY XBYTE[0xB002] &= 0xFD; //bit 2 turn off USB_host_SW_RESET Syn_Reset(); XBYTE[0xB018] = 0x01; //USB clock select //TONY XBYTE[0xB019] = 0x01; //host mode if(XBYTE[0xB615]==0x01) { i=100; while(i) i--; if(XBYTE[0xB615]==0x01) { return 1; } } return 0; }
//====================================================================================================================== void GetMAXLUN(void) { data U8 tc_state; XBYTE[HOST_BUF_SA+0]=0xA1; XBYTE[HOST_BUF_SA+1]=0xFE; XBYTE[HOST_BUF_SA+2]=0x00; XBYTE[HOST_BUF_SA+3]=0x00; XBYTE[HOST_BUF_SA+4]=0x00; XBYTE[HOST_BUF_SA+5]=0x00; XBYTE[HOST_BUF_SA+6]=0x01; XBYTE[HOST_BUF_SA+7]=0x00; tran_setup(1); tc_state = Host_phy_Command_check(); if(tc_state) { Syn_Reset(); return; } setup_in(1, 1, 0, 1); tc_state = Host_phy_Command_check(); if(tc_state) { Syn_Reset(); return; } setup_out(1, 0, 0, 1); tc_state = Host_phy_Command_check(); if(tc_state == 0) { MaxLUN=XBYTE[HOST_BUF_SA]; } else { Syn_Reset(); return; } }
void Host_register_INIT(void) { XBYTE[0xB011] |= 0x20; //bit 4 turn on usb_device clk XBYTE[0xB002] |= 0x04; //bit 2 turn on USB_SW_RESET XBYTE[0xB002]&=~0x04; //bit 2 trun off USB_SW_RESET XBYTE[0xB0E9]&=~0x01; XBYTE[0xB017] = 0x01; //USB2.0 UTMI op mode set XBYTE[0xB002] |= 0x02; //bit 2 turn on USB_host_SW_RESET XBYTE[0xB002]&=~0x02; //bit 2 turn off USB_host_SW_RESET XBYTE[0xB5e6] = 0x00; //bulk sram gated clock XBYTE[0xB522] = 0x01; //USB2.0 UTMI clock mode set Syn_Reset(); XBYTE[0xB019] = 0x01; //host mode }
U8 SCSICMD_25_READCAPACITY(void) { code U8 READ_CAPACITY[31]={0x55,0x53,0x42,0x43,0x55,0xAA,0xBB,0x05,0x08,0x00,0x00,0x00,0x80,0x00,0x0A,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; data U8 tc_state; xdata U8 i; // Prepare CBW data for(i=0;i<31;i++) { XBYTE[HOST_BUF_SA+i]=READ_CAPACITY[i]; } // OUT CBW tran_out(DeviceAddress, 31); Host_phy_Command_check(); delay(1000); //for action mp3 player // IN data tran_in(DeviceAddress, 8 , 0); tc_state=Host_phy_Command_check(); gc_HostSectorUnit=XBYTE[HOST_BUF_SA+6]/2; if(!tc_state) { ((U8 *)(&gdw_CARD_TotalSizeMB))[0]=XBYTE[HOST_BUF_SA+0]; ((U8 *)(&gdw_CARD_TotalSizeMB))[1]=XBYTE[HOST_BUF_SA+1]; ((U8 *)(&gdw_CARD_TotalSizeMB))[2]=XBYTE[HOST_BUF_SA+2]; ((U8 *)(&gdw_CARD_TotalSizeMB))[3]=XBYTE[HOST_BUF_SA+3]; } if(tc_state==HOST_STALL) { Host_StallCmd_Timeout++; gb_dtg_in=0; ClearFeature(DeviceAddress,0,EP_IN,0); tran_in(DeviceAddress, 13, 0); tc_state = Host_phy_Command_check(); if(tc_state!=0) // 20080620 { return tc_state; } SCSICMD_03_REQUESTSENSE(); delay(10000); return HOST_STALL; } if(tc_state!=0) { gb_dtg_in=0; Syn_Reset(); ClearFeature(DeviceAddress,0,EP_IN,0); } // IN CSW delay(1000); tran_in(DeviceAddress, 13, 0); Host_phy_Command_check(); if(XBYTE[HOST_BUF_SA+12]!=0) { SCSICMD_03_REQUESTSENSE(); return 1; } else { return 0; } }
U8 Host_Initial(void) { data U8 i; data U8 EP_flag=0; data U8 states; data U8 tc_StrProductName; data U8 tc_StrSerialNum; data U16 Stg_idx; USB_HOST_Init: DeviceAddress = 1; gb_HostConnect = 1; gb_HostInitial=1; EA=0; XBYTE[0xB530]=0xFF; XBYTE[0xB01F]=0x01; Host_register_INIT(); XBYTE[0xB01C]&=0xDF; //Auto Ack in delay(5000); // USB SUSPEND XBYTE[0xB610]=0x04; //force full-speed delay(60000); XBYTE[0xB610]=0x04; delay(200); // USB RESET XBYTE[0xB610]=0x03; //force full-speed delay(20000); XBYTE[0xB610]=0x03; delay(200); XBYTE[0xB630]=0x01; //SOF ON XBYTE[0xB632]=0xB8; //EOF point XBYTE[0xB633]=0x0B; delay(10000); gdw_pollingtime=320000; i=0; EA=1; while(1) { delay(2000); states = GetDescriptor(0,0x100,0,0x40); if(states == 0x00) { Max_Trans_Length = XBYTE[HOST_BUF_SA+7]; break; } else { i++; if(i==3) { gb_HostConnect=0; return HOST_GETDESCRIPTOR_FAIL; } if(gb_HostConnect == 0) { return HOST_PHYCOUNECT_FAIL; } } } EA=0; gb_HostInitial=0; XBYTE[0xB002] |= 0x02; //bit 2 turn on USB_host_SW_RESET XBYTE[0xB002] &=~0x02; //bit 2 turn off USB_host_SW_RESET // USB RESET XBYTE[0xB610]=0x03; //force full-speed delay(1200); XBYTE[0xB610]=0x03; delay(200); XBYTE[0xB630]=0x01; //SOF ON XBYTE[0xB632]=0xB8; //EOF point XBYTE[0xB633]=0x0B; delay(5000); XBYTE[0xB01C]|=0x10; //clear RX error flags XBYTE[0xB01C]&=0xEF; EA=1; // Set address--00 05 01 00 00 00 00 00 states = SetAddress(); if(states) { return HOST_SETADDRESS_FAIL; } delay(50000); gb_dtg_in=0; gb_dtg_out=0; //---- 80 06 00 01 00 00 12 00---- if(gb_HostConnect == 0) { return HOST_PHYCOUNECT_FAIL; } states = GetDescriptor(DeviceAddress,0x0100,0x00,0x12); if(states) { return HOST_GETDESCRIPTOR_FAIL; } tc_StrProductName=XBYTE[HOST_BUF_SA+15]; tc_StrSerialNum=XBYTE[HOST_BUF_SA+16]; gw_VID=XBYTE[HOST_BUF_SA+8]+(XBYTE[HOST_BUF_SA+9]<<8); //---- 80 06 00 02 00 00 09 00 ---- if(gb_HostConnect == 0) { return HOST_PHYCOUNECT_FAIL; } delay(1000); states = GetDescriptor(DeviceAddress,0x200,0,0x09); if(states) { return HOST_GETDESCRIPTOR_FAIL; } Syn_Reset(); ConfigurationDescriptorLength=XBYTE[HOST_BUF_SA+2]; //---- 80 06 00 03 00 00 FF 00 ---- //---- 80 06 3r 03 09 04 FF 00 ---- if(tc_StrSerialNum!=0) { if(gb_HostConnect == 0) { return HOST_PHYCOUNECT_FAIL; } delay(1000); states = GetDescriptor(DeviceAddress,0x300,0,0xFF); if(states) { return HOST_GETDESCRIPTOR_FAIL; } Stg_idx=(U16)(XBYTE[HOST_BUF_SA+3]<<8)+XBYTE[HOST_BUF_SA+2]; if(gb_HostConnect == 0) { return HOST_PHYCOUNECT_FAIL; } delay(1000); states = GetDescriptor(DeviceAddress,tc_StrSerialNum+0x0300,Stg_idx,0xFF); if(states) { return HOST_GETDESCRIPTOR_FAIL; } Syn_Reset(); } //---- 80 06 00 02 00 00 FF 00 ---- if(gb_HostConnect == 0) { return HOST_PHYCOUNECT_FAIL; } delay(1000); states = GetDescriptor(DeviceAddress,0x200,0,0xFF); if(states) { return HOST_GETDESCRIPTOR_FAIL; } //---- 80 06 00 06 00 00 0A 00 ---- // delay(1000); // GetDescriptor(DeviceAddress,0x0600,0,0x0A); //---- 80 06 00 03 00 00 FF 00 ---- //---- 80 06 PP 03 09 04 FF 00 ---- //---- 80 06 00 03 00 00 FF 00 ---- //---- 80 06 PP 03 09 04 FF 00 ---- if(tc_StrProductName!=0) { U8 i; for(i=0;i<2;i++) { if(gb_HostConnect == 0) { return HOST_PHYCOUNECT_FAIL; } delay(1000); states = GetDescriptor(DeviceAddress,0x300,0,0xFF); if(states) { return HOST_GETDESCRIPTOR_FAIL; } Stg_idx=(U16)(XBYTE[HOST_BUF_SA+3]<<8)+XBYTE[HOST_BUF_SA+2]; if(gb_HostConnect == 0) { return HOST_PHYCOUNECT_FAIL; } delay(1000); states = GetDescriptor(DeviceAddress,tc_StrProductName+0x0300,Stg_idx,0xFF); if(states) { return HOST_GETDESCRIPTOR_FAIL; } } } //---- 80 06 00 01 00 00 12 00 ---- if(gb_HostConnect == 0) { return HOST_PHYCOUNECT_FAIL; } delay(1000); states = GetDescriptor(DeviceAddress,0x0100,0x00,0x12); if(states) { return HOST_GETDESCRIPTOR_FAIL; } //---- 80 06 00 02 00 00 09 00 ---- delay(1000); GetDescriptor(DeviceAddress,0x0200,0x00,0x09); //---- 80 06 00 02 00 00 xx 00 ---- delay(1000); GetDescriptor(DeviceAddress,0x0200,0x00,ConfigurationDescriptorLength); CFGValue=XBYTE[HOST_BUF_SA+0x05]; //---- Set Endpoint Value ---- for(i=0;i<ConfigurationDescriptorLength;) { if(XBYTE[HOST_BUF_SA+i]== 0x09) { i += 0x09; } else if(XBYTE[HOST_BUF_SA+i]== 0x07) { if((XBYTE[HOST_BUF_SA+i+1]==0x05)&&(XBYTE[HOST_BUF_SA+i+3]==0x02)) { if(XBYTE[HOST_BUF_SA+i+2]&0x80) { EP_IN = XBYTE[HOST_BUF_SA+i+2]&0x0F; EP_flag = EP_flag + 0x01; } else { EP_OUT = XBYTE[HOST_BUF_SA+i+2]&0x0F; EP_flag = EP_flag + 0x10; } } if(EP_flag == 0x11) { break; } i += 0x07; } else { i++; } } //---- 80 06 00 03 00 00 02 00 ---- delay(1000); GetDescriptor(DeviceAddress,0x0300,0x00,0x02); //---- 80 06 00 03 00 00 04 00 ---- delay(1000); GetDescriptor(DeviceAddress,0x0300,0x00,0x04); //---- 80 06 SS 03 09 04 02 00 ---- if(tc_StrSerialNum!=0) { U8 tc_leng; if(gb_HostConnect == 0) { return HOST_PHYCOUNECT_FAIL; } delay(1000); states = GetDescriptor(DeviceAddress,0x300+tc_StrSerialNum,Stg_idx,0x02); if(states) { return HOST_GETDESCRIPTOR_FAIL; } tc_leng=XBYTE[HOST_BUF_SA]; if(gb_HostConnect == 0) { return HOST_PHYCOUNECT_FAIL; } delay(1000); states = GetDescriptor(DeviceAddress,0x0300+tc_StrSerialNum,Stg_idx,tc_leng); if(states) { return HOST_GETDESCRIPTOR_FAIL; } } //---- 00 09 xx 00 00 00 00 00 ---- if(gb_HostConnect == 0) { return HOST_PHYCOUNECT_FAIL; } delay(1000); states = SetConfiguration(DeviceAddress,CFGValue,0,0); //---- Get MaxLun ---- if(gb_HostConnect == 0) { return HOST_PHYCOUNECT_FAIL; } gb_stall_flag=0; delay(1000); GetMAXLUN(); if(gb_stall_flag == 1) { MaxLUN=0; gb_stall_flag=0; } XBYTE[0xB01C]&=0xdf; //Auto Ack in delay(30000); SCSICMD_12_INQUIRY(); delay(1000); states = SCSICMD_23_READFORMATCAPACITY(); if(states!=0) { return HOST_PHYCOUNECT_FAIL; } if(gb_HostConnect == 0) { return HOST_PHYCOUNECT_FAIL; } Host_StallCmd_Timeout=0; while(1) { states = SCSICMD_25_READCAPACITY(); if(gb_HostConnect == 0) { return HOST_PHYCOUNECT_FAIL; } if(Host_StallCmd_Timeout>60) { return 0x77; // Initial fail } if(states!=HOST_STALL) { break; } } gc_CurrentCard = CURRENT_MEDIA_HOST; gdw_pollingtime=3000; gdw_HOSTStartSectorRead=0xFFFFFFF0; states=HOST_Read_Logicsector(0); if(states==3) { goto USB_HOST_Init; } return 0; }