Beruflich Dokumente
Kultur Dokumente
Treiberhandbuch
ModuNORM
ModuNORM® XScale Treiberhandbuch
Änderungsnachweis
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
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
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)
MNSysKernelIoControl
Prototyp BOOL MNSysKernelIoControl(DWORD dwIoControlCode,
LPVOID pvInBuf, DWORD dwInBufSize, LPVOID pvOutBuf,
DWORD dwOutBufSize, DWORD* pdwBytesReturned)
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.
dwInBufSize sizeof(MNS_ADD_TIMER_INPARAM)
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.
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.
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.
dwInBufSize sizeof(MNS_START_TIMER_INPARAM)
pvOutBuf -
dwOutBufSize -
MNS_STOP_TIMER
Zweck Durch den Aufruf dieser Funktion wird ein gestarteter Timer gestoppt.
dwInBufSize sizeof(HANDLE)
pvOutBuf -
dwOutBufSize -
MNS_REMOVE_TIMER
Zweck Diese Funktion entfernt einen initialisierten Timer und gibt dessen
benötigten Ressourcen frei.
dwInBufSize sizeof(HANDLE)
pvOutBuf -
dwOutBufSize -
MNS_GET_TIMER_PARAM
Zweck Mit Hilfe dieser Funktion erhält man die Parameter von MNTimer.
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;
MNS_IISR_TIMER_INPARAM
Definition typedef struct MNS_IISR_TIMER_INPARAM_
{
HANDLE hTimer;
BYTE bInt;
DWORD dwCallInTicks;
} MNS_IISR_TIMER_INPARAM;
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_;
MNS_START_TIMER_INPARAM
Definition typedef struct MNS_START_TIMER_INPARAM_
{
HANDLE hTimer;
DWORD dwCallInTicks;
} MNS_START_TIMER_INPARAM;
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)
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
901051A.MAN01.doc
dwIoControlCode IOCTL_EEPROM_READ_BYTE
dwInBufSize sizeof(DWORD)
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
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
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
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
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
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
pvInBuf NULL
dwInBufSize 0
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;
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.
FileHelp-Funktionen:
FindFirstFileRecursive
Prototyp HANDLE FindFirstFileRecursive(LPCSTR lpFileName,
LPWIN32_FIND_DATA lpFindFileData, TCHAR **ppstDir)
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.
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.
VAllocMem-Funktionen:
MapVirtualMem
Prototyp PVOID MapVirtualMem(DWORD dwVirtAddr, DWORD dwSize)
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)
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.
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.
901051A.MAN01.doc
ToWrite
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.
CloseHandle
Prototyp BOOL CloseHandle(HANDLE hObject)
Funktion Mit dieser Funktion wird die durch CreateFile() geöffnete CAN-
Schnittstelle wieder geschlossen.
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)
CanStop
Prototyp BOOL CanStop(HANDLE hDevice)
Funktion Mit dieser Funktion wird die durch CanStart() initialisierte CAN-
Schnittstelle wieder deinitialisiert.
CanWriteMsg2
Prototyp BOOL CanWriteMsg2(HANDLE hDevice, CAN_MSG* pCanMsg,
DWORD dwMsgToWrite, DWORD* pdwMsgWritten, BYTE
bFifoNbr)
901051A.MAN01.doc
tatsächlich versendet wurden.
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.
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.
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.
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.
CanGetLastError
Prototyp BOOL CanGetLastError(HANDLE hDevice, BYTE* pbyState)
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;
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.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().
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.
901051A.MAN01.doc
Zustand der Stützbatterie.
dwLen sizeof(PSYSTEM_POWER_STATUS_EX2)
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;
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.
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!
SerReadError
Prototyp BOOL SerReadError(HANDLE hDevice, UINT32 *error)
901051A.MAN01.doc
Senden oder Empfangen
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()).
StartHwWatchdog
Prototyp HANDLE StartHwWatchdog(DWORD dwTimeout)
Funktion Mit dieser Funktion wird der Watchdog des Prozessors mit der
übergebenen Timeout-Zeit initialisiert und gestartet.
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.
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.
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.
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.
WinCE-
OEMSetRealTime() OEMGetRealTime()
Kern,
RTC-
Treiber
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.
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.
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;
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
Y:= GetPoint
PenIsDown?
X, Y
X, Y FALSE: Init Codec für Intr.
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.
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.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.
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.
Mouse Panel
Ist einer Taste die Funktion Mouse Panel zugeordnet, erscheint nach einem Druck
auf die Taste folgendes Symbol:
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.
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.
GetKeyCode
Prototyp BOOL GetKeyCode(HANDLE hDevice, BYTE *pbKeyNbr,
sRegKeyCode *psRegKeyCode)
Funktion Mit Hilfe dieser Funktion erhält der Anwender die Einstellungen der
übergebenen Tastennummer.
901051A.MAN01.doc
SetKeyCode
Prototyp BOOL SetKeyCode(HANDLE hDevice, sRegKeyCode
*psKeyCode)
Funktion Durch diese Funktion kann der Anwender die Einstellungen der
übergebenen Taste ändern.
4.7.3 Datentypen
SRegKeyCode
Definition typedef struct
{
BYTE config;
USHORT KeyCode[4];
BYTE KeyNbr;
DWORD TimeToRepeat;
DWORD DelayBetweenRepeat;
} sRegKeyCode;
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.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