📄 abb.c
字号:
afcout_index = ((afc + 512)>>10) + 1;
else
afcout_index = (afc + 512)>>10;
if (sleep_performed == FRAME_STOP) // Big sleep
{
#if ((ANALOG == 2) || (ANALOG == 3))
//////////// ADD HERE IOTA or SYREN CONFIGURATION FOR BIG SLEEP ////////////////////////////
#endif
}
else // Deep sleep
{
#if(ANALOG == 1)
// SELECTION OF AFC TEST MODE FOR OMEGA
//---------------------------------------------------
// This test configuration allows access on the AFCOUT register
ABB_SetPage(PAGE1);
// This transmission enables OMEGA test register.
ABB_WriteRegister(TAPCTRL, 0x01);
// This transmission selects OMEGA test instruction.
ABB_WriteRegister(TAPREG, AFCTEST);
// Set AFCOUT to 0.
ABB_WriteRegister(AFCOUT, 0x00 >> 6);
ABB_SetPage(PAGE0);
#elif ((ANALOG == 2) || (ANALOG == 3))
// This configuration allows access on the AFCOUT register
ABB_SetPage(PAGE1);
// Read AFCCTLADD value and enable USP access to AFCOUT register
reg_val = (ABB_ReadRegister(AFCCTLADD) | 0x04);
ABB_WriteRegister(AFCCTLADD, reg_val);
// Set AFCOUT to 0.
ABB_WriteRegister(AFCOUT, 0x00);
// Read BCICONF value and cut the measurement bridge of BB cut the BB charge.
reg_val = ABB_ReadRegister(BCICONF) & 0x039f;
ABB_WriteRegister(BCICONF, reg_val);
// Disable the ABB test mode
ABB_WriteRegister(TAPCTRL, 0x00);
ABB_SetPage(PAGE0);
// Read BCICTL1 value and cut the measurement bridge of MB.
reg_val = ABB_ReadRegister(BCICTL1) & 0x03fe;
ABB_WriteRegister(BCICTL1, reg_val);
#endif
// switch off MADC, AFC, AUXDAC, VOICE.
ABB_WriteRegister(TOGBR1, 0x155);
// Switch off Analog supply LDO
//-----------------------------
#if (ANALOG == 1)
ABB_SetPage(PAGE1);
// Read VRPCCTL3 register value and switch off VR3.
reg_val = ABB_ReadRegister(VRPCCTRL3) & 0x3df;
ABB_WriteRegister(VRPCCTRL3, reg_val);
// Switch to low frequency clock
ABB_stop_13M();
#elif (ANALOG == 2)
// Read VRPCSTS register value and extract status of meaningfull inputs.
reg_val = ABB_ReadRegister(VRPCSTS) & 0x0070;
if (reg_val == 0x30)
{
// start the SLPDLY counter in order to switch the ABB in sleep mode. This transmission sets IOTA sleep bit.
ABB_WriteRegister(VRPCDEV, 0x02);
}
// Dummy transmission to clean of ABB bus. This transmission accesses IOTA address 0 in "read".
ABB_WriteRegister(0x0000 | 0x0001, 0x0000);
// Switch to low frequency clock
ABB_stop_13M();
#elif (ANALOG == 3)
// Read VRPCCFG register value and extract status of meaningfull inputs.
reg_val = ABB_ReadRegister(VRPCCFG) & 0x0160;
if (reg_val == 0x120)
{
// start the SLPDLY counter in order to switch the ABB in sleep mode. This transmission sets SYREN sleep bit.
ABB_WriteRegister(VRPCCFG, 0x02);
}
// Dummy transmission to clean of ABB bus. This transmission accesses SYREN address 0 in "read".
ABB_WriteRegister(0x0000 | 0x0001, 0x0000);
// Switch to low frequency clock
ABB_stop_13M();
#endif
}
// Stop the SPI clock
#ifdef SPI_CLK_LOW_POWER
SPI_CLK_DISABLE
#endif
return(Afcout_T[afcout_index]);
}
/*------------------------------------------------------------------------*/
/* ABB_wakeup() */
/* */
/* This function sets the 13MHz clock working in ABB. A wait loop */
/* is required to allow first slow access to ABB clock register. */
/* Then it re-enables DCDC and returns to PAGE 0. */
/* */
/* WARNING !! : this function must not be protected by semaphore !! */
/* */
/*------------------------------------------------------------------------*/
void ABB_wakeup(SYS_UWORD8 sleep_performed, SYS_WORD16 afc)
{
volatile SYS_UWORD16 status;
SYS_UWORD16 reg_val;
// Start spi clock, mask IT for RD and WR and read SPI_REG_STATUS to reset the RE and WE flags.
SPI_Ready_for_RDWR
status = * (volatile SYS_UWORD16 *) SPI_REG_STATUS;
if (sleep_performed == FRAME_STOP) // Big sleep
{
#if ((ANALOG == 2) || (ANALOG == 3))
//////////// ADD HERE IOTA or SYREN CONFIGURATION FOR BIG SLEEP WAKEUP ////////////////////////////
#endif
}
else // Deep sleep
{
// Restitutes 13MHZ Clock to ABB
ABB_free_13M();
// Switch ON Analog supply LDO
#if (ANALOG == 1)
ABB_SetPage(PAGE1);
// Read VRPCCTL3 register value and switch on VR3.
reg_val = ABB_ReadRegister(VRPCCTRL3) | 0x020;
ABB_WriteRegister(VRPCCTRL3, reg_val);
ABB_SetPage(PAGE0);
#endif
// This transmission switches on MADC, AFC.
ABB_WriteRegister(TOGBR1, 0x280);
// This transmission sets the AUXAFC2.
ABB_WriteRegister(AUXAFC2, ((afc>>10) & 0x7));
// This transmission sets the AUXAFC1.
ABB_WriteRegister(AUXAFC1, (afc & 0x3ff));
#if (ANALOG == 1)
// Remove AFC test mode
ABB_SetPage(PAGE1);
// This transmission select Omega test instruction.
ABB_WriteRegister(TAPREG, TSPTEST1);
// Disable test mode selection
// This transmission disables Omega test register.
ABB_WriteRegister(TAPCTRL, 0x00 >> 6);
ABB_SetPage(PAGE0);
#elif ((ANALOG == 2) || (ANALOG == 3))
ABB_SetPage(PAGE1);
// Read AFCCTLADD register value and disable USP access to AFCOUT register.
reg_val = ABB_ReadRegister(AFCCTLADD) & ~0x04;
ABB_WriteRegister(AFCCTLADD, reg_val);
// Read BCICONF register value and enable BB measurement bridge enable BB charge.
reg_val = ABB_ReadRegister(BCICONF) | 0x0060;
ABB_WriteRegister(BCICONF, reg_val);
// Enable the ABB test mode
ABB_WriteRegister(TAPCTRL, 0x01);
ABB_SetPage(PAGE0);
// Read BCICTL1 register value and enable MB measurement bridge and cut the measurement bridge of MB.
reg_val = ABB_ReadRegister(BCICTL1) | 0x0001;
ABB_WriteRegister(BCICTL1, reg_val);
#endif
}
// Stop the SPI clock
#ifdef SPI_CLK_LOW_POWER
SPI_CLK_DISABLE
#endif
}
/*------------------------------------------------------------------------*/
/* ABB_wa_VRPC() */
/* */
/* This function initializes the VRPCCTRL1 or VRPCSIM register */
/* according to the ABB used. */
/* */
/*------------------------------------------------------------------------*/
void ABB_wa_VRPC(SYS_UWORD16 value)
{
volatile SYS_UWORD16 status;
// Start spi clock, mask IT for WR and read SPI_REG_STATUS to reset the RE and WE flags.
SPI_Ready_for_WR
status = * (volatile SYS_UWORD16 *) SPI_REG_STATUS;
#if ((ABB_SEMAPHORE_PROTECTION == 1) || (ABB_SEMAPHORE_PROTECTION == 2) || (ABB_SEMAPHORE_PROTECTION == 3))
// check if the semaphore has been correctly created and try to obtain it.
// if the semaphore cannot be obtained, the task is suspended and then resumed
// as soon as the semaphore is released.
if(&abb_sem != 0)
{
NU_Obtain_Semaphore(&abb_sem, NU_SUSPEND);
}
#endif // ABB_SEMAPHORE_PROTECTION
ABB_SetPage(PAGE1);
#if (ANALOG == 1)
// This transmission initializes the VRPCCTL1 register.
ABB_WriteRegister(VRPCCTRL1, value);
#elif (ANALOG == 2)
// This transmission initializes the VRPCSIM register.
ABB_WriteRegister(VRPCSIM, value);
#elif (ANALOG == 3)
// This transmission initializes the VRPCSIMR register.
ABB_WriteRegister(VRPCSIMR, value);
#endif
ABB_SetPage(PAGE0);
#if ((ABB_SEMAPHORE_PROTECTION == 1) || (ABB_SEMAPHORE_PROTECTION == 2) || (ABB_SEMAPHORE_PROTECTION == 3))
// release the semaphore only if it has correctly been created.
if(&abb_sem != 0)
{
NU_Release_Semaphore(&abb_sem);
}
#endif // ABB_SEMAPHORE_PROTECTION
// Stop the SPI clock
#ifdef SPI_CLK_LOW_POWER
SPI_CLK_DISABLE
#endif
}
/*-----------------------------------------------------------------------*/
/* ABB_Write_Uplink_Data() */
/* */
/* This function uses the SPI to write to ABB uplink buffer. */
/* */
/*-----------------------------------------------------------------------*/
void ABB_Write_Uplink_Data(SYS_UWORD16 *TM_ul_data)
{
SYS_UWORD8 i;
volatile SYS_UWORD16 status;
// Start spi clock, mask IT for WR and read SPI_REG_STATUS to reset the RE and WE flags.
SPI_Ready_for_WR
status = * (volatile SYS_UWORD16 *) SPI_REG_STATUS;
// Select Page 0 for TOGBR2
ABB_SetPage(PAGE0);
// Initialize pointer of burst buffer 1 : IBUFPTR is bit 10 of TOGBR2
ABB_WriteRegister(TOGBR2, 0x10);
// Clear, assuming that it works like IBUFPTR of Vega
ABB_WriteRegister(TOGBR2, 0x0);
// Write the ramp data
for (i=0;i<16;i++)
ABB_WriteRegister(BULDATA1_2, TM_ul_data[i]>>6);
// Stop the SPI clock
#ifdef SPI_CLK_LOW_POWER
SPI_CLK_DISABLE
#endif
}
#if (!OP_L1_STANDALONE)
/*-----------------------------------------------------------------------*/
/* ABB_Power_Off() */
/* */
/* This function uses the SPI to switch off the ABB. */
/* */
/*-----------------------------------------------------------------------*/
void ABB_Power_Off(void)
{
// Wait until all necessary actions are performed (write in FFS, etc...) to power-off the board (empirical value - 30 ticks).
NU_Sleep (30);
// Wait also until <ON/OFF> key is released.
// This is needed to avoid, if the power key is pressed for a long time, to switch
// ON-switch OFF the mobile, until the power key is released.
#if((ANALOG == 1) || (ANALOG == 2))
while ((ABB_Read_Status() & ONREFLT) == PWR_OFF_KEY_PRESSED) {
#elif(ANALOG == 3)
while ((ABB_Read_Register_on_page(PAGE1, VRPCCFG) & PWOND) == PWR_OFF_KEY_PRESSED) {
#endif
NU_Sleep (1); }
BZ_KeyBeep_OFF();
#if(ANALOG == 1)
ABB_Write_Register_on_page(PAGE0, VRPCCTL2, 0x00EE);
#elif((ANALOG == 2) || (ANALOG == 3))
ABB_Write_Register_on_page(PAGE0, VRPCDEV, 0x0001);
#endif
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -