📄 hal4otg.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 + -