본문 바로가기

Hello CE,Mobile

다른 뱅크의 RAM 영역을 OAL 에 등록하는 방법

기존의 RAM 과 연속적이지 않은 확장 RAM 영역을 OAL SYSTEM 메모리로 등록하는 방법에는 여러가지 방법이 있다.

 

1. 아래는 pNKEnumExtensionDRAM (OEMEnumExtensionDRAM) 을 이용하는 방법이다.

 

BSP/Src/Inc/oemaddrtab_cfg.inc

-----------------------------------------------------------------------------

g_oalAddressTable

        ; nCS6
        DCD     0x80000000, 0x50000000,  128     ; 128 MB DRAM BANK 6

        ; ----- 중략 ---------------

        DCD     0x93000000, 0x00000000,  16      ; 32 MB SROM(SRAM/ROM) BANK 0

        ; nCS1~nCS5, nCS0
        DCD     0x94000000, 0x18000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 1 = CS8900
        DCD     0x9A000000, 0x30000000,  1      ;  1 MB SROM(SRAM/ROM) BANK 4 = SRAM (256Kx16bit)
        DCD     0x00000000, 0x00000000,  0      ; end of table

        END
-----------------------------------------------------------------------------

 

BSP/Src/Kernel/Oal/Init.c

-----------------------------------------------------------------------------

#include <bsp.h>

 

// ---- 중략 --------

 

extern DWORD (*pNKEnumExtensionDRAM)(PMEMORY_SECTION , DWORD );

UINT32 g_oalIoCtlClockSpeed;

// ---- 중략 --------

 

 

static void InitializeSRAM(void)

{

// SROM setup for nCS4 of SRAM

// Put some configurations of SROM controller  for SRAM bank

}

 

#define EXT_RAM_BASE_VIRTUAL  (0x9A000000) // nCS4 - SRAM
#define SIZE_OF_EXT_RAM   (0x00010000) // 64KByte

DWORD OEMEnumExtensionDRAM(MEMORY_SECTION *mem, DWORD max_sections)
{
// RETAILMSG(1, (TEXT("^^^^^^^^^^^^OEMEnumExtensionDRAM called ^^^^^^^^^^^\r\n")));

 mem[0].dwFlags = 0;
 mem[0].dwStart = EXT_RAM_BASE_VIRTUAL;
 mem[0].dwLen = SIZE_OF_EXT_RAM;

 return (1);  // One additional memory section.
}

 

void OEMInit()
{
// --- 중략 ---------

 OALMSG(TRUE, (L"[OAL] ++OEMInit()\r\n"));

// --- 중략 ---------

 InitializeSRAM();
 pNKEnumExtensionDRAM = OEMEnumExtensionDRAM;

 

  // Lie about the Processor Type (we do this so that the visual C tools work)
 CEProcessorType=PROCESSOR_STRONGARM;

// --- 중략 ---------

}

-----------------------------------------------------------------------------

 

위와 같이 OEMInit() 함수 내에서 pNKEnumExtensionDRAM 을 정의하고, OEMEnumExtensionDRAM 함수를 연결하여 주면, OEMInit가 끝난후 OEMEnumExtensionDRAM함수가 수행이 되면서, 확장 메모리 영역이 시스템 메모리로 추가가 된다.

 

2. 다른 한가지의 방법은 OEMGetExtensionDRAM 함수를 이용하는 방법이다.

WINCE500/PLATFORM/COMMON/SRC/COMMON/OTHER/memory.c 에는 OEMGetExtensionDRAM 함수가 정의되어있다. 

이것을 아래와 같이 수정하면

해당 영역이 시스템 메모리영역에 추가가 된다.

전제 : 1) oemaddrtab_cfg.inc 에 해당 영역에 대한 mmu table 설정이 되어있을 것.

         2) config.bib 에는 해당영역에 대한 항목이 없도록 할 것.

 

//------------------------------------------------------------------------------

BOOL OEMGetExtensionDRAM(UINT32 *pMemoryStart, UINT32 *pMemoryLength)
{
  //RETAILMSG(1,(_T("+OEMGetExtensionDRAM()\r\n")));

 *pMemoryStart = 0x82000000;
 *pMemoryLength = 0x04000000; 
 //RETAILMSG(1,(_T("-OEMGetExtensionDRAM()\r\n")));

    return (TRUE);
}

//------------------------------------------------------------------------------