📄 pmicpdk.cpp
字号:
// Deinitialize platform-specific configuration
BSPPmicDeinit();
// kill the IST thread
if (hPmicISTThread)
{
bISTTerminate = TRUE;
CloseHandle(hPmicISTThread);
hPmicISTThread = NULL;
}
// Close interrupt event handle
if (hIntrEventPmic)
{
CloseHandle(hIntrEventPmic);
hIntrEventPmic = NULL;
}
// Delete critical sections
DeleteCriticalSection(&pmicCs);
DeleteCriticalSection(&adcCs);
DeleteCriticalSection(&intRegCs);
DEBUGMSG(ZONE_FUNC, (TEXT("-%s\r\n"), __WFUNCTION__));
}
//------------------------------------------------------------------------------
//
// Function: PmicIoctlConvityOpHandler
//
// This function does the general operations (Reset and Set Mode) for
// connectivity interface.
//
// Parameters:
// inParam
// [in] PMIC_PARAM_CONVITY_OP contains op code and specific information
// inParam->PARAMS.ifMode contains the desired mode in case of
// OP_SET_MODE.
// result
// [out] PMIC_STATUS
//
// Returns:
// TRUE if the successful, FALSE otherwise.
//
//------------------------------------------------------------------------------
static BOOL PmicIoctlConvityOpHandler(PMIC_PARAM_CONVITY_OP *inParam,
PMIC_STATUS *result)
{
UINT32 addr0 = MC13783_USB0_ADDR, data0 = 0, mask0 = 0;
UINT32 addr1 = MC13783_CHG_USB1_ADDR, data1 = 0, mask1 = 0;
BOOL rc = FALSE;
*result = PMIC_ERROR;
if (inParam->op == OP_RESET)
{
mask0 = 0xFFFFFFFF;
mask1 = 0xFFFFFFFF;
data0 = MC13783_USB0_ADDR_RESET;
data1 = MC13783_CHG_USB1_ADDR_RESET;
SetRegister(addr0, data0, mask0);
SetRegister(addr1, data1, mask1);
*result = PMIC_SUCCESS;
rc = TRUE;
}
else if (inParam->op == OP_SET_MODE)
{
// in case of USB mode, first enable SPI control of USB.
if (inParam->PARAMS.ifMode == USB)
{
mask0 = CSP_BITFMASK(MC13783_USB0_USBCNTRL);
data0 = CSP_BITFVAL(MC13783_USB0_USBCNTRL,
MC13783_USB0_USBCNTRL_SPI);
SetRegister(addr0, data0, mask0);
}
mask0 = CSP_BITFMASK(MC13783_USB0_CONMODE);
data0 = CSP_BITFVAL(MC13783_USB0_CONMODE, inParam->PARAMS.ifMode);
if (inParam->PARAMS.ifMode == USB)
{
// start USB in powered off, pull-up/downs disabled mode.
mask1 = CSP_BITFMASK(MC13783_CHG_USB1_VUSBEN) |
CSP_BITFMASK(MC13783_CHG_USB1_VBUSEN);
data1 = 0;
SetRegister(addr1, data1, mask1);
mask0 |= CSP_BITFMASK(MC13783_USB0_USBXCVREN) |
CSP_BITFMASK(MC13783_USB0_USBPU) |
CSP_BITFMASK(MC13783_USB0_UDPPD) |
CSP_BITFMASK(MC13783_USB0_UDMPD);
// no change to data0: all these are disabled by setting to 0.
}
else if (inParam->PARAMS.ifMode == RS232)
{
// This mode will set the connections as
// RS232_TX_RX_EXTERNAL_DEFAULT and
// RS232_TX_RX_INTERNAL_DEFAULT, and
// output not tristated.
mask0 |= CSP_BITFMASK(MC13783_CHG_USB1_RSPOL);
data0 |= CSP_BITFVAL(MC13783_CHG_USB1_RSPOL,
MC13783_CHG_USB1_RSTRI_NONE);
}
// no specific settings done for CEA-936 modes besides CONMODE itself.
SetRegister(addr0, data0, mask0);
*result = PMIC_SUCCESS;
rc = TRUE;
}
return rc;
}
//------------------------------------------------------------------------------
//
// Function: PmicIoctlConvityRs232OpHandler
//
// This function does the config setting in RS232 mode for
// connectivity interface.
//
// Parameters:
// inParam
// [in] PMIC_PARAM_CONVITY_OP contains op code and specific information
//
// result
// [out] PMIC_STATUS
//
// Returns:
// TRUE if the successful, FALSE otherwise.
//
//------------------------------------------------------------------------------
static BOOL PmicIoctlConvityRs232OpHandler(PMIC_PARAM_CONVITY_OP *inParam,
PMIC_STATUS *result)
{
UINT32 addr0 = MC13783_USB0_ADDR, data0 = 0, mask0 = 0;
UINT32 addr1 = MC13783_CHG_USB1_ADDR, data1 = 0, mask1 = 0;
BOOL rc = FALSE;
*result = PMIC_ERROR;
if (inParam->op == OP_RS232_SET_CFG)
{
mask0 = CSP_BITFMASK(MC13783_USB0_CONMODE);
mask1 = CSP_BITFMASK(MC13783_CHG_USB1_RSTRI) |
CSP_BITFMASK(MC13783_CHG_USB1_RSPOL);
data1 = CSP_BITFVAL(MC13783_CHG_USB1_RSTRI,
(inParam->PARAMS.RS232_CFG.txTristated == TRUE) ?
1: 0);
if (inParam->PARAMS.RS232_CFG.cfgInternal == RS232_TX_UDATVP_RX_URXVM)
{
data0 = CSP_BITFVAL(MC13783_USB0_CONMODE,
MC13783_USB0_CONMODE_RS232_2);
}
else // DEFAULT or RS232_TX_USE0VM_RX_UDATVP
{
data0 = CSP_BITFVAL(MC13783_USB0_CONMODE,
MC13783_USB0_CONMODE_RS232_1);
}
if (inParam->PARAMS.RS232_CFG.cfgExternal == RS232_TX_UDP_RX_UDM)
{
data1 |= CSP_BITFVAL(MC13783_CHG_USB1_RSPOL,
MC13783_CHG_USB1_RSPOL_TXUDP_RXUDM);
}
// else DEFAULT or RS232_TX_UDM_RX_UDP, set to
// MC13783_CHG_USB1_RSPOL_TXUDM_RXUDP (not set explicitly,
// as MC13783_CHG_USB1_RSPOL_TXUDM_RXUDP is 0)
SetRegister(addr0, data0, mask0);
SetRegister(addr1, data1, mask1);
*result = PMIC_SUCCESS;
rc = TRUE;
}
return rc;
}
//------------------------------------------------------------------------------
//
// Function: PmicIoctlConvityCea936OpHandler
//
// This function does the config setting in CEA-936 mode for
// connectivity interface.
//
// Parameters:
// inParam
// [in] PMIC_PARAM_CONVITY_OP contains op code and specific information
//
// result
// [out] PMIC_STATUS
//
// Returns:
// TRUE if the successful, FALSE otherwise.
//
//------------------------------------------------------------------------------
static BOOL PmicIoctlConvityCea936OpHandler(PMIC_PARAM_CONVITY_OP *inParam,
PMIC_STATUS *result)
{
UINT32 addr0 = MC13783_USB0_ADDR, data0 = 0, mask0 = 0;
UINT32 addr1 = MC13783_CHG_USB1_ADDR, data1 = 0, mask1 = 0;
BOOL rc = FALSE;
*result = PMIC_ERROR;
if (inParam->op == OP_CEA936_SET_DETECT)
{
mask0 = CSP_BITFMASK(MC13783_USB0_DP150KPU) |
CSP_BITFMASK(MC13783_USB0_IDPUCNTRL);
mask1 = CSP_BITFMASK(MC13783_CHG_USB1_ID100KPU);
if (inParam->PARAMS.cea936DetectCfg & ACCESSORY_ID_ID100KPU)
{
data1 |= CSP_BITFVAL(MC13783_CHG_USB1_ID100KPU, 1);
}
if (inParam->PARAMS.cea936DetectCfg & ACCESSORY_ID_IDPUCNTRL)
{
data0 |= CSP_BITFVAL(MC13783_USB0_IDPUCNTRL, 1);
}
if (inParam->PARAMS.cea936DetectCfg & ACCESSORY_ID_DP150KPU)
{
data0 |= CSP_BITFVAL(MC13783_USB0_DP150KPU, 1);
}
SetRegister(addr0, data0, mask0);
SetRegister(addr1, data1, mask1);
*result = PMIC_SUCCESS;
rc = TRUE;
}
else if (inParam->op == OP_CEA936_EXIT)
{
*result = PMIC_SUCCESS;
rc = TRUE;
switch (inParam->PARAMS.cea936ExitSignal)
{
case CEA936_UID_NO_PULLDOWN:
mask0 = CSP_BITFMASK(MC13783_USB0_IDPD) |
CSP_BITFMASK(MC13783_USB0_IDPULSE);
break;
case CEA936_UID_PULLDOWN_6MS:
mask0 = CSP_BITFMASK(MC13783_USB0_IDPD) |
CSP_BITFMASK(MC13783_USB0_IDPULSE);
data0 = CSP_BITFVAL(MC13783_USB0_IDPULSE, 1);
break;
case CEA936_UID_PULLDOWN:
mask0 = CSP_BITFMASK(MC13783_USB0_IDPD);
data0 = CSP_BITFVAL(MC13783_USB0_IDPD, 1);
break;
case CEA936_UDMPULSE:
mask0 = CSP_BITFMASK(MC13783_USB0_DMPULSE);
data0 = CSP_BITFVAL(MC13783_USB0_DMPULSE, 1);
break;
default:
*result = PMIC_ERROR;
rc = FALSE;
break;
}
SetRegister(addr0, data0, mask0);
}
return rc;
}
//------------------------------------------------------------------------------
//
// Function: PmicIoctlConvityUsbSetSpeedHandler
//
// This function does the speed setting in USB mode for
// connectivity interface.
//
// Parameters:
// inParam
// [in] PMIC_PARAM_CONVITY_OP contains op code and specific information
//
// result
// [out] PMIC_STATUS
//
// Returns:
// TRUE if the successful, FALSE otherwise.
//
//------------------------------------------------------------------------------
static BOOL PmicIoctlConvityUsbSetSpeedHandler(PMIC_PARAM_CONVITY_OP *inParam,
PMIC_STATUS *result)
{
UINT32 addr0 = MC13783_USB0_ADDR, data0 = 0, mask0 = 0;
UINT32 addr1 = MC13783_CHG_USB1_ADDR, data1 = 0, mask1 = 0;
BOOL rc = FALSE;
*result = PMIC_ERROR;
if (inParam->PARAMS.USB_SPEED.usbSpeed == USB_HIGH_SPEED)
{
*result = PMIC_NOT_SUPPORTED;
return rc;
}
mask0 = CSP_BITFMASK(MC13783_USB0_FSENB) |
CSP_BITFMASK(MC13783_USB0_USBPU) |
CSP_BITFMASK(MC13783_USB0_UDPPD) |
CSP_BITFMASK(MC13783_USB0_UDMPD) |
CSP_BITFMASK(MC13783_USB0_USBXCVREN);
// turn on the transceiver
data0 = CSP_BITFVAL(MC13783_USB0_USBXCVREN, MC13783_USB0_USBXCVREN_ENABLE);
if (inParam->PARAMS.USB_SPEED.usbSpeed == USB_LOW_SPEED)
{
data0 |= CSP_BITFVAL(MC13783_USB0_FSENB, MC13783_USB0_FSENB_LOW_SPEED);
}
if (inParam->PARAMS.USB_SPEED.usbMode == USB_HOST)
{
// turn on the VBUS, and 15K pull-down resistors.
mask0 |= CSP_BITFMASK(MC13783_CHG_USB1_VBUSEN);
data0 |= CSP_BITFVAL(MC13783_USB0_UDPPD, MC13783_USB_PDPU_SWITCHED_IN) |
CSP_BITFVAL(MC13783_USB0_UDMPD, MC13783_USB_PDPU_SWITCHED_IN) |
CSP_BITFVAL(MC13783_CHG_USB1_VBUSEN,
MC13783_CHG_USB1_OP_ENABLE);
}
else
{
// Turn on the 1.5k pull-up. Turn on 15k pull-down on the other
// data line.
data0 |= CSP_BITFVAL(MC13783_USB0_USBPU, MC13783_USB_PDPU_SWITCHED_IN);
if (inParam->PARAMS.USB_SPEED.usbSpeed == USB_FULL_SPEED)
{
data0 |= CSP_BITFVAL(MC13783_USB0_UDMPD,
MC13783_USB_PDPU_SWITCHED_IN);
}
else
{
data0 |= CSP_BITFVAL(MC13783_USB0_UDPPD,
MC13783_USB_PDPU_SWITCHED_IN);
}
}
SetRegister(addr0, data0, mask0);
SetRegister(addr1, data1, mask1);
*result = PMIC_SUCCESS;
rc = TRUE;
return rc;
}
//------------------------------------------------------------------------------
//
// Function: PmicIoctlConvityUsbSetPowerSourceHandler
//
// This function does the power specific setting in USB mode for
// connectivity interface.
//
// Parameters:
// inParam
// [in] PMIC_PARAM_CONVITY_OP contains op code and specific information
//
// result
// [out] PMIC_STATUS
//
// Returns:
// TRUE if the successful, FALSE otherwise.
//
//------------------------------------------------------------------------------
static BOOL PmicIoctlConvityUsbSetPowerSourceHandler(
PMIC_PARAM_CONVITY_OP *inParam, PMIC_STATUS *result)
{
UINT32 addr0 = MC13783_USB0_ADDR, data0 = 0, mask0 = 0;
UINT32 addr1 = MC13783_CHG_USB1_ADDR, data1 = 0, mask1 = 0;
BOOL rc = FALSE;
*result = PMIC_ERROR;
// Turn on the VUSB regulator. set the input source and output voltage
// as requested.
mask1 = CSP_BITFMASK(MC13783_CHG_USB1_VUSBIN) |
CSP_BITFMASK(MC13783_CHG_USB1_VUSB) |
CSP_BITFMASK(MC13783_CHG_USB1_VUSBEN);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -