⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pmicpdk.cpp

📁 freescale i.mx31 BSP CE5.0全部源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:

	*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 + -