BayTrail/AaeonIoPkg/NCT5538D/NCT5538DHwmSetup.c
2022-09-02 09:03:16 +08:00

896 lines
21 KiB
C

//**********************************************************************
//**********************************************************************
//** **
//** (C)Copyright 1985-2015, American Megatrends, Inc. **
//** **
//** All Rights Reserved. **
//** **
//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
//** **
//** Phone: (770)-246-8600 **
//** **
//**********************************************************************
//**********************************************************************
/** @file NCT5538DHwmSetup.c
This is related to individual HWM devices.
**/
//----------------------------------------------------------------------
// Include Files
//----------------------------------------------------------------------
#include <AmiDxeLib.h>
#include <Setup.h>
#include <SioSetup.h>
#include "AaeonIoSetup.h"
////////////////////////////////////////////////////////////////////////
////////////OEM PORTING REQUIRED/////////////OEM PORTING REQUIRED///////
////////////////////////////////////////////////////////////////////////
/**
Get the register value form HWM space register.
@param BankNo Bank Select
@param Register Register who content the wanted value
@param Value Pointer to register value
**/
void
GetValueWithIO (
IN UINT8 BankNo,
IN UINT8 Register,
OUT UINTN *Value
)
{
UINT8 temp;
//Enter Bank NO!
IoWrite8(NCT5538D_HWM_INDEX_PORT, 0x4E);
temp = IoRead8(NCT5538D_HWM_DATA_PORT);
temp &= 0xF0 ;
IoWrite8(NCT5538D_HWM_DATA_PORT, (temp | BankNo));
//Read the data from register
IoWrite8(NCT5538D_HWM_INDEX_PORT, Register);
*Value = IoRead8(NCT5538D_HWM_DATA_PORT);
return;
}
/**
Get the register value form HWM voltage space register.
@param Vol_Value voltage parameter.
@param Vol_Unit voltage lsb unit.
@param R_B divisor bigger resitor.
@param R_S divisor smaller resitor.
@return the voltage value.
**/
UINTN VOL_DIVISOR_CALCULATE (
IN UINTN Vol_Value,
IN UINTN Vol_Unit,
IN UINTN R_B,
IN UINTN R_S
)
{
UINTN OutBuffer=0;
if((R_B != 0) && (R_S != 0)) { //it use resistor divisor
OutBuffer = Vol_Value * Vol_Unit * (R_B + R_S)/R_S;
} else { //it don't use resistor divisor
OutBuffer = Vol_Value * Vol_Unit;
}
return OutBuffer;
}
/**
Get the first system temperature value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
// >> 2016/07/19 AAEON_OVERRIDE
void
GetAndUpdateTemperature0(
IN OUT HWM_DATA * Data
)
{
UINTN T1;
Data->Token = STRING_TOKEN(STR_HWM_CPU_DTS_TEMP_VALUE);
Data->Type = TEMPERATURE;
Data->OddPos = 0x00;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x07, 0x20, &T1); //Bank7, index20: PECI Temperature reading
if(T1 == 0x80)
Data->Value = 0x00;
else
Data->Value = (UINT16)T1;
return;
}
// << 2016/07/19 AAEON_OVERRIDE
/**
Get the first system temperature value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateTemperature1(
IN OUT HWM_DATA * Data
)
{
UINTN T1;
Data->Token = STRING_TOKEN(STR_HWM1_SYSTEM_TEMP1_VALUE);
Data->Type = TEMPERATURE;
Data->OddPos = 0x00;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x90,&T1); // Bank4 Register 0x90.
if(T1 == 0x80)
Data->Value = 0x00;
else
Data->Value = (UINT16)T1;
return;
}
/**
Get the second system temperature value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateTemperature2 (
IN OUT HWM_DATA * Data
)
{
UINTN T1;
Data->Token = STRING_TOKEN(STR_HWM1_SYSTEM_TEMP2_VALUE);
Data->Type = TEMPERATURE;
Data->OddPos = 0x00;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x91,&T1); // Bank4 Register 0x91.
if(T1 == 0x80)
Data->Value = 0x00;
else
Data->Value = (UINT16)T1;
return;
}
/**
Get the third system temperature value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateTemperature3 (
IN OUT HWM_DATA * Data
)
{
UINTN T1;
Data->Token = STRING_TOKEN(STR_HWM1_SYSTEM_TEMP3_VALUE);
Data->Type = TEMPERATURE;
Data->OddPos = 0x00;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x92,&T1); // Bank4 Register 0x92.
if(T1 == 0x80)
Data->Value = 0x00;
else
Data->Value = (UINT16)T1;
return;
}
/**
Get the first fourth temperature value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateTemperature4 (
IN OUT HWM_DATA * Data
)
{
UINTN T1;
Data->Token = STRING_TOKEN(STR_HWM1_SYSTEM_TEMP4_VALUE);
Data->Type = TEMPERATURE;
Data->OddPos = 0x00;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x93,&T1); // Bank4 Register 0x93.
if(T1 == 0x80)
Data->Value = 0x00;
else
Data->Value = (UINT16)T1;
return;
}
/**
Get the fifth system temperature value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateTemperature5 (
IN OUT HWM_DATA * Data
)
{
UINTN T1;
Data->Token = STRING_TOKEN(STR_HWM1_SYSTEM_TEMP5_VALUE);
Data->Type = TEMPERATURE;
Data->OddPos = 0x00;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x94,&T1); // Bank4 Register 0x94.
if(T1 == 0x80)
Data->Value = 0x00;
else
Data->Value = (UINT16)T1;
return;
}
/**
Get the sixth system temperature value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateTemperature6 (
IN OUT HWM_DATA * Data
)
{
UINTN T1;
Data->Token = STRING_TOKEN(STR_HWM1_SYSTEM_TEMP6_VALUE);
Data->Type = TEMPERATURE;
Data->OddPos = 0x00;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x95,&T1); // Bank4 Register 0x95.
if(T1 == 0x80)
Data->Value = 0x00;
else
Data->Value = (UINT16)T1;
return;
}
/**
Get the first FAN speed value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateFan1Speed (
IN OUT HWM_DATA * Data
)
{
UINTN Speed;
UINTN Divisor;
Data->Token = STRING_TOKEN(STR_HWM1_FAN1_SPEED_VALUE);
Data->Type = FAN_SPEED;
Data->OddPos = 0x00;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0xC0,&Speed); // Register 0xC0
Divisor = (UINT8)Speed << 8;
GetValueWithIO(0x04,0xC1,&Speed); // Register 0xC1
Divisor |= (UINT8) Speed;
if( (Divisor == 0xFFFF) || (Divisor == 0x0FFF) || (Divisor == 0 )) {
Speed = 0;
} else {
Speed = (UINTN)Divisor;
}
Data->Value = (UINT16)Speed;
return;
}
/**
Get the second FAN speed value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateFan2Speed (
IN OUT HWM_DATA * Data
)
{
UINTN Speed;
UINTN Divisor;
Data->Token = STRING_TOKEN(STR_HWM1_FAN2_SPEED_VALUE);
Data->Type = FAN_SPEED;
Data->OddPos = 0x00;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0xC2,&Speed); // Register 0xC2
Divisor = (UINT8)Speed << 8;
GetValueWithIO(0x04,0xC3,&Speed); // Register 0xC3
Divisor |= (UINT8) Speed;
if( (Divisor == 0xFFFF) || (Divisor == 0x0FFF) || (Divisor == 0 )) {
Speed = 0;
} else {
Speed = (UINTN)Divisor;
}
Data->Value = (UINT16)Speed;
return;
}
/**
Get the third FAN speed value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateFan3Speed (
IN OUT HWM_DATA * Data
)
{
UINTN Speed;
UINTN Divisor;
Data->Token = STRING_TOKEN(STR_HWM1_FAN3_SPEED_VALUE);
Data->Type = FAN_SPEED;
Data->OddPos = 0x00;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0xC4,&Speed); // Register 0xC4
Divisor = (UINT8)Speed << 8;
GetValueWithIO(0x04,0xC5,&Speed); // Register 0xC5
Divisor |= (UINT8) Speed;
if( (Divisor == 0xFFFF) || (Divisor == 0x0FFF) || (Divisor == 0 )) {
Speed = 0;
} else {
Speed = (UINTN)Divisor;
}
Data->Value = (UINT16)Speed;
return;
}
/**
Get the forth FAN speed value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateFan4Speed (
IN OUT HWM_DATA * Data
)
{
UINTN Speed;
UINTN Divisor;
Data->Token = STRING_TOKEN(STR_HWM1_FAN4_SPEED_VALUE);
Data->Type = FAN_SPEED;
Data->OddPos = 0x00;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0xC6,&Speed); // Register 0xC6
Divisor = (UINT8)Speed << 8;
GetValueWithIO(0x04,0xC7,&Speed); // Register 0xC7
Divisor |= (UINT8) Speed;
if( (Divisor == 0xFFFF) || (Divisor == 0x0FFF) || (Divisor == 0 )) {
Speed = 0;
} else {
Speed = (UINTN)Divisor;
}
Data->Value = (UINT16)Speed;
return;
}
/**
Get the fifth FAN speed value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateFan5Speed (
IN OUT HWM_DATA * Data
)
{
UINTN Speed;
UINTN Divisor;
Data->Token = STRING_TOKEN(STR_HWM1_FAN5_SPEED_VALUE);
Data->Type = FAN_SPEED;
Data->OddPos = 0x00;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0xB8,&Speed); // Register 0xB8
Divisor = (UINT8)Speed << 8;
GetValueWithIO(0x04,0xB9,&Speed); // Register 0xB9
Divisor |= (UINT8) Speed;
if( (Divisor == 0xFFFF) || (Divisor == 0x0FFF) || (Divisor == 0 )) {
Speed = 0;
} else {
Speed = (UINTN)1350000/Divisor;
}
Data->Value = (UINT16)Speed;
return;
}
/**
Get the VIN0 voltage value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateVIN0Voltage (
IN OUT HWM_DATA * Data
)
{
UINTN VData;
UINTN Lsb_Unit=8;//AMI_TODO:LSB unit is 8mv
// >> 2016/07/19 AAEON_OVERRIDE
// UINTN R_Big=34; //AMI_TODO:Connect bigger divisor resistor
// UINTN R_Small=34; //AMI_TODO:Connect smaller divisor resistor
// << 2016/07/19 AAEON_OVERRIDE
Data->Token = STRING_TOKEN(STR_NCT5538D_HMM_VIN0_VALUE);
Data->Type = VOLTAGE;
Data->OddPos = 0x03;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x84,&VData) ; // Register 0x84
//OEM_TODO:change R_Big & R_Small Value according to your board
//R_Big=10;
//R_Small=10;
//calculate voltage value
// >> 2016/07/19 AAEON_OVERRIDE
// VData = VOL_DIVISOR_CALCULATE (VData,
// Lsb_Unit,
// R_Big,
// R_Small);
VData = VOL_DIVISOR_CALCULATE (VData,
Lsb_Unit,
VIN0_R1,
VIN0_R2);
// << 2016/07/19 AAEON_OVERRIDE
//pass to setup data which is UINT64 data
Data->Value = (UINT16)VData;
return;
}
/**
Get the VIN1 voltage value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateVIN1Voltage (
IN OUT HWM_DATA * Data
)
{
UINTN VIN1;
Data->Token = STRING_TOKEN(STR_HWM1_VIN1_VALUE);
Data->Type = VOLTAGE;
Data->OddPos = 0x03;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x81,&VIN1) ; // Register 0x81
// >> 2016/07/19 AAEON_OVERRIDE
// VIN1 = VIN1*8;
VIN1 = VIN1 * 8 * (VIN1_R1 + VIN1_R2) / VIN1_R2;
// << 2016/07/19 AAEON_OVERRIDE
Data->Value = (UINT16)VIN1;
return;
}
/**
Get the VIN2 voltage value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateVIN2Voltage (
IN OUT HWM_DATA * Data
)
{
UINTN VIN2;
Data->Token = STRING_TOKEN(STR_HWM1_VIN2_VALUE);
Data->Type = VOLTAGE;
Data->OddPos = 0x03;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x8C,&VIN2) ; // Register 0x8C
VIN2 = VIN2*8*(20+47)/47;
Data->Value = (UINT16)VIN2;
return;
}
/**
Get the VIN3 voltage value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateVIN3Voltage (
IN OUT HWM_DATA * Data
)
{
UINTN VIN3;
Data->Token = STRING_TOKEN(STR_HWM1_VIN3_VALUE);
Data->Type = VOLTAGE;
Data->OddPos = 0x03;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x8D,&VIN3) ; // Register 0x8D
VIN3 = VIN3*8;
Data->Value = (UINT16)VIN3;
return;
}
/**
Get the VIN4 voltage value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateVIN4Voltage (
IN OUT HWM_DATA * Data
)
{
UINTN VIN4;
Data->Token = STRING_TOKEN(STR_HWM1_VIN4_VALUE);
Data->Type = VOLTAGE;
Data->OddPos = 0x03;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x86,&VIN4) ; // Register 0x86
VIN4 = VIN4*8*(100+100)/100;
Data->Value = (UINT16)VIN4;
return;
}
/**
Get the VIN5 voltage value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateVIN5Voltage (
IN OUT HWM_DATA * Data
)
{
UINTN VIN4;
Data->Token = STRING_TOKEN(STR_HWM1_VIN5_VALUE);
Data->Type = VOLTAGE;
Data->OddPos = 0x03;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x8A,&VIN4) ; // Register 0x8A
VIN4 = VIN4*8*(100+100)/100;
Data->Value = (UINT16)VIN4;
return;
}
/**
Get the VIN5 voltage value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateVIN6Voltage (
IN OUT HWM_DATA * Data
)
{
UINTN VIN4;
Data->Token = STRING_TOKEN(STR_HWM1_VIN6_VALUE);
Data->Type = VOLTAGE;
Data->OddPos = 0x03;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x8B,&VIN4) ; // Register 0x8B
VIN4 = VIN4*8*(100+100)/100;
Data->Value = (UINT16)VIN4;
return;
}
/**
Get the VIN5 voltage value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateVIN7Voltage (
IN OUT HWM_DATA * Data
)
{
UINTN VIN4;
Data->Token = STRING_TOKEN(STR_HWM1_VIN7_VALUE);
Data->Type = VOLTAGE;
Data->OddPos = 0x03;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x8E,&VIN4) ; // Register 0x8E
VIN4 = VIN4*8*(100+100)/100;
Data->Value = (UINT16)VIN4;
return;
}
/**
Get the AVCC voltage value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateAVCCVoltage (
IN OUT HWM_DATA * Data
)
{
UINTN AVCC;
Data->Token = STRING_TOKEN(STR_NCT5538D_HWM_AVCC_VALUE);
Data->Type = VOLTAGE;
Data->OddPos = 0x03;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x82,&AVCC) ; // Register 0x82
AVCC = AVCC*8*2;
Data->Value = (UINT16)AVCC;
return;
}
/**
Get the VCC3V voltage value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateVCC3VVoltage (
IN OUT HWM_DATA * Data
)
{
UINTN VCC3V;
Data->Token = STRING_TOKEN(STR_HWM1_VCC3V_VALUE);
Data->Type = VOLTAGE;
Data->OddPos = 0x03;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x83,&VCC3V) ; // Register 0x83
VCC3V = VCC3V * 8 * 2;
Data->Value = (UINT16)VCC3V;
return;
}
/**
Get the VSB3V voltage value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateVSB3VVoltage (
IN OUT HWM_DATA * Data
)
{
UINTN VSB3V;
Data->Token = STRING_TOKEN(STR_HWM1_VSB3V_VALUE);
Data->Type = VOLTAGE;
Data->OddPos = 0x03;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x87,&VSB3V) ; // Register 0x87
VSB3V = VSB3V * 8 * 2 ;
Data->Value = (UINT16)VSB3V;
return;
}
/**
Get the VBAT voltage value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateVBATVoltage (
IN OUT HWM_DATA * Data
)
{
UINTN VBAT;
Data->Token = STRING_TOKEN(STR_HWM1_VBAT_VALUE);
Data->Type = VOLTAGE;
Data->OddPos = 0x03;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x88,&VBAT) ; // Register 0x88
VBAT = VBAT*8*2;
Data->Value = (UINT16)VBAT;
return;
}
/**
Get the VTT voltage value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateVTTVoltage (
IN OUT HWM_DATA * Data
)
{
UINTN VTT;
Data->Token = STRING_TOKEN(STR_NCT5538D_HWM_VTT_VALUE);
Data->Type = VOLTAGE;
Data->OddPos = 0x03;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x89,&VTT) ; // Register 0x89
VTT = VTT*8*2;
Data->Value = (UINT16)VTT;
return;
}
/**
Get the CPUVCORE voltage value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateCPUVCOREVoltage (
IN OUT HWM_DATA * Data
)
{
UINTN CPUVCORE;
Data->Token = STRING_TOKEN(STR_NCT5538D_HWM_CPUVCORE_VALUE);
Data->Type = VOLTAGE;
Data->OddPos = 0x03;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x80,&CPUVCORE) ; // Register 0x80
CPUVCORE = CPUVCORE*8*2;
Data->Value = (UINT16)CPUVCORE;
return;
}
/**
Get the VCOREREFIN voltage value in HWM space register and update to HII.
@param Data data for HWM HII.
**/
void
GetAndUpdateVCOREREFINVoltage (
IN OUT HWM_DATA * Data
)
{
UINTN VCOREREFIN;
Data->Token = STRING_TOKEN(STR_NCT5538D_HWM_VCOREREFIN_VALUE);
Data->Type = VOLTAGE;
Data->OddPos = 0x03;
//OEM_TODO:Get value with HWM IO interface
GetValueWithIO(0x04,0x85,&VCOREREFIN) ; // Register 0x85
VCOREREFIN = VCOREREFIN*8*2;
Data->Value = (UINT16)VCOREREFIN;
return;
}
///---------------------------------------------------------------------
///All Callback Functions List.
///---------------------------------------------------------------------
SIO_EXTERNAL_FUN *NCT5538DExternalFunList[] = {
GetAndUpdateTemperature0, // AAEON_OVERRIDE +
GetAndUpdateTemperature1,
GetAndUpdateTemperature2,
GetAndUpdateTemperature3,
GetAndUpdateTemperature4,
GetAndUpdateTemperature5,
GetAndUpdateTemperature6,
GetAndUpdateFan1Speed,
GetAndUpdateFan2Speed,
GetAndUpdateFan3Speed,
GetAndUpdateFan4Speed,
GetAndUpdateFan5Speed,
GetAndUpdateVIN0Voltage,
GetAndUpdateVIN1Voltage,
GetAndUpdateVIN2Voltage,
GetAndUpdateVIN3Voltage,
GetAndUpdateVIN4Voltage,
GetAndUpdateVIN5Voltage,
GetAndUpdateVIN6Voltage,
GetAndUpdateVIN7Voltage,
GetAndUpdateAVCCVoltage,
GetAndUpdateVCC3VVoltage,
GetAndUpdateVSB3VVoltage,
GetAndUpdateVBATVoltage,
GetAndUpdateVTTVoltage,
GetAndUpdateCPUVCOREVoltage,
GetAndUpdateVCOREREFINVoltage,
NULL
};
/**
Form Callback Function. Will be called every 100m Polling for data Updates.
@param HiiHandle A handle that was previously registered in the HII Database.
@param Class Indicates the setup class.
@param SubClass Indicates the setup subclass
@param Key Id of setup control.
**/
VOID NCT5538D_HWM_CallBack(
IN EFI_HII_HANDLE HiiHandle,
IN UINT16 Class,
IN UINT16 SubClass,
IN UINT16 Key
)
{
UINTN index;
HWM_DATA Data;
CALLBACK_PARAMETERS *Callback = NULL;
Callback = GetCallbackParameters();
if(!Callback || Callback->Action != EFI_BROWSER_ACTION_CHANGING)
return;
for(index=0; NCT5538DExternalFunList[index]; index++) {
NCT5538DExternalFunList[index](&Data);
AaeonHHMCommon(Data.Value, Data.Type, Data.Token, Data.OddPos, HiiHandle);
}
return;
}
//**********************************************************************
//**********************************************************************
//** **
//** (C)Copyright 1985-2015, American Megatrends, Inc. **
//** **
//** All Rights Reserved. **
//** **
//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
//** **
//** Phone: (770)-246-8600 **
//** **
//**********************************************************************
//**********************************************************************