📄 pmicpdk.cpp
字号:
{
data0 |= CSP_BITFMASK(MC13783_USB0_VBUSPULSETMR);
mask0 |= CSP_BITFVAL(MC13783_USB0_VBUSPULSETMR, MC13783_USB0_VBUSPULSETMR_910UA);
}
else if (inParam->PARAMS.usbOtgCfg & USB_VBUS_CURRENT_LIMIT_LOW_10MS)
{
data0 |= CSP_BITFMASK(MC13783_USB0_VBUSPULSETMR);
mask0 |= CSP_BITFVAL(MC13783_USB0_VBUSPULSETMR, MC13783_USB0_VBUSPULSETMR_910UA_10MS);
}
else if (inParam->PARAMS.usbOtgCfg & USB_VBUS_CURRENT_LIMIT_LOW_20MS)
{
data0 |= CSP_BITFMASK(MC13783_USB0_VBUSPULSETMR);
mask0 |= CSP_BITFVAL(MC13783_USB0_VBUSPULSETMR, MC13783_USB0_VBUSPULSETMR_910UA_20MS);
}
else if (inParam->PARAMS.usbOtgCfg & USB_VBUS_CURRENT_LIMIT_LOW_30MS)
{
data0 |= CSP_BITFMASK(MC13783_USB0_VBUSPULSETMR);
mask0 |= CSP_BITFVAL(MC13783_USB0_VBUSPULSETMR, MC13783_USB0_VBUSPULSETMR_910UA_30MS);
}
else if (inParam->PARAMS.usbOtgCfg & USB_VBUS_CURRENT_LIMIT_LOW_40MS)
{
data0 |= CSP_BITFMASK(MC13783_USB0_VBUSPULSETMR);
mask0 |= CSP_BITFVAL(MC13783_USB0_VBUSPULSETMR, MC13783_USB0_VBUSPULSETMR_910UA_40MS);
}
else if (inParam->PARAMS.usbOtgCfg & USB_VBUS_CURRENT_LIMIT_LOW_50MS)
{
data0 |= CSP_BITFMASK(MC13783_USB0_VBUSPULSETMR);
mask0 |= CSP_BITFVAL(MC13783_USB0_VBUSPULSETMR, MC13783_USB0_VBUSPULSETMR_910UA_50MS);
}
else if (inParam->PARAMS.usbOtgCfg & USB_VBUS_CURRENT_LIMIT_LOW_60MS)
{
data0 |= CSP_BITFMASK(MC13783_USB0_VBUSPULSETMR);
mask0 |= CSP_BITFVAL(MC13783_USB0_VBUSPULSETMR, MC13783_USB0_VBUSPULSETMR_910UA_60MS);
}
if (inParam->PARAMS.usbOtgCfg & USB_VBUS_PULLDOWN)
{
data0 |= CSP_BITFMASK(MC13783_USB0_VBUS70KPDENB);
mask0 |= CSP_BITFVAL(MC13783_USB0_VBUS70KPDENB, MC13783_USB0_VBUS70KPDENB_ENABLE);
}
SetRegister(addr0, data0, mask0);
*result = PMIC_SUCCESS;
rc = TRUE;
return rc;
}
static BOOL PmicIoctlConvityUsbOtgClearConfigHandler(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.usbOtgCfg & USB_OTG_SE0CONN)
{
data0 |= CSP_BITFMASK(MC13783_USB0_SE0CONN);
mask0 |= CSP_BITFVAL(MC13783_USB0_SE0CONN, MC13783_USB0_SE0CONN_AUTOCON_DISABLE);
}
if (inParam->PARAMS.usbOtgCfg & USB_PULL_OVERRIDE)
{
data0 |= CSP_BITFMASK(MC13783_USB0_PULLOVR);
mask0 |= CSP_BITFVAL(MC13783_USB0_PULLOVR, MC13783_USB0_PULLOVR_DISABLE);
}
if (inParam->PARAMS.usbOtgCfg & USB_VBUS_PULLDOWN)
{
data0 |= CSP_BITFMASK(MC13783_USB0_VBUS70KPDENB);
mask0 |= CSP_BITFVAL(MC13783_USB0_VBUS70KPDENB, MC13783_USB0_VBUS70KPDENB_DISABLE);
}
SetRegister(addr0, data0, mask0);
*result = PMIC_SUCCESS;
rc = TRUE;
return rc;
}
//------------------------------------------------------------------------------
//
// Function: PmicADCGetSettings
//
// This function gets the adc configuration information.
//
// Parameters:
// channel
// [in] channels to be configured.
// group
// [out] group setting.
// chann
// [out] channel setting in ADC1.
// ena
// [out] bits to be enabled in ADC0.
//
// Returns:
// Status.
//
//-----------------------------------------------------------------------------
static PMIC_STATUS PmicADCGetSettings(UINT16 channel, UINT32 *group,
UINT32 *chann, UINT32 *ena)
{
*group = 0;
*chann = 0;
*ena = 0;
switch (channel)
{
case CSP_BITFMASK(MC13783_ADC_BATT):
// Select group 0
*group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP0);
// Select channel battery voltage
*chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_BATT);
*ena = CSP_BITFVAL(MC13783_ADC0_BATICON, MC13783_ADC0_ENABLE);
DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_BATT\r\n")));
break;
case CSP_BITFMASK(MC13783_ADC_BATTISNS):
// Select group 0
*group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP0);
// Select channel battery current
*chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_BATTISNS);
*ena = CSP_BITFVAL(MC13783_ADC0_BATICON, MC13783_ADC0_ENABLE);
DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_BATTISNS\r\n")));
break;
case CSP_BITFMASK(MC13783_ADC_BPSNS):
// Select group 0
*group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP0);
// Select channel application supply
*chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_BPSNS);
DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_BPSNS\r\n")));
break;
case CSP_BITFMASK(MC13783_ADC_CHRGRAW):
// Select group 0
*group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP0);
// Select channel charger voltage
*chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_CHRGRAW);
DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_CHRGRAW\r\n")));
break;
case CSP_BITFMASK(MC13783_ADC_CHRGISNS):
// Select group 0
*group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP0);
// Select channel battery current
*chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_CHRGISNS);
// Enable CHRGICON bit to retrieve charger current sample from ADC
*ena = CSP_BITFVAL(MC13783_ADC0_CHRGICON, MC13783_ADC0_ENABLE);
DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_CHRGISNS\r\n")));
break;
case CSP_BITFMASK(MC13783_ADC_RTHEN):
// Select group 0
*group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP0);
// Select channel battery pack thermistor
*chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_RTHEN);
// Enable RTHEN bit to retrieve battery pack thermistor sample from
// ADC
*ena = CSP_BITFVAL(MC13783_ADC0_RTHEN, MC13783_ADC0_ENABLE);
DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_RTHEN\r\n")));
break;
case CSP_BITFMASK(MC13783_ADC_LICELL):
// Select group 0
*group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP0);
// Select channel backup voltage (LICELL)
*chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_LICELL);
// Enable BATICON bit to retrieve backup voltage sample from ADC
*ena = CSP_BITFVAL(MC13783_ADC0_LICELLCON, MC13783_ADC0_ENABLE);
DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_LICELL\r\n")));
break;
case CSP_BITFMASK(MC13783_ADC_DTHEN):
// Select group 0
*group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP0);
// Select channel die temperature
*chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_DTHEN);
// Enable DTHEN bit to retrieve die temperature sample from ADC
*ena = CSP_BITFVAL(MC13783_ADC0_DTHEN, MC13783_ADC0_ENABLE);
DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_DTHEN\r\n")));
break;
case CSP_BITFMASK(MC13783_ADC_ADIN8):
// Select group 1
*group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP1);
// Select channel ADIN8
*chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL1_ADIN8);
DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_ADIN8\r\n")));
break;
case CSP_BITFMASK(MC13783_ADC_ADIN9):
// Select group 1
*group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP1);
// Select channel ADIN9
*chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL1_ADIN9);
DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_ADIN9\r\n")));
break;
case CSP_BITFMASK(MC13783_ADC_ADIN10):
// Select group 1
*group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP1);
// Select channel ADIN10
*chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL1_ADIN10);
DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_ADIN10\r\n")));
break;
case CSP_BITFMASK(MC13783_ADC_ADIN11):
// Select group 1
*group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP1);
// Sselect channel ADIN11
*chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL1_ADIN11);
DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_ADIN11\r\n")));
break;
case CSP_BITFMASK(MC13783_ADC_TSX1):
// Select group 1
*group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP1);
// Select channel TSX1
*chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL1_TSX1);
DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_TSX1\r\n")));
break;
case CSP_BITFMASK(MC13783_ADC_TSX2):
// Select group 1
*group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP1);
// Select channel TSX2
*chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL1_TSX2);
DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_TSX2\r\n")));
break;
case CSP_BITFMASK(MC13783_ADC_TSY1):
// Select group 1
*group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP1);
// Select channel TSY1
*chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL1_TSY1);
DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_TSY1\r\n")));
break;
case CSP_BITFMASK(MC13783_ADC_TSY2):
// Select group 1
*group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP1);
// Select channel TSY2
*chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL1_TSY2);
DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_TSY2\r\n")));
break;
default:
return PMIC_PARAMETER_ERROR;
}
return PMIC_SUCCESS;
}
//-----------------------------------------------------------------------------
//
// Function: PmicADCConvert
//
// This function triggers a new set of ADC conversions and waits for the
// conversions to complete.
//
// Parameters:
// mode
//
// Returns:
// Status.
//
//-----------------------------------------------------------------------------
static PMIC_STATUS PmicADCConvert(void)
{
PMIC_STATUS rc = PMIC_ERROR;
UINT32 addr, data, mask;
addr = MC13783_ADC1_ADDR;
data = CSP_BITFVAL(MC13783_ADC1_ASC, MC13783_ADC1_ASC_START_ADC);
mask = CSP_BITFMASK(MC13783_ADC1_ASC);
// If we are in polled communication mode
if (g_bAdcPolled)
{
// Start the ADC conversion
SetRegister(addr, data, mask);
// Poll the ADC1 until the ASC bit is clear
DWORD maxRetries = 1000;
do
{
GetRegister(addr, &data);
} while ((data & mask) && --maxRetries);
if (!maxRetries)
{
ERRORMSG(TRUE, (_T("ADC operation timeout. \r\n")));
goto cleanUp;
}
}
else
{
// Make sure ADC done interrupt is unmasked and cleared
PMICIoctlIntEnable( PMIC_MC13783_INT_ADCDONEI, TRUE );
// Start the ADC conversion
SetRegister(addr, data, mask);
// Wait for ADC complete interrupt
if(WaitForSingleObject(phIntrHdlr[PMIC_MC13783_INT_ADCDONEI],
ADC_OPERATION_TIMEOUT) != WAIT_OBJECT_0)
{
ERRORMSG(TRUE, (_T("ADC operation timeout. \r\n")));
GetRegister(MC13783_INT_STAT0_ADDR, &data);
RETAILMSG(TRUE, (_T("MC13783_INT_STAT0 = 0x%x"), data));
GetRegister(MC13783_INT_MSK0_ADDR, &data);
RETAILMSG(TRUE, (_T("MC13783_INT_MSK0 = 0x%x"), data));
GetRegister(MC13783_INT_STAT1_ADDR, &data);
RETAILMSG(TRUE, (_T("MC13783_INT_STAT1 = 0x%x"), data));
GetRegister(MC13783_INT_MSK1_ADDR, &data);
RETAILMSG(TRUE, (_T("MC13783_INT_MSK1 = 0x%x"), data));
BSPPmicReadIntrStatus();
goto cleanUp;
}
}
rc = PMIC_SUCCESS;
cleanUp:
return rc;
}
//-----------------------------------------------------------------------------
//
// Function: PmicADCDisable
//
// This function is just a helper function that disables ADC conversions
//
// Parameters:
//
// Returns:
//
//-----------------------------------------------------------------------------
static VOID PmicADCDisable(void)
{
UINT32 addr, data, mask;
// Disable the ADC
addr = MC13783_ADC1_ADDR;
data = CSP_BITFVAL(MC13783_ADC1_ADEN, MC13783_ADC1_ADEN_DISABLE);
mask = CSP_BITFMASK(MC13783_ADC1_ADEN);
SetRegister(addr, data, mask);
}
//-----------------------------------------------------------------------------
//
// Function: PmicReadEightValues
//
// This function is a helper function that reads eight values at a time
// from the ADC. This method uses the auto increment feature with two offset
// pointers. This is done to optimize the ADC read. Uses 4 CSPI transactions
// compared to 16.
//
// Parameters:
// pReturnVal
// [out] This points to the eight returned UINT16 values.
//
// Returns:
//
//-----------------------------------------------------------------------------
static VOID PmicReadEightValues( UINT16* pReturnVal )
{
UINT32 t_addr, t_data, t_mask;
// configure for auto increment
t_addr = MC13783_ADC0_ADDR;
t_data = CSP_BITFVAL(MC13783_ADC0_ADINC1, MC13783_ADC0_ADINC_AUTO_INCR) |
CSP_BITFVAL(MC13783_ADC0_ADINC2, MC13783_ADC0_ADINC_AUTO_INCR);
t_mask = CSP_BITFMASK(MC13783_ADC0_ADINC1) |
CSP_BITFMASK(MC13783_ADC0_ADINC2);
SetRegister(t_addr, t_data, t_mask);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -