

//[VMOS통합판수정중][2010.12.10.금][생성!!!]{---------------------------------------
//VMOS 가 [수학 API] 통합과 API 다양지원으로 여러 종류로 분화 되었으므로 이로인한
//가변성을 지원하기 위하여 이전처럼 <vmos_memmap_def.h> 에 정의된 상수값을 사용하지
//않고전용 [구조체] 를 사용한다.
//}---------------------------------------------------------------------------------


#include <vcl.h>
#pragma hdrstop


#include "vmos_info.h"
#include "vmos_memmap_def.h"

//[2010.12.13.월][추가!!!]
#include  "file_ginf.h"

//[2010.12.11.토][추가!!!]
#include "ide_library.h"
#include "ide_msgbox.h"


//[VMOS 정보]
//{
    //[2010.12.10.금][추가!!!]{----------------------------------------------------------
    //전체 [맷돌-통합개발환경] 에서 사용아는 정보를 이곳에서 한개만 전역변수로 선언한다.
    //}----------------------------------------------------------------------------------

    struct VMOSINFO  _vmosInfo;

//}


void __fastcall VmosInfo_GetPtr(struct VMOSINFO  **rVmosInfo)
{
  //[2010.12.10.금][생성!!!]{-----------------------------------------------------
  //다른 [소스 파일] 에서 사용할수 있도록 <_vmosInfo> 의 [위치] 를 구해 반환한다.
  //}-----------------------------------------------------------------------------

  //전역 변수로 선언된 _vmos 의 주소값을 넘겨준다.
  (*rVmosInfo) = &_vmosInfo;

}

void __fastcall VmosInfo_Init(void)
{
  //[2010.12.10.금][생성!!!]{----
  //운영체제 정보를 초기화 한다.
  //}----------------------------

  //[메모리 정보]
  //{
      //[!]{-------------------------------------------------------------------
      //현재 맷돌은 STM32F103C8T6 로 제작되었으므로 이 MCU 의 것으로 설정한다.
      //고정값.
      //}----------------------------------------------------------------------

      _vmosInfo.mcuFlash_Base   = 0x00000000;
      _vmosInfo.mcuFlash_Size   = (1024*64);

      _vmosInfo.mcuRam_Base     = 0x20000000;
      _vmosInfo.mcuRam_Size     = (1024*20);

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

  //}

  //[각 부분의 CODE:BASE 정의]
  //{
      _vmosInfo.codeBase_BaseVM = _vmosInfo.mcuFlash_Base;
      _vmosInfo.codeSize_BaseVM = (1024*4);

      _vmosInfo.codeBase_System = (_vmosInfo.codeBase_BaseVM + _vmosInfo.codeSize_BaseVM);
      _vmosInfo.codeSize_System = (1024*1);

      //[VMOS계열/VMOS:AT45DB041X계열 에 따라 다르다]
      //{
          //[2010.12.11.토][수정!!!]{-----------------------------------------------------
          //아래 두 정보는 VMOS/VMOS:AT45DB041X 계열에 따라 완전히 다르므로 여기서는 일단
          //VMOS 계열에 맞추어 설정하되, 실제 설치시에는 둘을 구분하여 재설정해야 한다.
          //}-----------------------------------------------------------------------------

          //<System영역:1KByte> 다음에 배치된다.
          _vmosInfo.codeBase_VMOS   = (_vmosInfo.codeBase_System + _vmosInfo.codeSize_System);
          //이 정보는 VMOS 계열인지 VMOS:AT45DB041X 계열인지에 따라 크기가 달라진다.
          //설치할 VMOS 의 <vmos.ginf> 안에 크기 정보가 들어 있으므로 이 때 재설정된다.
          //이 정보는 VMOS 를 설치할때 재 설정되므로 여기서는 가장 큰 VMOS 의 크기로 설정해 놓는다.
          //단, 이 값의 변화에 따라 변하는 모든 것을 다 수정해 주어야 한다.
          _vmosInfo.codeSize_VMOS   = (1024*59); //설치할때 재설정 된다.

      //}

      //[VmosRom]
      //{
          //사용자 Flash(ROM) 영역 시작(기본값).
          _vmosInfo.codeBase_VmosRom = (_vmosInfo.codeBase_VMOS + _vmosInfo.codeSize_VMOS);
          _vmosInfo.codeSize_VmosRom = (_vmosInfo.mcuFlash_Size - _vmosInfo.codeBase_VmosRom);

      //}

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

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

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

          //SRAM 은 0x20000000 부터 시작하므로 이것을 빼주어야 한다-------------------------------------v
          _vmosInfo.codeSize_VmosRam = (_vmosInfo.mcuRam_Size - (_vmosInfo.codeBase_VmosRam - _vmosInfo.mcuRam_Base));

      //}

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

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

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

      //}

  //}


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

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

          _vmosInfo.sys_OS_VMOS   = (_vmosInfo.codeBase_System + 0x0000); //2Byte
          _vmosInfo.sys_OS_BaseVM = (_vmosInfo.codeBase_System + 0x0002); //2Byte

      //}

      //[MCU 상의 주소]
      //{
          _vmosInfo.codeBase_SystemMcu = (_vmosInfo.sys_OS_BaseVM + 2);

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

          _vmosInfo.sys_CodeBase_System   = (_vmosInfo.codeBase_SystemMcu + 4*2);  //4Byte
          _vmosInfo.sys_CodeSize_System   = (_vmosInfo.codeBase_SystemMcu + 4*3);  //4Byte

          _vmosInfo.sys_CodeBase_VMOS     = (_vmosInfo.codeBase_SystemMcu + 4*4);  //4Byte
          _vmosInfo.sys_CodeSize_VMOS     = (_vmosInfo.codeBase_SystemMcu + 4*5);  //4Byte

          _vmosInfo.sys_CodeBase_VmosRom  = (_vmosInfo.codeBase_SystemMcu + 4*6);  //4Byte
          _vmosInfo.sys_CodeSize_VmosRom  = (_vmosInfo.codeBase_SystemMcu + 4*7);  //4Byte

          _vmosInfo.sys_CodeBase_VmosRam  = (_vmosInfo.codeBase_SystemMcu + 4*8); //4Byte
          _vmosInfo.sys_CodeSize_VmosRam  = (_vmosInfo.codeBase_SystemMcu + 4*9); //4Byte

          _vmosInfo.sys_CodeBase_VmosHeap = (_vmosInfo.codeBase_SystemMcu + 4*10); //4Byte
          _vmosInfo.sys_CodeSize_VmosHeap = (_vmosInfo.codeBase_SystemMcu + 4*11); //4Byte

      //}

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


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

          _vmosInfo.sys_RamStart    = (_vmosInfo.codeBase_SystemVmos + 8*2);  //8Byte
          _vmosInfo.sys_RamEnd      = (_vmosInfo.codeBase_SystemVmos + 8*3);  //8Byte

          _vmosInfo.sys_HeapStart   = (_vmosInfo.codeBase_SystemVmos + 8*4);  //8Byte
          _vmosInfo.sys_HeapEnd     = (_vmosInfo.codeBase_SystemVmos + 8*5);  //8Byte

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

      //}

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

          _vmosInfo.sys_OS_ID = (_vmosInfo.codeBase_SystemVmos + 8*8);  //8Byte

      //}

  //}

  //[메모리 정의][맷돌모듈]
  //{
      _vmosInfo.VMOS_RamSize  = _vmosInfo.codeSize_VmosRam;

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

          //[VMOS 계열]
          //{
              //[ROM]
              _vmosInfo.VMOS_ROM_START    = 0x0000000000000000;
              _vmosInfo.VMOS_ROM_END      = (_vmosInfo.VMOS_ROM_START + _vmosInfo.codeSize_VmosRom - 1);

              //[RAM]
              _vmosInfo.VMOS_RAM_START    = (_vmosInfo.VMOS_ROM_END + 1);
              _vmosInfo.VMOS_RAM_END      = (_vmosInfo.VMOS_RAM_START + _vmosInfo.codeSize_VmosRam - 1);

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

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

          //}

      //}

  //}

  //[부가 정보]
  //{
      //[MCU Flash 지우는 페이지 수]
      //{
          //[!]{-----------------------------------------------------
          //맷돌안의 Flash 를 지울 [쪽수] 를 관리한다.
          //BaseVM(4K) 를 제외한 64K 의 나머지 영역이 전부 해당된다.
          //}--------------------------------------------------------

          _vmosInfo.vmosInfo_ErasePageNum = 60;

      //}

      //[현재 설치하는 운영체제의 <식별자>]
      //{
          //[2010.12.10.금][추가!!!]{------------------------------
          //가장 기본적인 VMOS 의 [식별자] 를 초기값으로 할당한다.
          //}------------------------------------------------------

          _vmosInfo.osID = 0xffffffff00000000;

      //}

  //}

}

void __fastcall VmosInfo_CodeSize_VMOS(//[2010.12.11.토][추가!!!]{---------------------------------
                                       //VMOS:AT45DB041X 계열인 경우는 일부 다른 적용이 필요하므로
                                       //이를 구분할수 있도록 [식별자] 정보를 추가한다.
                                       //}---------------------------------------------------------
                                       DTU8  pID,
                                       DTU4  pCodeSize_VMOS)
{
  //[2010.12.11.토][생성!!!]{------------------------------------------------------------------
  //[운영체제 정보 구조체] 에서 <codeSize_VMOS> 를 수정하고, 관련 정보만 골라서 전부 수정한다.
  //}------------------------------------------------------------------------------------------

  //[각 부분의 CODE:BASE 정의]
  //{
      //[!]{----------------------------------------
      //[운영체제 자체 크기] 는 가장 먼저 처리한다.
      _vmosInfo.codeSize_VMOS = pCodeSize_VMOS;
      //}-------------------------------------------

      //[VmosRom][운영체제 구분 처리]
      //{
          //[2010.12.11.토][수정!!!]{---------------------------------------------------------
          //이 두 정보는 VMO 계열, VMOS:AT45DB041X 계열 인지에 따라 완전히 다른 값을 갖으므로
          //전달받은 [식별자] 를 참고로 이 둘을 구분하여 처리해야 한다.
          //
          //[식별자] 의 상위 4 Byte 값으로 [운영체제] 를 쉽게 구분할수 있다.
          //}---------------------------------------------------------------------------------

          switch(pID & 0xffffffff00000000)
          {
            case  d_OS_vmos : //일반 VMOS 계열.
            {
              //사용자 Flash(ROM) 영역 시작(기본값).
              _vmosInfo.codeBase_VmosRom = (_vmosInfo.codeBase_VMOS + _vmosInfo.codeSize_VMOS);
              _vmosInfo.codeSize_VmosRom = (_vmosInfo.mcuFlash_Size - _vmosInfo.codeBase_VmosRom);

            } break;

            case  d_OS_at45db041x : //VMOS:AT45DB041X 계열.
            {
              //MCU 상의 [ROM 배치위치] 를 정의한다.
              //이 경우는 외부 SPI Flash 를 ROM 으로 사용하므로 일단 MCU 밖에 존재하므로
              //MCU Flash(64K) 바로 다음에 존재하는 것으로 가상적으로 설정해 놓는다.
              _vmosInfo.codeBase_VmosRom = 1024*64;

              //[ROM 크기] 정보를 설정한다.
              //ROM 으로 사용하는 AT45DB041X 가 가진 512K 영역을 전부 사용하는 것으로 고정설정한다.
              _vmosInfo.codeSize_VmosRom = 1024*512;

            } break;

          }

      //}

  //}

  //[메모리 정의][맷돌모듈]
  //{
      //[VMOS 상의 주소 범위 정의]
      //{
          //[VMOS 계열]
          //{
              //[ROM]
              _vmosInfo.VMOS_ROM_END      = (_vmosInfo.VMOS_ROM_START + _vmosInfo.codeSize_VmosRom - 1);

              //[RAM]
              _vmosInfo.VMOS_RAM_START    = (_vmosInfo.VMOS_ROM_END + 1);
              _vmosInfo.VMOS_RAM_END      = (_vmosInfo.VMOS_RAM_START + _vmosInfo.codeSize_VmosRam - 1);

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

          //}

      //}

  //}


  //[검증]
  //{
      //[2010.12.11.토][추가!!]{--------------------------
      //검증을 위한 것으로 실제는 주석으로 처리해야 한다.
      //}-------------------------------------------------

      /*
      char  tempStr[1024] = {""};

      STR_Add(tempStr, "codeSize_VMOS    : 0x");
      CONV_LongVal_To_Hex(_vmosInfo.codeSize_VMOS, 8, &(tempStr[STR_Length(tempStr)])); STR_Add(tempStr, "\r\n");

      STR_Add(tempStr, "codeBase_VmosRom : 0x");
      CONV_LongVal_To_Hex(_vmosInfo.codeBase_VmosRom, 8, &(tempStr[STR_Length(tempStr)])); STR_Add(tempStr, "\r\n");

      STR_Add(tempStr, "codeSize_VmosRom : 0x");
      CONV_LongVal_To_Hex(_vmosInfo.codeSize_VmosRom, 8, &(tempStr[STR_Length(tempStr)])); STR_Add(tempStr, "\r\n");

      STR_Add(tempStr, "VMOS_ROM_END     : 0x");
      CONV_LongVal_To_Hex(_vmosInfo.VMOS_ROM_END, 8, &(tempStr[STR_Length(tempStr)])); STR_Add(tempStr, "\r\n");

      STR_Add(tempStr, "VMOS_RAM_START   : 0x");
      CONV_LongVal_To_Hex(_vmosInfo.VMOS_RAM_START, 8, &(tempStr[STR_Length(tempStr)])); STR_Add(tempStr, "\r\n");

      STR_Add(tempStr, "VMOS_RAM_END     : 0x");
      CONV_LongVal_To_Hex(_vmosInfo.VMOS_RAM_END, 8, &(tempStr[STR_Length(tempStr)])); STR_Add(tempStr, "\r\n");

      STR_Add(tempStr, "VMOS_HEAP_START  : 0x");
      CONV_LongVal_To_Hex(_vmosInfo.VMOS_HEAP_START, 8, &(tempStr[STR_Length(tempStr)])); STR_Add(tempStr, "\r\n");

      STR_Add(tempStr, "VMOS_HEAP_END    : 0x");
      CONV_LongVal_To_Hex(_vmosInfo.VMOS_HEAP_END, 8, &(tempStr[STR_Length(tempStr)])); STR_Add(tempStr, "\r\n");

      ide_msgbox_Form->_MsgBox(d_MSGBOX_info, tempStr);
      */

  //}


}













