view src/cs/drivers/drv_core/abb/abb.h @ 220:0ed36de51973

ABB semaphore protection overhaul The ABB semaphone protection logic that came with TCS211 from TI was broken in several ways: * Some semaphore-protected functions were called from Application_Initialize() context. NU_Obtain_Semaphore() called with NU_SUSPEND fails with NU_INVALID_SUSPEND in this context, but the return value wasn't checked, and NU_Release_Semaphore() would be called unconditionally at the end. The latter call would increment the semaphore count past 1, making the semaphore no longer binary and thus no longer effective for resource protection. The fix is to check the return value from NU_Obtain_Semaphore() and skip the NU_Release_Semaphore() call if the semaphore wasn't properly obtained. * Some SPI hardware manipulation was being done before entering the semaphore- protected critical section. The fix is to reorder the code: first obtain the semaphore, then do everything else. * In the corner case of L1/DSP recovery, l1_abb_power_on() would call some non-semaphore-protected ABB & SPI init functions. The fix is to skip those calls in the case of recovery. * A few additional corner cases existed, all of which are fixed by making ABB semaphore protection 100% consistent for all ABB functions and code paths. There is still one remaining problem of priority inversion: suppose a low- priority task calls an ABB function, and some medium-priority task just happens to preempt right in the middle of that semaphore-protected ABB operation. Then the high-priority SPI task is locked out for a non-deterministic time until that medium-priority task finishes its work and goes back to sleep. This priority inversion problem remains outstanding for now.
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 26 Apr 2021 20:55:25 +0000
parents 4e78acac3d88
children
line wrap: on
line source

/**********************************************************************************/
/*            TEXAS INSTRUMENTS INCORPORATED PROPRIETARY INFORMATION              */
/*                                                                                */
/*   Property of Texas Instruments -- For  Unrestricted  Internal  Use  Only      */
/*   Unauthorized reproduction and/or distribution is strictly prohibited.  This  */
/*   product  is  protected  under  copyright  law  and  trade  secret law as an  */
/*   unpublished work.  Created 1987, (C) Copyright 1997 Texas Instruments.  All  */
/*   rights reserved.                                                             */
/*                                                                                */
/*                                                                                */
/*   Filename         : abb.h                                                     */
/*                                                                                */
/*   Description      : Analog BaseBand registers and bits definition.	    	  */
/*                       Functions to drive the ABB device.                       */
/*                       The Serial Port Interface is used to connect the TI 	  */
/*						 Analog BaseBand (ABB).				    				  */
/*						 It is assumed that the ABB is connected as the SPI       */																				  
/*                       device 0.                                                */																				  
/*																				  */
/*   Author           : Pascal PUEL                                               */
/*                                                                                */
/*   Version number   : 1.3                                                       */
/*                                                                                */
/*   Date and time    : 08/22/03                                                       */
/*                                                                                */
/*   Previous delta   : Creation                                                  */
/*                                                                                */
/**********************************************************************************/

#ifndef __ABB_H__
#define __ABB_H__

#include "l1sw.cfg"

#if (OP_L1_STANDALONE == 0)
  #include "main/sys_types.h"
#else
  #include "sys_types.h"
#endif


#ifndef _WINDOWS


#include "chipset.cfg"




/*------------------------------------*/
/* SYREN PG Definition                */
/*------------------------------------*/

#if (ANLG_FAM == 3)   // SYREN
    #define S_PG_10      1
    #define S_PG_20      2
#endif  // (ANLG_FAM == 3)



// DEFINITIONS FOR OMEGA/NAUSICA
#if (ANLG_FAM == 1)
  // ABB PAGE
  #define PAGE0	0x0001
  #define PAGE1	0x0002

  // ABB REGISTERS
  //=== PAGE 0 =======
  #define PAGEREG      (1  << 1)
  #define APCDEL1      (2  << 1)
  #define BULDATA1_2   (3  << 1)
  #define TOGBR1       (4  << 1)
  #define TOGBR2       (5  << 1)
  #define VBDCTRL      (6  << 1)
  #define AUXAFC1      (7  << 1)
  #define AUXAFC2      (8  << 1)
  #define AUXAPC       (9  << 1)
  #define APCRAM       (10 << 1)
  #define APCOFF       (11 << 1)
  #define AUXDAC       (12 << 1)
  #define MADCCTRL1    (13 << 1)
  #define MADCCTRL2    (14 << 1)
  #define VBATREG      (15 << 1)
  #define VCHGREG      (16 << 1)
  #define ICHGREG      (17 << 1)
  #define VBKPREG      (18 << 1)
  #define ADIN1REG     (19 << 1)
  #define ADIN2REG     (20 << 1)
  #define ADIN3REG     (21 << 1)
  #define ADIN4XREG    (22 << 1)
  #define ADIN5YREG    (23 << 1)
  #define MADCSTAT     (24 << 1)
  #define CHGREG       (25 << 1)
  #define ITMASK       (26 << 1)
  #define ITSTATREG    (27 << 1)
  #define BCICTL1      (28 << 1)
  #define BCICTL2      (29 << 1)
  #define VRPCCTL2     (30 << 1)
  #define VRPCSTS      (31 << 1)
  
  //=== PAGE 1 =======
  #define PAGEREG      (1  << 1)
  #define BULIOFF      (2  << 1)
  #define BULQOFF      (3  << 1)
  #define BULQDAC      (4  << 1)
  #define BULIDAC      (5  << 1)
  #define BBCTRL       (6  << 1)
  #define VBUCTRL      (7  << 1)
  #define VBCTRL       (8  << 1)
  #define PWDNRG       (9  << 1)
  #define TSC_TIMER    (10 << 1)
  #define VRPCCTRL3    (11 << 1)
  #define APCOUT       (12 << 1)
  #define VRPCBGT      (18 << 1)
  #define TAPCTRL      (19 << 1)
  #define TAPREG       (20 << 1)
  #define AFCCTLADD    (21 << 1)
  #define AFCOUT       (22 << 1)
  #define VRPCCTRL1    (23 << 1)
  #define VRPCCTRL4    (24 << 1)
  #define APCDEL2      (26 << 1)
  #define ITSTATREG    (27 << 1)

  // Registers bit definitions
  // ABB device bits definition of register VBCTRL
  #define VDLAUX    0x001
  #define VDLEAR    0x002
  #define VBUZ      0x004
  #define VULSWITCH 0x008
  #define MICBIAS   0x010
  #define VALOOP    0x020
  #define VCLKMODE  0x040
  #define VSYNC     0x080
  #define VBDFAUXG  0x100
  #define VFBYP     0x200

  // ABB device bits definition of register VBUCTRL
  #define DXEN      0x200

  // ABB device bits definition of register VRPCSTS
  #define ONBSTS    0x01  // ON Button push flag
  #define ONRSTS    0x02  // Remote ON flag
  #define ITWSTS    0x04  // Wake-up IT flag
  #define CHGSTS    0x08  // Charger plug flag
  #define ONREFLT   0x10  // ON Button current state
  #define ORMRFLT   0x20  // Remote ON current state
  #define CHGPRES   0x40  // Charger plug current state

  // ABB device bits definition of register ITSTATREG
  #define REMOT_IT_STS    0x02
  #define PUSHOFF_IT_STS  0x04
  #define CHARGER_IT_STS  0x08
  #define ADCEND_IT_STS   0x20

  // On Nausica, if the PWR key is pressed, the bit is set, and cleared when released
  #define PWR_OFF_KEY_PRESSED       (ONREFLT)

  // ABB ADC Interrupts
  #define EOC_INTENA  0x03DF
  #define EOC_INTMASK 0x0020

  // ABB ADC CHANNELS
  #define VBATCV      0x0001
  #define VCHGCV      0x0002
  #define ICHGCV      0x0004
  #define VBKPCV      0x0008
  #define ADIN1CV     0x0010
  #define ADIN2CV     0x0020
  #define ADIN3CV     0x0040
  #define vADIN4XCV   0x0080
  #define ADIN5XCV    0x0100
  #define ALL         0x01FF
  #define NONE        0x0000

  // ABB MODULES
  #define MADC        0x8000
  #define AFC         0x2000
  #define ADAC        0x0800
  #define DCDC        0x0080
  #define ALLOFF      0x0000

  // Definitions of OMEGA test modes for baseband windows
  #define TSPTEST1       0x001d
  #define TSPTEST2       0x001e
  #define AFCTEST        0x0010
  #define AFCNORM        0x0000


// DEFINITIONS FOR IOTA
#elif (ANLG_FAM == 2)
  // ABB PAGE
  #define PAGE0	0x0001
  #define PAGE1	0x0002
  #define PAGE2	0x0010

  // ABB REGISTERS
  //=== PAGE 0 =======
  #define PAGEREG      (1  << 1)
  #define APCDEL1      (2  << 1)
  #define BULDATA1_2   (3  << 1)
  #define TOGBR1       (4  << 1)
  #define TOGBR2       (5  << 1)
  #define VBDCTRL      (6  << 1)
  #define AUXAFC1      (7  << 1)
  #define AUXAFC2      (8  << 1)
  #define AUXAPC       (9  << 1)
  #define APCRAM       (10 << 1)
  #define APCOFF       (11 << 1)
  #define AUXDAC       (12 << 1)
  #define MADCCTRL     (13 << 1)
  #define VBATREG      (15 << 1)
  #define VCHGREG      (16 << 1)
  #define ICHGREG      (17 << 1)
  #define VBKPREG      (18 << 1)
  #define ADIN1REG     (19 << 1)
  #define ADIN2REG     (20 << 1)
  #define ADIN3REG     (21 << 1)
  #define ADIN4REG     (22 << 1)
  #define MADCSTAT     (24 << 1)
  #define CHGREG       (25 << 1)
  #define ITMASK       (26 << 1)
  #define ITSTATREG    (27 << 1)
  #define BCICTL1      (28 << 1)
  #define BCICTL2      (29 << 1)
  #define VRPCDEV      (30 << 1)
  #define VRPCSTS      (31 << 1)
								
  //=== PAGE 1 =======		
  #define PAGEREG      (1  << 1)
  #define BULIOFF      (2  << 1)
  #define BULQOFF      (3  << 1)
  #define BULQDAC      (4  << 1)
  #define BULIDAC      (5  << 1)
  #define BBCTRL       (6  << 1)
  #define VBUCTRL      (7  << 1)
  #define VBCTRL1      (8  << 1)
  #define PWDNRG       (9  << 1)
  #define VBPOP        (10 << 1)
  #define VBCTRL2      (11 << 1)
  #define APCOUT       (12 << 1)
  #define BCICONF      (13 << 1)
  #define BULGCAL      (14 << 1)
  #define TAPCTRL      (19 << 1)
  #define TAPREG       (20 << 1)
  #define AFCCTLADD    (21 << 1)
  #define AFCOUT       (22 << 1)
  #define VRPCSIM      (23 << 1)
  #define AUXLED       (24 << 1)
  #define APCDEL2      (26 << 1)
  #define ITSTATREG    (27 << 1)
  #define VRPCMSKABB   (29 << 1)
  #define VRPCCFG      (30 << 1)
  #define VRPCMSK      (31 << 1)

  // Registers bit definitions
  // ABB device bits definition of register VBCTRL1
  #define VDLAUX    0x001
  #define VDLEAR    0x002
  #define VBUZ      0x004
  #define VULSWITCH 0x008
  #define MICBIAS   0x010
  #define VALOOP    0x020
  #define VCLKMODE  0x040
  #define VSYNC     0x080
  #define VBDFAUXG  0x100
  #define VFBYP     0x200
 
  // ABB device bits definition of register VBCTRL2
  #define MICBIASEL 0x001
  #define VDLHSO    0x002
  #define MICNAUX   0x004

  // ABB device bits definition of register VBUCTRL
  #define DXEN      0x200

  // ABB device bits definition of register VBPOP
  #define HSODIS    0x001
  #define HSOCHG    0x002
  #define HSOAUTO   0x004
  #define EARDIS    0x008
  #define EARCHG    0x010
  #define EARAUTO   0x020
  #define AUXDIS    0x040
  #define AUXCHG    0x080
  #define AUXAUTO   0x100

  // ABB device bits definition of register VRPCSTS
  #define ONBSTS    0x01  // ON Button push flag
  #define ONRSTS    0x02  // Remote ON flag
  #define ITWSTS    0x04  // Wake-up IT flag
  #define CHGSTS    0x08  // Charger plug flag
  #define ONREFLT   0x10  // ON Button current state
  #define ORMRFLT   0x20  // Remote ON current state
  #define CHGPRES   0x40  // Charger plug current state

  // ABB device bits definition of register ITSTATREG
  #define REMOT_IT_STS    0x02
  #define PUSHOFF_IT_STS  0x04
  #define CHARGER_IT_STS  0x08
  #define ADCEND_IT_STS   0x20

  // On Iota, the bit is set when the key is released and set when the key is pressed
  #define PWR_OFF_KEY_PRESSED      (0)

  // ABB ADC Interrupts
  #define EOC_INTENA  0x03DF
  #define EOC_INTMASK 0x0020

  // ABB ADC CHANNELS
  #define VBATCV      0x0001
  #define VCHGCV      0x0002
  #define ICHGCV      0x0004
  #define VBKPCV      0x0008
  #define ADIN1CV     0x0010
  #define ADIN2CV     0x0020
  #define ADIN3CV     0x0040
  #define ADIN4CV     0x0080
  #define ALL         0x00FF
  #define NONE        0x0000

  // ABB MODULES
  #define MADC        0x8000
  #define AFC         0x2000
  #define ADAC        0x0800
  #define DCDC        0x0080
  #define ALLOFF      0x0000

  // Definitions of IOTA test modes
  #define TSPTEST1      0x001d
  #define TSPTEST2      0x001e
  #define AFCTEST       0x0010
  #define AFCNORM       0x0000

  // Definition for IOTA test modes
  #define TSPEN         0x001a
  #define MADCTEST      0x0012
  #define TSPADC        0x0015
  #define TSPUP         0x0017
  #define TSPDN         0x0018

  // Definition for IOTA Power Management

  //The duration of the SLPDLY counter must be greater than the process execution time:
  //DBB deep sleep routine included the IT check = DBB sleep routine and IT check
  //+ the seven 32Khz clock cycle interval needed to ABB in order to make effective the sleep abort write access in VRPCDEV    ++  //  register -> 7*T32Khz = = ABB IBIC propagation delay 
  //+ 150us of short asynchronous wake-up time  (approximately 4*T32Khz) = ULPD short sleep where Syren/IOTA aborts sleep and 
  //  write DEVSLEEP = 0  




  #define SLPDLY                0x001F    // delay to set IOTA in sleep mode (unit: 20*T32Khz)
  #define MASK_SLEEP_MODE       0x0000    // set the regulators in low consumption in sleep mode


// DEFINITIONS FOR SYREN
#elif (ANLG_FAM == 3)

  // ABB PAGE
  #define PAGE0	0x0001
  #define PAGE1	0x0002
  #define PAGE2	0x0010

  // ABB REGISTERS
  //=== PAGE 0 =======
  #define PAGEREG     (1  << 1)
  #define APCDEL1     (2  << 1)
  #define BULDATA1_2  (3  << 1)
  #define TOGBR1      (4  << 1)
  #define TOGBR2      (5  << 1)
  #define VBDCTRL     (6  << 1)
  #define AUXAFC1     (7  << 1)
  #define AUXAFC2     (8  << 1)
  #define AUXAPC      (9  << 1)
  #define APCRAM      (10 << 1)
  #define APCOFF      (11 << 1)
  #define AUXDAC      (12 << 1)
  #define MADCCTRL    (13 << 1)
  #define CHGIREG     (14 << 1)
  #define VBATREG     (15 << 1)
  #define VCHGREG     (16 << 1)
  #define ICHGREG     (17 << 1)
  #define VBKPREG     (18 << 1)
  #define ADIN1REG    (19 << 1)
  #define ADIN2REG    (20 << 1)
  #define ADIN3REG    (21 << 1)
  #define ADIN4REG    (22 << 1)
  #define ADIN5REG    (23 << 1)
  #define MADCSTAT    (24 << 1)
  #define CHGVREG     (25 << 1)
  #define ITMASK      (26 << 1)
  #define ITSTATREG   (27 << 1)
  #define BCICTL1     (28 << 1)
  #define BCICTL2     (29 << 1)
  #define VRPCDEV     (30 << 1)
  #define VRPCSTS     (31 << 1)

  //=== PAGE 1 =======
  #define PAGEREG     (1  << 1)
  #define BULIOFF     (2  << 1)
  #define BULQOFF     (3  << 1)
  #define BULQDAC     (4  << 1)
  #define BULIDAC     (5  << 1)
  #define BBCTRL      (6  << 1)
  #define VBUCTRL     (7  << 1)
  #define VBCTRL1     (8  << 1)
  #define PWDNRG      (9  << 1)
  #define VBPOP       (10 << 1)
  #define VBCTRL2     (11 << 1)
  #define APCOUT      (12 << 1)
  #define BCICONF     (13 << 1)
  #define BULGCAL     (14 << 1)
  #define VAUDCTRL    (15 << 1)
  #define VAUSCTRL    (16 << 1)
  #define VAUOCTRL    (17 << 1)
  #define VAUDPLL     (18 << 1)
  #define TAPCTRL     (19 << 1)
  #define TAPREG      (20 << 1)
  #define AFCCTLADD   (21 << 1)
  #define AFCOUT      (22 << 1)
  #define VRPCSIMR    (23 << 1)
  #define BCIWDOG     (24 << 1)
  #define NONE8       (25 << 1)
  #define APCDEL2     (26 << 1)
  #define ITSTATREG   (27 << 1)

#if (ANLG_PG == S_PG_20)                           // SYREN PG2.0 ON EVACONSO
  #define BBCFG       (28 << 1)
#else
  #define NONE9       (28 << 1)
#endif

  #define VRPCMSKOFF  (29 << 1)
  #define VRPCCFG     (30 << 1)
  #define VRPCMSKSLP  (31 << 1)
  
  //=== PAGE 2 =======

#if (ANLG_PG == S_PG_10)       // SYREN PG1.0 ON ESAMPLE
  #define BBCFG       (5 << 1)
#endif

  #define VRPCABBTST  (25 << 1)
  #define VRPCAUX     (30 << 1)
  #define VRPCLDO     (31 << 1)

/* INSERT HERE OTHER DEVICES REGISTERS */


  // Registers bit definitions
  /*** SYREN internal control bits ***/

  /** For reg. VBCTRL1 **/      
  #define VULSWITCH 0x008
  #define MICBIAS   0x010
  #define VALOOP    0x020
  #define VCLKMODE  0x040
  #define VSYNC     0x080
  #define VBDFAUXG  0x100
  #define VFBYP     0x200
 
  /** For reg. VBCTRL2 **/      
  #define HSMICSEL  0x001
  #define MICBIASEL 0x004
  #define SPKG      0x008
  #define HSOVMID   0x010
  #define HSDIF     0x020

  /** For reg. VBUCTRL **/      
  #define DXEN      0x200

  /** For reg. VBPOP **/      
  #define HSODIS    0x001
  #define HSOCHG    0x002
  #define HSOAUTO   0x004
  #define EARDIS    0x008
  #define EARCHG    0x010
  #define EARAUTO   0x020
  #define AUXFDIS   0x040
  #define AUXAUTO   0x080
  #define AUXFBYP   0x200

  // ABB device bits definition of register VRPCCFG
  #define PWOND     0x20  // ON Button current state
  #define CHGPRES   0x40

  // ABB device bits definition of register ITSTATREG
  #define REMOT_IT_STS    0x02
  #define PUSHOFF_IT_STS  0x04
  #define CHARGER_IT_STS  0x08
  #define ADCEND_IT_STS   0x20

  // ABB device bits definition of register VRPCSTS
  #define ITWSTS    0x10   // Wake-up IT flag
  #define PWONBSTS  0x20   // ON Button push flag
  #define CHGSTS    0x40   // Charger plug flag
  #define RPSTS     0x100  // Remote ON flag

  // ABB ADC Interrupts
  #define EOC_INTENA  0x03DF
  #define EOC_INTMASK 0x0020

  // ABB ADC CHANNELS (reg. MADCCTRL)
  #define VBATCV    0x0001
  #define VCHGCV    0x0002
  #define ICHGCV    0x0004
  #define VBKPCV    0x0008
  #define ADIN1CV   0x0010
  #define ADIN2CV   0x0020
  #define ADIN3CV   0x0040
  #define ADIN4CV   0x0080
  #define ADIN5CV   0x0100
  #define ALL       0x01FF
  #define NONE      0x0000

  // ABB MODULES
  #define MADC        0x8000
  #define AFC         0x2000
  #define ADAC        0x0800
  #define DCDC        0x0080
  #define ALLOFF      0x0000

  // Definitions of SYREN test modes
  #define TSPTEST1      0x001d
  #define TSPTEST2      0x001e
  #define AFCTEST       0x0010
  #define AFCNORM       0x0000

  #define TSPEN         0x001a
  #define MADCTEST      0x0012
  #define TSPADC        0x0015
  #define TSPUP         0x0017
  #define TSPDN         0x0018

  // Definition for SYREN Power Management

  //The duration of the SLPDLY counter must be greater than the process execution time:
  //DBB deep sleep routine included the IT check = DBB sleep routine and IT check
  //+ the seven 32Khz clock cycle interval needed to ABB in order to make effective the sleep abort write access in VRPCDEV    ++  //  register -> 7*T32Khz = = ABB IBIC propagation delay 
  //+ 150us of short asynchronous wake-up time  (approximately 4*T32Khz) = ULPD short sleep where Syren/IOTA aborts sleep and 
  //  write DEVSLEEP = 0  

  #define SLPDLY             0x001F    // delay to set SYREN in sleep mode (unit: 20*T32Khz)
  #define MASK_SLEEP_MODE    0x0000    // set the regulators in low consumption in sleep mode

  #define LOCORE_SLEEP   0x01
  #define NORMAL_SLEEP   0x00

  #define MAIN_BG        0x01,
  #define SLEEP_BG       0x00

#endif	  // ANLG_FAM == 1,2,3


// Define the level of semaphore protection for all accesses to the ABB
// 0 for no protection
// 1 for protection low 
// 2 for protection medium 
// 3 for protection high 
#if (OP_L1_STANDALONE == 1)
#define ABB_SEMAPHORE_PROTECTION     (0)
#else
#define ABB_SEMAPHORE_PROTECTION     (3)
#endif



// PROTOTYPES
#if (ABB_SEMAPHORE_PROTECTION)   
  void ABB_Sem_Create(void);
#endif
void ABB_Wait_IBIC_Access(void);
void ABB_Write_Register_on_page(SYS_UWORD16 page, SYS_UWORD16 reg_id, SYS_UWORD16 value);
SYS_UWORD16 ABB_Read_Register_on_page(SYS_UWORD16 page, SYS_UWORD16 reg_id);
void ABB_free_13M(void);
void ABB_stop_13M(void);
SYS_UWORD16 ABB_Read_Status(void);
void ABB_Conf_ADC(SYS_UWORD16 Channels, SYS_UWORD16 ItVal);                              
void ABB_Read_ADC(SYS_UWORD16 *Buff);
void ABB_on(SYS_UWORD16 modules, SYS_UWORD8 bRecoveryFlag);
SYS_UWORD32 ABB_sleep(SYS_UWORD8 sleep_performed, SYS_WORD16 afc);
void ABB_wakeup(SYS_UWORD8 sleep_performed, SYS_WORD16 afc);
void ABB_wa_VRPC(SYS_UWORD16 value);
void ABB_Write_Uplink_Data(SYS_UWORD16 *TM_ul_data);
#if (OP_L1_STANDALONE == 0)
void ABB_Power_Off(void);
#endif
#if (ANLG_FAM ==3)
  void Syren_Sleep_Config(SYS_UWORD16 sleep_type,SYS_UWORD16 bg_select, SYS_UWORD16 sleep_delay);
#endif

#else    // _WINDOWS
// DEFINITIONS FOR IOTA
  // ABB PAGE
  #define PAGE0	0x0001
  #define PAGE1	0x0002
  #define PAGE2	0x0010

  // ABB REGISTERS
  //=== PAGE 0 =======
  #define PAGEREG      (1  << 1)
  #define APCDEL1      (2  << 1)
  #define BULDATA1_2   (3  << 1)
  #define TOGBR1       (4  << 1)
  #define TOGBR2       (5  << 1)
  #define VBDCTRL      (6  << 1)
  #define AUXAFC1      (7  << 1)
  #define AUXAFC2      (8  << 1)
  #define AUXAPC       (9  << 1)
  #define APCRAM       (10 << 1)
  #define APCOFF       (11 << 1)
  #define AUXDAC       (12 << 1)
  #define MADCCTRL     (13 << 1)
  #define VBATREG      (15 << 1)
  #define VCHGREG      (16 << 1)
  #define ICHGREG      (17 << 1)
  #define VBKPREG      (18 << 1)
  #define ADIN1REG     (19 << 1)
  #define ADIN2REG     (20 << 1)
  #define ADIN3REG     (21 << 1)
  #define ADIN4REG     (22 << 1)
  #define MADCSTAT     (24 << 1)
  #define CHGREG       (25 << 1)
  #define ITMASK       (26 << 1)
  #define ITSTATREG    (27 << 1)
  #define BCICTL1      (28 << 1)
  #define BCICTL2      (29 << 1)
  #define VRPCDEV      (30 << 1)
  #define VRPCSTS      (31 << 1)
								
  //=== PAGE 1 =======		
  #define PAGEREG      (1  << 1)
  #define BULIOFF      (2  << 1)
  #define BULQOFF      (3  << 1)
  #define BULQDAC      (4  << 1)
  #define BULIDAC      (5  << 1)
  #define BBCTRL       (6  << 1)
  #define VBUCTRL      (7  << 1)
  #define VBCTRL1      (8  << 1)
  #define PWDNRG       (9  << 1)
  #define VBPOP        (10 << 1)
  #define VBCTRL2      (11 << 1)
  #define APCOUT       (12 << 1)
  #define BCICONF      (13 << 1)
  #define BULGCAL      (14 << 1)
  #define TAPCTRL      (19 << 1)
  #define TAPREG       (20 << 1)
  #define AFCCTLADD    (21 << 1)
  #define AFCOUT       (22 << 1)
  #define VRPCSIM      (23 << 1)
  #define AUXLED       (24 << 1)
  #define APCDEL2      (26 << 1)
  #define ITSTATREG    (27 << 1)
  #define VRPCMSKABB   (29 << 1)
  #define VRPCCFG      (30 << 1)
  #define VRPCMSK      (31 << 1)

  // ABB device bits definition of register VBUCTRL
  #define DXEN      0x200

  // ABB device bits definition of register VRPCSTS
  #define ONBSTS    0x01  // ON Button push flag
  #define ONRSTS    0x02  // Remote ON flag
  #define ITWSTS    0x04  // Wake-up IT flag
  #define CHGSTS    0x08  // Charger plug flag
  #define ONREFLT   0x10  // ON Button current state
  #define ORMRFLT   0x20  // Remote ON current state
  #define CHGPRES   0x40  // Charger plug current state

  // ABB device bits definition of register ITSTATREG
  #define REMOT_IT_STS    0x02
  #define PUSHOFF_IT_STS  0x04
  #define CHARGER_IT_STS  0x08
  #define ADCEND_IT_STS   0x20


// PROTOTYPES
void ABB_Write_Register_on_page(SYS_UWORD16 page, SYS_UWORD16 reg_id, SYS_UWORD32 value);
SYS_UWORD16 ABB_Read_Register_on_page(SYS_UWORD16 page, SYS_UWORD16 reg_id);
SYS_UWORD16 ABB_Read_Status(void);
void ABB_Conf_ADC(SYS_UWORD16 Channels, SYS_UWORD16 ItVal);                              
void ABB_Read_ADC(SYS_UWORD16 *Buff);

#endif  // _WINDOWS

#endif // __ABB_H__