小磷光一

USB主机检测及主机初始化程序

0
阅读(1977)

 

****************************************************************************/

int isp1362_hc_probe(struct isp1362 *isp1362)
{
	int id = 0;
	int tmp = 0;
	
	id = isp1362_read_reg16(isp1362, HC_RD_CHIP_ID_REG);
	if (HC_CHIP_ID != id)
		return -1;
	
	isp1362_write_reg16(isp1362, HC_WR_SCRATCH_REG, 0x55aa);
	tmp = isp1362_read_reg16(isp1362, HC_RD_SCRATCH_REG);
	
	if (0x55aa != tmp)
		return -1;
		
	return 0;	
}
/**********************************************************************************
* 名称 :isp1362_hc_init
* 功能 :USB主机初始化
* 入口参数 :无
* 出口参数 :无
***********************************************************************************/

int isp1362_hc_init(struct isp1362 *isp1362)
{
	int tmp = 0;
	hc_reset(isp1362);
	
	hc_set_istl_buff_size(isp1362, 0x400);
	hc_set_intl_buff_size(isp1362, 0x200);
	hc_set_atl_buff_size(isp1362, 0x400);
	
	hc_set_atl_blk_size(isp1362, 0x40);
	
	isp1362_write_reg16(isp1362, HC_WR_CTRL_REG, 0x0680);//0x801f0780
	
	isp1362_write_reg32(isp1362, HC_WR_FRM_INT_REG, 0x27782edf);
	
	isp1362_write_reg32(isp1362, HC_WR_RH_DTA_REG, 0x80000102);//0x05000b01//
	isp1362_write_reg32(isp1362, HC_WR_RH_DTB_REG, 0x00000000);//0x00060000
	
	isp1362_write_reg32(isp1362, HC_WR_RH_PSTAT2_REG, 0x00000100);//reset root hub
	tmp = isp1362_read_reg32(isp1362, HC_RD_RH_PSTAT2_REG);
	
	isp1362_write_reg32(isp1362, HC_WR_RH_PSTAT2_REG, 0x00000002);//0x801f0169
	
	tmp = isp1362_read_reg32(isp1362, HC_RD_RH_PSTAT2_REG);
}


struct isp1362 usb_isp1362_dc = {1, DC_CMD_PORT, DC_DATA_PORT};
struct isp1362 usb_isp1362_hc = {1, HC_CMD_PORT, HC_DATA_PORT};
volatile long flag = 0;
unsigned char buff[512];

/**********************************************************************************
* 名称 :EX_INTERRUPT_HANDLER(PFB_ISR)
* 功能 :外部中断函数
* 入口参数 :无
* 出口参数 :无
***********************************************************************************/
EX_INTERRUPT_HANDLER(PFB_ISR)		// <--|declaration in  exception.h -->
{										//    |declaration with _pragma(interrupt) the ISR Startaddress 					//close Interrupt
	*pFIO_FLAG_C = IRQ_PF;           // NIC_INT connected to PFx 

	usb_isr();
	int_cnt++;

	if (int_cnt%2)
		Led4_On();
	else
		Led4_Off();
}


/**********************************************************************************
* 名称 :irq_init
* 功能 :初始化中断函数
* 入口参数 :无
* 出口参数 :无
***********************************************************************************/
void irq_init(void)
{
	// configure interrupt
	*pSIC_IAR0 = *pSIC_IAR0 & 0x0fffffff | 0x30000000;	
	*pSIC_IAR1 = *pSIC_IAR1 & 0xffffffff | 0x00000000;	
	*pSIC_IAR2 = *pSIC_IAR2 & 0xfff0fff0 | 0x00040006;	// map PFB -> ID5 IVG12 ;Timer0 -> ID4 IVG11;

	register_handler(ik_ivg11, PFB_ISR);
//	register_handler(ik_ivg13, Timer0_ISR);				// Timer0 ISR -> IVG 11

	*pSIC_IMASK=*pSIC_IMASK | 0x00110000;
}