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

📄 xllp_dvm.c

📁 Intel PXA270底层设备驱动代码
💻 C
字号:
#include "xllp_dvm.h"

/******************************************************************************
XDP_DOC_HDR_END

  Function Name: XllpDvmInit(P_XLLP_PWRMGR_T  v_pPmgrReg, P_XLLP_CLKMGR_T v_pClkReg)

  Description: Enable I2C bus, and configure 

  Input Arguments: P_XLLP_CLOCK_T  P_XLLP_PWRMGR_T
     
  Output Arguments:
     None
  
  return:
	true
	false

XLLP_DOC_HDR_END
*******************************************************************************/

void XllpDvmInit(P_XLLP_PWRMGR_T v_pPmgrReg,  P_XLLP_CLKMGR_T v_pClkReg, P_XLLP_GPIO_T gpio)
{
     v_pClkReg->cken |= XLLP_CLKEN_PWRI2C;
     v_pClkReg->cken |= XLLP_CLKEN_I2C;
     v_pPmgrReg->PCFR |= XLLP_PCFR_PI2C_EN;  //unncessary for XLLP_PCFR_SYSEN_EN

     gpio->GPDR3 |= (XLLP_GPIO_BIT_SCL | XLLP_GPIO_BIT_SDA);
     gpio->GAFR3_U |=  ( XLLP_GPIO_AF_BIT_SCL | XLLP_GPIO_AF_BIT_SDA);
}

/******************************************************************************
XDP_DOC_HDR_END

  Function Name: XLLPGetCurrentFreqSetting( )

  Description: return current frequency setting 

  Input Arguments: P_XLLP_CLOCK_T
     
  Output Arguments:
     None
  
  return:
     XLLP_FREQ_PARAM

XLLP_DOC_HDR_END
*******************************************************************************/

XLLP_FREQ_PARAM  XLLPGetCurrentFreqSetting(volatile XLLP_CLKMGR_T *v_pClkReg)
{
   XLLP_FREQ_PARAM  freq_status;
   XLLP_UINT32_T    CLKCFGValue = 0;
   XLLP_UINT32_T    LMulti;
   XLLP_UINT32_T    NMulti;
   
   CLKCFGValue = XllpXSC1ReadCLKCFG();
   freq_status.turbo_mode = (CLKCFGValue &  XLLP_CLKCFG_T);
   freq_status.fastbus_mode = (CLKCFGValue &  XLLP_CLKCFG_B) >>3;

   LMulti = v_pClkReg->ccsr & XLLP_CCCR_L;
   NMulti = ((v_pClkReg->ccsr & XLLP_CCCR_2N)>>7);

   if (freq_status.turbo_mode == 1)
        freq_status.frequency = (PRIMARY_CLOCK_FREQ * LMulti * NMulti)/2;
   else
	    freq_status.frequency = (PRIMARY_CLOCK_FREQ * LMulti);
               //read coprocessor 
   return freq_status;
}

/******************************************************************************
XDP_DOC_HDR_END

  Function Name: XLLPSetCoreRunFrequency(P_XLLP_CLOCK_T, XLLP_FREQ_PARAM)

  Description: Set the run mode corfrequency
  

  Input Arguments: P_XLLP_CLOCK_T  P_XLLP_PWRMGR_T
     
  Output Arguments:
     None
  
  return:
	true
	false

XLLP_DOC_HDR_END
*******************************************************************************/

XLLP_BOOL_T XLLPSetCoreRunFrequency(P_XLLP_CLKMGR_T v_pClkReg, XLLP_FREQ_PARAM freq_param)
{
	//set up the new frequency mulitipliers, N and L
    XLLP_UINT32_T newCLKCFGValue = 0;
    XLLP_UINT32_T  CLKCFGValue = 0;
    XLLP_UINT32_T  Int_num;
    XLLP_UINT32_T  LMulti, NMulti;

	LMulti = freq_param.frequency / PRIMARY_CLOCK_FREQ;
	NMulti = 2;                               //run mode N=2    
	v_pClkReg->cccr = (NMulti<<7) | LMulti;
    newCLKCFGValue =(XLLP_CLKCFG_F | (freq_param.fastbus_mode<<3) );
	Int_num = XllpIntcDisableInts();
	XllpXSC1FreqChange(newCLKCFGValue);
	XllpIntcRestoreInts(Int_num);
	return XLLP_TRUE;
}


/******************************************************************************
XDP_DOC_HDR_END

  Function Name: XLLPSetCoreVoltage(P_XLLP_I2C_T v_pI2CReg)

  Description: Set the voltage through I2C
  

  Input Arguments: P_XLLP_I2C_T
     
  Output Arguments:
     None
  
  return:

    NONE

XLLP_DOC_HDR_END
*******************************************************************************/
void XllpSetCoreVoltage(P_XLLP_I2C_T  v_pI2CReg, XLLP_UINT32_T dacValue)
{
	
   // lpWriteDebugStringFunc(TEXT("SetCoreVoltage...\r\n"));
	v_pI2CReg->ISAR = 0x0; // Set Slave address
	v_pI2CReg->ICR =  0x0;	 // Clear interrupts in ICR
	v_pI2CReg->ICR = (XLLP_ICR_UIE | XLLP_ICR_SCLEA); // Enable I2C unit, and enable clock output
	v_pI2CReg->IDBR = 0x40; // Set D/A's slave address and enable write mode
	v_pI2CReg->ICR = (XLLP_ICR_UIE | XLLP_ICR_SCLEA | XLLP_ICR_START | XLLP_ICR_TB); // Send START and then TRANSMIT the byte.
	

	while((v_pI2CReg->ISR & XLLP_ISR_ITE) != XLLP_ISR_ITE); // Wait for ITE to go high

	v_pI2CReg->ISR = XLLP_ISR_ITE; // Write the ITE bit to clear it.

	v_pI2CReg->IDBR = 0x0; // Command 
	v_pI2CReg->ICR = (XLLP_ICR_UIE | XLLP_ICR_SCLEA | XLLP_ICR_TB); // Clear START, STOP, set TB
	while((v_pI2CReg->ISR & XLLP_ISR_ITE) != XLLP_ISR_ITE); // Wait for ITE to go high
	v_pI2CReg->ISR = XLLP_ISR_ITE; // Write the ITE bit to clear it.
    
	v_pI2CReg->IDBR = dacValue & 0x000000FF; // LSB 
//	EdbgOutputDebugString("Enters here - LSB I2C->IDBR = %x\r\n",I2C->IDBR);
	v_pI2CReg->ICR = (XLLP_ICR_UIE | XLLP_ICR_SCLEA | XLLP_ICR_TB); // Clear START, STOP, set TB
	while((v_pI2CReg->ISR & XLLP_ISR_ITE) != XLLP_ISR_ITE); // Wait for ITE to go high
	v_pI2CReg->ISR = XLLP_ISR_ITE; // Write the ITE bit to clear it.
    v_pI2CReg->IDBR = (dacValue & 0x0000FF00) >> 8; // MSB

//	EdbgOutputDebugString("Enters here - MSB I2C->IDBR = %x\r\n",I2C->IDBR);
	v_pI2CReg->ICR = (XLLP_ICR_UIE | XLLP_ICR_SCLEA | XLLP_ICR_TB); // Clear START, STOP, set TB
	while((v_pI2CReg->ISR & XLLP_ISR_ITE) != XLLP_ISR_ITE); // Wait for ITE to go high
	v_pI2CReg->ISR = XLLP_ISR_ITE; // Write the ITE bit to clear it.



	v_pI2CReg->ICR = (XLLP_ICR_UIE | XLLP_ICR_SCLEA | XLLP_ICR_STOP | XLLP_ICR_TB);
	while((v_pI2CReg->ISR & XLLP_ISR_ITE) != XLLP_ISR_ITE); // Wait for ITE to go high
	v_pI2CReg->ISR = XLLP_ISR_ITE; // Write the ITE bit to clear it.
//	EdbgOutputDebugString("Enters here - I2C->ISR = %x\r\n",I2C->ISR);
}

/******************************************************************************
XDP_DOC_HDR_END

  Function Name: XllpVMSetVoltage(DWORD DACValue, P_XLLP_PWRMGR_T  v_pPmgrReg)

  Description: Set the voltage through I2C
  

  Input Arguments: P_XLLP_I2C_T
     
  Output Arguments:
     None
  
  return:

    NONE

XLLP_DOC_HDR_END
*******************************************************************************/
void XllpVMSetVoltage(XLLP_UINT32_T DACValue, P_XLLP_PWRMGR_T  v_pPmgrReg)
{
	XLLP_UINT32_T dataArray[3];
	XLLP_UINT32_T start = 0, end = 0;
    XLLP_UINT32_T i = 0;

	dataArray[0] = 0;  //Command 0
	dataArray[1] = (DACValue & 0x000000FF);
	dataArray[2] = (DACValue & 0x0000FF00)>>8;


	v_pPmgrReg->PVCR = 0;


	v_pPmgrReg->PCFR &= ~XLLP_PCFR_FVC;   // ~PCFR_FVC;  
	v_pPmgrReg->PVCR &=0xFFFFF07F; //no delay is necessary
	v_pPmgrReg->PVCR &= 0xFFFFFF80;    //clear slave address
	v_pPmgrReg->PVCR |= VOLTAGE_REGULATOR_ADDRESS;         //set slave address

	v_pPmgrReg->PVCR &= 0xFE0FFFFF;   //clear read pointer 0


	 //Clear SQC DCE and MBC
   	for(i=0; i<32; i++)
	{
		v_pPmgrReg->PCMDn[i]  &= ~XLLP_PCMD_SQC;
		v_pPmgrReg->PCMDn[i]  &= ~XLLP_PCMD_DCE;      //Clear DCE 
        v_pPmgrReg->PCMDn[i]  &= ~XLLP_PCMD_MBC;     //Clear MBC
	}
     
	//Set MBC bit

	 	v_pPmgrReg->PCMDn[0] |=  XLLP_PCMD_MBC; 
	    v_pPmgrReg->PCMDn[1] |=  XLLP_PCMD_MBC;

	//indicate the last byte of this command is holded in this register
        v_pPmgrReg->PCMDn[2] &=~ XLLP_PCMD_MBC; 

	//indicate this is the first and last command also
	 v_pPmgrReg->PCMDn[0] |=  XLLP_PCMD_LC ;    //LC bit
	 v_pPmgrReg->PCMDn[1] |=  XLLP_PCMD_LC ;
	 v_pPmgrReg->PCMDn[2] |=  XLLP_PCMD_LC ;

	 //programming the command data bits
	 v_pPmgrReg->PCMDn[0] &= 0xFFFFFF00;
     v_pPmgrReg->PCMDn[0] |= dataArray[0];

     v_pPmgrReg->PCMDn[1] &= 0xFFFFFF00;
     v_pPmgrReg->PCMDn[1] |= dataArray[1];

	 v_pPmgrReg->PCMDn[2] &= 0xFFFFFF00;
     v_pPmgrReg->PCMDn[2] |= dataArray[2];

	//indicate this is the first and last command also
	 v_pPmgrReg->PCMDn[0] |=  XLLP_PCMD_LC;    //LC bit
	 v_pPmgrReg->PCMDn[1] |=  XLLP_PCMD_LC;
	 v_pPmgrReg->PCMDn[2] |=  XLLP_PCMD_LC;

	 //programming the command data bits
	 v_pPmgrReg->PCMDn[0] &= 0xFFFFFF00;
     v_pPmgrReg->PCMDn[0] |= dataArray[0];

     v_pPmgrReg->PCMDn[1] &= 0xFFFFFF00;
     v_pPmgrReg->PCMDn[1] |= dataArray[1];

	 v_pPmgrReg->PCMDn[2] &= 0xFFFFFF00;
     v_pPmgrReg->PCMDn[2] |= dataArray[2];


	 //Enable Power I2C
      v_pPmgrReg->PCFR |= XLLP_PCFR_PI2C_EN;  //enable Pwr I2C 

	 //Execute voltage change sequence
	  XllpXSC1ChangeVoltage( );    //set VC on the PWRMODE on CP14
    
     while ( ( (v_pPmgrReg->PVCR) & XLLP_PVCR_VCSA) !=0 );


}

/******************************************************************************
XDP_DOC_HDR_END

  Function Name: XllpVMSetVoltage(DWORD DACValue, P_XLLP_PWRMGR_T  v_pPmgrReg)

  Description: Set the voltage through I2C
  

  Input Arguments: P_XLLP_I2C_T
     
  Output Arguments:
     None
  
  return:

    NONE

XLLP_DOC_HDR_END
*******************************************************************************/

void XllpFreqVoltageChange(P_XLLP_PWRMGR_T  v_pPmgrReg,P_XLLP_CLKMGR_T v_pClkReg, XLLP_COMBO_PARAM combo_param)
{
    XLLP_UINT32_T newCLKCFGValue = 0;
    XLLP_UINT32_T  CLKCFGValue = 0;
	XLLP_UINT32_T ReadPointer = 0, i=0;
	XLLP_UINT32_T NumOfBytes = 3;
	XLLP_UINT32_T dataArray[3];
    XLLP_UINT32_T  LMulti, NMulti;


	dataArray[0] = 0;  //Command 0
	dataArray[1] = (combo_param.DacValue & 0x000000FF);
	dataArray[2] = (combo_param.DacValue & 0x0000FF00)>>8;

	NMulti = 2;                    //run mode, N=2
	LMulti = combo_param.frequency / PRIMARY_CLOCK_FREQ;

	//set up the new frequency mulitipliers, N and L
	v_pClkReg->cccr = (NMulti<<7) | LMulti;

    newCLKCFGValue = (XLLP_CLKCFG_F | combo_param.fastbus_mode<<3);

	//votlage change configureation
    v_pPmgrReg->PVCR = 0;
    v_pPmgrReg->PCFR &= ~XLLP_PCFR_FVC;  // First disable Frequency/Voltage Sequence
    v_pPmgrReg->PVCR &= 0xFFFFF07F;    //no delay is necessary
    v_pPmgrReg->PVCR |= 0x20;          //set Slave address
    v_pPmgrReg->PVCR &= 0xFE0FFFFF;   //clear read pointer 0 


	
		
	 //Clear SQC DCE and MBC
   	for(i=0; i<32; i++)
	{
		v_pPmgrReg->PCMDn[i]  &= ~XLLP_PCMD_SQC;
		v_pPmgrReg->PCMDn[i]  &= ~XLLP_PCMD_DCE;      //Clear DCE 
        v_pPmgrReg->PCMDn[i]  &= ~XLLP_PCMD_MBC;     //Clear MBC
	}
     
	//Set MBC bit

	 	v_pPmgrReg->PCMDn[0] |=  XLLP_PCMD_MBC; 
	    v_pPmgrReg->PCMDn[1] |=  XLLP_PCMD_MBC;

	//indicate the last byte of this command is holded in this register
        v_pPmgrReg->PCMDn[2] &=~ XLLP_PCMD_MBC ; 

	//indicate this is the first and last command also
	 v_pPmgrReg->PCMDn[0] |=  XLLP_PCMD_LC;    //LC bit
	 v_pPmgrReg->PCMDn[1] |=  XLLP_PCMD_LC;
	 v_pPmgrReg->PCMDn[2] |=  XLLP_PCMD_LC;

	 //programming the command data bits
	 v_pPmgrReg->PCMDn[0] &= 0xFFFFFF00;
     v_pPmgrReg->PCMDn[0] |= dataArray[0];

     v_pPmgrReg->PCMDn[1] &= 0xFFFFFF00;
     v_pPmgrReg->PCMDn[1] |= dataArray[1];

	 v_pPmgrReg->PCMDn[2] &= 0xFFFFFF00;
     v_pPmgrReg->PCMDn[2] |= dataArray[2];

	 v_pPmgrReg->PCFR |= (XLLP_PCFR_PI2C_EN | XLLP_PCFR_FVC);    //PCFR_PI2C_EN;  //enable Pwr I2C 

	 //set CLKCFG reigster in CP14 to initiate the freq/voltage change sequence
	 XllpXSC1FreqChange(newCLKCFGValue);


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -