⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hc_comm.c

📁 Dsp控制1362芯片做主机
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -