📄 hc_comm.c
字号:
g_chip_version_index = 0;
}
else
{
return ( False );
}
//return(True);
//
// write-read test using scratch register
//
tmp = 0x55AA; // pattern of "0101 1010"
write_register16( Com16_HcScratch, tmp );
if ( tmp != read_register16( Com16_HcScratch ) )
return(False);
tmp = ~tmp; // check again with inverted pattern
write_register16( Com16_HcScratch, tmp );
if ( tmp != read_register16( Com16_HcScratch ) )
return ( False );
//
// chip exists!
//
return ( True );
}
*/
void check_1362_connection( void ) // Check 1362 is present
{
unsigned short chip_id;
//
// Check 1362 register access
//
if ( !detect_1362_connected( &chip_id ) )
{
printf( "\r\n\r\nError @ chip detection : " );
printf( "This may not be ISP1362. (detected ChipID = 0x%04X)\r\n\r\n", chip_id );
printf("1362 is not present!\r\n" );
}
else
{
printf("This is ISP1362. (detected ChipID = 0x%04X)\r\n\r\n", chip_id );
}
}
void software_reset( void ) // Reset HC
{
write_register16( Com16_HcSoftwareReset, 0x00F6 );
}
//*****************************************************************************************
//USB Delay edit by ricky
//*****************************************************************************************
void wait_ms(unsigned int sec)
{
unsigned int timer=1000;
unsigned int i,j;
for (i=0;i<sec;i++)
{
for(j=0;j<timer;j++)
{
}
}
}
void Hc_reset()
{
unsigned long uValue;
// Read the contents of the HcCommandStatus register.
uValue = read_register32(Com32_HcCommandStatus);
// Set the HCR bit
uValue |= 0x00000001;
//tmp=read_register32(Com32_HcCommandStatus) ;
write_register32(Com32_HcCommandStatus,uValue);
// Wait until reset is done. When reset is done, the HCR bit is set to logic 0.
wait_ms(100);
//tmp=read_register32(Com32_HcCommandStatus) ;
while ((read_register32(Com32_HcCommandStatus)& 0x00000001));
uValue = read_register32(Com32_HcControl);
// When writing a new value to the HcControl register, the state of other bits in the register
// must be preserved by writing 1 to the bits already set to 1 in the register.
uValue &= ~0x000000C0;
// 00B in bit[7:6] => RESET state
write_register32(Com32_HcControl, uValue);
}
void Operational_set()
{
unsigned long uValue;
uValue = read_register32(Com32_HcControl);
// When writing a new value to the HcControl register, the state of the other bits in the
// register must be preserved by writing 0 to the bits already set to logic 1 in the register.
uValue &= 0x000000C0;
// 10B in bits[7:6] => Operational state
uValue |= 0x00000080;
write_register32(Com32_HcControl, uValue);
}
void remote_wake()
{
unsigned long uValue;
uValue = read_register32(Com32_HcControl);
write_register32(Com32_HcControl, uValue|0x00000600);
}
void set_regValue()
{
unsigned short tmp;
unsigned long uData;
//on-chip oc detection,int1 active low, edge-trggered
tmp=read_register16( Com16_HcHardwareConfiguration);
tmp=tmp|0x2429;//需考虑是否换成0x7429
write_register16( Com16_HcHardwareConfiguration, tmp);
// Clear all pending interrupts.
write_register16(Com16_HcuPInterrupt, 0xFFFF);
// Enable the OPR and SOF interrupts.
write_register16(Com16_HcuPInterruptEnable, OPR_Reg | SOFITLInt);
// Disable all USB specific interrupts.
write_register32(Com32_HcInterruptDisable, 0x0000007F);
// Enable the SOF and Master Interrupts.
write_register32(Com32_HcInterruptEnable, SF | RHSC | MIE);
//configure remote_wake
remote_wake();
//configure HcFmInterval
write_register32(Com32_HcFmInterval,0x27782edf);
uData = 0x00000200 ;
// Must use an even value.
uData |= 0x25000000;//((POWER_ON_TO_POWER_GOOD_TIME / 2) << 24);
write_register32(Com32_HcRhDescriptorA, uData);
// LPSC <= 1
uData = 0x00010000;
write_register32(Com32_HcRhStatus, uData);
write_register32(Com32_HcRhDescriptorB,0x00000000);
}
void buffer_setting()
{
// Buffer general
write_register16( Com16_HcBufferStatus, 0 );
// Buffer sizes
write_register16( Com16_HcATLBufferSize, 3600 );
write_register16( Com16_HcINTLBufferSize, 496 );
write_register16( Com16_HcISTLBufferSize, 0 ); // Set size of single buffer
// ISTL settings
write_register16( Com16_HcISTLToggleRate, 0 );
// INTL settings
write_register16( Com16_HcINTLBlkSize, 16 );
write_register32( Com32_HcINTLPTDSkipMap, 0xFFFFFFFF );
write_register32( Com32_HcINTLLastPTD, 1 );
// ATL settings
write_register16( Com16_HcATLBlkSize, 72 );
write_register32( Com32_HcATLPTDSkipMap,0xFFFFFFFF );
write_register32( Com32_HcATLLastPTD, 1 );
write_register16( Com16_HcATLPTDDoneThresholdCount, 0x00000000);
write_register16( Com16_HcATLPTDDoneThresholdTimeOut,0x00000000);
}
void port_enable()
{
write_register32(Com32_HcRhPortStatus1,0x00000102); // Set Port1 PortEnableStatus and
// PortPowerStatus to ‘1’
write_register32(Com32_HcRhPortStatus2,0x00000102); // Set Port2 PortEnableStatus and
// PortPowerStatus to ‘1’
write_register32(Com32_HcRhDescriptorA,0x00000B01); // Set NumberDownstreamPort,
// OCProtection etc. to ‘1’
write_register32(Com32_HcRhDescriptorB,0x00000000); // Device removable and control
// by Global power switch
}
/*****************************************************
Function:
Setting the Host Controller to Perform USB Enumeration
******************************************************/
void usb_connect()
{
//int i;
unsigned short udata;
int uspeed,i;
printf("Waiting mp3 connect!\r\n");
//此处需考虑做修改
i=read_register32(Com32_HcRhPortStatus2);
printf("status: %x\r\n",i);
while(!((read_register32(Com32_HcRhPortStatus2) & 0x00000001)))
{
while(!((read_register32(Com32_HcRhPortStatus2) & 0x00000001)))//||(read_register32(Com32_HcRhPortStatus1) & 0x00000001)))
{
udata= read_register32(Com32_HcRhPortStatus2) ;
printf("usb device didn't connect \r\n");
wait_ms(100);
}
if (read_register32(Com32_HcRhPortStatus2)& 0x00000001) // Detection of the connected device
{
wait_ms(100); // Wait at least 100 ms to allow completion of insertion
write_register32(Com32_HcRhPortStatus2,0x00000010); // Set port reset
wait_ms(10); // Wait for reset recovery time. Min is 10 ms.
port_enable(); // Set HcRh registers to enable USB ports
activePortNumber=2;
printf("Port");
printf("%x",activePortNumber);
printf("connect a full speed device!\r\n");
wait_ms(100);
}
while((read_register32(Com32_HcRhPortStatus2) & 0x00000001))
{};
wait_ms(100);
printf("usb device disconnected! \r\n");
}
/* else if(read_register32(Com32_HcRhPortStatus1)& 0x00000001)
{
wait_ms(100); // Wait at least 100 ms to allow completion of insertion
write_register32(Com32_HcRhPortStatus1,0x00000010); // Set port reset
wait_ms(10); // Wait for reset recovery time. Min is 10 ms.
port_enable(); // Set HcRh registers to enable USB ports
activePortNumber=1;
speed=speed_detect(0);
printf(" speed :\r\n",speed);
printf("Port");
printf("%x",activePortNumber);
printf("connect a device!\r\n");
wait_ms(100);
} */
}
int speed_detect(int portNumber)
{
unsigned long udata;
int speed;
udata = read_register32(Com32_HcRhPortStatus2);
speed=(udata & 0x00000200)>>9;
return(speed);
}
void make_control_ptd(unsigned short *ph, unsigned char type_ptd,unsigned char last,unsigned char ep,unsigned char max,unsigned char tog,unsigned char addr)
{
PTD_first.ActualBytes = 0;
PTD_first.CompletionCode = 0x0;
PTD_first.Active = 1;
PTD_first.Toggle = tog;
PTD_first.MaxPacketSize = max;
PTD_first.EndpointNumber = ep;
PTD_first.Last = 1;
PTD_first.Speed =speed_detect(activePortNumber);
PTD_first.TotalBytes = max;
PTD_first.DirectionPID = type_ptd;
PTD_first.Format = 0;
PTD_first.FunctionAddress = addr;
PTD_first.PollingRate= 0;
PTD_first.StartingFrame= 0;
*(ph + 0) = ((PTD_first.ActualBytes & 0x3FF)
|((PTD_first.CompletionCode &0x0f) << 12)
| ((PTD_first.Active &0x01) << 11)
| ((PTD_first.Toggle &0x01) << 10) );
*(ph + 1) = ((PTD_first.MaxPacketSize & 0x3FF)
| ((PTD_first.EndpointNumber &0x0f) << 12)
| ((PTD_first.Last &0x01) << 11)
| ((PTD_first.Speed &0x01) << 10) );
*(ph + 2) = ((PTD_first.TotalBytes & 0x3FF)
| ((PTD_first.DirectionPID &0x03) << 10));
*(ph + 3) = ( ((PTD_first.Format &0x01) << 7)
| (PTD_first.FunctionAddress & 0x7F)
| ((PTD_first.PollingRate &0xe0) << 8)
| ((PTD_first.StartingFrame & 0x1F)<<8));
}
void send_control(unsigned short *a_ptr,unsigned short d0,unsigned short d1,unsigned short d2,unsigned short d3)
{
unsigned char active_bit;
//unsigned char *r_ptr;
unsigned short reg;
abuf[0]=*(a_ptr+0);
abuf[1]=*(a_ptr+1);
abuf[2]=*(a_ptr+2);
abuf[3]=*(a_ptr+3);
abuf[4]=d0;
abuf[5]=d1;
abuf[6]=d2;
abuf[7]=d3;
write_atl(abuf,8); // Write 16 bytes
reg=read_register16(Com16_HcBufferStatus);
reg=reg|0x0008;
write_register16(Com16_HcBufferStatus,reg);
wait_ms(100);
read_atl(abuf,8);
active_bit=abuf[0]&(0x0800);
while( active_bit!=0);
{
read_atl(abuf, 8);// Read 16 bytes
active_bit=abuf[0]&(0x0800); // Check active bit. The Host Controller sets the
// bit to 0 after PTD is finished
// cnt--;
//wait_ms(10);
}
}
void set_address(unsigned char old_addr,unsigned char new_addr)// A unique device address has been assigned
{
unsigned short *cbuf_ptr=0;
// Send out first control Setup packet
make_control_ptd(cbuf_ptr,SETUP,0,0,8,0,old_addr);
send_control(cbuf_ptr,0x0500,new_addr,0x0000,0x0000);
// Send out control Status packet
make_control_ptd(cbuf_ptr,IN,0,0,0,1,old_addr);
send_control(cbuf_ptr,0x0000,0x0000,0x0000,0x0000); // Send zero-length packet to
// complete transfer
}
void set_config(unsigned char addr,unsigned char config) // Configure the device
{
unsigned short *cbuf_ptr=0;
// Send out first control Setup packet
make_control_ptd(cbuf_ptr,SETUP,0,0,8,0,addr);
send_control(cbuf_ptr,0x0900,config,0x0000,0x0000);
// Send out control Status packet
make_control_ptd(cbuf_ptr,IN,0,0,0,1,addr);
send_control(cbuf_ptr,0x0000,0x0000,0x0000,0x0000); // Send zero-length packet to
// complete transfer
}
void isr_USB_Hc()
{
}
/* ********** ********** ********** ********** ***********
dsp vect
* ********** ********** ********** ********** ***********/
#pragma CODE_SECTION(vect,"vect")
void vect()
{
asm(" .ref _c_int00");
asm(" .ref _isr_USB_Hc");
// asm(" .ref _tint0");
// asm(" .ref _isr_USB_Hc");
asm(" b _c_int00"); /* reset */
asm(" nop");
asm(" nop");
asm(" rete"); /* nmi */
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete"); /* int0 */
asm(" nop");
asm(" nop");
asm(" nop");
asm(" b _isr_USB_Hc"); /* int1 */
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete"); /* int2 */
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete"); /* tint0 */
asm(" nop");
asm(" nop");
asm(" rete"); /* brint0 */
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete"); /* bxint0 */
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete"); /* dmac0 */
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete"); /* tint1 */
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete"); /* int3 */
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete"); /* hpint */
asm(" nop");
asm(" nop");
asm(" rete"); /* brint1 */
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete"); /* bxint1 */
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete"); /* dmac4 */
asm(" nop");
asm(" nop");
asm(" nop");
asm(" rete"); /* dmac5 */
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
asm(" nop");
}
//------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -