

//[VMOS통합판수정중][2010.12.09.목][생성!!!]{------------------------------------
//VMOS 에 [수학 API] 가 통합되고, 다양한 API 를 지원하기 위하여 API 에 따라
//VMOS 가 세분화 되어 여러 종류가 지원되므로 VMOS 크기와 _ROM_ 크기등이 가변적이
//되므로 여러 설정을 [구조체 변수] 화 하여 가변적으로 대응할수 있도록 수정한다.
//
//맷돌용 VMOS 자체는 이전처럼 <vmos_memmap_def.h> 를 사용하지 않고 여기서 정의된
//[구조체 정보] 를 사용한다.
//}------------------------------------------------------------------------------


#ifndef vmos_info_h
#define vmos_info_h


#include  "vmos_def.h"


//[맷돌 운영체제 종류 대분류]
//{
    //[2010.12.10.금][추가!!!]{--------------------
    //[VMOS 계열]            : 0xffffffff:xxxxxxxx
    //[VMOS:AT45DB041X 계열] : 0x45db0410:xxxxxxxx
    //[OSX 계열]             : 0x00000000:xxxxxxxx
    //
    //상위 4Byte 만 사용한다.
    //}--------------------------------------------

    #define  d_OS_vmos          0xffffffff00000000
    #define  d_OS_at45db041x    0x45db041000000000
    #define  d_OS_osx           0x0000000000000000

//}






struct  VMOSINFO
{
  //[2010.12.09.목][생성!!!]{------------------------------------------------------------
  //맷돌에 설치할 VMOS 의 자세한 정보를 관리한다.
  //설치되는 VMOS 에 따라 약간의 정보차이가 있음로 이를 가변적으로 운영하기 위한 것이다.
  //}------------------------------------------------------------------------------------

  //[메모리 정보]
  //{
      DTU4  mcuFlash_Base; //0x00000000
      DTU4  mcuFlash_Size; //(1024*64)

      DTU4  mcuRam_Base; //0x20000000
      DTU4  mcuRam_Size; //(1024*20)

      //맷돌모듈(VMOS 자체가)에서 사용하는 SRAM 정의.
      DTU4  mcuVmosRam_Base; //d_McuRam_Base
      DTU4  mcuVmosRam_Size; //(1024*4)

  //}

  //[각 부분의 CODE:BASE 정의]
  //{
      DTU4  codeBase_BaseVM; //d_McuFlash_Base
      DTU4  codeSize_BaseVM; //(1024*4)

      DTU4  codeBase_System; //(d_CodeBase_BaseVM + d_CodeSize_BaseVM)
      DTU4  codeSize_System; //(1024*1)

      //<System영역:1KByte> 다음에 배치된다.
      DTU4  codeBase_VMOS; //(d_CodeBase_System + d_CodeSize_System)
      //이 정보는 VMOS 계열인지 VMOS:AT45DB041X 계열인지에 따라 크기가 달라진다.
      //설치할 VMOS 의 <vmos.ginf> 안에 크기 정보가 들어 있으므로 이 때 재설정된다.
      DTU4  codeSize_VMOS; //1024*41       //[크기(KByte 단위)를 구해서 사용]

      //[VmosRom]
      //{
          //[2010.12.11.토][수정!!!]{--------------------------------------------------
          //아래 두 정보는 VMOS/VMOS:AT45DB041X 계열에 따라 완전히 다르므로 설치시에는
          //둘을 구분하여 재설정해야 한다.
          //}--------------------------------------------------------------------------

          //사용자 Flash(ROM) 영역 시작(기본값).
          DTU4  codeBase_VmosRom; //(d_CodeBase_VMOS + d_CodeSize_VMOS)
          DTU4  codeSize_VmosRom; //(d_McuFlash_Size - d_CodeBase_VmosRom)

      //}

      //[VmosRam]
      //{
          //[2009.08.12.수][추가!!!]{--------------------------------------------
          //VMOS 가 사용하는 SRAM 영역의 MCU 상의 위치정보.
          //RAM 은 [VMOS] 와 [VMOS:AT45DB041X] 가 동일한 크기와 공간을 사용한다.
          //}--------------------------------------------------------------------

          //[0x20000000:0x20000fff] 까지 4KByte 는 OS 자체에서 사용한다.

          //VMOS 의 RAM 시작 위치는 OS 자체가 사용하는 SRAM 이 많아지는 경우는 크기가 줄어들수 있다.
          DTU4  codeBase_VmosRam; //(d_McuVmosRam_Base + d_McuVmosRam_Size)

          //SRAM 은 0x20000000 부터 시작하므로 이것을 빼주어야 한다-------------v
          DTU4  codeSize_VmosRam; //(d_McuRam_Size - (d_CodeBase_VmosRam - d_McuRam_Base))

      //}

      //[VmosHeap]
      //{
          //현재 [맷돌모듈] 에는 이 영역이 없다.

          //사용되지 않는 주소를 할당한다.
          DTU4  codeBase_VmosHeap; //0xffffffff

          //현재는 사용되지 않는다.
          DTU4  codeSize_VmosHeap; //0

      //}

  //}


  //[System 영역 정의]
  //{
      //IDE 쪽에서는 단지 주소만 필요하다.

      //[OS 구동 종류 구분]
      //{
          //[!]{-------------------------------------------------------------------
          //[영혼] 을 주입할때 어떤 [영혼] 이 구동중인지 식별하는 용도로 사용된다.
          //}----------------------------------------------------------------------

          DTU4  sys_OS_VMOS; //(d_CodeBase_System + 0x0000) //2Byte
          DTU4  sys_OS_BaseVM; //(d_CodeBase_System + 0x0002) //2Byte

      //}

      //[MCU 상의 주소]
      //{
          DTU4  codeBase_SystemMcu; //(d_Sys_OS_BaseVM + 2)


          //MCU 상의 배치를 정의한다(모두 4Byte 크기를 갖는다).
          DTU4  sys_CodeBase_BaseVM; //(codeBase_SystemMcu + 4*0)  //4Byte
          DTU4  sys_CodeSize_BaseVM; //(codeBase_SystemMcu + 4*1)  //4Byte

          DTU4  sys_CodeBase_System; //(codeBase_SystemMcu + 4*2)  //4Byte
          DTU4  sys_CodeSize_System; //(codeBase_SystemMcu + 4*3)  //4Byte

          DTU4  sys_CodeBase_VMOS; //(codeBase_SystemMcu + 4*4)  //4Byte
          DTU4  sys_CodeSize_VMOS; //(codeBase_SystemMcu + 4*5)  //4Byte

          DTU4  sys_CodeBase_VmosRom; //(codeBase_SystemMcu + 4*6)  //4Byte
          DTU4  sys_CodeSize_VmosRom; //(codeBase_SystemMcu + 4*7)  //4Byte

          DTU4  sys_CodeBase_VmosRam; //(codeBase_SystemMcu + 4*8) //4Byte
          DTU4  sys_CodeSize_VmosRam; //(codeBase_SystemMcu + 4*9) //4Byte

          DTU4  sys_CodeBase_VmosHeap; //(codeBase_SystemMcu + 4*10) //4Byte
          DTU4  sys_CodeSize_VmosHeap; //(codeBase_SystemMcu + 4*11) //4Byte

      //}

      //[VMOS 상의 주소]
      //{
          //VMOS 상의 정보의 기반은 이전 정보 다음 위치부터다.
          //<d_Sys_VmosVarTable_Size> 자체 크기-------------------v
          DTU4  codeBase_SystemVmos; //(d_Sys_CodeSize_VmosHeap + 4)


          //VMOS 상의 배치를 정의한다(모두 8Byte 크기를 갖는다).
          DTU4  sys_RomStart;    //(d_CodeBase_SystemVmos + 8*0)  //8Byte
          DTU4  sys_RomEnd;      //(d_CodeBase_SystemVmos + 8*1)  //8Byte

          DTU4  sys_RamStart;    //(d_CodeBase_SystemVmos + 8*2)  //8Byte
          DTU4  sys_RamEnd;      //(d_CodeBase_SystemVmos + 8*3)  //8Byte

          DTU4  sys_HeapStart;   //(d_CodeBase_SystemVmos + 8*4)  //8Byte
          DTU4  sys_HeapEnd;     //(d_CodeBase_SystemVmos + 8*5)  //8Byte

          //이 영역은 <F:adr> 로 접근 하는 VMOS 안에서 직접 MCU 의 주소 공간에 접근하기 위한 주소영역이다.
          DTU4  sys_SystemStart; //(d_CodeBase_SystemVmos + 8*6)  //8Byte
          DTU4  sys_SystemEnd;   //(d_CodeBase_SystemVmos + 8*7)  //8Byte

          //[OS 종류구분]
          //{
              //[!]{------------------------------------------------------------------------------
              //각 [운영체제(VMOS/OSX)] 의 <*.gos> 가 위치한 곳의 <*.ginf> 문서 안의 {식별자} 를
              //읽고, 맷돌의 이 <sys_OS_X> 정보를 읽으면, 현재 맷돌에 설치된 [운영체제] 의 종류를
              //간단하게 알수있다.
              //}---------------------------------------------------------------------------------

              DTU4  sys_OS_ID; //(d_CodeBase_SystemVmos + 8*8)  //8Byte

          //}

      //}

  //}

  //[메모리 정의][맷돌모듈]
  //{
      DTU8  VMOS_RamSize; //d_CodeSize_VmosRam

      //[VMOS 상의 주소 범위 정의]
      //{
          //[!]{--------------------------------------------------------------
          //VMOS 계열인지, VMOS:AT45DB041X 계열인지에 따라 구성값이 달라진다.
          //설치시 해당 VMOS 에 맞게 재설정후 사용해야 한다.
          //}-----------------------------------------------------------------

          //[ROM]
          DTU8  VMOS_ROM_START;    //0x0000000000000000
          DTU8  VMOS_ROM_END;      //(d_VMOS_ROM_START + d_CodeSize_VmosRom - 1)

          //[RAM]
          DTU8  VMOS_RAM_START;    //(d_VMOS_ROM_END + 1)
          DTU8  VMOS_RAM_END;      //(d_VMOS_RAM_START + d_CodeSize_VmosRam - 1)

          //[HEAP]
          //현재 그냥 [RAM] 영역 바로 다음부터 시작되어 64KByte 크기를 갖는 것으로 해 놓는다.
          DTU8  VMOS_HEAP_START;   //(d_VMOS_RAM_END + 1)
          //[2009.08.17.월][수정!!!]
          //현재는 사용되지 않으므로    [시작주소] 와 같은 값을 할당한다.
          DTU8  VMOS_HEAP_END;     //d_VMOS_HEAP_START

          //[SYSTEM]
          //[장치] 적으로 완전 고정되 있는 [주소영역] 이된다.
          DTU8  VMOS_SYSTEM_START; //0xffffffff00000000
          DTU8  VMOS_SYSTEM_END;   //0xffffffffffffffff

      //}

  //}

  //[부가 정보]
  //{
      //맷돌안의 Flash 를 지울 [쪽수] 를 관리한다.
      //BaseVM(4K) 를 제외한 64K 의 나머지 영역이 전부 해당된다.
      DTU4  vmosInfo_ErasePageNum; //60


  //}

  //[현재 설치하는 운영체제의 식별자]
  //{
      //[2010.12.10.금][추가!!!]{----------------------------------------------------------------
      //현재 설치하는 [운영체제] 가 VMOS, VMOS:AT45DB041X, OSX 계열중 어떤 것인지
      //다른 곳에서 알기 위한 것이다.
      //이 정보는 실제 [운영체제] 를 설치하는 <matdol.cpp> 안의 해당 함수들에서 참조하게 된다.
      //
      //반드시 설치할 때마다 이곳에 현재 설치하는 [운영체제의 <식별자>] 를 반드시 기록해야 한다.
      //}----------------------------------------------------------------------------------------

      DTU8  osID; //(BASE : 0xffffffff00000000) 기본 VMOS 로 설정해 준다.

  //}


};


//[2010.12.10.금][완료!!!]
void __fastcall VmosInfo_GetPtr(struct VMOSINFO  **rVmosInfo);

//[2010.12.10.금][완료!!!]
void __fastcall VmosInfo_Init(void);

//[2010.12.11.토][완료!!!]
void __fastcall VmosInfo_CodeSize_VMOS(//[2010.12.11.토][추가!!!]{---------------------------------
                                       //VMOS:AT45DB041X 계열인 경우는 일부 다른 적용이 필요하므로
                                       //이를 구분할수 있도록 [식별자] 정보를 추가한다.
                                       //}---------------------------------------------------------
                                       DTU8  pID,
                                       DTU4  pCodeSize_VMOS);



#endif
