PN7010
- Technical Document

(Ver.1.0)

Contents

Revision History 3

1. Overview 4

1.1 Product Design 4

1.2 System 4

1.3 Hardware Description 5

1.4 I/O Interface 6

1.4.1 Interface on Bottom 6

1.4.2 10-pin SIO Port 6

1.4.3 Side SIO Port (EXT-IR Port) 6

1.4.4 External Cable Connection 7

1.4.5 AV-In 7

1.4.6 Rear Camera 7

2. System Applications 8

3. Development Environment 8

3.1 API (Application Programming Interface) 8

3.1.1 System Info 8

3.1.2 Backlight 10

3.1.3 Volume 14

3.1.4 Battery 15

3.1.5 Sample Program 17

3.2 Serial Communication 18

3.2.1 Storage 18

3.2.2 UART 18

4. OS Update process 18

Revision History

Revision / Issue Date / Author / Change
1.0 / 2014-06-09 / Don Seo / Initial draft

1. Overview

1.1 Product Design

1.2 System

1)  Microsoft® Windows® CE 6.0 Core version

2)  Microsoft .NET Compact Framework: Version 2.0 / Version 3.5

3)  Microsoft SQL Compact: Version 3.5

4)  System Applications

5)  Auto-start Application

“App.exe” (which should be your main application) located in ResidentFlash or SD card is automatically launched.

If there is no “App.exe” in ResidentFlash or SD card, “Explorer.exe” is automatically launched. So it is recommended to install “App.exe” only in ResisdentFlash and save related applications, files and/or data in SD card.

1.3 Hardware Description

Item / Specification
Display / 7-inch TFT LCD (800x480px) with touch screen
Processor / Telechips TCC8803 2.1GHz (ARM A8, 1.2GHz Core + 1GHz DSP)
Operating System / Microsoft Windows CE.Net 6.0 core
GPS Antenna / High Performance Built-in GPS Antenna
External GPS Antenna – MCX type (optional)
GPS Chipset / High Sensitivity U-Blox 6
Internal Memory / 256MB DDR2 RAM
512MB ROM NAND Flash
External Memory / SD Card Slot (up to 16GB support)
External SD Box (optional)
Wi-Fi (optional) / 802.11 b/g/n Support
Audio / Earphone Jack with Stereo Output
Built-in Two 1.5W Speaker
Interface / USB 2.0 Host & Slave Ports
R-Cam Port for a Rear Parking Camera
AV-out Port for Dual Display (optional)
2 Serial (RS232, TTL) Connectivity
Power / Rechargeable1600mAh Li-polymer Battery (optional)
12~24V & 1.5A DC Car Charger or AC Home Charger (optional)
12~24V Power Input on SIO Port (optional)
Size / Weight / 182 x 115 x 21 mm / 367 grams

1.4 I/O Interface

1.4.1 Interface on Bottom

No / Name / Description
1 / Battery Switch / Turn on/off the internal battery.
2 / SIO Port / DC power input / ignition-check input / 2 serial ports
3 / USB Slave Port / Connect a mini-USB cable
4 / Debug Port / Engineering purpose only
5 / Ext. SD/USB Box / Connect an extended SD/USB box (optional)

1.4.2 10-pin SIO Port

Pin# / Name / Description
1 / GND / Ground line for power
2 / DC 12~24V / 12~24V power input line
3 / GND (SIO#1) / Ground line for RS232 serial communication
4 / TX1 (SIO#1) / Transmit data as RS232C level (Vcc_-6~6V) on COM4 port
5 / RX1 (SIO#1) / Receive data as RS232C level on COM4 port
6 / GND (SIO#2) / Ground line for TTL serial communication
7 / TX2 (SIO#2) / Transmit data as TTL level (Vcc_0~3.3V) on COM3 port
8 / RX2 (SIO#2) / Receive data as TTL level (Vcc_0~3.3V) on COM3 port
9 / GPIO1 / Ignition input line (TBD)
10 / GPIO2

1.4.3 Side SIO Port (EXT-IR Port)

1.4.4 External Cable Connection

l  10-pin cable for power supply and SIO ports

l  Serial Cable for side SIO port

l  USB cable for active sync

l  Extended SD/USB Box

1.4.5 AV-In

l  Pin information /

1.4.6 Rear Camera

l  It can be auto detected.

l  Pin information /

2. System Applications

The following system applications are located in ¥ResisdentFlash¥apps.

Application / Description
AVin / AV-in application
Browser / Demo version of Opera mini
Configuration / Configuration application
ProcessManager / hidden application controlling system
RCAM / Video-in application for rearview camera
VolumeDisplay / Volume control application
wifiConfig / Configuration application for WiFi connectivity

3. Development Environment

For application development, SDK (“TCC89x_Magellan_WinCE600_SDK.msi”.) should be installed in PC.

3.1 API (Application Programming Interface)

3.1.1 System Info

l  UUID

+ Define

#define DISK_GET_SERIALNUM_IOCTLCode(4,METHOD_BUFFERED)

+ Control

DWORD ReadUUID(UCHAR * pUuidBuf)

{

HANDLE hNandDrv;

UCHAR Buffer[32];

DWORD returned_bytes;

DWORD cnt = 0;

memset(Buffer, 0x00, sizeof(Buffer));

hNandDrv = CreateFile(L"DSK1:",

GENERIC_READ|GENERIC_WRITE,

NULL,

NULL,

OPEN_ALWAYS,

FILE_ATTRIBUTE_NORMAL|FILE_FLAG_WRITE_THROUGH,

NULL);

if( hNandDrv == NULL)

{

RETAILMSG(0,(_T("Cannot Open NAND Driver...\r\n")));

return 0;

}

if(DeviceIoControl(hNandDrv, DISK_GET_SERIALNUM, NULL, 0, Buffer, sizeof(Buffer), &returned_bytes, NULL ) == 0)

{

RETAILMSG(TRUE, (_T("Get NAND Serial Number Failed...")));

CloseHandle(hNandDrv);

return 0 ;

}

CloseHandle(hNandDrv);

memcpy(pUuidBuf, Buffer, 32);

return returned_bytes;

}

l  PRODUCT ID

+ Control

DWORD CVersion::ReadKernelVersion (void)

{

HKEY hKey;

LONG lResult;

DWORD dwType;

DWORD dwVal=0;

DWORD dwLen;

lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\cns_link\\Version", 0,
KEY_ALL_ACCESS, &hKey);

if(ERROR_SUCCESS == lResult)

{

TCHAR szTest[100]={0,};

dwType = REG_SZ;

dwLen = 100;

RegQueryValueEx(hKey, L"Kernel", NULL, &dwType,(PBYTE)szTest, &dwLen);

GetDlgItem(IDC_VER_ST_OS)->SetWindowText(szTest);

dwLen = 100;

RegQueryValueEx(hKey, L"KernelDate", NULL, &dwType,(PBYTE)szTest, &dwLen);

GetDlgItem(IDC_OS_DATE)->SetWindowText(szTest);

dwLen = 100;

RegQueryValueEx(hKey, L"Model", NULL, &dwType,(PBYTE)szTest, &dwLen);

GetDlgItem(IDC_MODEL)->SetWindowText(szTest);

dwLen = 100;

RegQueryValueEx(hKey, L"CPU", NULL, &dwType,(PBYTE)szTest, &dwLen);

GetDlgItem(IDC_CPU)->SetWindowText(szTest);

dwLen = 100;

RegQueryValueEx(hKey, L"Memory", NULL, &dwType,(PBYTE)szTest, &dwLen);

GetDlgItem(IDC_RAM)->SetWindowText(szTest);

RegCloseKey(hKey);

}

return 0;

}

3.1.2 Backlight

l  LCD ON/OFF

+ Define

#define IOCTL_BACKLIGHT_ON_OFF CTL_CODE( FILE_DEVICE_SERVICE,

0x0A00+0x1001, METHOD_BUFFERED, FILE_ANY_ACCESS )

+ Control

int onoff = 0;

unsigned long m_RetSize;

HANDLE pBLK;

onoff = 0;

pBLK = CreateFile(L"BKL1:", GENERIC_READ | GENERIC_WRITE, NULL, NULL,

OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

DeviceIoControl(pBLK, IOCTL_BACKLIGHT_ON_OFF, &onoff, sizeof(int), NULL, NULL,

&m_RetSize,NULL);

CloseHandle(pBLK);

l  BRIGHT CONTROL(Source)

+ Note

Need "IniFileIO.h" and "IniFileIO.cpp"

+ Define

#define CTLW_CHANGE_BACKLIGHT 101

//Global Variable

int dwRegDayLightLevel;

int dwRegNightLevel;

//Message

UINT MSG_ConfigtoProcessManager;

+ Function

int InitBackLightSetting()

{

int readValue,nightTime, dayTime = 0;

CString strSection, strKey, strKey2;

SYSTEMTIME Time;

GetLocalTime(&Time);

strSection = _T("BackLight");

strKey = _T("NIGHT_MODE");

readValue = GetPrivateProfileInt(strSection, strKey, 0,PATH_INI);

strKey2 = _T("PMTIME");

nightTime = GetPrivateProfileInt(strSection, strKey2, 0,PATH_INI);

strKey2 = _T("AMTIME");

dayTime = GetPrivateProfileInt(strSection, strKey2, 0,PATH_INI);

if(readValue) //USE NIGHT MODE

{

if((nightTime > Time.wHour) & (dayTime < Time.wHour)) //DAY

strKey = _T("DAY");

else

strKey = _T("NIGHT"); //NIGHT

readValue = GetPrivateProfileInt(strSection, strKey, 0,PATH_INI);

}

else

{

strKey = _T("DAY");

readValue = GetPrivateProfileInt(strSection, strKey, 0,PATH_INI);

}

return readValue;

}

+ Initialize

//DAY

dwRegDayLightLevel = GetPrivateProfileInt(_T("BackLight"), _T("DAY"), 4,PATH_INI);

//NIGHT

dwRegNightLevel = GetPrivateProfileInt(_T("BackLight"), _T("NIGHT"), 4,PATH_INI);

MSG_ConfigtoProcessManager =

RegisterWindowMessage(_T("MSG_ConfigtoProcessManager"));

+ Control(Bright)

CString strSection, strKey;

CString strReadValue;

#if 1 //DAY

{

strSection = _T("BackLight");

strKey = _T("DAY");

if(dwRegDayLightLevel<11-1) dwRegDayLightLevel++;

WritePrivateProfileInt(strSection, strKey, dwRegDayLightLevel, PATH_INI);

strReadValue.Format(_T("%d"), dwRegDayLightLevel);

GetDlgItem(IDC_STATIC_BACKLIGHT)->SetWindowText(strReadValue);

}

#else //NIGHT

{

strSection = _T("BackLight");

strKey = _T("NIGHT");

if(dwRegNightLevel<11-1) dwRegNightLevel++;

WritePrivateProfileInt(strSection, strKey, dwRegNightLevel, PATH_INI);

strReadValue.Format(_T("%d"), dwRegNightLevel);

GetDlgItem(IDC_STATIC_BACKLIGHT)->SetWindowText(strReadValue);

}

#endif

::PostMessage(HWND_BROADCAST, MSG_ConfigtoProcessManager,

CTLW_CHANGE_BACKLIGHT, NULL);

+ Control(Dark)

CString strSection, strKey;

CString strReadValue;

#if 1 //DAY

{

strSection = _T("BackLight");

strKey = _T("DAY"); //NIGHT MODE : _T("NIGHT")

if(dwRegDayLightLevel>0) dwRegDayLightLevel--;

WritePrivateProfileInt(strSection, strKey, dwRegDayLightLevel, PATH_INI);

strReadValue.Format(_T("%d"), dwRegDayLightLevel);

GetDlgItem(IDC_STATIC_BACKLIGHT)->SetWindowText(strReadValue);

}

#else //NIGHT

{

strSection = _T("BackLight");

strKey = _T("NIGHT");

if(dwRegNightLevel>0) dwRegNightLevel--;

WritePrivateProfileInt(strSection, strKey, dwRegNightLevel, PATH_INI);

strReadValue.Format(_T("%d"), dwRegNightLevel);

GetDlgItem(IDC_STATIC_BACKLIGHT)->SetWindowText(strReadValue);

}

#endif

::PostMessage(HWND_BROADCAST, MSG_ConfigtoProcessManager,

CTLW_CHANGE_BACKLIGHT, NULL);

3.1.3 Volume

l  Note

Need "IniFileIO.h" and "IniFileIO.cpp"

l  Read to System Volume

CString strSection, strKey;

strSection = _T("Sound");

strKey = _T("SystemVolume");

int gVolumeLevel = GetPrivateProfileInt(strSection, strKey, 0,PATH_INI);

l  Read to Mute Status

CString strSection, strKey;

strSection = _T("Sound");

strKey = _T("MUTE");

int readValue = GetPrivateProfileInt(strSection, strKey, 0,PATH_INI);

l  Mute On

+ Define

#define WM_PROCESSMESSAGE WM_USER+243

#define PROCESS_MUTEON 0x8E

+ Control

::PostMessage(HWND_BROADCAST, WM_PROCESSMESSAGE, PROCESS_MUTEON, NULL);

l  Mute Off

+ Define

#define WM_PROCESSMESSAGE WM_USER+243

#define PROCESS_MUTEOFF 0x8D

+ Control

::PostMessage(HWND_BROADCAST, WM_PROCESSMESSAGE, PROCESS_MUTEOFF, NULL);

l  Volume UP

+ Define

#define WM_PROCESSMESSAGE WM_USER+243

#define PROCESS_VOLUMEUP 0x78

+ Control

::SendMessage(HWND_BROADCAST, WM_PROCESSMESSAGE, PROCESS_VOLUMEUP, NULL);

//Read Value of Volume

CString strSection, strKey;

strSection = _T("Sound");

strKey = _T("SystemVolume");

int readValue = GetPrivateProfileInt(strSection, strKey, 0,PATH_INI);

l  Volume Down

+ Define

#define WM_PROCESSMESSAGE WM_USER+243

#define PROCESS_VOLUMEDOWN 0x79

+ Control

::SendMessage(HWND_BROADCAST, WM_PROCESSMESSAGE, PROCESS_VOLUMEDOWN,

NULL);

//Read Value of Volume

CString strSection, strKey;

strSection = _T("Sound");

strKey = _T("SystemVolume");

int readValue = GetPrivateProfileInt(strSection, strKey, 0,PATH_INI);

3.1.4 Battery

l  Note

Need for links to "CommonLib.lib" and "CommonLib.dll"

l  Read Value

+ Define

#pragma comment(lib, "CommonLib.lib")

__declspec(dllimport) DWORD _GetBattery_(void);

DWORD g_dwBattery;

enum _PROGRESS_POSITION_

{

_LEVEL_0 = 0,

_LEVEL_1 = 25,

_LEVEL_2 = 50,

_LEVEL_3 = 75,

_LEVEL_4 = 100,

};

enum _PROGRESS_BATTERYSTATUS_

{

_BATTERY_CHARGING,

_BATTERY_CHARGING_BATLOW,

_BATTERY_CHARGING_BATFULL,

_BATTERY_USE,

_BATTERY_USE_BATLOW,

_BATTERY_USE_POWEROFF,

};

+ Function(MFC)

void SetProgress(WORD Level, WORD BatteryStatus)

{

switch(BatteryStatus)

{

case _BATTERY_CHARGING:

GetDlgItem(IDC_STATIC_BATSTATUS)->SetWindowText(_T("Charging"));

break;

case _BATTERY_USE:

GetDlgItem(IDC_STATIC_BATSTATUS)->SetWindowText(_T("Battery use"));

break;

case _BATTERY_CHARGING_BATFULL:

GetDlgItem(IDC_STATIC_BATSTATUS)->SetWindowText(_T("Battery Full"));

break;

case _BATTERY_CHARGING_BATLOW:

GetDlgItem(IDC_STATIC_BATSTATUS)->SetWindowText(_T("Charging Low"));

break;

case _BATTERY_USE_BATLOW:

GetDlgItem(IDC_STATIC_BATSTATUS)->SetWindowText(_T("Use Low"));

break;

case _BATTERY_USE_POWEROFF:

GetDlgItem(IDC_STATIC_BATSTATUS)->SetWindowText(_T("Power off"));

break;

}

m_wndProgress.SetPos(Level);

return;

}

+ Control

g_dwBattery = _GetBattery_();

if(g_dwBattery == 0)SetProgress(_LEVEL_0, _BATTERY_USE_POWEROFF);

else if(g_dwBattery == 11) SetProgress(_LEVEL_0, _BATTERY_USE_BATLOW);

else if(g_dwBattery == 100) SetProgress(_LEVEL_0, _BATTERY_USE);

else if(g_dwBattery == 101) SetProgress(_LEVEL_1, _BATTERY_USE);

else if(g_dwBattery == 102) SetProgress(_LEVEL_2, _BATTERY_USE);

else if(g_dwBattery == 103) SetProgress(_LEVEL_3, _BATTERY_USE);

else if(g_dwBattery == 104) SetProgress(_LEVEL_4, _BATTERY_USE);

else if(g_dwBattery == 21) SetProgress(_LEVEL_0, _BATTERY_CHARGING_BATLOW);

else if(g_dwBattery == 200) SetProgress(_LEVEL_0, _BATTERY_CHARGING);

else if(g_dwBattery == 201) SetProgress(_LEVEL_1, _BATTERY_CHARGING);

else if(g_dwBattery == 202) SetProgress(_LEVEL_2, _BATTERY_CHARGING);

else if(g_dwBattery == 203) SetProgress(_LEVEL_3, _BATTERY_CHARGING);

else if(g_dwBattery == 204) SetProgress(_LEVEL_4, _BATTERY_CHARGING);

else if(g_dwBattery == 205) SetProgress(_LEVEL_4, _BATTERY_CHARGING_BATFULL);

3.1.5 Sample Program

WinCE MFC sample program is provided.

3.2 Serial Communication

3.2.1 Storage

Item / Name / Remarks
NAND1 / ResidentFlash / Fixed
NAND2 / ResidentFlash2 / Fixed
SD1 / SDMMCDisk / Fixed
SD2 / SDMMCDisk / Fixed
USB1 / USB Disk, USB Disk2, … / Flexible
USB2 / USB Disk, USB Disk2, … / Flexible

3.2.2 UART

It can be set up in ‘Serial.reg’.

Item / Descriptions / Remarks
HW Driver
Specification / channel0 (DMA) - port 0 (Flow Control) - COMx => Debug
channel1 (DMA) - port 1 (Flow Control) - COM3 => TRIP
channel2 (DMA) - port 4 (Flow Control) - COM2 => GPS 2
channel3 (DMA) - port 5 (Flow Control) - COM1 => GPS 1
channel4 (NO DMA) - port 2 (NO F/C) - NC
channel5 (NO DMA)- port 3 (NO F/C) - COM4 => Spare

4. OS Update process

1)  Copy OS files on the root of the SD card.

2)  Insert the SD card in the device.

3)  Start the device, then the update process will start automatically.

4)  Once the update is completed, remove the SD card from the device.