Sie sind auf Seite 1von 48

XScale

Treiberhandbuch


ModuNORM
ModuNORM® XScale Treiberhandbuch

Änderungsnachweis

Änderungen: Datei: Erstellt:

Erstausgabe 901050A 13.12.2002 / SR


Neuformatierung, CIF, Touch, Analog IO 901050B.MAN01 16.11.2004 / BT
Erweiterung der WinCE 4.2 Treiber 901051A.MAN01 01.12.2004 / WS

CoDeSys ist Warenzeichen von 3S Smart Software Solutions GmbH


ModuNORM® ist Warenzeichen von ModuNORM GmbH
QVis ist Markenzeichen von Kinz Elektronik
Windows®CE ist Warenzeichen von Microsoft Corp.

© Copyright: Geprüft: 25.07.2005 / CW


Mikrap AG für Mikroelektronik-Applikation Freigabe Abt. E: 29.07.2005 / AF
CH-8840 Einsiedeln Freigabe Abt. M: 29.07.2005 / OB
Switzerland Freigabe Abt. P: 29.07.2005 / BT

2 901051A.MAN01.doc
Inhaltsverzeichnis

1. Einleitung.................................................................................................4

2. MNSys ......................................................................................................4
2.1 Timer.........................................................................................................5
2.2 Interrupt-Handling ................................................................................... 10

3. CPU ........................................................................................................ 11
3.1 Übersicht................................................................................................. 11
3.2 Filesystem............................................................................................... 11
3.3 EEPROM ................................................................................................ 12
3.4 FlexDownload ......................................................................................... 17
3.5 MNLib ..................................................................................................... 18
3.6 CAN ........................................................................................................ 20
3.7 Battery Driver .......................................................................................... 27
3.8 COM-Schnittstellen ................................................................................. 29
3.9 Watchdog................................................................................................ 30
3.10 RTC ........................................................................................................ 32

4. PCP, PC-Control Panels........................................................................ 34


4.1 Übersicht................................................................................................. 34
4.2 Display .................................................................................................... 34
4.3 Touch...................................................................................................... 35
4.4 Touch Keys ............................................................................................. 38
4.5 Hot Keys ................................................................................................. 40
4.6 MNSetup ................................................................................................. 43
4.7 Keyboard................................................................................................. 44
4.8 Soft-Keyboard ......................................................................................... 46

5. PCU, PC-Control Units .......................................................................... 47


5.1 Übersicht................................................................................................. 47
5.2 LED......................................................................................................... 47

901051A.MAN01.doc
1. Einleitung
Im vorliegenden Handbuch sind die Treiber für XScale basierende ModuNORM
Baugruppen der Firma Mikrap AG beschrieben. Dem Anwendungsprogrammierer
stehen diese Treiber in entsprechenden DLL’s zur Verfügung.

2. MNSys
Das MNSys ist ein Modul im Kern, welches WindowsCE in seiner Echtzeitfähigkeit
unterstützt. Es erfüllt hauptsächlich zwei verschiedene Aufgaben. Einerseits stellt es
dem Anwendungsprogrammierer Timerfunktionen zur Verfügung, um zeitkritische
Programmteile schneller als mit dem Schedulerintervall von WindowsCE
anzustossen. Andererseits priorisiert das MNSys die HW-Interrupts. Der zeitkritische
Teil eines Treibers ist in einer ISR (Interrupt Service Routine) implementiert, welche
vom MNSys aktiviert wird.

WindowsCE
Applications

Device Drivers

SYSINTR KernelLibIOControl
MNSysKernelIoControl

CAN Touch Device Driver


Timer ISR
ISR ISR ISR

IRQ Interrupt
quittieren
MNSys MNTimer

HW-IRQ

Hardware

Blockdiagramm MNSys
Die Kommunikation zwischen den Treiber im WindowsCE und den unteren Schichten
findet mittels IOControl-Aufrufen statt. Will ein Treiber mit einer ISR kommunizieren,
muss er KernelLibIoControl() benutzten. Kommuniziert er direkt mit dem
MNSys, so kommt MNSysKernelIoControl() zur Anwendung.
Ein Ereignis (HW-IRQ oder Timer-IRQ) wird vom MNSys priorisiert und aktiviert die
entsprechende ISR. Dort wird der zeitkritische Teil des Treibers abgearbeitet und der
Interrupt quittiert. Die ISR benachrichtigt den Treiber im WindowsCE, in dem sie
einen SysInterrupt (SYSINTR) zurückgibt. Der Treiber muss bei seiner Initialisierung
den SYSINTR seiner ISR mit einem Event verbinden. Wird nun der SYSINTR
zurückgegeben, wird der verbundene Event signalisiert. Der Treiber kann in seiner
IST (Interrupt Service Thread) den Teil abarbeiten, welcher weniger zeitkritisch ist.
Der SYSINTR muss im File „oalintr.h“ definiert sein.

901051A.MAN01.doc
Folgender Codeausschnitt soll das Obenstehende verdeutlichen:
-Device Treiber:
static ULONG DeviceDriverIST(PVOID Reserved);
DWORD dwSysIntr = SYSINTR_DEVICEDRIVER;
HANDLE hDeviceDriverIst, hDeviceDriverEvent;
Initialisierung des Treibers:
hDeviceDriverEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
InterruptInitialize(dwSysIntr, hDeviceDriverEvent, NULL, 0);
hDeviceDriverIst = CreateThread(NULL, 0, DeviceDriverIST, 0, 0,
NULL);
IST des Treibers:
static ULONG DeviceDriverIST(PVOID Reserved)
{
while(1)
{
WaitForSingleObject(hDeviceDriverEvent, INFINITE);
//Eigentliche Aufgabe des Treibers erledigen
//...
}
}
-ISR:
DWORD ISRHandler(DWORD dwInstanceIndex)
{
//Zeitkritischer Teil abarbeiten
//Interrupt quittieren
return SYSINTR_DEVICEDRIVER;
}

2.1 Timer

2.1.1 Übersicht
Zuständig für die Timerfunktionen innerhalb des MNSys ist der Teil MNTimer. Er
unterscheidet zwischen zwei verschiedenen Timer. Einerseits ermöglicht MNTimer
die Anmeldung eines IISR-Timers, andererseits kann der Anwender auch einen IST-
Timer initialisieren. Diese beiden Timerarten und ihre Verwendung sind nachfolgend
kurz beschrieben:

IISR-Timer:
Initialisiert der Anwender einen IISR-Timer, so aktiviert der MNTimer bei seiner
Auslösung eine ISR. Der Rückgabewert der ISR enthält den SysInterrupt und die
Länge des nächsten Intervalls. Somit kann der Anwender in der ISR jeweils
bestimmen, welche IST aktiviert wird, und wie lange der nächste Intervall dauert.
Initialisierung und Anwendung:
-Timer anmelden (MNS_ADD_TIMER)
-Timer parametrieren und eventuell starten (MNS_SET_IISR_TIMER_PARAM)
-Timer starten (MNS_START_TIMER)
-Mit dem Timer arbeiten

901051A.MAN01.doc
-Timer stoppen (MNS_STOP_TIMER)
-Timer abmelden (MNS_REMOVE_TIMER)

IST-Timer:
Bei der Verwendung eines IST-Timers muss der Timer bei der Parametrierung diese
Angaben erhalten: SysInterrupt, welcher aktiviert werden soll; Länge eines Timer-
Intervalls; Anzahl der Auslösungen. MNTimer führt anschliessend die geforderten
Auslösungen selbständig aus.
Initialisierung und Anwendung:
-Timer anmelden (MNS_ADD_TIMER)
-Timer parametrieren und eventuell starten (MNS_SET_IST_TIMER_PARAM)
-Timer starten (MNS_START_TIMER)
-Mit dem Timer arbeiten
-Timer stoppen (MNS_STOP_TIMER)
-Timer abmelden (MNS_REMOVE_TIMER)

2.1.2 Schnittstelle zum Anwendungsprogrammierer


Der Prototyp und die Parameter eines Funktionsaufrufes von MNSysKernelIoControl
sehen folgendermassen aus:

MNSysKernelIoControl
Prototyp BOOL MNSysKernelIoControl(DWORD dwIoControlCode,
LPVOID pvInBuf, DWORD dwInBufSize, LPVOID pvOutBuf,
DWORD dwOutBufSize, DWORD* pdwBytesReturned)

Funktion Diese Funktion ruft, abhängig vom übergebenem IOControlCode, die


entsprechende Funktion im MNSys auf

Parameter dwIoControlCode Nummer des IOControlCode. Dieser bestimmt,


welche Aktion vom MNSys ausgeführt wird.
pvInBuf Pointier auf Buffer, welcher die vom Anwender
übergebenen Daten enthält

dwInBufSize Grösse des Input-Buffers

pvOutBuf Pointer auf Buffer, in welchen die von der


Funktion zurückgegebenen Daten gespeichert
werden.

dwOutBufSize Grösse des Output-Buffers

pdwBytesReturned Wird nicht gebraucht

Rückgabe BOOL Gibt TRUE zurück, wenn das MNSys die


geforderte Funktion erfolgreich ausgeführt hat.
Falls nicht, wird FALSE zurückgegeben.

901051A.MAN01.doc
2.1.3 IOControlCodes

MNS_ADD_TIMER
Zweck Die Funktion erzeugt einen neuen Timer. Der Timer wird über die
Struktur MNS_ADD_TIMER_INPARAM initialisiert.

Parameter dwIoControlCode MNS_ADD_TIMER


pvInBuf Pointer auf Struktur
MNS_ADD_TIMER_INPARAM

dwInBufSize sizeof(MNS_ADD_TIMER_INPARAM)

pvOutBuf Pointer auf HANDLE. Handle vom initialisierten


Timer

dwOutBufSize sizeof(HANDLE)

MNS_SET_IISR_TIMER_PARAM
Zweck Dieser Code parametrisiert einen IISR-Timer. MNTimer ruft eine IISR auf,
dessen Rückgabewert bestimmt das nächste Intervall und den
zurückzugebende SysInterrupt.

Parameter dwIoControlCode MNS_SET_IISR_TIMER_PARAM


pvInBuf Pointer auf Struktur
MNS_IISR_TIMER_INPARAM

dwInBufSize sizeof(MNS_IISR_TIMER_INPARAM)

pvOutBuf -

dwOutBufSize -

MNS_SET_IST_TIMER_PARAM
Zweck Dieser Code parametrisiert einen IST-Timer. MNTimer setzt periodisch
den entsprechenden SysInterrupt, um dann den dazugehörenden
InterruptEvent zu signalisieren. Die Intervalllänge und die Anzahl der
Intervalle wird hier bestimmt.

Parameter dwIoControlCode MNS_SET_IST_TIMER_PARAM


pvInBuf Pointer auf Struktur
MNS_IST_TIMER_INPARAM

dwInBufSize sizeof(MNS_IST_TIMER_INPARAM)

pvOutBuf -

dwOutBufSize -

901051A.MAN01.doc
MNS_START_TIMER
Zweck Durch den Aufruf dieser Funktion wird ein initialisierter Timer gestartet.

Parameter dwIoControlCode MNS_START_TIMER


pvInBuf Pointer auf Struktur
MNS_START_TIMER_INPARAM

dwInBufSize sizeof(MNS_START_TIMER_INPARAM)

pvOutBuf -

dwOutBufSize -

MNS_STOP_TIMER
Zweck Durch den Aufruf dieser Funktion wird ein gestarteter Timer gestoppt.

Parameter dwIoControlCode MNS_STOP_TIMER


pvInBuf Pointer auf HANDLE. Handle vom initialisierten
Timer, welcher gestartet wurde.

dwInBufSize sizeof(HANDLE)

pvOutBuf -

dwOutBufSize -

MNS_REMOVE_TIMER
Zweck Diese Funktion entfernt einen initialisierten Timer und gibt dessen
benötigten Ressourcen frei.

Parameter dwIoControlCode MNS_REMOVE_TIMER


pvInBuf Pointer auf HANDLE. Handle vom initialisierten
Timer.

dwInBufSize sizeof(HANDLE)

pvOutBuf -

dwOutBufSize -

MNS_GET_TIMER_PARAM
Zweck Mit Hilfe dieser Funktion erhält man die Parameter von MNTimer.

Parameter dwIoControlCode MNS_GET_TIMER_PARAM


pvInBuf -

dwInBufSize -

901051A.MAN01.doc
pvOutBuf Pointer auf Struktur MNS_TIMER_OUTPARAM

dwOutBufSize sizeof(MNS_TIMER_OUTPARAM)

2.1.4 Datentypen

MNS_ADD_TIMER_INPARAM
Definition typedef struct MNS_ADD_TIMER_INPARAM_
{
BOOL fUseFastTimer;
} MNS_ADD_TIMER_INPARAM;

Elemente fUseFastTimer TRUE: MNSys erzeugt einen Fast Timer


(kleinerer Overhead, direkt am HW-Timer,
stehen nur wenige zur Verfügung)
FALSE: MNSys erzeugt einen normalen Timer
(grösserer Overhead, ein shared HW-Timer für
alle, stehen viele zur Verfügung)

MNS_IISR_TIMER_INPARAM
Definition typedef struct MNS_IISR_TIMER_INPARAM_
{
HANDLE hTimer;
BYTE bInt;
DWORD dwCallInTicks;
} MNS_IISR_TIMER_INPARAM;

Elemente hTimer Handle auf den initialisierten Timer. Wird durch


MNS_ADD_TIMER erzeugt.
bInt Nummer des verwendeten Interrupts (Bereich:
SINT_MNTIMER0..(SINT_MNTIMER0 +
NUM_MNTIMER_INTS - 1)). Der Interrupt muss
vorgängig mit ResourceRequest() reserviert
werden.
Rückgabewert der ISR (DWORD):
-Bit0..7: zurückzugebender SysInterrupt
-Bit8..31: Anzahl Ticks bis zum nächsten Aufruf
der ISR
dwCallInTicks -Zeit in Timer-Ticks bis zur ersten Auslösung
-0xFFFF'FFFF: Timer wird nicht gestartet

901051A.MAN01.doc
MNS_IST_TIMER_INPARAM_
Definition typedef struct MNS_IST_TIMER_INPARAM__
{
HANDLE hTimer;
DWORD dwPeriodicInterval;
DWORD dwSysIntr;
BYTE dwNumFires;
DWORD dwCallInTicks;
} MNS_IST_TIMER_INPARAM_;

Elemente hTimer Handle auf den initialisierten Timer. Wird durch


MNS_ADD_TIMER erzeugt.
dwPeriodic Intervall in Timer-Ticks zwischen zwei
Interval Auslösungen (don't care wenn dwNumFires = 1).
dwSysIntr periodisch zu setzender SysInterrupt
dwNumFires -Anzahl Auslösungen bis der Timer gestoppt
wird. Danach muss der Timer mit
MNS_START_TIMER wieder neu gestartet
werden.
-0: Timer läuft bis er gestoppt wird.
dwCallInTicks -Zeit in Timer-Ticks bis zur ersten Auslösung
-0xFFFF'FFFF: Timer wird nicht gestartet

MNS_START_TIMER_INPARAM
Definition typedef struct MNS_START_TIMER_INPARAM_
{
HANDLE hTimer;
DWORD dwCallInTicks;
} MNS_START_TIMER_INPARAM;

Elemente hTimer Handle auf den initialisierten Timer. Wird durch


MNS_ADD_TIMER erzeugt.
dwCallInTicks Erstes Intervall nach dem Starten des Timers (in
Timer-Ticks)

2.2 Interrupt-Handling

2.2.1 Übersicht
Das MNSys ist verantwortlich für die Priorisierung und Weiterverarbeitung der
Interrupts. Zur Zeit kann der Anwender selber keine Interrupts anmelden.

901051A.MAN01.doc
3. CPU

3.1 Übersicht
Dieses Kapitel gibt dem Anwender eine Übersicht über die verschiedenen Treiber,
welche man direkt der CPU zuordnet. Das heisst, dass die CPU ihre Aufgaben mit
Hilfe dieser Treiber erledigt oder durch sie mit der Peripherie kommuniziert. Auch die
gesamte Speicherverwaltung wird in diesem Kapitel behandelt.

3.2 Filesystem

3.2.1 Übersicht
Der Zugriff auf die verschiedenen Speichermedien des Systems wird dem Anwender
durch ein Filesystem ermöglicht. Das Filesystem ist als FAT (File Allocation Table)
System aufgebaut. Als Root-Verzeichnis ist das Flash definiert. Das Filesystem
bindet die verschiedenen anderen Speichermedien als Unterverzeichnisse in sein
Root-Verzeichnis ein.
Die diversen Speichertypen, welche verwendet werden, sind jeweils als „block
device“ Treiber implementiert. Das Filesystem kann diesen Speicher also über
Standart-Schnittstellen ansprechen. Der Anwender hat mit dem Storage Manager
(unter Start -> Settings -> Control Panel) ein Werkzeug, um die Einstellungen der
eingebundenen Speichermedien zu kontrollieren.
Dokumentationen zu den Themen File System, „block device“ Treiber und Storage
Manager sind im MSDN enthalten. Eine kurze Übersicht über die verschiedenen
Speichermedien ist in den nächsten Unterkapitel gegeben.

3.2.2 Flash
Der Flash-Speicher ist als Root-Verzeichnis definiert. Die Grösse des Flash’s ist vom
Typ der CPU abhängig. Die Registry ist ein Teil des Flash-Speichers. Die Flash-Disk
ist als TFAT (Transaction-Safe FAT) konfiguriert.

3.2.3 RAM
Der RAM-Speicherbaustein kann als Disk im Speicherverzeichnis und als System-
RAM-Speicher aufgeteilt werden. Die Grösse und der Verzeichnisname der Disk
kann der Anwender anhand von Einträgen in der Registry bestimmen. Die Disk wird
jeweils beim Aufstarten des Panels formatiert. Dies bedeutet, dass die gespeicherten
Daten nach einem Reset nicht mehr vorhanden sind.
Die folgenden Registry-Einträge sind defaultmässig eingestellt:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\RamDisk]
"Size"=dword:80000 ; Grösse der RAM-Disk in Bytes

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\RamDisk]
"Folder"="Temp" ;Name der RAM-Disk

3.2.4 SRAM
Der SRAM-Speicherbaustein kann ebenfalls in eine Disk und in Systemspeicher
aufgeteilt werden. Die Grösse und der Verzeichnisname kann der Benutzer in der

901051A.MAN01.doc
Registry einstellen. Die SRAM-Disk ist als TFAT konfiguriert. Die Disk wird nur
formatiert, wenn das Filesystem auf dem SRAM noch nicht initialisiert ist. Somit sind
die gespeicherten Daten nach einem Reset immer noch vorhanden.
Die folgenden Registry-Einträge sind defaultmässig eingestellt:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SramDisk]
"Size"=dword:FFFFFFFF ; max. Grösse in Bytes. Wird im
Treiber angepasst wenn SRAM
kleiner ist
"Offset"=dword:0 ; Offset von der SRAM-
Basisadresse in Bytes

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SramDisk]
"Folder"="SramDisk" ; Name der SRAM-Disk

3.2.5 MMC
Der MMC-Treiber ermöglicht das Lesen und Schreiben von Daten von und auf
MMC’s (Multi Media Card) im MMC-Drive auf dem Steckerprint. Ist im MMC-Drive
eine Karte eingeschoben, wird diese nach kurzer Zeit vom Treiber erkannt. Der Inhalt
der Karte wird im Root-Verzeichnis im Verzeichnis „MMC“ angezeigt.

3.2.6 USB
Der USB-Treiber ermöglicht das Lesen und Schreiben von Daten von und auf USB-
Sticks (USB = Universal Serial Bus) im USB-Slot auf dem Steckerprint. Ist in einem
der beiden USB-Slot’s ein Stick eingesteckt, wird dieser nach kurzer Zeit vom Treiber
erkannt. Der Inhalt des Stick‘s wird im Root-Verzeichnis im Verzeichnis „USB Disk“
angezeigt.

3.3 EEPROM

3.3.1 Übersicht
Das EEPROM ist in zwei Bereich aufgeteilt. Der erste Teil des EEPROM’s ist der
Mikrap-Bereich. Hier sind die Produktionsdaten und die MAC-Adresse gespeichert.
Der Anwender hat keine Möglichkeit, diese Daten zu verändern. Er kann sie jedoch
in der Registry betrachten. Der zweite Teil im EEPROM ist der Customer-Bereich.
Der Benutzer kann diesen Bereich als normalen Speicher gebrauchen, um Daten
dauerhaft zu speichern.
Der Eeprom-Treiber ist als Stream-Interface-Treiber realisiert und wird jeweils beim
Booten von WindowsCE als BuiltIn-Treiber geladen. Um den Treiber zu benutzen,
muss also zuerst ein File auf dem EEPROM-Device (EEP1:) erzeugt werden.
HANDLE hEep = CreateFile(TEXT("EEP1:"),
GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL));
Über das Handle hEep ist der Treiber nun ansprechbar. Der erste Teil des
EEPROM’s ist mit Mikrap-Daten belegt, trotzdem kann der Anwender den Customer-
Bereich ab der Adresse 0x0000 ansprechen. Der Treiber rechnet den Offset jeweils
dazu.

901051A.MAN01.doc
3.3.2 Schnittstelle zum Anwendungsprogrammierer
DeviceIoControl() ist eine Standart-Funktion von Microsoft. Eine genauere
Beschreibung findet man in der MSDN.

DeviceIoControl
Prototyp BOOL DeviceIoControl(HANDLE hDevice, DWORD
dwIoControlCode, LPVOID lpInBuffer, DWORD
nInBufferSize, LPVOID lpOutBuffer, DWORD
nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED
lpOverlapped)

Funktion Diese Funktion ruft im entsprechenden Treiber je nach IOControlCode


die gewünschte Funktion auf.

Parameter hDevice Handle auf den geöffneten Eeprom-Treiber.


Rückgabewert von CreateFile().
dwIoControlCode Nummer des IOControlCode (definiert im File
„Eeprom.h“). Dieser bestimmt, welche Aktion
vom Treiber ausgeführt wird.

lpInBuffer Pointer auf Buffer, welcher die vom Anwender


übergebenen Daten enthält

nInBufferSize Grösse des Input-Buffers

lpOutBuffer Pointer auf Buffer, in welchen die von der


Funktion zurückgegebenen Daten gespeichert
werden.

nOutBufferSize Grösse des Output-Buffers

lpBytesReturned Pointer auf DWORD. Die Funktion speichert


hier die Anzahl Bytes, welche sie im Ausgabe-
Buffer gespeichert hat.

lpOverlapped Wird nicht gebraucht. Auf NULL setzen.

Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt


wurde. FALSE, wenn ein Fehler aufgetreten ist.

3.3.3 IOControlCodes

IOCTL_EEPROM_READ_BYTE
Zweck Ein Funktionsaufruf mit diesem Code liest ein Byte von der übergebenen
Adresse.

Alt: RTCEEP_IOCTL_READ_BYTE

Parameter hDevice Handle auf geöffneten Eeprom-Treiber

901051A.MAN01.doc
dwIoControlCode IOCTL_EEPROM_READ_BYTE

pvInBuf Pointer auf DWORD. Hier kann der Anwender


die Adresse angeben, von der ein Byte gelesen
wird.

dwInBufSize sizeof(DWORD)

pvOutBuf Pointer auf BYTE. Hier speichert die Funktion


das gelesene Byte.

dwOutBufSize sizeof(BYTE)

IOCTL_EEPROM_WRITE_BYTE
Zweck Ein Funktionsaufruf mit diesem Code schreibt ein Byte in die
übergebenen Adresse.

Alt: RTCEEP_IOCTL_WRITE_BYTE

Parameter hDevice Handle auf geöffneten Eeprom-Treiber


dwIoControlCode IOCTL_EEPROM_WRITE_BYTE

pvInBuf Pointer auf Struktur EEPROM_IO_PARAM. Hier


kann der Anwender die Adresse und der Wert
abspeichern.

dwInBufSize sizeof(EEPROM_IO_PARAM)

pvOutBuf NULL

dwOutBufSize 0

IOCTL_EEPROM_READ_BLK
Zweck Dieser Code ermöglicht dem Anwender, ein Block mit variabler Länge ab
einer übergebenen Adresse zu lesen.

Alt: RTCEEP_IOCTL_READ_BLK

Parameter hDevice Handle auf geöffneten Eeprom-Treiber


dwIoControlCode IOCTL_EEPROM_READ_BLK

pvInBuf Pointer auf Struktur EEPROM_IO_PARAM. Hier


kann der Anwender die Startadresse und die
Blocklänge angeben.

dwInBufSize sizeof(EEPROM_IO_PARAM)

pvOutBuf NULL

dwOutBufSize 0

901051A.MAN01.doc
IOCTL_EEPROM_WRITE_BLK
Zweck Dieser Code ermöglicht dem Anwender, ein Block mit variabler Länge ab
einer übergebenen Adresse zu schreiben.

Alt: RTCEEP_IOCTL_WRITE_BLK

Parameter hDevice Handle auf geöffneten Eeprom-Treiber


dwIoControlCode IOCTL_EEPROM_WRITE_BLK

pvInBuf Pointer auf Struktur EEPROM_IO_PARAM. Hier


kann der Anwender die Startadresse, die
Blocklänge und die zu schreibenden Daten
angeben.

dwInBufSize sizeof(EEPROM_IO_PARAM)

pvOutBuf NULL

dwOutBufSize 0

IOCTL_EEPROM_UPDATE_REG
Zweck Mit Hilfe dieses Codes kann der Anwender die Daten des Mikrap-
Bereiches lesen und in die Registry abspeichern.

Alt: RTCEEP_IOCTL_UPDATE_REG

Parameter hDevice Handle auf geöffneten Eeprom-Treiber


dwIoControlCode IOCTL_EEPROM_UPDATE_REG

pvInBuf NULL

dwInBufSize 0

pvOutBuf NULL

dwOutBufSize 0

IOCTL_EEPROM_CHACHE_MODE
Zweck Die Funktion, welche von diesem Code aufgerufen wird, ist leer. Der
Code ist nur noch aus Kompatibilitätsgründen definiert, erfüllt aber keine
Funktion.

Alt: RTCEEP_IOCTL_MODE

Parameter hDevice Handle auf geöffneten Eeprom-Treiber


dwIoControlCode IOCTL_EEPROM_CHACHE_MODE

pvInBuf Pointer auf ein BYTE.

dwInBufSize sizeof(BYTE)

901051A.MAN01.doc
pvOutBuf NULL

dwOutBufSize 0

IOCTL_EEPROM_CHACHE_CHK_DIRTY
Zweck Die Funktion, welche von diesem Code aufgerufen wird, ist leer. Der
Code ist nur noch aus Kompatibilitätsgründen definiert, erfüllt aber keine
Funktion.

Alt: RTCEEP_IOCTL_WRITE_DIRTY

Parameter hDevice Handle auf geöffneten Eeprom-Treiber


dwIoControlCode IOCTL_EEPROM_CHACHE_WRITE_DIRTY

pvInBuf NULL

dwInBufSize 0

pvOutBuf Pointer auf BOOL

dwOutBufSize sizeof(BOOL)

3.3.4 Datentypen

EEPROM_IO_PARAM_
Definition typedef struct EEPROM_IO_PARAM_
{
WORD wAddr;
WORD wBufLen;
BYTE *pbBuf;
} EEPROM_IO_PARAM;

Elemente wAddr Adresse im Kunden-Bereich des EEPROM‘s


wBufLen Länge von pbBuf in Bytes
pbBuf Buffer

3.3.5 Registry
Der Eeprom-Treiber speichert Daten aus dem Mikrap-Bereich in die Registry.
Folgende Einträge werden erstellt:

Produktionsdaten:
Die Produktionsdaten beziehen sich auf die Herstellung (ProdInfo0)
beziehungsweise auf eine Modifikation (ProdInfo1 ...) der CPU.
[HKEY_LOCAL_MACHINE\Platform\ProdInfoX]
Name Typ Beschreibung
HWArticleNr STRING Mikrap-Artikelnummer des CPU-Moduls.

901051A.MAN01.doc
OrderNr STRINGMikrap-Auftragsnummer. Unter dieser Nummer ist
der ganze Auftrag dokumentiert.
TestYear DWORD Jahr, in welchem die CPU getestet wurde.
TestMonth DWORD Monat, in welchem die CPU getestet wurde.
TestDay DWORD Tag, an welchem die CPU getestet wurde.
MAC-Adresse
Unter dem folgenden Eintrag ist die MAC-Adresse abgelegt, welche die CPU
weltweit eindeutig identifiziert.
[HKEY_LOCAL_MACHINE\Comm\LAN90001\Parms]
Name Typ Beschreibung
NetworkAddress STRING Mikrap-Nummer (00-30-92) + MAC-Adresse der
CPU.

3.4 FlexDownload

3.4.1 Übersicht
Der Treiber FlexDownload sorgt dafür, dass der Flex-Baustein auf der Basis mit
seiner Software geladen wird. Diverse Treiber benutzen die Flex-Funktionalitäten
(z.B. Display-Treiber, CAN-Treiber). Darum ist es notwendig, dass der Download der
Flex-Software möglichst früh erfolgt. Daher ist der Treiber als BuiltIn-Treiber im Kern
integriert und mit der Ordnungsnummer 5 versehen.
Damit die Software in den Flex geladen wird, sind drei Schritte nötig:
- Feature „FlexDownload“ im PlatformBuilder in den Workspace ziehen. Damit wird
auch die Umgebungsvariable MIKRAP_FLEX_DOWN_LOAD gesetzt.
- Flex-Software im Dateiformat .rbf im Ordner D:\WINCE420\PLATFORM\ MnPxaBd\
FILES ablegen.
– Name des rbf-Files in der Registry eintragen.

3.4.2 Registry

Platform.reg
Im File Platform.reg ist der untenstehende Eintrag vorhanden. Dieser Eintrag sorgt
dafür, das der Treiber als BuiltIn-Treiber in den Kern integriert wird. Weiter bestimmt
der Eintrag, dass FlexDownload als fünfter BuiltIn-Treiber geladen wird.
IF MIKRAP_FLEX_DOWN_LOAD
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Flex]
"DLL"="FlexDownLoad.dll"
"ORDER"=dword:5
"Prefix"="FLE"
ENDIF

Project.reg
In Project.reg steht der Eintrag, welcher dem Treiber mitteilt, wie die zu ladende
Flex-Software heisst. Im Beispiel unten soll der Flex mit der Software 004140b
geladen werden.

901051A.MAN01.doc
IF MIKRAP_FLEX_DOWN_LOAD
[HKEY_LOCAL_MACHINE\Platform\Basis\Flex]
"FlexFile"="\\windows\\004140b.rbf"
ENDIF

3.5 MNLib

3.5.1 Übersicht
Die Library MNLib ist eine Ansammlung von Hilfsfunktionen. Die Library enthält
sowohl private Mikrap-Funktionen als auch öffentliche Funktionen für den Anwender.
Im Weiteren besteht MNLib aus einem platformunabhängigen und einem
platformabhängigen Teil.
Im File „MnLib.h“ sind alle Schnittstellen für den Anwender definiert. In den folgenden
Abschnitte sind diese öffentlichen Schnittstellen dokumentiert.

3.5.2 Platformunabhängige Funktionen

FileHelp-Funktionen:

FindFirstFileRecursive
Prototyp HANDLE FindFirstFileRecursive(LPCSTR lpFileName,
LPWIN32_FIND_DATA lpFindFileData, TCHAR **ppstDir)

Funktion Diese Funktion sucht im übergebenen Verzeichnis und in allen


Unterverzeichnissen nach dem ersten File oder Unterverzeichnis,
welches mit dem übergebenen Namen übereinstimmt.

Parameter lpFileName Pointer auf einen String. Dieser enthält den


Namen des gesuchten File oder Verzeichnis.
Der String kann Wildcards (?, *) enthalten.
lpFindFileData Pointer auf Struktur WIN32_FIND_DATA. Hier
speichert die Funktion Informationen zum
gefundenen File/Verzeichnis. Informationen zu
WIN32_FIND_DATA, siehe MSDN.

ppstDir Pointer auf TCHAR. Hier speichert die Funktion


den String, welcher den Pfad des gefundenen
File/Verzeichnis enthält.

Rückgabe HANDLE Handle für die Funktion


FindNextFileRecursive(). NULL, wenn
die Funktion nicht erfolgreich ist.

FindNextFileRecursive
Prototyp BOOL FindNextFileRecursive(HANDLE hFindFile,
LPWIN32_FIND_DATA lpFindFileData, TCHAR **ppstDir,
BOOL fRecursive)

901051A.MAN01.doc
Funktion Diese Funktion sucht nach einem weiteren File oder Verzeichnis,
welches mit dem gesuchten Namen übereinstimmt.

Parameter hFindFile Handle auf eine gestartete Suche.


Rückgabewert von
FindFirstFileRecursive().
lpFindFileData Pointer auf Struktur WIN32_FIND_DATA. Hier
speichert die Funktion Informationen zum
gefundenen File/Verzeichnis. Informationen zu
WIN32_FIND_DATA, siehe MSDN.

ppstDir Pointer auf TCHAR. Hier speichert die Funktion


den String, welcher den Pfad des gefundenen
File/Verzeichnis enthält.

fRecursive TRUE: Zuletzt wurde ein Verzeichnis gefunden,


in dem weiter gesucht werden soll.
FALSE: Es wurde kein Verzeichnis mehr
gefunden, in dem weiter gesucht werden soll.

Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt


wurde. FALSE, wenn ein Fehler aufgetreten ist.

FindCloseRecursive
Prototyp BOOL FindCloseRecursive(HANDLE hFindClose)

Funktion Diese Funktion schliesst die Suche ab. Sie muss ausgeführt werden,
um die benötigten Ressourcen wieder freizugeben.

Parameter hFindClose Handle auf eine gestartete Suche.


Rückgabewert von
FindFirstFileRecursive().
Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt
wurde. FALSE, wenn ein Fehler aufgetreten ist.

VAllocMem-Funktionen:

MapVirtualMem
Prototyp PVOID MapVirtualMem(DWORD dwVirtAddr, DWORD dwSize)

Funktion Diese Funktion reserviert einen Bereich im virtuellen Adressraum und


mappt diesen Bereich auf einen physikalischen Bereich.

Parameter dwVirtAddr Basisadresse des zu allozierenden Bereiches


im virtuellen Speicherbereich.
dwSize Grösse des zu allozierenden Bereiches in Byte,
die Grösse wird auf ein vielfaches einer Page-
Grösse (1024) aufgerundet.

901051A.MAN01.doc
Rückgabe BOOL Falls die Funktion erfolgreich war, gibt sie
einen Pointer auf die gemappte Basisadresse
zurück. Sonst gibt sie NULL zurück.

UnMapVirtualMem
Prototyp BOOL UnMapVirtualMem(VOID *pvAddr)

Funktion Diese Funktion gibt ein mit MapVirtualMem() allozierter Bereich


wieder frei.

Parameter pvAddr Pointer auf die gemappte Basisadresse.


Rückgabewert von MapVirtualMem().
Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt
wurde. FALSE, wenn ein Fehler aufgetreten ist.

3.5.3 Platformabhängige Funktionen


Zur Zeit sind keine öffentlichen, platformabhängige Funktionen in MNLib
implementiert.

3.6 CAN

3.6.1 Übersicht
Der CAN Treiber dient dazu, über die CAN-Schnittstellen der ModuNorm-Hardware
CAN-Meldungen zu versenden und zu empfangen. CAN (Controller Area Network) ist
ein serielles Bussystem. Dieses System hat den Vorteil einer hoher Echtzeitfähigkeit.
Die Einhaltung des Protokolls und das physikalische Senden und Empfangen der
Meldungen wird von einem CAN-Controller übernommen.
Damit der CAN-Treiber benutzt werden kann, muss das Feature „CAN“ in den
Workspace des PlatformBuilder gezogen werden. Somit sind im Kern automatisch
zwei CAN-Treiber als BuiltIn-Treiber integriert. Diese stehen jeweils für eine CAN-
Schnittstelle auf der Basis.
Die Schnittstelle zum Anwendungsprogrammierer ist zweigeteilt. Der Treiber ist als
„Stream Interface Driver“ implementiert. Darum kann er einerseits über die File-API‘s
CreateFile(), WriteFile(), ReadFile() und CloseHandle() mit dem
Treiber kommunizieren und die Schnittstelle bedienen. Der Benutzer kann
andererseits auch über die Funktionen des CAN-Interfaces mit der Schnittstelle in
Kontakt treten. Diese Funktionen sind im File „ICanDll.h“ (im Ordner
D:\WINCE420\Mikrap\inc) definiert.
Eine korrekte Kommunikation zwischen dem Anwender und einer CAN-Schnittstelle
ist folgendermassen aufgebaut:
- CAN-Schnittstelle öffnen: CreateFile()
- CAN-Schnittstelle starten: CanStart()
- CAN-Meldungen versenden und empfangen: WriteFile(), ReadFile(),
CanWriteMsg2()
- CAN-Schnittstelle stoppen: CanStop()
- CAN-Schnittstelle schliessen: CloseHandle()

901051A.MAN01.doc
3.6.2 Benutzte File-API’s

CreateFile
Prototyp HANDLE CreateFile(LPCTSTR lpFileName, DWORD
dwDesiredAccess, DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD
dwCreationDispostion, DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile)

Funktion Mit diesem File-API kann der Anwender eine CAN-Schnittstelle öffnen.

Parameter lpFileName Name des Treibers. Hier CAN1: oder CAN2:


dwDesiredAccess Beschreibung des Parameters, siehe MSDN.
Empfohlener Wert: GENERIC_READ |
GENERIC_WRITE

dwShareMode Beschreibung des Parameters, siehe MSDN.


Empfohlener Wert: FILE_SHARE_READ |
FILE_SHARE_WRITE

lpSecurity Unbenutzt: NULL


Attributes

dwCreation Beschreibung des Parameters, siehe MSDN.


Dispostion Empfohlener Wert: OPEN_ALWAYS

dwFlagsAnd Beschreibung des Parameters, siehe MSDN.


Attributes Empfohlener Wert:
FILE_ATTRIBUTE_ARCHIVE

hTemplateFile Unbenutzt: NULL

Rückgabe HANDLE Handle auf die geöffnete CAN-Schnittstelle,


falls die Funktion erfolgreich ausgeführt wurde.
Sonst wird NULL zurückgegeben.

WriteFile
Prototyp BOOL WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD
nNumberOfBytesToWrite, LPDWORD
lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped)

Funktion Mit dieser Funktion kann der Anwender Daten über die geöffnete und
gestartete CAN-Schnittstelle versenden.

Parameter hFile Handle auf die geöffnete und gestartete CAN-


Schnittstelle. Erzeugt durch CreateFile()
lpBuffer Pointer auf Struktur CAN_MSG. In dieser
Struktur ist die CAN-Meldung abgespeichert,
welche verschickt werden soll.

nNumberOfBytes Anzahl Bytes, welche verschickt werden sollen.

901051A.MAN01.doc
ToWrite

lpNumberOfBytes Pointer auf ein DWORD. Hier speichert die


Written Funktion ab, wie viele Bytes tatsächlich
verschickt wurden.

lpOverlapped Unbenutzt: NULL

Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt


wurde. FALSE, wenn ein Fehler aufgetreten ist.

ReadFile
Prototyp BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD
nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped)

Funktion Diese Funktion erlaubt dem Anwender das Lesen von CAN-Meldungen,
welche die Schnittstelle empfangen hat.

Parameter hFile Handle auf die geöffnete und gestartete CAN-


Schnittstelle. Erzeugt durch CreateFile()
lpBuffer Pointer auf Struktur CAN_MSG. In diese
Struktur speichert die Funktion die gelesenen
Daten ab.

nNumberOfBytesTo Anzahl Bytes, welche die Funktion lesen soll.


Read

lpNumberOfBytes Pointer auf ein DWORD. Hier speichert die


Read Funktion ab, wie viele Bytes tatsächlich
gelesen und gespeichert wurden

lpOverlapped Unbenutzt: NULL

Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt


wurde. FALSE, wenn ein Fehler aufgetreten ist.

CloseHandle
Prototyp BOOL CloseHandle(HANDLE hObject)

Funktion Mit dieser Funktion wird die durch CreateFile() geöffnete CAN-
Schnittstelle wieder geschlossen.

Parameter hObject Handle auf die geöffnete CAN-Schnittstelle


Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt
wurde. FALSE, wenn ein Fehler aufgetreten ist.

901051A.MAN01.doc
3.6.3 Funktionen des CAN-Interface

CanStart
Prototyp BOOL CanStart(HANDLE hDevice, DWORD dwBaudrate)

Funktion Mit dieser Funktion wird die durch CreateFile() geöffnete CAN-
Schnittstelle gestartet (die Schnittstelle wird auf HW-Ebene initialisiert)

Parameter hDevice Handle auf die geöffnete CAN-Schnittstelle.


Rückgabewert von CreateFile().
dwBaudrate Baudrate, mit welcher die Schnittstelle arbeiten
soll.

Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt


wurde. FALSE, wenn ein Fehler aufgetreten ist.

CanStop
Prototyp BOOL CanStop(HANDLE hDevice)

Funktion Mit dieser Funktion wird die durch CanStart() initialisierte CAN-
Schnittstelle wieder deinitialisiert.

Parameter hDevice Handle auf die geöffnete CAN-Schnittstelle.


Rückgabewert von CreateFile().
Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt
wurde. FALSE, wenn ein Fehler aufgetreten ist.

CanWriteMsg2
Prototyp BOOL CanWriteMsg2(HANDLE hDevice, CAN_MSG* pCanMsg,
DWORD dwMsgToWrite, DWORD* pdwMsgWritten, BYTE
bFifoNbr)

Funktion Funktion zum Versenden von CAN-Meldungen. Im Gegensatz zu


WriteFile() kann die CAN-Meldung bei dieser Funktion noch mit
einer Sendepriorität versehen werden (FIFO 0: höchste Priorität, ... ,
FIFO 7: niedrigste Priorität, Standart-FIFO, wird von WriteFile()
benutzt)

Parameter hDevice Handle auf die geöffnete CAN-Schnittstelle.


Rückgabewert von CreateFile().
pCanMsg Pointer auf Struktur CAN_MSG. In dieser
Struktur sind die Meldungen abgespeichert,
welche versendet werden sollen.

dwMsgToWrite Anzahl Meldungen, welche der Anwender


versenden will.

pdwMsgWritten Pointer auf ein DWORD. Hier speichert die


Funktion die Anzahl Meldungen, welche

901051A.MAN01.doc
tatsächlich versendet wurden.

bFifoNbr Nummer des benutzten FIFO-Buffer. Der


Treiber sucht zuerst im FIFO mit der höchsten
Priorität (FIFO 0) nach Meldungen, dann im
FIFO mit der zweithöchsten Priorität (FIFO 1)
und so weiter.

Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt


wurde. FALSE, wenn ein Fehler aufgetreten ist.

CanCheckSendfifo
Prototyp BOOL CanCheckSendfifo(HANDLE hDevice, WORD* pwCount)

Funktion Mit dieser Funktion wird die Anzahl freier Speicherplätze im Sende-
FIFO mit der niedrigsten Priorität ermittelt. Dies ist der FIFO-Buffer,
welcher von WriteFile() benutzt wird.

Parameter hDevice Handle auf die geöffnete CAN-Schnittstelle.


Rückgabewert von CreateFile().
pwCount Pointer auf ein WORD. Hier speichert die
Funktion die Anzahl freier Speicherplätze ab.

Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt


wurde. FALSE, wenn ein Fehler aufgetreten ist.

CanCheckSendfifo2
Prototyp BOOL CanCheckSendfifo2(HANDLE hDevice, WORD*
pwMsgCount, BYTE bFifoNbr)

Funktion Auch diese Funktion ermittelt die freie Anzahl Speicherplätze im Sende-
FIFO. Allerdings kann diese Funktion alle FIFO’s abfragen.

Parameter hDevice Handle auf die geöffnete CAN-Schnittstelle.


Rückgabewert von CreateFile().
pwMsgCount Pointer auf ein WORD. Hier speichert die
Funktion die Anzahl freier Speicherplätze ab.

bFifoNbr Nummer des Sende-FIFO’s, welcher überprüft


werden soll.

Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt


wurde. FALSE, wenn ein Fehler aufgetreten ist.

CanCheckState
Prototyp BOOL CanCheckState(HANDLE hDevice, BYTE* pbyState)

901051A.MAN01.doc
Funktion Mit Hilfe dieser Funktion kann der Anwender den Zustand der CAN-
Schnittstelle überprüfen.

Parameter hDevice Handle auf die geöffnete CAN-Schnittstelle.


Rückgabewert von CreateFile().
pbyState Pointer auf ein BYTE. Auf diesen Speicherplatz
gibt die Funktion den Zustand der Schnittstelle
zurück.

Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt


wurde. FALSE, wenn ein Fehler aufgetreten ist.

CanDriverInfo
Prototyp BOOL CanDriverInfo(HANDLE hDevice, DWORD* pdwInfo)

Funktion Der Aufruf dieser Funktion bewirkt, dass der Overrun-Counter gelöscht
wird. Weiter gibt die Funktion den Status der Schnittstelle (Bit0 .. Bit15)
und der alte Wert des Overrun-Counters (Bit16 .. Bit31) zurück.

Parameter hDevice Handle auf die geöffnete CAN-Schnittstelle.


Rückgabewert von CreateFile().
pdwInfo Pointer auf ein DWORD. Auf diesen
Speicherplatz gibt die Funktion den Status und
der alte Wert des Overrun-Counters zurück.

Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt


wurde. FALSE, wenn ein Fehler aufgetreten ist.

CanGetLastError
Prototyp BOOL CanGetLastError(HANDLE hDevice, BYTE* pbyState)

Funktion Diese Funktion gibt den letzten gespeicherten CAN-Fehler zurück.

Parameter hDevice Handle auf die geöffnete CAN-Schnittstelle.


Rückgabewert von CreateFile().
pbyState Pointer auf ein BYTE. Hier speichert die
Funktion den letzten gespeicherten CAN-Fehler
ab.

Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt


wurde. FALSE, wenn ein Fehler aufgetreten ist.

901051A.MAN01.doc
3.6.4 Datentypen

CAN_MSG
Definition typedef struct {
WORD wID;
BYTE byRTR;
BYTE byDLC;
BYTE byData[8];
} CAN_MSG, *pCAN_MSG;

Elemente wID ID der CAN-Meldung


byRTR RTR = Remote Transmission Request. Gibt an,
ob es sich bei der vorliegenden Meldung um
einen Datentransfer (0) oder ein Steuerbefehl (1)
handelt.
byDLC DLC = Data Length Code. Gibt an, wie viele
Datenbytes zur CAN-Meldung gehören.
byData[8] Datenbytes der CAN-Meldung

CAN_BaudT
Definition typedef enum {
BAUDRATE_10K,
BAUDRATE_20K,
BAUDRATE_50K,
BAUDRATE_100K,
BAUDRATE_125K,
BAUDRATE_250K,
BAUDRATE_500K,
BAUDRATE_800K,
BAUDRATE_1M;
} CAN_BaudT;

3.6.5 Registry
Ist das CAN-Feature in den Workspace des PlatformBuilders integriert, ist auch die
Umgebungsvariable MIKRAP_DRV_CAN gesetzt. Somit werden auch folgende
Einträge aus dem File „Platform.reg“ in die Registry übernommen:
IF MIKRAP_DRV_CAN
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Can1]
"Dll" = "CAN.Dll"
"Prefix" = "CAN"
"Index" = dword:1
"FriendlyName" = "Can Driver on Port CAN1"
"BaseAddr" = dword:b4b00000
"Key" = "\\Drivers\\BuiltIn\\Can1"
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Can2]
"Dll" = "CAN.Dll"
"Prefix" = "CAN"
"Index" = dword:2
"FriendlyName" = "Can Driver on Port CAN2"
"BaseAddr" = dword:b4c00000

901051A.MAN01.doc
"Key" = "\\Drivers\\BuiltIn\\Can2"
ENDIF
Durch diese Einträge werden zwei BuiltIn-Treiber mit der CAN.dll geladen, für jede
CAN-Schnittstelle einen. Die beiden Treiber können über „CAN1:“ beziehungsweise
„CAN2:“ angesprochen werden. Weiter muss in der Registry auch die Adresse
stehen, über welche der Treiber mit der Hardware kommunizieren kann
(„BaseAddr“).

3.7 Battery Driver

3.7.1 Übersicht
Die Aufgabe des Batterie-Treibers ist es, die Spannung der Stützbatterie auf der
Basis zu überwachen. Zu diesem Zweck ist die Spannung der Stützbatterie direkt auf
das CPU-Board geführt. Eine Spannungsüberwachungs-Schaltung zeigt der CPU
über das GPIO9 an, ob die Batterie noch eine genügend hohe Spannung liefert. Der
Batterie-Treiber wird periodisch aufgerufen und kontrolliert den Wert der
Batteriespannung. Falls die Spannung einen ungenügenden Wert aufweist, wird dies
dem Anwender mit dem untenstehenden Symbol in der Taskbar mitgeteilt:

Der Benutzer kann den Zustand der Batterie auch über das Control Panel abfragen
(Start/Settings/Control Panel). Klickt man das Icon „Power“ an, wird mit dem
folgenden Dialog der Zustand der Batterie ersichtlich:

Zustand der
Stützbatterie auf der
Basis

Eine weiter Möglichkeit, sich über den Zustand der Batterie zu informieren, bietet das
Standart-API GetSystemPowerStatusEx2().

3.7.2 Schnittstelle zum Anwendungsprogrammierer

GetSystemPowerStatusEx2
Prototyp DWORD
GetSystemPowerStatusEx2(PSYSTEM_POWER_STATUS_EX2
pSystemPowerStatusEx2, DWORD dwLen, BOOL fUpdate)
Funktion Über die Struktur PSYSTEM_POWER_STATUS_EX2 wird dem
Anwender der Zustand der Stützbatterie mitgeteilt. Die weiteren
Zustands-Bits der Struktur sind zur Zeit noch nicht unterstützt.

Parameter pSystemPower Pointer auf Struktur


StatusEx2 PSYSTEM_POWER_STATUS_EX2. Zeigt den

901051A.MAN01.doc
Zustand der Stützbatterie.
dwLen sizeof(PSYSTEM_POWER_STATUS_EX2)

fUpdate TRUE: Funktion holt sich die neuesten Werte.


FALSE: Funktion gibt die gecachten Werte
zurück, welche eventuell bereits einige
Sekunden alt sind.

Rückgabe DWORD 0 bedeutet, dass ein Fehler aufgetreten ist. Im


Erfolgsfall wird die Grösse des Buffers von
pSystemPowerStatusEx2 zurückgegeben.

3.7.3 Datentypen

SYSTEM_POWER_STATUS_EX2
Definition typedef struct _SYSTEM_POWER_STATUS_EX2{
...
BYTE BackupBatteryFlag;
...
} SYSTEM_POWER_STATUS_EX2, *PSYSTEM_POWER_STATUS_EX2;

Elemente ... Diese Elemente werden zur Zeit nicht


unterstützt. Die ganze Struktur ist in der MSDN
ersichtlich.
BackupBatteryFlag Zeigt den Zustand der Stützbatterie
(BATTERY_FLAG_HIGH oder
BATTERY_FLAG_LOW)
... Diese Elemente werden zur Zeit nicht
unterstützt. Die ganze Struktur ist in der MSDN
ersichtlich.

3.7.4 Registry
Im File „Platform.reg“ sind folgende Werte eingetragen:
IF BSP_NOBATTERY !
IF IMG_NOBATTERY !
[HKEY_LOCAL_MACHINE\Software\Microsoft\Power]
;ShowBattery Taskbar Icon and hide Warning Dialogs
"ShowIcon" = dword:1
"ShowWarning" = dword:0
ENDIF ; IMG_NOBATTERY !
ENDIF ; BSP_NOBATTERY !
Diese Einträge bedeuten, dass bei zu geringer Spannung kein Dialog mit einer
Warnung angezeigt wird. Der Benutzer wird nur über das Icon in der Taskbar
informiert.

901051A.MAN01.doc
3.8 COM-Schnittstellen

3.8.1 Übersicht
Der Serial-Treiber unterstützt bis zu 10 serielle Schnittstellen. Die Treiber werden
beim Aufstarten des Panels anhand der hardwaremässig vorhandenen Schnittstellen
geladen.
Die RS485-Funktionalität ist noch nicht implementiert. Die Funktionen, welche bei
älteren Treiber im Zusammenhang mit RS485 gebraucht wurden, sind aus
Kompatibilitätsgründen aber weiterhin vorhanden. Sie sind im File „SerialExt.h“
definiert.
Bevor der Anwender Funktionen auf eine COM-Schnittstelle ausübt, muss er zuerst
den entsprechenden Treiber („COMx:“) öffnen. Die Funktion CreateFile() liefert
einen Handle zu der gewünschten Schnittstelle.

3.8.2 Schnittstelle zum Anwendungsprogrammierer

SerSetMode
Prototyp BOOL SerSetMode(HANDLE hDevice, UINT8 mode)

Funktion Mit dieser Funktion kann der Anwender zwischen den Moden
RS232/RS422 und RS485 umschalten. Die Funktion erfüllt zur Zeit
keine Aufgabe und ist nur aus Kompatibilitätsgründen definiert!

Parameter hDevice Handle auf geöffnete Schnittstelle.


Rückgabewert von CreateFile().
mode CTRL_MODE_RS232
CTRL_MODE_RS485

Rückgabe BOOL TRUE, wenn Modus RS232 gewählt wird. Sonst


wird FALSE zurückgegeben.

SerReadError
Prototyp BOOL SerReadError(HANDLE hDevice, UINT32 *error)

Funktion Im RS485-Modus liefert diese Funktion im Fehlerfall den Inhalt des


Error-Registers. Die Funktion erfüllt zur Zeit keine Aufgabe und ist nur
aus Kompatibilitätsgründen definiert!

Parameter hDevice Handle auf geöffnete Schnittstelle.


Rückgabewert von CreateFile().
error ERROR_RS485_BUFEMPTY: Behandlungsfehler
im Treiber;
ERROR_RS485_BUFFULL: Zeichen gesandt,
aber keine empfangen;
ERROR_RS485_COMPARE: compare Fehler;
ERROR_RS485_EIF: Fehler im Receive-Frame;
ERROR_RS485_TIMEOUT: Timeout beim

901051A.MAN01.doc
Senden oder Empfangen

Rückgabe BOOL TRUE, wenn Funktion erfolgreich ausgeführt


wurde. Sonst wird FALSE zurückgegeben.

ClearCommError()
Diese Funktion ist ausführlich in der MSDN dokumentiert. Zusätzlicher Error-Code:
CE_RS485: Während der Übertragung im RS485-Mode ist ein Fehler aufgetreten.
Die Ursache kann mit der Funktion SerReadError() ermittelt werden.

WaitCommEvent()/SetCommMask()
Die Funktionen WaitCommEvent() und SetCommMask() werden in der MSDN
beschrieben. Zusätzliche Events:
EV_END_RS485: Die Übertragung eines Pakets ist abgeschlossen. Ist ein Fehler
aufgetreten, so wird das Errorbit CE_RS485 und der Event EV_ERR_RS485 gesetzt.
EV_ERR_RS485: Fehler bei der Übertragung festgestellt.

3.9 Watchdog

3.9.1 Übersicht
Dieser Treiber ermöglicht den Zugriff auf die Watchdog-Funktionalität eines XScale-
Prozessors. Diese Möglichkeit besteht sowohl für einfache Anwendungen als auch
für die HW-abhängige Schicht des Software-Watchdogs.
Nach dem Start muss der Watchdog periodisch ein Update erhalten. Erhält er
innerhalb einer beliebigen, vom Anwender des Watchdogs bestimmten Zeit, kein
Update, löst der Watchdog-Treiber ein Reset aus. Ist der Watchdog einmal in
Betrieb, kann er nicht mehr gestoppt werden.
Der Benutzer muss das File „HwWatchdog.h“ einbinden, damit er den Watchdog-
Treiber verwenden kann. Dieses File ist im platformabhängigen Teil des Kerns
abgelegt (D:\WINCE420\PLATFORM\MnPxaBd\INC). Die Funktionen des Treibers
sind in der DLL HwWatchdog.dll enthalten. Diese wird direkt über LoadLibrary() in
den Prozess der Anwendung geladen. Dies verkürzt die Rechenzeit gegenüber der
Variante über das device.exe (mit der Funktion CreateFile()).

3.9.2 Schnittstelle zum Anwendungsprogrammierer

StartHwWatchdog
Prototyp HANDLE StartHwWatchdog(DWORD dwTimeout)

Funktion Mit dieser Funktion wird der Watchdog des Prozessors mit der
übergebenen Timeout-Zeit initialisiert und gestartet.

Parameter dwTimeout Timeout-Zeit in ms. Innerhalb dieser Zeit muss


der Anwender den Watchdog updaten, sonst
wird ein Reset ausgelöst. Maximaler Wert ist
1165084.

901051A.MAN01.doc
Rückgabe HANDLE Handle auf den initialisierten und gestarteten
Watchdog. Gibt die Funktion NULL zurück, ist
ein Fehler aufgetreten.

UpdateHwWatchdog
Prototyp BOOL UpdateHwWatchdog(HANDLE hWatchdog)

Funktion Mit Hilfe dieser Funktion wird ein Update des Watchdogs ausgeführt.

Parameter hWatchdog Handle auf den initialisierten und gestarteten


Watchdog. Wird von StartHwWatchdog()
geliefert.
Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt
wurde. FALSE, wenn ein Fehler aufgetreten ist.

UpdateHwWatchdogEx
Prototyp BOOL UpdateHwWatchdogEx(HANDLE hWatchdog, DWORD
dwTimeoutMs)

Funktion Der Aufruf dieser Funktion löst ein Update des Watchdogs aus.
Gleichzeitig wird der Watchdog des Prozessors neu mit der
übergebenen Timeout-Zeit initialisiert.

Parameter hWatchdog Handle auf den initialisierten und gestarteten


Watchdog. Wird von StartHwWatchdog()
geliefert.
dwTimeoutMs Timeout-Zeit in ms. Innerhalb dieser Zeit muss
der Anwender den Watchdog updaten, sonst
wird ein Reset ausgelöst. Maximaler Wert ist
1165084.

Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt


wurde. FALSE, wenn ein Fehler aufgetreten ist.

ForceDeviceReset
Prototyp BOOL ForceDeviceReset(void)

Funktion Die Funktion löst einen Reset aus. Da der PXA255 keine SW-Reset-
Funktion mehr besitzt, wird der Reset über das Auslösen einer
Watchdog-Verletzung ausgelöst.

Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt


wurde. FALSE, wenn ein Fehler aufgetreten ist.

901051A.MAN01.doc
3.10 RTC

3.10.1 Übersicht
Der RTC-Treiber (Real Time Clock-Treiber) ist als Library implementiert und wird
direkt in den Kern integriert. Im Gegensatz zu älteren Versionen hat sich der Treiber
deutlich vereinfacht, da der externe, batteriegepufferte RTC-Baustein und der interne
RTC des XScale-Prozessors am gleichen Oszillator angeschlossen sind. Somit läuft
ihre Zeit synchron miteinander, ein Update der internen Systemzeit ist nicht mehr
nötig. Im Gegensatz zu älteren Treiberversionen müssen auch keine Einträge in der
Registry stehen.
Der Benutzer hat mit den zwei Funktionen SetSystemTime() und
GetSystemTime() des Standart-API’s (Winbase.h) die Möglichkeit, mit den
internen und externen RTC’s zu kommunizieren. Mit SetSysteTime() setzt der
Anwender sowohl den internen als auch den externen RTC mit der gewünschten
Zeit. Mit GetSystemTime() liest er die aktuelle Zeit aus dem internen RTC.

API SetSysteTime() GetSysteTime()

WinCE-
OEMSetRealTime() OEMGetRealTime()
Kern,
RTC-
Treiber

Interner RTC vom XScale-


Externer, batteriegestützer RTC
Prozessor

Beim Aufstarten der Plattform wird die Zeit aus der externen in die interne RTC
kopiert. Ist der externe RC nicht initialisiert, wird eine Default-Zeit (1. Jan. 1980,
23h59) für den internen und den externen RTC verwendet.

3.10.2 Schnittstelle zum Anwendungsprogrammierer

SetSystemTime
Prototyp BOOL SetSystemTime(const SYSTEMTIME * lpSystemTime)

Funktion Der Anwender setzt mit dieser Funktion den internen und externen RTC
auf die übergebene Systemzeit.

901051A.MAN01.doc
Parameter lpSystemTime Pointer auf Struktur SYSTEMTIME. Systemzeit,
welche in den internen und externen RTC
geschrieben wird.
Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt
wurde. FALSE, wenn ein Fehler aufgetreten ist.

GetSystemTime
Prototyp void GetSystemTime(LPSYSTEMTIME lpSystemTime)

Funktion Die Funktion gibt dem Anwender die aktuelle Systemzeit zurück, welche
im internen RTC gespeichert ist.

Parameter lpSystemTime Pointer auf Struktur SYSTEMTIME. Hier


speichert die Funktion die aktuelle Systemzeit
ab.
Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt
wurde. FALSE, wenn ein Fehler aufgetreten ist.

3.10.3 Datentypen

SYSTEMTIME
Definition typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeak;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMillisecond;
} SYSTEMTIME;

Elemente wYear Aktuelles Jahr


wMonth Aktueller Monat (Januar = 1, Februar = 2, ...)
wDayOfWeak Aktueller Wochentag (Sonntag = 0, Montag = 1,
Dienstag = 2, ...)
wDay Aktueller Tag des Monats
wHour Aktuelle Stunde
wMinute Aktuelle Minute
wSecond Aktuelle Sekunde
wMillisecond Aktuelle Millisekunde

901051A.MAN01.doc
4. PCP, PC-Control Panels

4.1 Übersicht
Dieses Kapitel beschreibt die Treiber, welche die Funktionalitäten der PC-Control
Panels unterstützen. Diese Treiber sind hauptsächlich für die Interaktion zwischen
dem System und dem Anwender verantwortlich. Die Kommunikation zwischen dem
Benutzer und dem System findet bei den Control Panels zu einem grossen Teil über
den Touch-screen statt.

4.2 Display

4.2.1 Übersicht
Der Display-Treiber ist für die Anzeige auf dem Bildschirm verantwortlich. Der
Anwender hat über Einträge in der Registry die Möglichkeit, die Einstellungen des
Bildschirmes zu ändern. Änderungen in der Registry übernimmt der Display-Treiber
erst nach einem Reset des Panels.
Hinweis: Der Hintergrundbeleuchtung des Bildschirmes ist über den Flex auf der
Basis gesteuert. Kann die Flex-Software nicht geladen werden, oder wird die falsche
Software verwendet, bleibt der Bildschirm schwarz.

4.2.2 Registry
Diese Einträge bestimmen die Einstellungen des Bildschirmes:
[HKEY_LOCAL_MACHINE\Drivers\Display\MNVideo]
Name Typ Initialwert Beschreibung
Bpp DWORD 8Bits pro Pixel. Der Display-Treiber
unterstützt nur 8 Bits pro Pixel.
CxScreen DWORD 640 Auflösung in X-Richtung (LPC 104 = 640,
LCP 57 = 320).
CyScreen DWORD 480 Auflösung in Y-Richtung (LCP 104 = 480,
LCP 57 = 240).
DisplayType STRING MN_LCP104 Grösse des verwendeten Displays (LCP
57 = MN_LCP57).
DisplayLum DWORD 144 Helligkeit des Displays
UseFrameBuffer DWORD 0 Gibt an, ob der Frame-Buffer verwendet
wird. Wird automatisch eingeschalten,
wenn eine Maus verwendet wird.
Mouse DWORD 0 Gibt an, ob eine Maus verwendet wird (1)
oder nicht (0)
PixelClock DWORD 25000000 Optional; Dieser Eintrag ist
defaultmässig nicht vorhanden. Der
Pixelclock bestimmt die Refresh-Rate
des Displays.
DisplayOn DWORD 1 Optional; Dieser Eintrag ist
defaultmässig nicht vorhanden. Falls
dieser Eintrag 0 enthält, wird das Display
nicht eingeschalten.

901051A.MAN01.doc
Der Eintrag „Angle“, welcher das Drehen des Bildes um 90 Grad ermöglicht, wird zur
Zeit noch nicht unterstützt.

4.3 Touch

4.3.1 Übersicht
Der Touch dient als Eingabegerät. Mit einem Druck auf die aktive Touchfläche wird
ein Mouseevent ausgelöst. Zusätzlich bietet der Treiber die Möglichkeit TouchKey-
Tasten zu definieren. Diese senden einen Keyevent an das aktive Window.
Der Touch Treiber des WinCE4.2 besteht aus zwei verschiedenen Schichten.
Einerseits die hardwareabhängige PDD-Schicht (platform depend driver),
andererseits die hardwareunabhängige MDD-Schicht (model device driver).
Damit ein Kern den Touch Treiber verwenden kann, muss im Workspace des
PlatformBuilders das Feature „TouchDisplay“ eingebunden werden. Dieses befindet
sich bei den Mikrap DeviceDrivers. Falls ein Panel nicht über die benötigte Hardware
zur Verarbeitung von Toucheingaben verfügt, muss das Feature „NO_TOUCH“
eingebunden sein. Dieser Dummy-Treiber verhindert einen Absturz des GWES beim
Aufstarten, da das GWES versucht, mit der nicht vorhandenen Hardware Kontakt
aufzunehmen
Initialisiert wird der Touch Treiber vom GWES, beim Aufstarten des Panels. Dabei
kreiert das GWES die IST TouchPanelpISR und initialisiert den Codec zum Erkennen
von Touchberührungen. TouchPanelpISR wartet auf einen signalisierten Event und
der Codec auf eine Berührung des Touch-screens
Berührt der User den Touch-screen, löst der Codec einen Interrupt aus und
signalisiert den Event, welche TouchPanelpISR aktiviert. Diese Routine fordert nun
von der PDD die Koordinaten des gedrückten Punktes (GetCoord). Die PDD liest
über den Codec die X- und Y-Koordinate. Weiter ermittelt die PDD, ob der User
immer noch auf den Touch-screen drückt (PenIsDown). Ist dies der Fall, wird ein
Timer mit der Intervalllänge 25 ms gestartet.
Die gemessenen Koordinaten werden an die MDD gesendet und dort verarbeitet. Die
MDD sendet diese Werte in Form einer Windows Message an die aktuelle Ansicht
und wartet dann, bis sie durch einen signalisierten Event wieder neu gestartet wird.
Dieser geschieht, sobald die 25 ms des Timers abgelaufen sind. TouchPanelpISR
startet einen neuen Messvorgang.
Dieser Ablauf wird so lange wiederholt, bis die PDD nach einer Messung feststellt,
dass der User nicht mehr auf den Touch-screen drückt. In diesem Fall wird die
Messung beendet und der Codec so initialisiert, dass er bei einer erneuten
Touchberührung durch den User einen Interrupt auslöst.
Der Vorteil bei diesem Ablauf liegt darin, dass der Touch Treiber keine Ressourcen
der CPU benötigt, wenn der User den Touch-screen nicht benutzt.
Das folgende Sequenzendiagramm gibt eine Übersicht über die Arbeitsweise des
Touch-Treibers:

901051A.MAN01.doc
GWES.exe Ansicht TouchPanelpISR PDD Timer Codec (HW)
(MDD) (MNSys)

User

Initialisierung
Init Codec für Interrupt

Warten auf
Event
Touch Druck
Interrupt: Signalisiert Event
GetCoord
X:= GetPoint

Y:= GetPoint
PenIsDown?
X, Y
X, Y TRUE: Start Timer

Warten auf
Event

Interrupt: Signalisiert Event


GetCoord
X:= GetPoint

Y:= GetPoint
PenIsDown?

X, Y
X, Y FALSE: Init Codec für Intr.

Warten auf Warten auf


Event neuen Touch
Druck des
Users

4.3.2 Kalibration
Damit der Touch-Treiber benutzt werden kann, ist eine Kalibration unumgänglich. Die
Kalibrationsroutine berechnet anhand von vier Punkten auf dem Display die
Kalibrationsmatrix. Mit Hilfe dieser Matrix berechnet der Touch-Treiber aus den
Rohdaten der Hardware die Mauskoordinaten auf dem Bildschirm.
Beim Aufstarten eines Panels überprüft der Treiber anhand eines Eintrages in der
Registry, ob die Kalibration schon einmal ausgeführt wurde. Ist dies der Fall,
übernimmt der Touch-Treiber die Kalibrationsmatrix der bereits durchgeführten
Kalibration. Wurde noch nie eine Kalibration ausgeführt, startet der Treiber die
Kalibrationsroutine.
Der Anwender hat jederzeit die Möglichkeit, eine neue Kalibration zu starten und die
alten Werte zu verwerfen. Einerseits kann er dies aus dem Control Panel (über Start
-> Settings -> Control Panel) tun. Im Tool „Stylus“ ist die Kalibration anwählbar.
Andererseits ist es im SMT unter Tools -> WindowsCE Start -> Touch Calibration
ebenfalls möglich, eine Kalibration auszuführen. In diesem Fall muss allerdings eine
ActiveSync-Verbindung zwischen dem Panel und dem Host-PC bestehen.

901051A.MAN01.doc
4.3.3 Registry
In der Registry sind die Einstellungen zum verwendeten Touch-screen abgelegt. Sie
befinden sich unter
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Touch]
Name Typ Bereich Initialwert Beschreibung
FilterBox DWORD 0..20 12 Dieser Wert bestimmt die
Genauigkeit der
Mauskoordinaten. Je grösser
der Wert, um so ungenauer ist
die Koordinate, dafür ist die
Bedienung ruhiger.
HighPriority256 DWORD 0..255 80 Hohe Priorität des
TouchThreads
Priority256 DWORD 0..255 109 Normale Priorität des
TouchThreads
PenPressure DWORD 0..600 500 Notwendiger Druck auf den
Screen, damit ein Messwert als
gültig gilt
Dll STRING - Touch.dll Name der Touch Treiber DLL

[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH]
Name Typ Bereich Initialwert Beschreibung
CalibrationData STRING - - Falls vorhanden, ist Kalibration
schon mindestens einmal
ausgeführt worden
Dll STRING - Touch.dll Name der Touch Treiber DLL
MaxCalError DWORD 0..100 7 Maximale Abweichung in
horizontaler und vertikaler
Richtung, welche die vier
Punkte bei der Kalibration
haben dürfen. Ist die
Abweichung grösser, wird die
Kalibration wiederholt.

Damit der Touch-Treiber mit der Hardware kommunizieren kann, muss sein Interrupt
initialisiert werden (siehe Kapitel MNSys). Im File „Platform.reg“ werden daher
folgende Einträge vorgenommen:
IF MIKRAP_TOUCH
[HKEY_LOCAL_MACHINE\Software\Mikrap\MNSys\Interrupt\54]
; INT_GPIO22
"Sysintr" = dword:11 ; SYSINTR_TOUCH
"IISR" = dword:1
"IntMode" = dword:1
"Priority" = dword:FB ;251
ENDIF

901051A.MAN01.doc
4.4 Touch Keys

4.4.1 Übersicht
Das Tool „TouchKey“ gibt dem Benutzer die Möglichkeit, die Anzahl der Touch Keys
seines Panels zu definieren. Als Touch Key bezeichnet man eine Taste, welche auf
der aktiven Fläche des Touchs liegt. Sie wird also über den Touch Treiber bearbeitet.
Damit ein Kern die Touch Keys verwenden kann, muss das Feature „TouchKey“ im
PlatformBuilder eingebunden sein. Dieses befindet sich bei den Mikrap Tools.
Gestartet wird die Anwendung TouchKey aus dem MNSetup (siehe Kapitel
MNSetup).
Besitzt die Hardware weniger Touch Keys als maximal möglich, so müssen diese
regelmässig über die gesamte Seitenlänge verteilt sein. In den Ecken der aktiven
Touchfläche dürfen keine Touch Keys plaziert werden, diese Punkte sind keiner
Seite zugeordnet. Die folgende Abbildung zeigt eine möglich Plazierung und
Numerierung von Touch Keys:
Aktive
Touchfläche Screen
Touch Key

14 13 12 11

7 8 9 10

Die Grenzen zwischen den Tasten werden aus den Anzahl Tasten und den
gerechneten Kanten des Bildschirmes bestimmt. Die Kanten des Bildschirmes
werden nach der Kalibration berechnet.

4.4.2 Die Anwendung „Touch Key Setup“


Die Anwendung „Touch Key Setup“ erlaubt dem Benutzer des Panels, die Anzahl der
Touch Keys auf jeder Seite des Bildschirms zu definieren. Gestartet wird das Tool
über das MNSetup. Mit dem untenstehenden GUI gibt der Anwender dann die Anzahl
Tasten ein.

901051A.MAN01.doc
Über die Eingabetasten „More“ und „Less“ gibt der User die Anzahl der Touch Keys
an jeder Seite ein. Es ist nicht möglich, mehr als die maximal erlaubte Anzahl Touch
Keys einzugeben. Drückt der User die Taste „Cancel“, wird die Anwendung beendet
und die alten Daten behalten. Die Taste „OK“ beendet die Anwendung ebenfalls, die
neuen Werte werden aber übernommen und in der Registry gespeichert.

4.4.3 Registry
In der Registry sind die Einstellungen zur verwendeten Hardware abgelegt. Sie
befinden sich unter:
[HKEY_LOCAL_MACHINE\SOFTWARE\Mikrap\HOTKEYS\MaxKeys]
Name Typ Bereich Initialwert Beschreibung
MaxKeyLeftRight DWORD 0..10 Wird im File Maximal mögliche Anzahl
TouchKey.reg Touch Keys an der rechten
definiert und linken Seite
MaxKeyUpDown DWORD 0..10 Wird im File Maximal mögliche Anzahl
TouchKey.reg Touch Keys an der oberen und
definiert unteren Seite

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Touch]
Name Typ Bereich Initialwert Beschreibung
KeyTopNbr DWORD 0.. 0 Anzahl Touch Keys oben
MaxKeyUpDown
KeyLeftNbr DWORD 0.. 0 Anzahl Touch Keys links
MaxKeyLeftRight
KeyRightNbr DWORD 0.. 0 Anzahl Touch Keys rechts
MaxKeyLeftRight
KeyBottomNbr DWORD 0.. 0 Anzahl Touch Keys unten
MaxKeyUpDown
MaxCalX DWORD 0 .. 2540 2540 Linke Kante des
Bildschirmes in kalibrierten
Koordinaten, wird bei der
Kalibration berechnet
MaxCalY DWORD 0 .. 1920 1920 Untere Kante des
Bildschirmes in kalibrierten

901051A.MAN01.doc
Koordinaten, wird bei der
Kalibration berechnet

4.5 Hot Keys

4.5.1 Übersicht
Als Hot Key versteht man ein Touch Key, welcher mit einer Funktion verbunden ist.
Das bedeutet, dass der Anwender durch einen Tastendruck die mit der Taste
verbundene Funktion auslöst. Dieser Treiber besteht aus zwei verschiedenen Tools.
Mit dem Hot Key Setup werden die Touch Keys mit entsprechenden Funktionen
verbunden. Das Tool HotKeys wartet, bis eine gedrückte Taste signalisiert wird. Ist
dieser Taste eine Funktion zugeordnet, wird diese aufgerufen.

4.5.2 Die Anwendung „Hot Key Setup“


Die Anwendung „Hot Key Setup“ dient dem Erstellen von Verbindungen zwischen
Touch Keys und Funktionen. Gestartet wird die Anwendung über das MNSetup.
Nach dem Start erscheint folgendes GUI:

Bestehen bereits Verbindungen zwischen Touch Keys und Funktionen, so werden


diese im Fenster „Actual HotKey Settings“ angezeigt. Mit der Taste „Delete HotKeys“
können bestehende Verbindungen gelöscht werden.
Über die Taste „Add HotKey“ gelangt man zum folgenden Fenster:

901051A.MAN01.doc
Der Anwender drückt nun auf eine Taste. Sendet diese Taste einen gültigen
KeyCode, kann unter “Key function” die gewünschte Funktion ausgesucht und mit
der Taste verbunden werden. Eine Taste kann nur dann einen gültigen KeyCode
senden, wenn sie mit dem “Touch Key Setup” definiert wurde.
Nach dem Verlassen des obigen GUI’s erscheint wieder das “Hot Key Setup”-GUI.
Mit “Apply” oder “OK” kann der Anwender die gemachten Änderungen in die Registry
übernehmen. Durch “Cancel” werden die Änderungen verworfen.

4.5.3 Die Anwendung „Hot Keys“


Dieses Tool überprüft, ob gesendete KeyCodes mit einer Funktion verbunden sind.
Ist dies der Fall, ruft „Hot Keys“ die entsprechende Funktion auf. Zur Zeit sind
folgende Funktionen implementiert:

Mouse Panel
Ist einer Taste die Funktion Mouse Panel zugeordnet, erscheint nach einem Druck
auf die Taste folgendes Symbol:

Die einzelnen Symbole entsprechen diesen Funktionen:


Aktuelles Fenster nach Aktuelles Fenster nach aktuelles Fenster nach
links verschieben oben verschieben rechts verschieben
Helligkeit und Kontrast Aktuelles Fenster nach Soft-Keyboard anzeigen
konfigurieren (Kontrast- unten verschieben
Panel einblenden)

Helligkeit und Kontrast können nur bei Systemen mit WindowsCE V3.0 verändert
werden. Der Anwender kann die Werte mit den Schiebereglern einstellen (siehe
oben). Die neuen Einstellungen werden erst übernommen, nachdem [Take It] betätigt
wird. Nach Ablauf des Timers werden die alten Werte wieder eingestellt, damit auch
bei versehentlich falsch eingestelltem Kontrast oder Hintergrundbeleuchtung das
Display wieder abgelesen werden kann. Sollen die Werte beim nächsten Systemstart
beibehalten werden, so muss die Registry mit [SaveRegistry] gespeichert werden.

901051A.MAN01.doc
Soft-Keyboard
Mit der Funktion Soft-Keyboard kann der Anwender ein Keyboard auf dem Bildschirm
ein- und ausblenden. Das Keyboard ist über den Touch-screen bedienbar.

Contrast Panel
Die Funktion Contrast Panel ermöglicht dem Benutzer, dass Kontrast-Panel ein- und
auszublenden. Die Funktionalität des Kontrast-Panels ist bereits im Kapitel Mouse
Panel beschrieben.

Move Window Left / Right / Up / Down


Ist einer Taste die Funktion Move Window zugeordnet, wird bei einem Tastendruck
das aktuelle Fenster in die angegebene Richtung verschoben.

Execute
Wird eine Taste mit der Funktion Execute belegt, so wird ihr als Argument eine
Anwendung angegeben. Wird die Taste gedrückt, startet WindowsCE diese
Anwendung. Ein erneuter Tastendruck startet die Anwendung noch einmal,
unabhängig ob die erste Anwendung noch aktiv ist oder nicht.

Swap
Einer Taste mit der Funktion Swap muss ebenfalls eine Anwendung als Argument
übergeben werden. Per Tastendruck wird die Anwendung gestartet. Ein erneutes
drücken der Taste führt dazu, dass die Anwendung beendet wird.

4.5.4 Registry
In der Registry sind die bestehenden Verbindungen abgelegt.
[HKEY_LOCAL_MACHINE\ SOFTWARE\Mikrap\HOTKEYS]
Name Typ Inhalt
KeyCode Nummer STRING Funktion, welche mit der Taste verbunden ist. Die
(dezimal) Codierung ist folgendermassen aufgebaut:
<Class>,<Cmd>

<Class>:
Class: P Panel
W Window
C Command

<Cmd>:
Panel:: M Mouse
K KeyBoard
C Contrast

901051A.MAN01.doc
Window:: L Left
R Right
U Up
D Down
Command:: S Swap S,<Prog>[,<CmdLine]
E Exec E,<Prog>[,<CmdLine
Folgende Einträge sollen diese Codierung erklären:

Die Taste mit dem KeyCode 113 (F2) löst einen Window-Befehl (W) aus. Das U
bedeutet, dass das aktuelle Fenster nach oben verschoben wird.
Die Taste mit dem KeyCode 112 (F1) löst einen Panel-Befehl (P) aus. Das M
bedeutet, dass das Mous-Panel aktiviert wird.

4.6 MNSetup

4.6.1 Übersicht
Mit dem Tool „MNSetup“ besitzt der Anwender ein Werkzeug, um dem
Betriebssystem die Eigenschaften der Hardware mitzuteilen. Das MNSetup wird beim
Aufstarten des Panels aufgerufen. Beim erstmaligen Aufstarten führt das Tool die
angemeldeten Funktionen aus. Wenn die Funktionen erfolgreich beendet werden,
ignoriert das MNSetup diese Funktionen bei einem erneuten Aufstarten. Wird eine
angemeldete Funktion ohne Erfolg beendet, wird sie beim nächsten Aufstarten
erneut ausgeführt. Dieser Vorgang wiederholt sich, bis die Funktion mit Erfolg
abgeschlossen wird.
Der Anwender hat während dem Betrieb ebenfalls die Möglichkeit, die Funktionen
des MNSetup’s auszuführen. Über das MNSetup-Icon auf dem Desktop oder über
Start -> Programs -> MNTools -> MNSetup wird folgendes GUI gestartet:

Das GUI zeigt dem Anwender alle angemeldeten Funktion. Der Benutzer kann diese
ausführen und mit “Done” die gemachten Änderungen in der Registry speichern.

901051A.MAN01.doc
4.7 Keyboard

4.7.1 Übersicht
Der Keyboard-Treiber ist ein Teil des Basis-Treibers. Dieser lädt bei seiner
Initialisierung das File „Basis.reg“ in die Registry. Damit sind für 64 verschiedene
Tasten KeyCode und Einstellungen hinterlegt. Unter dem KeyCode versteht man den
Code, welcher nach einem Tastendruck an das System gesendet wird. In den
Einstellungen kann die Tastenfunktion (z. B. Repetiermodus, Haltemodus) verändert
werden.
Der Keyboard-Treiber stellt dem Anwender die beiden Funktionen GetKeyCode()
und SetKeyCode() zur Verfügung. Mit diesen beiden Funktionen sind während dem
Betrieb Änderungen an den KeyCodes und an den Einstellungen einer Taste
möglich. Bevor der Anwender diese Funktionen benutzen kann, muss er den Basis-
Treiber öffnen:
HANDLE hBasisFile;
LPCWSTR lpBasisName = TEXT("VGA1:");
hBasisFile = CreateFile(lpBasisName, GENERIC_READ |
GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL);
Der Touch-Treiber benutzt die Informationen, welche der Keyboard-Treiber in der
Registry hinterlegt. Die Touch Keys entsprechen den Tasten 1 bis Taste x. Ändert
der Anwender über SetKeyCode() die Einstellung oder den KeyCode einer Taste,
wird diese Änderung im Touch-Treiber unmittelbar übernommen.

4.7.2 Schnittstelle zum Anwendungsprogrammierer

GetKeyCode
Prototyp BOOL GetKeyCode(HANDLE hDevice, BYTE *pbKeyNbr,
sRegKeyCode *psRegKeyCode)

Funktion Mit Hilfe dieser Funktion erhält der Anwender die Einstellungen der
übergebenen Tastennummer.

Parameter hDevice Handle auf den geöffneten Basis-Treiber.


Rückgabewert von CreateFile().
pbKeyNbr Pointer auf en BYTE. Diese Variable enthält die
Nummer der Taste, von welcher die
Einstellungen zurückgegeben werden.

psRegKeyCode Pointer auf Struktur sRegKeyCode. Die


Funktion speichert hier die Einstellungen der
Taste.

Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt


wurde. FALSE, wenn ein Fehler aufgetreten ist.

901051A.MAN01.doc
SetKeyCode
Prototyp BOOL SetKeyCode(HANDLE hDevice, sRegKeyCode
*psKeyCode)

Funktion Durch diese Funktion kann der Anwender die Einstellungen der
übergebenen Taste ändern.

Parameter hDevice Handle auf den geöffneten Basis-Treiber.


Rückgabewert von CreateFile().
psKeyCode Pointer auf Struktur sRegKeyCode. In dieser
Funktion sind sowohl die Nummer der Taste als
auch ihre neuen Einstellungen gespeichert.

Rückgabe BOOL TRUE, wenn die Funktion erfolgreich ausgeführt


wurde. FALSE, wenn ein Fehler aufgetreten ist.

4.7.3 Datentypen

SRegKeyCode
Definition typedef struct
{
BYTE config;
USHORT KeyCode[4];
BYTE KeyNbr;
DWORD TimeToRepeat;
DWORD DelayBetweenRepeat;
} sRegKeyCode;

Elemente config Diese Variable enthält die Flags für die


Tastenfunktionen:
NOFUN: keine spezielle Funktion;
REPON: Tastenwiederholung falls länger als
TimeToRepeat gedrückt;
AUTON: nach TimeToRepeat wird automatisch
der Index von KeyCode um 1 erhöht;
LOCK: Halten der Taste ohne LED;
LOCKL: Halten der Taste mit LED
Default: NOFUN
KeyCode Hier sind die KeyCodes der Taste gespeichert.
Diese können Werte von 0x01 bis 0xFE
annehmen. Die Umschaltung des Index erfolgt
mittels Offset auf den Tastencode. Ein Offset
von 0x100 entspricht dem Index 1, ein Offset
von 0x200 entspricht dem Index 2 und ein
Offset von 0x300 entspricht dem Index 3
Default: Taste 1 = 0x70 (F1), Taste 2 = 0x71
(F2), Taste 3 = 0x72 (F3) ...

901051A.MAN01.doc
KeyNbr Entspricht der Tastennummer – 1.
TimeToRepeat 30 … 2000 [ms]; nach Erreichen der Zeit wird
bei gedrückter Taste der Tastencode bei der
Konfiguration REPON und AUTON noch einmal
gesendet. Ist zur Zeit noch nicht implementiert.
Default: 0
DelayBetween 30 … 2000 [ms]; nach Erreichen der Zeit
Repeat TimeToRepeat und DelayBetweenRepeat
wird bei gedrückter Taste der Tastencode bei
der Konfiguration REPON und AUTON wiederholt
gesendet. Ist zur Zeit noch nicht implementiert.
Default: 0

4.7.4 Registry
Die KeyCodes und die Einstellungen der Tasten sind in der Registry unter den
folgenden Einträgen abgelegt:
-[HKEY_LOCAL_MACHINE\ SOFTWARE\Mikrap\HOTKEYS\Config]:
Tastenfunktionen für die Tasten 1 bis Taste 64 (Eintrag 0 entspricht Taste 1, ...)
-[HKEY_LOCAL_MACHINE\ SOFTWARE\Mikrap\HOTKEYS\KeyCode0]:
KeyCode mit Index 0 für die Tasten 1 bis Taste 64 (Eintrag 0 entspricht Taste 1, ...)
-[HKEY_LOCAL_MACHINE\ SOFTWARE\Mikrap\HOTKEYS\KeyCode1]:
KeyCode mit Index 1 für die Tasten 1 bis Taste 64 (Eintrag 0 entspricht Taste 1, ...)
-[HKEY_LOCAL_MACHINE\ SOFTWARE\Mikrap\HOTKEYS\KeyCode2]:
KeyCode mit Index 2 für die Tasten 1 bis Taste 64 (Eintrag 0 entspricht Taste 1, ...)
-[HKEY_LOCAL_MACHINE\ SOFTWARE\Mikrap\HOTKEYS\KeyCode3]:
KeyCode mit Index 3 für die Tasten 1 bis Taste 64 (Eintrag 0 entspricht Taste 1, ...)
-[HKEY_LOCAL_MACHINE\ SOFTWARE\Mikrap\HOTKEYS\TimeToRepeat]:
Repetitionszeit für die Tasten 1 bis Taste 64 (Eintrag 0 entspricht Taste 1, ...)
-[HKEY_LOCAL_MACHINE\ SOFTWARE\Mikrap\HOTKEYS\DelayBetweenRepeat]:
Wartezeit zwischen einer Repetition für die Tasten 1 bis Taste 64 (Eintrag 0
entspricht Taste 1, ...)

4.8 Soft-Keyboard

4.8.1 Übersicht
Das Soft-Keyboard ist eine Unterstützung für den Benutzer, wenn dieser Text
eingeben will. Es wird auf dem Touch-screen eingeblendet und kann über diesen
auch bedient werden. WindowsCE zeigt das Soft-Keyboard automatisch an, sobald
der Anwender Text eingeben muss. Der Benutzer kann über das untenstehende
Symbol in der Taskbar das Soft-Keyboard aber auch jederzeit sonst einblenden.

901051A.MAN01.doc
Soft-Keyboard Icon in
der Taskbar

Der Anwender kann zwischen einem normalen Soft-Keyboard (Keyboard) und einem
grossen Soft-Keyboard (LargeKB) wählen. Weiter hat er die Möglichkeit, über das
Icon in der Taskbar auch das Mouse Panel oder das Panel für die Einstellung der
Helligkeit einzublenden (siehe auch Kapitel „Hot Keys“).
Der Soft-Keyboard-Treiber ist ein Teil des HotKeys-Treiber und wird beim Aufstarten
des Systems automatisch eingebunden und gestartet.

5. PCU, PC-Control Units

5.1 Übersicht
Dieses Kapitel beschreibt die Treiber, welche die Funktionalitäten der PC-Control
Units unterstützen. Diese Treiber sind hauptsächlich für die Interaktion zwischen
dem System und dem Anwender verantwortlich. Da die Control Units nicht über
einen Touch-screen verfügen, findet die Kommunikation zwischen dem System und
dem Anwender hauptsächlich über die I/O’s der Basis statt.

5.2 LED

901051A.MAN01.doc
Mikrap AG für Mikroelektronik-Applikation
Postfach 264 Tel: +41 (0)55 418 44 44
Langrütistrasse 33 Fax: +41 (0)55 418 44 33
CH-8840 Einsiedeln E-mail: info@mikrap.ch
Schweiz Internet: www.mikrap.com

901051A.MAN01.doc

Das könnte Ihnen auch gefallen