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

📄 hal4otg.c

📁 此為philip 1362 USB DOS下的驅動程式包, 已經共測試並內含有說明文件
💻 C
字号:
/*
   //*************************************************************************
   //
   //                  P H I L I P S   P R O P R I E T A R Y
   //
   //           COPYRIGHT (c)   2000-2002 BY PHILIPS SINGAPORE.
   //                     --  ALL RIGHTS RESERVED  --
   //
   // File Name:	Hal4OTG.C
   // Created:		Feb. 1, 2000
   // Modified:		Jun. 6, 2002
   // Revision:		1.0
   //
   //*************************************************************************
   // Abstract:
   //
 //*************************************************************************
*/

#include <stdio.h>
#include <string.h>
#include <bios.h>
#include <dos.h>
#include <malloc.h>

#include "SysCnfg.h"
#include "BasicTyp.h"
#include "HAL4Sys.h"
#include "D13_Reg.h"
#include "Hal4Hc.h"
#include "PHC_Reg.h"
#include "HAL4OTG.h"

//*************************************************************************
// USB protocol function pointer arrays
//*************************************************************************

//*************************************************************************
//  Public/Global static data
//*************************************************************************

OTG_REG	OtgReg;
USHORT	wTemp;
BOOL 	bCP_Sel;

//*************************************************************************
//  Subroutines
//*************************************************************************

//control pulldown on D-
void Hal4OTG_PULLDOWN_CTRL(BOOL bTrue)
{

	if(TRUE == bTrue)	//pulldown on D- is always enabled
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp|OTG_LOC_PULLDN_DM);
	}
	else
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp&(~OTG_LOC_PULLDN_DM));
	}
}

//control pullup/pulldown on D+
void Hal4OTG_PULLUP_CTRL(BOOL bTrue)
{
	UCHAR byTemp;

#ifdef ISP1362_CHIP
	if(TRUE == bTrue)	//pulldown on D+ is disabled when pullup enabled
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp&(~OTG_LOC_PULLDN_DP)|OTG_LOC_CONN);
	}
	else                //pulldown on D+ is enabled when pullup disabled
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp&(~OTG_LOC_CONN)|OTG_LOC_PULLDN_DP);
	}
#else
	//for FPGA testing, ISP1181 chip needs SoftConnect bit and Vbus sensing to check suspend/awake
	if(TRUE == bTrue)	//pulldown on D+ is disabled when pullup enabled
	{
		byTemp = D13_GetMode();
		D13_SetMode(byTemp|D13REG_MODE_SOFTCONNECT);
		//disable pull-down resistor
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp&(~OTG_LOC_PULLDN_DP));
		//disable auto connect (a_rdis_lcon_en bit)
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp&(~OTG_A_RDIS_LCON_EN));
	}
	else                //pulldown on D+ is enabled when pullup disabled
	{
		byTemp = D13_GetMode();
		D13_SetMode(byTemp&(~D13REG_MODE_SOFTCONNECT));
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp|OTG_LOC_PULLDN_DP);
	}
#endif
}

//control CHRG_VBUS(B-device requests session by VBUS pulsing)
void Hal4OTG_VBUS_SessionReq(BOOL bTrue)
{
	if(TRUE == bTrue)
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp|OTG_CHRG_VBUS);
	}
	else
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp&(~OTG_CHRG_VBUS));
	}
}

//control DISCHRG_VBUS
void Hal4OTG_VBUS_DisChrg(BOOL bTrue)
{
	if(TRUE == bTrue)
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp|OTG_DISCHRG_VBUS);
	}
	else
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp&(~OTG_DISCHRG_VBUS));
	}
}

//control DRV_VBUS(A-device drives VBUS)
void Hal4OTG_VBUS_PowerUp(BOOL bTrue)
{
	if(TRUE == bTrue)
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		if(bCP_Sel == TRUE)
		{
			//enable internal charge-pump
			Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp|OTG_DRV_VBUS);
		}
		else
		{
			//enable external charge-pump
			Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp|OTG_DRV_VBUS|OTG_SEL_CP_EXT);
		}
	}
	else
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		//disable charge-pump
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp&(~OTG_DRV_VBUS));
	}
}

//control SEL_HC_DC, when HC is selected, DC will be disconnected
/*void Hal4OTG_HC_Relay(BOOL bTrue)
{
	if(TRUE == bTrue)
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp&(~OTG_SEL_HC_DC));
	}
	else
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp|OTG_SEL_HC_DC);
	}
} */

//control SEL_HC_DC. 0: HC, 1: DC
void Hal4OTG_HC_DC_Sel(BOOL bTrue)
{
	if(TRUE == bTrue)
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp|OTG_SEL_HC_DC);
	}
	else
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp&(~OTG_SEL_HC_DC));
	}
}

void Hal4OTG_ClearIRQ(USHORT wIRQ)
{
	Hal4Otg_OutW(REG_OTG_INTERRUPT, wIRQ);	//write '1' to clear
}

void Hal4OTG_SRP_Det_En(BOOL bTrue)
{
	if(TRUE == bTrue)
	{
//		Hal4Otg_OutW(REG_OTG_STATUS_CHANGE, 0xffff);	//write '1' to clear
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);

		//VBUS pulsing(use a_sess_vld)
		wTemp |= OTG_A_SRP_DET_EN & (~OTG_A_SEL_SRP);
		//Dataline pulsing(use D+ or D- low to high)
//		wTemp |= OTG_A_SRP_DET_EN | OTG_A_SEL_SRP;
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp);
	}
	else
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp&(~OTG_A_SRP_DET_EN));
	}
}

void Hal4OTG_RdisLcon_En(BOOL bTrue)
{
	if(TRUE == bTrue)
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Otg_OutW(REG_OTG_CONTROL, wTemp|OTG_A_RDIS_LCON_EN);
	}
	else
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp&(~OTG_A_RDIS_LCON_EN));
	}
}

void Hal4OTG_RconLse0_En(BOOL bTrue)
{
	if(TRUE == bTrue)
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Otg_OutW(REG_OTG_CONTROL, wTemp|OTG_B_RCON_LSE0_EN);
	}
	else
	{
		wTemp = Hal4Otg_InW(REG_OTG_CONTROL);
		Hal4Hc_RegOutW(REG_OTG_CONTROL, wTemp&(~OTG_B_RCON_LSE0_EN));
	}
}

void Hal4OTG_SuspendOTGPort(BOOL bTrue)
{
	SLH_REG_ULONG	SlhReg;

	SlhReg.FlexLong = 0;
	if(TRUE == bTrue)
	{
		SlhReg.SlhRootHubPortStatusWr.Bits.SetPortSuspend= TRUE;
		SlhReg.FlexLong = 0x101;
		PHC_SetRootHubPort( 1, SlhReg.FlexLong);
	}
	else
	{
		SlhReg.SlhRootHubPortStatusWr.Bits.ClearPortSuspend = TRUE;
		SlhReg.FlexLong = 0x102;
		PHC_SetRootHubPort( 1, SlhReg.FlexLong);
	}
}

void Hal4OTG_StartTimer(ULONG uTimerout)
{
	if(uTimerout > 0xffffff)    //24bits valid
		return;
	else
	{
		//stop the timer if it is running
		Hal4Hc_RegOutDW(REG_OTG_TMR, 0x0);
		//restart the timer @uTimerout*0.1ms
		Hal4Hc_RegOutDW(REG_OTG_TMR, 0x80000000 | uTimerout);
	}
}

void Hal4OTG_StopTimer(void)
{
	Hal4Hc_RegOutW(REG_OTG_TMR, 0x0);
}

USHORT Hal4OTG_Status(void)
{
	OtgReg.StatusPort.Word = Hal4Otg_InW(REG_OTG_STATUS);
	OtgReg.StatusChangePort.Word = Hal4Otg_InW(REG_OTG_INTERRUPT);
	if(OtgReg.StatusChangePort.Word != 0)
	{
//		printf(">>> OTG Interupt: 0x%x,	Status: 0x%x <<<\n", OtgReg.StatusChangePort.Word,OtgReg.StatusPort.Word);
	}

	//clear all interrupt bits
	Hal4Otg_OutW(REG_OTG_INTERRUPT,0xffff);

	return OtgReg.StatusPort.Word;
}

void Hal4OTG_Sel_Vbus(void)
{
	UCHAR 	ch;

	bCP_Sel = FALSE;
	printf("Select on-chip Charge-Pump for VBUS? Y/N:");
	ch = getchar();
	fflush(stdin);
	if(ch == 'Y' || ch == 'y')
		bCP_Sel = TRUE;
}

⌨️ 快捷键说明

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