/************************************************************************************
* This module contains the NV Data module
*
* Note!! The specified link sequence is very important for the allocation of NV RAM
*        A changed link sequence can change the NV RAM layout and the pointer cannot
*        read the correct NV RAM data.
*
*       Note! This file covers version 0003 of the Freescale NVM layout. Version 0003 is backward
*             compatible with version 0001 and 0002
*
* Author(s):  Michael V. Christensen
*
* (c) Copyright 2005, Freescale Semiconductor, Inc. All rights reserved.
*
* Freescale Confidential Proprietary
* Digianswer Confidential
*
* No part of this document must be reproduced in any form - including copied,
* transcribed, printed or by any electronic means - without specific written
* permission from Freescale.
*
* Last Inspected: 04-11-05
* Last Tested:
*
************************************************************************************/


#include "DigiType.h"
#include "NV_Data.h"
#include "FunctionalityDefines.h"
#include "App_Target.h"
#include "AllTargets.h"

// **************************************************************************

#pragma DISABLE_WARNING(C3303) // Warning C3303: Implicit concatenation of strings
#pragma DISABLE_WARNING(C4200) // Warning C4200: Other segment than in previous declaration

// **************************************************************************

#pragma PLACE_CONST_SEG(BOOTLOADER_MCU_NV_DATA0)
// MCU manufacture Number
  _CONST uint8_t  MCU_Manufacture = MCU_MANUFACTURE;
// MCU ID Number
  _CONST uint8_t  MCU_Version = MCU_VERSION;
#pragma RESTORE_CONST_SEG

// **************************************************************************

#pragma PLACE_CONST_SEG(BOOTLOADER_APP_NV_DATA0)

// Initialized with default values
volatile const Init_NV_RAM_Struct_t NV_RAM0 =
{
// Application Name
#if (!defined FLASH_LIB_ENABLED && !defined DYN_FLASH_LIB_ENABLED && !defined BOOTLOADER_ENABLED &&\
	 !defined DYN_BOOTLOADER_ENABLED && !defined  BOOTLOADER_LITE_ENABLED)
	"PTC Demo  Ver 2.01a Build: "__DATE__" "__TIME__,
#endif (!defined FLASH_LIB_ENABLED && !defined DYN_FLASH_LIB_ENABLED && !defined BOOTLOADER_ENABLED &&\
	 !defined DYN_BOOTLOADER_ENABLED && !defined  BOOTLOADER_LITE_ENABLED)

#ifdef FLASH_LIB_ENABLED
	"PTC Demo  Ver 2.01b Build: "__DATE__" "__TIME__,
#endif FLASH_LIB_ENABLED

#ifdef DYN_FLASH_LIB_ENABLED
	"PTC Demo  Ver 2.01c Build: "__DATE__" "__TIME__,
#endif DYN_FLASH_LIB_ENABLED

#ifdef BOOTLOADER_ENABLED
	"PTC Demo  Ver 2.01d Build: "__DATE__" "__TIME__,
#endif BOOTLOADER_ENABLED

#ifdef DYN_BOOTLOADER_ENABLED
	"PTC Demo  Ver 2.01e Build: "__DATE__" "__TIME__,
#endif DYN_BOOTLOADER_ENABLED

#ifdef BOOTLOADER_LITE_ENABLED
	"PTC Demo  Ver 2.01f Build: "__DATE__" "__TIME__,
#endif BOOTLOADER_LITE_ENABLED
					  
// Embedded Bootloader version - if present
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,
// NVM Layout Version
	NVM_LAYOUT_VERSION,
// PA Level	
	PA_LEVEL,
// Channel Select
	CHANNEL_SELECT,
#ifdef SYSTEM_CLOCK_8MHZ
// System/bus frequency	
	0x08, // 8 MHz
// RF Clock Setting	
	CLOCK_OUT_SETTING,
// RF calibration Setting
	HF_CALIBRATION,
// ICG
	0x18,
	0x00, // 0x00 => CPU clk=16 MHz, Buc clk = 8 MHz
// ICG Filter
	0x02,
	0x40,
// SCI
	0x00,
	0x1A, // 1A => 19200 @ 8 MHz
#endif SYSTEM_CLOCK_8MHZ

#ifdef SYSTEM_CLOCK_12MHZ
	0x0C, // 12 MHz
	CLOCK_OUT_SETTING,
	HF_CALIBRATION,
// ICG clock
	0x18,
	0x41, // 0x41 => CPU clk=24 MHz, Buc clk = 12 MHz
// ICG Filter
	0x02,
	0x40,
// SCI
	0x00,
	0x27, // 0x27 => 19200 @ 12 MHz
#endif SYSTEM_CLOCK_12MHZ

#ifdef SYSTEM_CLOCK_16MHZ
	0x10, // 16 MHz
	CLOCK_OUT_SETTING,
	HF_CALIBRATION,
// ICG clock
	0x18,
	0x20, // 0x20 => CPU clk=32 MHz, Buc clk = 16 MHz
// ICG Filter
	0x02,
	0x40,
// SCI
	0x00,
	0x34, // 0x34 => 19200 @ 16 MHz
#endif SYSTEM_CLOCK_16MHZ

#ifdef SYSTEM_CLOCK_16_78MHZ
	0x10, // 16 MHz -> ~16,78 MHz
	CLOCK_OUT_SETTING,
	HF_CALIBRATION,
// ICG clock
	0x18,
	0x60, // 0x60 => CPU clk=32,78 MHz, Buc clk = 16,39 MHz
// ICG Filter
	0x02,
	0x40,
// SCI
	0x00,
	0x09, // 0x09 => 115200 @ 16,78 MHz
#endif SYSTEM_CLOCK_16_78MHZ

#ifdef SYSTEM_CLOCK_14_24MHZ
	0x0E, // 14,24 MHz
	CLOCK_OUT_SETTING,
	HF_CALIBRATION,
// ICG clock
	0x18,
	0x50, // 0x50 => CPU clk=28,48 MHz, Buc clk = 14,24 MHz
// ICG Filter
	0x02,
	0x40,
// SCI
	0x00,
	0x04, // 0x04 => 230400 @ 14,24 MHz
#endif SYSTEM_CLOCK_14_24MHZ

// MAC Address
	0x10,0x01,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,
// AntennaSelect
  0x01,
// Sleep Mode Enable
	0x00,
// HW Name	
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
// Serial Number	
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
// Production Site
	0xFFFF,
// Country Code
	0xFF,
// Productin Week
	0xFF,
// Production Year	
	0xFF,
// Reserved
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
// Crystal Trim and Bias Setting	
	CRYSTAL_TRIM_AND_BIAS_SETTING,
// Channel PA
	CHANNEL_PA,
// Application_Section
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
	NV_SYSTEM_FLAG
};

// **************************************************************************

#pragma PLACE_CONST_SEG(BOOTLOADER_APP_NV_DATA1)
  // This is the empty "copy" sector - contains all 0xFF's
  volatile const NV_RAM_Struct_t NV_RAM1;
#pragma RESTORE_CONST_SEG

#pragma PLACE_DATA_SEG(NV_RAM_POINTER)
  volatile NV_RAM_Struct_t *NV_RAM_ptr; // A pointer to NV Data will be setup in init code.
#pragma RESTORE_DATA_SEG

// **************************************************************************
// Place NVM holder, so that Bootloader can find them

#if defined DYN_BOOTLOADER_ENABLED || defined DYN_FLASH_LIB_ENABLED

    #pragma PLACE_CONST_SEG(APP_BOOTLOADER_NVM0_STORED)
        NV_RAM_Struct_t *const NVM0_ptr = (NV_RAM_Struct_t*)Freescale_Copyright;
    #pragma RESTORE_CONST_SEG
  
    #pragma PLACE_CONST_SEG(APP_BOOTLOADER_NVM1_STORED)
        NV_RAM_Struct_t *const NVM1_ptr = (NV_RAM_Struct_t*)&NV_RAM1;
    #pragma RESTORE_CONST_SEG

#endif defined DYN_BOOTLOADER_ENABLED || defined DYN_FLASH_LIB_ENABLED

void NV_Data_Init(void)
{
	// Setup NV RAM pointer after update.
  if ((MCU_Manufacture != MCU_MANUFACTURE) || (MCU_Version != MCU_VERSION))
	  __asm nop;
}
