📄 isp1504.c
字号:
//------------------------------------------------------------------------------
//
// Copyright (C) 2005-2006, Freescale Semiconductor, Inc. All Rights Reserved.
// THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
// AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
//
//------------------------------------------------------------------------------
/*
* File: Isp1504.c
* Purpose: Platform-specific host transceiver configuration
* Interrupt, USB signal pull-up, and Vbus driving configuration
*
* Functions:
* Initialize1504 - initial set up for host mode
* SetULPIHostMode - change those parts for swapping to host
* from client mode
*/
#include <windows.h>
#include <Winbase.h>
#include <ceddk.h>
#include "bsp.h"
#include "mx27_usbcommon.h"
#ifdef DEBUG
void DumpULPIRegsH2(CSP_USB_REG * regs);
#endif
//-----------------------------------------------------------------------------
//
// Function: Initialize1504
//
// This function is to configure the ISP1504 transceiver and corresponding
// USB OTG Core. This function is called by InitializeTransceiver in hwinit.c
//
// Parameters:
// regs - Pointer to the 3 USB Core registers.
//
// Returns:
// TRUE - success, FALSE - failure
//
//-----------------------------------------------------------------------------
BOOL Initialize1504(CSP_USB_REGS * regs, WORD sel)
{
DWORD * temp;
volatile DWORD * view_port;
DEBUGMSG(1, (TEXT("###### Initialize1504 #######\r\n")));
if (sel == 0)
{
USB_HCSPARAMS_T hcs;
temp=(DWORD *)&hcs;
*temp=INREG32(®s->H2.HCSPARAMS);
if (hcs.PPC)
{
USB_PORTSC_T portsc;
temp=(DWORD *)&portsc;
*temp=0;
portsc.CSC=1; portsc.PEC=1; portsc.OCC=1;
*temp=(~*(temp))&INREG32(®s->H2.PORTSC);
SETREG32(®s->H2.PORTSC, *temp);
}
#ifdef DEBUG
DumpULPIRegsH2((CSP_USB_REG *)®s->H2) ;
#endif
view_port = ®s->H2.ULPI_VIEWPORT;
DEBUGMSG(1, (TEXT(" H2 view_port 0x%x\r\n"),view_port));
}
else if (sel == 2)
{
USB_HCSPARAMS_T hcs;
temp=(DWORD *)&hcs;
*temp=INREG32(®s->OTG.HCSPARAMS);
if (hcs.PPC) {
USB_PORTSC_T portsc;
temp=(DWORD *)&portsc;
*temp=0;
portsc.CSC=1; portsc.PEC=1; portsc.OCC=1;portsc.WKOC=1; portsc.WKDC=1; portsc.WKCN=1;
*temp=(~*(temp))&INREG32(®s->OTG.PORTSC);
SETREG32(®s->OTG.PORTSC, *temp);
}
#ifdef DEBUG
DumpULPIRegsH2((CSP_USB_REG *)®s->OTG) ;
#endif
view_port = ®s->OTG.ULPI_VIEWPORT;
DEBUGMSG(1, (TEXT(" OTG view_port 0x%x\r\n"),view_port));
}
DEBUGMSG(1, (TEXT("Access PHY set to host mode - USBHOST2 ... \r\n")));
// Execute reset
ISP1504_WriteReg(view_port, ISP1504_FUNCTION_CTRL_S, 0x20);
ISP1504_WriteReg(view_port, ISP1504_OTG_CTRL_S, 0x1); // ID_PULLUP
// enable external vbus supply
// onboard power supply MC13783 feeds through MAX4787 current limit switch
ISP1504_WriteReg(view_port, ISP1504_OTG_CTRL_S, 0x40); // DRV_VBUS_EXT
// disable vbus (internal)
// use external VBus power supply from MC17383 DC-DC converter
ISP1504_WriteReg(view_port, ISP1504_OTG_CTRL_S, 0x20); // DRV_VBUS
// enable external vbus (fault) indicator
// use MAX4787 fault flag to indicate over current condition
ISP1504_WriteReg(view_port, ISP1504_OTG_CTRL_S, 0x80); // USE_EXT_VBUS_IND
ISP1504_WriteReg(view_port, ISP1504_OTG_CTRL_S, 0x10); // VBus Charge
return TRUE;
}
//-----------------------------------------------------------------------------
//
// Function: SetULPIToHostMode
//
// This function is called by CSP public module to configure the ULPI to host
// mode before putting the ULPI to suspend mode or after resume.
//
// Parameters:
// pRegs - Pointer to the 3 USB Core registers.
// pSel - USB Core to be configured.
// fSuspend - Suspend or resume
//
// Returns:
// NONE
//
//-----------------------------------------------------------------------------
void SetULPIHostMode(PCSP_USB_REGS pRegs, WORD pSel, BOOL fSuspend)
{
volatile DWORD * view_port;
DEBUGMSG(1, (TEXT("SetULPIHostMode sel = %d\r\n"),pSel));
if (pSel == 0)
view_port = &pRegs->H2.ULPI_VIEWPORT;
else if (pSel == 2)
view_port = &pRegs->OTG.ULPI_VIEWPORT;
else
return;
DEBUGMSG(1, (TEXT("Dump USBCTRL = 0x%x\r\n"), INREG32(&pRegs->USB_CTRL)));
if (fSuspend)
{
ISP1504_WriteReg(view_port, ISP1504_FUNCTION_CTRL_C, 0x3); // Clear the XCVRSELECT
ISP1504_WriteReg(view_port, ISP1504_FUNCTION_CTRL_S, 0x1); // Set the XCVRSELECT
ISP1504_WriteReg(view_port, ISP1504_FUNCTION_CTRL_S, 0x4); // Set the TERM SELECT
ISP1504_WriteReg(view_port, ISP1504_FUNCTION_CTRL_C, 0x18); // Set the OPMODE = 00
ISP1504_WriteReg(view_port, ISP1504_OTG_CTRL_S, 0x2); // DP_PULL_DOWN
ISP1504_WriteReg(view_port, ISP1504_OTG_CTRL_S, 0x4); // DM_PULL_DOWN
}
else
{
ISP1504_WriteReg(view_port, ISP1504_FUNCTION_CTRL_S, 0x20);
ISP1504_WriteReg(view_port, ISP1504_OTG_CTRL_S, 0x1); // ID_PULLUP
// enable external vbus supply
// onboard power supply MC13783 feeds through MAX4787 current limit switch
ISP1504_WriteReg(view_port, ISP1504_OTG_CTRL_S, 0x40); // DRV_VBUS_EXT
// disable vbus (internal)
// use external VBus power supply from MC17383 DC-DC converter
ISP1504_WriteReg(view_port, ISP1504_OTG_CTRL_S, 0x20); // DRV_VBUS
// enable external vbus (fault) indicator
// use MAX4787 fault flag to indicate over current condition
ISP1504_WriteReg(view_port, ISP1504_OTG_CTRL_S, 0x80); // USE_EXT_VBUS_IND
ISP1504_WriteReg(view_port, ISP1504_OTG_CTRL_S, 0x10); // VBus Charge
}
}
#ifdef DEBUG
void DumpULPIRegsH2(CSP_USB_REG * regs)
{
CSP_USB_REG *pReg = regs;
// Read the ID
WORD sel =0;//= BSPGetUSBControllerType();
/* if (sel == USB_SEL_OTG)
pReg = ®s->OTG;
else if (sel == USB_SEL_H2)
pReg = ®s->H2;
else
return;
*/
//CSP_USB_REG *pReg;
DEBUGMSG(1, (L"H2 DumpULPIRegsH2 regs 0x%X\r\n", regs));
//pReg = ®s->H2;
//pReg = *(volatile CSP_USB_REG *)®s;
DEBUGMSG(1, (L"H2 after DumpULPIRegsH2 **pReg 0x%X\r\n", pReg));
DEBUGMSG(1, (L"Dump PORTSC (0x%x)\r\n", INREG32(&pReg->PORTSC[0])));
DEBUGMSG(1, (L"Dump ULPI registers(%x)\r\n", INREG32(&pReg->ULPI_VIEWPORT)));
DEBUGMSG(1, (L"\tULPI_VID=(%x,%x)\r\n",
ISP1504_ReadReg(&pReg->ULPI_VIEWPORT, ISP1504_VENDERID_LOW_R),
ISP1504_ReadReg(&pReg->ULPI_VIEWPORT, ISP1504_VENDERID_HIGH_R)));
DEBUGMSG(1, (L"\tULPI_PID=(%x,%x)\r\n",
ISP1504_ReadReg(&pReg->ULPI_VIEWPORT, ISP1504_PRODUCT_LOW_R),
ISP1504_ReadReg(&pReg->ULPI_VIEWPORT, ISP1504_PRODUCT_HIGH_R)));
// XCVR Select[1:0]=00, Term Select[2]=0, OP Mode[4:3]=00
// ISP1504_WriteReg(&pReg->ULPI_VIEWPORT, ISP1504_FUNCTION_CTRL_C, 0x1f);
DEBUGMSG(1, (L"\tFunction Control(%x)=%x\r\n",
ISP1504_FUNCTION_CTRL_RW,
ISP1504_ReadReg(&pReg->ULPI_VIEWPORT, ISP1504_FUNCTION_CTRL_RW)));
DEBUGMSG(1, (L"\tInterface Control(%x)=%x\r\n",
ISP1504_INTERFACE_CTRL_RW,
ISP1504_ReadReg(&pReg->ULPI_VIEWPORT, ISP1504_INTERFACE_CTRL_RW)));
// DP_PullDown[1]=0, DM_PullDown[2]=0
// ISP1504_WriteReg(&pReg->ULPI_VIEWPORT, ISP1504_OTG_CTRL_C, 0x6);
DEBUGMSG(1, (L"\tOTG Control(%x)=%x\r\n",
ISP1504_OTG_CTRL_RW,
ISP1504_ReadReg(&pReg->ULPI_VIEWPORT, ISP1504_OTG_CTRL_RW)));
DEBUGMSG(1, (L"\tInterrupt Enable rising(%x)=%x\r\n",
ISP1504_INTR_RISING_RW,
ISP1504_ReadReg(&pReg->ULPI_VIEWPORT, ISP1504_INTR_RISING_RW)));
DEBUGMSG(1, (L"\tInterrupt Enable Falling(%x)=%x\r\n",
ISP1504_INTR_FALLING_RW,
ISP1504_ReadReg(&pReg->ULPI_VIEWPORT, ISP1504_INTR_FALLING_RW)));
DEBUGMSG(1, (L"\tInterrupt Status(%x)=%x\r\n",
ISP1504_INTR_STATUS_R,
ISP1504_ReadReg(&pReg->ULPI_VIEWPORT, ISP1504_INTR_STATUS_R)));
DEBUGMSG(1, (L"\tInterrupt Latch(%x)=%x\r\n",
ISP1504_INTR_LATCH_RC,
ISP1504_ReadReg(&pReg->ULPI_VIEWPORT, ISP1504_INTR_LATCH_RC)));
DEBUGMSG(1, (L"\tDebug(%x)=%x\r\n",
ISP1504_DEBUG_R,
ISP1504_ReadReg(&pReg->ULPI_VIEWPORT, ISP1504_DEBUG_R)));
DEBUGMSG(1, (L"\tScratch(%x)=%x\r\n",
ISP1504_SCRATCH_RW,
ISP1504_ReadReg(&pReg->ULPI_VIEWPORT, ISP1504_SCRATCH_RW)));
DEBUGMSG(1, (L"\tPower(%x)=%x\r\n",
ISP1504_POWER_CTRL_RW,
ISP1504_ReadReg(&pReg->ULPI_VIEWPORT, ISP1504_POWER_CTRL_RW)));
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -