📄 pmicpdk.cpp
字号:
// 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);
// Set reading channel to ADA
t_addr = MC13783_ADC1_ADDR;
t_data = CSP_BITFVAL(MC13783_ADC1_ASC, MC13783_ADC1_ASC_ADC_IDLE) |
// we will use auto ADINC1
CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_BATT) |
// we will use auto ADINC2
CSP_BITFVAL(MC13783_ADC1_ADA2, MC13783_ADC1_ADA_SEL0_CHRGISNS);
t_mask = CSP_BITFMASK(MC13783_ADC1_ASC) |
CSP_BITFMASK(MC13783_ADC1_ADA1) |
CSP_BITFMASK(MC13783_ADC1_ADA2);
SetRegister(t_addr, t_data, t_mask);
// Read conversion values
for ( int i = 0; i < 4; i++ )
{
// Read channel data
t_addr = MC13783_ADC2_ADDR;
GetRegister(t_addr, &t_data);
pReturnVal[i] = CSP_BITFEXT(t_data, MC13783_ADC2_ADD1);
DEBUGMSG(ZONE_FUNC, (_T("t_data[%x] = %x\r\n"), i, pReturnVal[i]));
pReturnVal[i+4] = CSP_BITFEXT(t_data, MC13783_ADC2_ADD2);
DEBUGMSG(ZONE_FUNC, (_T("t_data[%x] = %x\r\n"), (i+4), pReturnVal[i+4]));
}
}
//-----------------------------------------------------------------------------
//
// Function: PMICAdcSetMode
//
// This function sets the mode for the PMIC ADC.
//
// Parameters:
// mode
// [in] Requested ADC.
//
// Returns:
// TRUE if the successful, FALSE otherwise.
//
//-----------------------------------------------------------------------------
static BOOL PMICAdcSetMode(PMIC_TOUCH_MODE mode)
{
BOOL rc = FALSE;
UINT32 addr, data, mask;
DEBUGMSG(ZONE_FUNC, (TEXT("+%s()\r\n"), __WFUNCTION__));
addr = MC13783_ADC0_ADDR;
if (mode != TM_INACTIVE)
{
data = CSP_BITFVAL(MC13783_ADC0_TSMOD, mode) |
CSP_BITFVAL(MC13783_ADC0_ADREFMOD, MC13783_ADC0_ENABLE) |
CSP_BITFVAL(MC13783_ADC0_ADREFEN, MC13783_ADC0_ENABLE);
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -