📄 pmicpdk.cpp
字号:
*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;
}
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;
}
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;
}
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);
*result = PMIC_SUCCESS;
rc = TRUE;
return rc;
}
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);
data1 = CSP_BITFVAL(MC13783_CHG_USB1_VUSBEN, MC13783_CHG_USB1_OP_ENABLE) |
CSP_BITFVAL(MC13783_CHG_USB1_VUSB, inParam->PARAMS.USB_PWR.pwrout) |
CSP_BITFVAL(MC13783_CHG_USB1_VUSBIN, inParam->PARAMS.USB_PWR.pwrin);
SetRegister(addr1, data1, mask1);
*result = PMIC_SUCCESS;
rc = TRUE;
return rc;
}
static BOOL PmicIoctlConvityUsbSetXcvrHandler(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;
switch (inParam->PARAMS.usbXcvrMode)
{
case USB_TRANSCEIVER_OFF:
mask0 |= CSP_BITFMASK(MC13783_USB0_USBXCVREN);
data0 |= CSP_BITFVAL(MC13783_USB0_USBXCVREN, MC13783_USB0_USBXCVREN_DISABLE);
break;
case USB_SUSPEND_ON:
mask0 |= CSP_BITFMASK(MC13783_USB0_USBSUSPEND);
data0 |= CSP_BITFVAL(MC13783_USB0_USBSUSPEND, MC13783_USB0_USBSUSPEND_ON);
break;
case USB_SUSPEND_OFF:
mask0 |= CSP_BITFMASK(MC13783_USB0_USBSUSPEND);
data0 |= CSP_BITFVAL(MC13783_USB0_USBSUSPEND, MC13783_USB0_USBSUSPEND_OFF);
break;
case USB_OTG_SRP_DLP_START:
// note: this is "manual" DLP
mask0 |= CSP_BITFMASK(MC13783_USB0_USBPU);
data0 |= CSP_BITFVAL(MC13783_USB0_USBPU, MC13783_USB_PDPU_SWITCHED_IN);
break;
case USB_OTG_SRP_DLP_STOP:
mask0 |= CSP_BITFMASK(MC13783_USB0_USBPU);
data0 |= CSP_BITFVAL(MC13783_USB0_USBPU, MC13783_USB_PDPU_SWITCHED_OUT);
break;
case USB_SINGLE_ENDED_UNIDIR_TX:
case USB_SINGLE_ENDED_UNIDIR_RX:
mask0 |= CSP_BITFMASK(MC13783_USB0_DATSE0) | CSP_BITFMASK(MC13783_USB0_BIDIR);
data0 |= CSP_BITFVAL(MC13783_USB0_DATSE0, MC13783_USB0_DATSE0_SE) |
CSP_BITFVAL(MC13783_USB0_BIDIR, MC13783_USB0_BIDIR_UNIDIR);
break;
case USB_SINGLE_ENDED_BIDIR_TX:
case USB_SINGLE_ENDED_BIDIR_RX:
mask0 |= CSP_BITFMASK(MC13783_USB0_DATSE0) | CSP_BITFMASK(MC13783_USB0_BIDIR);
data0 |= CSP_BITFVAL(MC13783_USB0_DATSE0, MC13783_USB0_DATSE0_SE) |
CSP_BITFVAL(MC13783_USB0_BIDIR, MC13783_USB0_BIDIR_BIDIR);
break;
case USB_DIFFERENTIAL_UNIDIR_TX:
case USB_DIFFERENTIAL_UNIDIR_RX:
mask0 |= CSP_BITFMASK(MC13783_USB0_DATSE0) | CSP_BITFMASK(MC13783_USB0_BIDIR);
data0 |= CSP_BITFVAL(MC13783_USB0_DATSE0, MC13783_USB0_DATSE0_DIFF) |
CSP_BITFVAL(MC13783_USB0_BIDIR, MC13783_USB0_BIDIR_UNIDIR);
break;
case USB_DIFFERENTIAL_BIDIR_TX:
case USB_DIFFERENTIAL_BIDIR_RX:
mask0 |= CSP_BITFMASK(MC13783_USB0_DATSE0) | CSP_BITFMASK(MC13783_USB0_BIDIR);
data0 |= CSP_BITFVAL(MC13783_USB0_DATSE0, MC13783_USB0_DATSE0_DIFF) |
CSP_BITFVAL(MC13783_USB0_BIDIR, MC13783_USB0_BIDIR_BIDIR);
break;
case USB_SINGLE_ENDED_LOW:
// With MC13783, the se0 can be controlled by the processor, not
// by the PMIC. Hence NO-OP.
break;
default:
*result = PMIC_ERROR;
rc = FALSE;
return rc;
}
SetRegister(addr0, data0, mask0);
*result = PMIC_SUCCESS;
rc = TRUE;
return rc;
}
static BOOL PmicIoctlConvityUsbOtgBeginHnpHandler(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;
mask0 = CSP_BITFMASK(MC13783_USB0_USBPU) |
CSP_BITFMASK(MC13783_USB0_UDPPD) |
CSP_BITFMASK(MC13783_USB0_UDMPD);
if (inParam->PARAMS.usbOtgType == USB_A_DEVICE)
{
// enable pull up on D+ (ensure it is D+, not D-)
mask0 |= CSP_BITFMASK(MC13783_USB0_FSENB);
data0 = CSP_BITFVAL(MC13783_USB0_USBPU, MC13783_USB_PDPU_SWITCHED_IN);
}
else if (inParam->PARAMS.usbOtgType == USB_B_DEVICE)
data0 = 0;
SetRegister(addr0, data0, mask0);
*result = PMIC_SUCCESS;
rc = TRUE;
return rc;
}
static BOOL PmicIoctlConvityUsbOtgEndHnpHandler(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;
mask0 = CSP_BITFMASK(MC13783_USB0_USBPU);
if (inParam->PARAMS.usbOtgType == USB_A_DEVICE)
data0 = 0;
else if (inParam->PARAMS.usbOtgType == USB_B_DEVICE)
{
// enable pull up on D+ (ensure it is D+, not D-)
mask0 |= CSP_BITFMASK(MC13783_USB0_FSENB);
data0 = CSP_BITFVAL(MC13783_USB0_USBPU, MC13783_USB_PDPU_SWITCHED_IN);
}
SetRegister(addr0, data0, mask0);
*result = PMIC_SUCCESS;
rc = TRUE;
return rc;
}
static BOOL PmicIoctlConvityUsbOtgSetConfigHandler(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_ENABLE);
}
if (inParam->PARAMS.usbOtgCfg & USB_OTG_DLP_SRP)
{
data0 |= CSP_BITFMASK(MC13783_USB0_DLPSRP);
mask0 |= CSP_BITFVAL(MC13783_USB0_DLPSRP, MC13783_USB0_DLPSRP_TRIGGER);
}
if (inParam->PARAMS.usbOtgCfg & USB_PULL_OVERRIDE)
{
data0 |= CSP_BITFMASK(MC13783_USB0_PULLOVR);
mask0 |= CSP_BITFVAL(MC13783_USB0_PULLOVR, MC13783_USB0_PULLOVR_ENABLE);
}
if (inParam->PARAMS.usbOtgCfg & USB_VBUS_CURRENT_LIMIT_HIGH)
{
data0 |= CSP_BITFMASK(MC13783_USB0_VBUSPULSETMR);
mask0 |= CSP_BITFVAL(MC13783_USB0_VBUSPULSETMR, MC13783_USB0_VBUSPULSETMR_200MA);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -