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

📄 ohcihcd.bak

📁 RDC R2886 USB Ehci ohc测试源码,paradigm c++上运行测试
💻 BAK
📖 第 1 页 / 共 4 页
字号:
}

void ReuseISOED(int num)
{
	switch(num)
   {
   	case 1:
      	ohci_ISO_TD1->hwINFO = TD_NOTACCESSED|0x02000000L|DWordRead(&ohci_regs->fmnumber);	//
			ohci_ISO_TD1->hwNextTD = 0;
         ohci_ISO_TD1->hwCBP = (UpperAddr(ISODataBuf1) << 16) + LowerAddr(ISODataBuf1);
         ohci_ISO_TD1->hwBE = ohci_ISO_TD1->hwCBP + MAXBufSize -1;
         ohci_ISO_TD1->hwPSW[0] = (u16)(ohci_ISO_TD1->hwCBP & 0xFFF);
         ohci_ISO_TD1->hwPSW[1] = (u16)(ohci_ISO_TD1->hwCBP & 0xFFF)+0x100;
         ohci_ISO_TD1->hwPSW[2] = (u16)(ohci_ISO_TD1->hwCBP & 0xFFF)+0x200;
         ohci_ISO_TD1->hwPSW[3] = (u16)((ohci_ISO_TD1->hwCBP & 0xFFF)+MAXBufSize-1);
         ohci_ISO_TD1->hwPSW[4] = 0;
         AddingiTDtoED(ohci_EpISO, ohci_ISO_TD1);
      	break;
      case 2:
      	ohci_ISO_TD2->hwINFO = TD_NOTACCESSED|0x02000000L|(DWordRead(&ohci_regs->fmnumber)+0x8);	//
         ohci_ISO_TD2->hwNextTD = 0;
         ohci_ISO_TD2->hwCBP = (UpperAddr(ISODataBuf2) << 16) + LowerAddr(ISODataBuf2);
         ohci_ISO_TD2->hwBE = ohci_ISO_TD2->hwCBP + MAXBufSize -1;
         ohci_ISO_TD2->hwPSW[0] = (u16)(ohci_ISO_TD2->hwCBP & 0xFFF);
         ohci_ISO_TD2->hwPSW[1] = (u16)(ohci_ISO_TD2->hwCBP & 0xFFF)+0x100;
         ohci_ISO_TD2->hwPSW[2] = (u16)((ohci_ISO_TD2->hwCBP & 0xFFF)+0x200);
         ohci_ISO_TD2->hwPSW[3] = (u16)((ohci_ISO_TD2->hwCBP & 0xFFF)+MAXBufSize-1);
         AddingiTDtoED(ohci_EpISO1, ohci_ISO_TD2);
      	break;
      case 3:
      	ohci_ISO_TD3->hwINFO = TD_NOTACCESSED|0x02000000L|(DWordRead(&ohci_regs->fmnumber)+0x10);//0x03540000L;
         ohci_ISO_TD3->hwNextTD = 0;
         ohci_ISO_TD3->hwCBP = (UpperAddr(ISODataBuf3) << 16) + LowerAddr(ISODataBuf3);
         ohci_ISO_TD3->hwBE = ohci_ISO_TD3->hwCBP + MAXBufSize -1;	//In 640 bytes
         ohci_ISO_TD3->hwPSW[0] = (u16)(ohci_ISO_TD3->hwCBP & 0xFFF);
         ohci_ISO_TD3->hwPSW[1] = (u16)(ohci_ISO_TD3->hwCBP & 0xFFF)+0x100;
         ohci_ISO_TD3->hwPSW[2] = (u16)((ohci_ISO_TD3->hwCBP & 0xFFF)+0x200);
         ohci_ISO_TD3->hwPSW[3] = (u16)((ohci_ISO_TD3->hwCBP & 0xFFF)+MAXBufSize-1);
         AddingiTDtoED(ohci_EpISO2, ohci_ISO_TD3);
      	break;
      case 4:
      	ohci_ISO_TD4->hwINFO = TD_NOTACCESSED|0x02000000L|(ohci_regs->fmnumber+0x18);//0x03540000L;
         ohci_ISO_TD4->hwNextTD = 0;
         ohci_ISO_TD4->hwCBP = (UpperAddr(ISODataBuf4) << 16) + LowerAddr(ISODataBuf4);
         ohci_ISO_TD4->hwBE = ohci_ISO_TD4->hwCBP + MAXBufSize -1;	//In 640 bytes
         ohci_ISO_TD4->hwPSW[0] = (u16)(ohci_ISO_TD4->hwCBP & 0xFFF);
         ohci_ISO_TD4->hwPSW[1] = (u16)(ohci_ISO_TD4->hwCBP & 0xFFF)+0x100;
         ohci_ISO_TD4->hwPSW[2] = (u16)((ohci_ISO_TD4->hwCBP & 0xFFF)+0x200);
         ohci_ISO_TD4->hwPSW[3] = (u16)((ohci_ISO_TD4->hwCBP & 0xFFF)+MAXBufSize-1);
         AddingiTDtoED(ohci_EpISO3, ohci_ISO_TD4);
      	break;
   }
}

/*-------------------------------------------------------------------------*
 * Done List handling functions
 * //Unlink the TD from DoneHead and set complete status
 *-------------------------------------------------------------------------*/

BOOL dl_done_list()
{
	u32 Temp, Temp1;

	Temp = ohci_hcca->done_head & ~0xF;
	Temp1 = (UpperAddr(ohci_Ctl_TD3) << 16) + LowerAddr(ohci_Ctl_TD3);
	if(Temp == Temp1) {
		if((ohci_Ctl_TD3->hwINFO & 0xF0000000L) != TD_CC_NOERROR)
			return FALSE;
		ohci_hcca->done_head = ohci_Ctl_TD3->hwNextTD;

		//For one control transfer complete
		DoneHeadClear = TRUE;
	}
	Temp = ohci_hcca->done_head & ~0xF;
	Temp1 = (UpperAddr(ohci_Ctl_TD2) << 16) + LowerAddr(ohci_Ctl_TD2);
	if(Temp == Temp1) {      
		if((ohci_Ctl_TD2->hwINFO & 0xF0000000L) != TD_CC_NOERROR)
			return FALSE;
		ohci_hcca->done_head = ohci_Ctl_TD2->hwNextTD;
	}
	Temp = ohci_hcca->done_head & ~0xF;
	Temp1 = (UpperAddr(ohci_Ctl_TD1) << 16) + LowerAddr(ohci_Ctl_TD1);
	if(Temp == Temp1) {
		if((ohci_Ctl_TD1->hwINFO & 0xF0000000L) != TD_CC_NOERROR)
			return FALSE;
		ohci_hcca->done_head = ohci_Ctl_TD1->hwNextTD;
	}
	//CBW
	Temp = ohci_hcca->done_head & ~0xF;
	Temp1 = (UpperAddr(ohci_CBW_TD) << 16) + LowerAddr(ohci_CBW_TD);
	if(Temp == Temp1) {
		if((ohci_CBW_TD->hwINFO & 0xF0000000L) != TD_CC_NOERROR)
			return FALSE;
		ohci_hcca->done_head = ohci_CBW_TD->hwNextTD;
		TD_Status &= ~St_CBW_TD;
	}
	//CSW
	Temp = ohci_hcca->done_head & ~0xF;
	Temp1 = (UpperAddr(ohci_CSW_TD) << 16) + LowerAddr(ohci_CSW_TD);
	if(Temp == Temp1) {
		if((ohci_CSW_TD->hwINFO & 0xF0000000L) != TD_CC_NOERROR)
			return FALSE;
		ohci_hcca->done_head = ohci_CSW_TD->hwNextTD;
		TD_Status &= ~St_CSW_TD;
	}
	//CBW Data In
	Temp = ohci_hcca->done_head & ~0xF;
	Temp1 = (UpperAddr(ohci_DataIn_TD) << 16) + LowerAddr(ohci_DataIn_TD);
	if(Temp == Temp1) {
		if((ohci_DataIn_TD->hwINFO & 0xF0000000L) != TD_CC_NOERROR)
			return FALSE;
		ohci_hcca->done_head = ohci_DataIn_TD->hwNextTD;
		TD_Status &= ~St_DataIn_TD;
	}
	//CBW Data Out
	Temp = ohci_hcca->done_head & ~0xF;
	Temp1 = (UpperAddr(ohci_DataOut_TD) << 16) + LowerAddr(ohci_DataOut_TD);
	if(Temp == Temp1) {
		if((ohci_DataOut_TD->hwINFO & 0xF0000000L) != TD_CC_NOERROR)
			return FALSE;
		ohci_hcca->done_head = ohci_DataOut_TD->hwNextTD;
		TD_Status &= ~St_DataOut_TD;
	}

   if(IntInitOK==TRUE)
   {
      //EP0 Int Data In
      Temp = ohci_hcca->done_head & ~0xF;
      Temp1 = (UpperAddr(ohci_Int_TD1) << 16) + LowerAddr(ohci_Int_TD1);
      if(Temp == Temp1) {
         if((ohci_Int_TD1->hwINFO & 0xF0000000L) != TD_CC_NOERROR)
            return FALSE;
         ohci_hcca->done_head = ohci_Int_TD1->hwNextTD;
         ReuseIntED();
         //TD_Status &= ~St_DataOut_TD;
      }
   }

   if(ISOInitOK==TRUE)
   {
      Temp = ohci_hcca->done_head & ~0xF;
      Temp1 = (UpperAddr(ohci_ISO_TD1) << 16) + LowerAddr(ohci_ISO_TD1);
      if(Temp == Temp1) {
         ohci_hcca->done_head = ohci_ISO_TD1->hwNextTD;
         ReuseISOED(1);
      }
      Temp = ohci_hcca->done_head & ~0xF;
      Temp1 = (UpperAddr(ohci_ISO_TD2) << 16) + LowerAddr(ohci_ISO_TD2);
      if(Temp == Temp1) {
         ohci_hcca->done_head = ohci_ISO_TD2->hwNextTD;
         ReuseISOED(2);
      }
      Temp = ohci_hcca->done_head & ~0xF;
      Temp1 = (UpperAddr(ohci_ISO_TD3) << 16) + LowerAddr(ohci_ISO_TD3);
      if(Temp == Temp1) {
         ohci_hcca->done_head = ohci_ISO_TD3->hwNextTD;
         ReuseISOED(3);
      }
      Temp = ohci_hcca->done_head & ~0xF;
      Temp1 = (UpperAddr(ohci_ISO_TD4) << 16) + LowerAddr(ohci_ISO_TD4);
      if(Temp == Temp1) {
         ohci_hcca->done_head = ohci_ISO_TD4->hwNextTD;
         ReuseISOED(4);
      }
   }
	return TRUE;
}


/*-------------------------------------------------------------------------*
 * Control Transfer
 *-------------------------------------------------------------------------*/
BOOL OHCI_Get_Device_Descriptor(u32 size)
{
	//int i;
	//char *p, *q;
	u32 Temp;
	
	dev_des->bLength = 0x40;
	
	//Setup Stage
	Ctl_Setup->bmRequestType = 0x80;
	Ctl_Setup->bRequest = 0x06;
	Ctl_Setup->wValue = 0x0100;
	Ctl_Setup->wIndex = 0x0000;
	Ctl_Setup->wLength = (u16)size;
	
	ohci_Ctl_TD1->hwINFO = TD_DP_SETUP|TD_T_DATA0|TD_DI;//0x02400000L;
	ohci_Ctl_TD1->hwNextTD = 0;
	ohci_Ctl_TD1->hwCBP = (UpperAddr(Ctl_Setup) << 16) + LowerAddr(Ctl_Setup);
	ohci_Ctl_TD1->hwBE = ohci_Ctl_TD1->hwCBP + sizeof(setup_format) - 1;

	//Data Stage
	Ctl_Data = (char *)dev_des;

	ohci_Ctl_TD2->hwINFO = TD_DP_IN|TD_T_DATA1|TD_DI|TD_R;//0x03540000L;
	ohci_Ctl_TD2->hwNextTD = 0;
	ohci_Ctl_TD2->hwCBP = (UpperAddr(Ctl_Data) << 16) + LowerAddr(Ctl_Data);
	ohci_Ctl_TD2->hwBE = ohci_Ctl_TD2->hwCBP + size - 1;	//In 18 bytes

	//Status Stage
	ohci_Ctl_TD3->hwINFO = TD_DP_OUT|TD_T_DATA1|TD_DI;//0x02480000L;
	ohci_Ctl_TD3->hwNextTD = 0;
	ohci_Ctl_TD3->hwCBP = 0;
	ohci_Ctl_TD3->hwBE = 0;	//Out 0 bytes

	AddingTDtoED(ohci_Ep0, ohci_Ctl_TD3);
	AddingTDtoED(ohci_Ep0, ohci_Ctl_TD2);
	AddingTDtoED(ohci_Ep0, ohci_Ctl_TD1);

	mdelay(1);    	//miles
	//Set Control_Filled
	Temp = ohci_regs->cmdstatus | OHCI_CLF;
	DWordWrite(&ohci_regs->cmdstatus, Temp);
	
	do{} while((dev_des->bLength != 0x12) || (DoneHeadClear == FALSE));
/*	
	p = (char *) dev_des;
	q = (char *) UDisk_dev_des;
	for(i=0;i<sizeof(std_dev_des);i++)
		if(*p++ != *q++)
			return FALSE;
*/	
	return TRUE;
}

BOOL OHCI_Get_Configuration_Desc(int Length)
{
	//int i;
	//char *p, *q;
	u32 Temp;

	cfg_des->bLength = 0;

	//Setup Stage
	Ctl_Setup->bmRequestType = 0x80;
	Ctl_Setup->bRequest = 0x06;
	Ctl_Setup->wValue = 0x0200;
	Ctl_Setup->wIndex = 0x0000;
	Ctl_Setup->wLength = Length;
	
	ohci_Ctl_TD1->hwINFO = TD_DP_SETUP|TD_T_DATA0|TD_DI;//0x02400000L;
	ohci_Ctl_TD1->hwNextTD = 0;
	ohci_Ctl_TD1->hwCBP = (UpperAddr(Ctl_Setup) << 16) + LowerAddr(Ctl_Setup);
	ohci_Ctl_TD1->hwBE = ohci_Ctl_TD1->hwCBP + sizeof(setup_format) - 1;

	//Data Stage
	Ctl_Data = (char *)cfg_des;

	ohci_Ctl_TD2->hwINFO = TD_DP_IN|TD_T_DATA1|TD_DI|TD_R;//0x03540000L;
	ohci_Ctl_TD2->hwNextTD = 0;
	ohci_Ctl_TD2->hwCBP = (UpperAddr(Ctl_Data) << 16) + LowerAddr(Ctl_Data);
	ohci_Ctl_TD2->hwBE = ohci_Ctl_TD2->hwCBP + Length - 1;	//In 18 bytes

	//Status Stage
	ohci_Ctl_TD3->hwINFO = TD_DP_OUT|TD_T_DATA1|TD_DI;//0x02480000L;
	ohci_Ctl_TD3->hwNextTD = 0;
	ohci_Ctl_TD3->hwCBP = 0;
	ohci_Ctl_TD3->hwBE = 0;	//Out 0 bytes

	AddingTDtoED(ohci_Ep0, ohci_Ctl_TD3);
	AddingTDtoED(ohci_Ep0, ohci_Ctl_TD2);
	AddingTDtoED(ohci_Ep0, ohci_Ctl_TD1);

   mdelay(1);	//miles
	//Set Control_Filled
	Temp = ohci_regs->cmdstatus | OHCI_CLF;
	DWordWrite(&ohci_regs->cmdstatus, Temp);
	
	do{} while((cfg_des->bLength != 0x09) || (DoneHeadClear == FALSE));	

   //miles
   /*p = (char *) cfg_des;
   p+= sizeof(std_cfg_des);

   if(Length > sizeof(std_cfg_des))
   {
   	p = (char *) if_des;
      p+= sizeof(std_if_des);

      p = (char *) edp_des1;
      p+= sizeof(std_edp_des);

      p = (char *) edp_des2;
      p+= sizeof(std_edp_des);
   }*/
   /////////////////////////////////////

	/*p = (char *) cfg_des;
	q = (char *) UDisk_cfg_des;
	for(i=0;i<sizeof(std_cfg_des);i++)
		if(*p++ != *q++)
			return FALSE;

	if(Length > sizeof(std_cfg_des))
	{
		p = (char *) if_des;
		q = (char *) UDisk_if_des;
		for(i=0;i<sizeof(std_if_des);i++)
			if(*p++ != *q++)
				return FALSE;
		p = (char *) edp_des1;
		q = (char *) UDisk_edp_des1;
		for(i=0;i<sizeof(std_edp_des);i++)
			if(*p++ != *q++)
				return FALSE;
		p = (char *) edp_des2;
		q = (char *) UDisk_edp_des2;
		for(i=0;i<sizeof(std_edp_des);i++)
			if(*p++ != *q++)
				return FALSE;
	}
*/	
	return TRUE;	
}

BOOL OHCI_Get_String_Desc(int num)
{
	u32 Temp;

	if(num == 0)
		LANGID[0] = 0;
   else if(num == 1)
		String1[0] = 0;
	else if(num == 2)
		String2[0] = 0;
	else if(num == 3)
		String3[0] = 0;
	
	//Setup Stage
	Ctl_Setup->bmRequestType = 0x80;
	Ctl_Setup->bRequest = 0x06;
	Ctl_Setup->wValue = 0x0300 | num;
	if(num == 0)
		Ctl_Setup->wIndex = 0x0000;
	else {
		Temp = (LANGID[3] << 8) + LANGID[2];
		Ctl_Setup->wIndex = (u16)Temp;
	}
	Ctl_Setup->wLength = 0x00FF;
	
	ohci_Ctl_TD1->hwINFO = TD_DP_SETUP|TD_T_DATA0|TD_DI;//0x02400000L;
	ohci_Ctl_TD1->hwNextTD = 0;
	ohci_Ctl_TD1->hwCBP = (UpperAddr(Ctl_Setup) << 16) + LowerAddr(Ctl_Setup);
	ohci_Ctl_TD1->hwBE = ohci_Ctl_TD1->hwCBP + sizeof(setup_format) - 1;

	//Data Stage
	if(num == 0)
		Ctl_Data = (char *)LANGID;
   else if(num == 1)
		Ctl_Data = (char *)String1;
	else if(num == 2)
		Ctl_Data = (char *)String2;
	else if(num == 3)
		Ctl_Data = (char *)String3;
	
	ohci_Ctl_TD2->hwINFO = TD_DP_IN|TD_T_DATA1|TD_DI|TD_R;//0x03540000L;
	ohci_Ctl_TD2->hwNextTD = 0;
	ohci_Ctl_TD2->hwCBP = (UpperAddr(Ctl_Data) << 16) + LowerAddr(Ctl_Data);
	ohci_Ctl_TD2->hwBE = ohci_Ctl_TD2->hwCBP + 0xFE;	//In 256 bytes

	//Status Stage
	ohci_Ctl_TD3->hwINFO = TD_DP_OUT|TD_T_DATA1|TD_DI;//0x02480000L;
	ohci_Ctl_TD3->hwNextTD = 0;
	ohci_Ctl_TD3->hwCBP = 0;
	ohci_Ctl_TD3->hwBE = 0;	//Out 0 bytes
	
	AddingTDtoED(ohci_Ep0, ohci_Ctl_TD3);
	AddingTDtoED(ohci_Ep0, ohci_Ctl_TD2);
	AddingTDtoED(ohci_Ep0, ohci_Ctl_TD1);

	mdelay(1);
	//Set Control_Filled
	Temp = ohci_regs->cmdstatus | OHCI_CLF;
	DWordWrite(&ohci_regs->cmdstatus, Temp);
	
	do{} while((*Ctl_Data == 0) || (DoneHeadClear == FALSE));	

	return TRUE;	
}

void OHCI_Set_Configuration(int num)
{
	u32 Temp;
	
	//Setup Stage
	Ctl_Setup->bmRequestType = 0x00;
	Ctl_Setup->bRequest = 0x09;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -