COM iMX25 WinCE: Difference between revisions

From Wiki-DB
Jump to navigationJump to search
Christoph (talk | contribs)
Created page with "== Registry Settings == === LCD Controller === [HKEY_LOCAL_MACHINE\Drivers\Display\LCDC] "PanelType"=dword:1 ; LCD Panel identifier ; Descript..."
 
Ageisreiter (talk | contribs)
 
(12 intermediate revisions by 3 users not shown)
Line 1: Line 1:
== FAQ ==
:'''Q: How long does it take to start WinCE from MicroSD Card?'''
:'''A:''' Start time is depending on the image size. With normal image size of 10MByte (nk.gz file) it takes roughly 18 up to 20 seconds to boot WinCE.
:'''Q: How long does it take to start WinCE from NAND flash?'''
:'''A:''' Start time is depending on the image size. With normal image size of 10MByte (nk.gz file) it takes roughly 16 up to 18 seconds to boot WinCE.
== Registry Settings ==
== Registry Settings ==


Line 21: Line 27:
  [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NAND_Flash]
  [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NAND_Flash]
   “FlashDiskBaseAddress“=dword:02000000  ; Configures the WinCE NAND FlashDisk Base address
   “FlashDiskBaseAddress“=dword:02000000  ; Configures the WinCE NAND FlashDisk Base address
== DHHalLib (function library) ==
The DHHalLib provides hardware related functions for Windows Embedded CE 6 and Windows Embedded Compact 7. All the functionality is available from the user mode.
=== Version numbers ===
:'''Read DHHalLib version'''
:{| class="wikitable"
|''<code> unsigned long DHHalLibGetVersion() </code>''
|}
:Return value: <code>unsigned long</code> --> version number (e.g. 0x01040001 for version 1.4.0.1)
:'''BSP version'''
:{| class="wikitable"
|''<code> unsigned long BSPGetVersion() </code>''
|}
:Return value: <code>unsigned long</code> --> version number (e.g. 0x01040001 for version 1.4.0.1)
:Note: The version number information is stored in the following registry key: <code>[HKEY_LOCAL_MACHINE\Ident] dword:"BSPVersionNumber"</code>
:'''Read image version'''
:{| class="wikitable"
|''<code> unsigned long WinCEImageGetVersion() </code>''
|}
:Return value: <code>unsigned long</code> --> version number (e.g. 0x01040001 for version 1.4.0.1)
=== I2C ===
:'''Read'''
:{| class="wikitable"
|''<code> bool I2CRead( unsigned char cI2CPort, unsigned char cDevId, unsigned char cI2CReg, bool bSendStop, unsigned char *pOutBuffer) </code>''
|}
:Input values:
::<code>unsigned char cI2CPort</code> = DHCOM I2C port number (1.. 2)
::<code>unsigned char iDevId</code> = I2C device address (0..127)
::<code>unsigned char iI2CReg</code> = I2C device register address (0..255)
::<code>bool bSendStop</code> = send or not send stop bit at the end of the transfer (true --> stop bit is generated)
::<code>unsigned char *pOutBuffer</code> = Pointer to the read byte
:Return value: <code>bool</code> --> true = success; false = failed
:'''Write'''
:{| class="wikitable"
|''<code> bool I2CWrite( unsigned char cI2CPort, unsigned char cDevId, unsigned char cI2CReg, unsigned char cValue, bool bSendStop) </code>''
|}
:Input values:
::<code>unsigned char cI2CPort</code> = DHCOM I2C port number (1.. 2)
::<code>unsigned char iDevId</code> = I2C device address (0..127)
::<code>unsigned char iI2CReg</code> = I2C device register address (0..255)
::<code>unsigned char iValue</code> = Value to be written
::<code>bool bSendStop</code> = send or not send stop bit at the end of the transfer (true --> stop bit is generated)
:Return value: <code>bool</code> --> true = success; false = failed
:'''Read multiple bytes'''
:{| class="wikitable"
|''<code> bool I2CReadMultipleBytes( unsigned char cI2CPort, unsigned char cDevId, unsigned char cI2CReg, unsigned char cBytes, bool bSendStop, unsigned char *pOutBuffer) </code>''
|}
:Input values:
::<code>unsigned char cI2CPort</code> = DHCOM I2C port number (1.. 2)
::<code>unsigned char iDevId</code> = I2C device address (0..127)
::<code>unsigned char iI2CReg</code> = I2C device register address (0..255)
::<code>unsigned char cBytes</code> = Number of bytes to be read (max. 255)
::<code>bool bSendStop</code> = send or not send stop bit at the end of the transfer (true --> stop bit is generated)
::<code>unsigned char *pOutBuffer</code> = Pointer to the read buffer
:Return value: <code>bool</code> --> true = success; false = failed
:'''Write multiple bytes'''
:{| class="wikitable"
|''<code> bool I2CWriteMultipleBytes( unsigned char cI2CPort, unsigned char cDevId, unsigned char cI2CReg, unsigned char cBytes, bool bSendStop, unsigned char *pInBuffer)</code>''
|}
:Input values:
::<code>unsigned char cI2CPort</code> = DHCOM I2C port number (1.. 2)
::<code>unsigned char iDevId</code> = I2C device address (0..127)
::<code>unsigned char iI2CReg</code> = I2C device register address (0..255)
::<code>unsigned char cBytes</code> = Number of bytes to be written (max. 255)
::<code>bool bSendStop</code> = send or not send stop bit at the end of the transfer (true --> stop bit is generated)
::<code>unsigned char *pInBuffer</code> = Pointer to the input buffer
:Return value: <code>bool</code> --> true = success; false = failed
:'''Bus scan'''
:{| class="wikitable"
|''<code> bool I2CProbe(unsigned char cI2CPort, unsigned char cDevId)</code>''
|}
:Description:
::Scans the bus for the specified device address. Is this achievable, then the function returns "true".
:Input values:
::<code>unsigned char cI2CPort</code> = DHCOM I2C port number (1.. 2)
::<code>unsigned char iDevId</code> = I2C device address (0..127)
:Return value: <code>bool</code> --> true = success; false = failed
=== GPIO ===
:'''Note:''' These functions can only access the DHCOM standard GPIOs. The mapping is done with the following enum.
  enum DHCOM_GPIOEnum
  {
    DHCOM_GPIO_A,
    DHCOM_GPIO_B,
    DHCOM_GPIO_C,
    DHCOM_GPIO_D,
    DHCOM_GPIO_E,
    DHCOM_GPIO_F,
    DHCOM_GPIO_G,
    DHCOM_GPIO_H,
    DHCOM_GPIO_I,
    DHCOM_GPIO_J,
    DHCOM_GPIO_K,
    DHCOM_GPIO_L,
    DHCOM_GPIO_M,
    DHCOM_GPIO_N,
    DHCOM_GPIO_O,
    DHCOM_GPIO_P,
    DHCOM_GPIO_Q,
    DHCOM_GPIO_R,
    DHCOM_GPIO_S,
    DHCOM_GPIO_T,
    DHCOM_GPIO_U,
    DHCOM_GPIO_NOT_DEFINED
  };
:'''Direction'''
:{| class="wikitable"
|''<code> bool GPIOSetDirection( DHCOM_GPIOEnum eGpio, bool bInOut, bool bDefaultState) </code>''
|}
:Input values:
::<code>DHCOM_GPIOEnum eGpio </code>= DHCOM GPIO pin name
::<code>bool bInOut</code> = GPIO direction (1 = input / 0 = output)
::<code>bool bDefaultState </code>= Default state (0 = low / 1 = high)
:Return value: <code>bool</code> --> true = success; false = failed
:'''Set state'''
:{| class="wikitable"
|''<code> void GPIOSetPin(DHCOM_GPIOEnum eGpio, bool bState) </code>''
|}
:Input values:
::<code>DHCOM_GPIOEnum eGpio</code> = DHCOM GPIO pin name
::<code>bool bState</code> = pin state ( 0 = low / 1 = high)
:'''Read state'''
:{| class="wikitable"
|''<code> bool GPIOGetPin(DHCOM_GPIOEnum eGpio) </code>''
|}
:Input values:
::<code>DHCOM_GPIOEnum eGpio</code> = DHCOM GPIO pin name
:Return value: <code>bool</code> --> 0 = low; 1 = high
=== Memory ===
:'''Read physical address'''
:{| class="wikitable"
|''<code> int ReadPhysicalAddress(int iPhyAddr, unsigned char cRegSize) </code>''
|}
:Input values:
::<code>int iPhyAddr</code> = Physical address
::<code>unsigned char cRegSize</code> = Register size (16 = 16bit; 32 = 32bit)
:Return value: <code>int</code> --> current value of the physical address
:'''Write physical address'''
:{| class="wikitable"
|''<code> int WritePhysicalAddress( int iPhyAddr, unsigned char cRegSize, int iValue, bool bReadBack) </code>''
|}
:Input values:
::<code>int iPhyAddr</code> = physical address
::<code>unsigned char cRegSize</code> = Register size (16 = 16bit; 32 = 32bit)
::<code>int iValue</code> = Value to be written
::<code>bool bReadBack</code> = true --> the current value is read back after the write; false --> the current value isn’t read back after the write
:Return value: <code>int</code> --> content of the physical address after write, if <code>bReadBack</code> = true. Otherwise the function returns 0.
:'''Map physical memory'''
:{| class="wikitable"
|''<code> PVOID UserMmMapIoSpace(ULONG PhysicalAddress, ULONG NumberOfBytes, BOOLEAN CacheEnable) </code>''
|}
:Input values:
::<code>ULONG PhysicalAddress </code>= physical address
::<code>ULONG NumberOfBytes </code>= Number of bytes to map
::<code>BOOLEAN CacheEnable</code> = true --> Cached memory map; false --> Uncached memory map
:Return value: <code>PVOID</code> --> virtual base address of the mapped memory
:Note: From WinCE 6, the function <code> MmMapIoSpace()</code> can not be called from the user mode. THis library function provides a workaround.
:'''UnMap physical memory'''
:{| class="wikitable"
|''<code> void UserMmUnmapIoSpace(PVOID BaseAddress, ULONG NumberOfBytes) </code>''
|}
:Input values:
::<code>PVOID BaseAddress </code> = pointer to virtual base address of the mapped memory
::<code>ULONG NumberOfBytes </code> = Number of mapped bytes
:Note: From WinCE 6, the function <code> MmUnmapIoSpace() </code> can not be called from the user mode. THis library function provides a workaround.
=== Backlight ===
:'''PWM'''
:{| class="wikitable"
|''<code> bool SetBacklightPWM(int iPercent) </code>''
|}
:Input values:
::<code>int iPercent</code> = Backlight brightness in percent
:Return value: <code>bool</code> --> true = success; false = failed
=== Touch screen===
:'''Calibrate touch'''
:{| class="wikitable"
|''<code> bool CalibrateTouch() </code>''
|}
:Return value: <code>bool</code> --> true = success; false = failed
:'''Save calibration data'''
:{| class="wikitable"
|''<code> bool SaveTouchCalibrationData() </code>''
|}
:Description:
:: This function sets the registry entry <code>[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH] dword:"TouchCalibrationDone"</code> to the value 1. For saving the value permanent please call <code>SaveRegistry()</code> afterwards.
:Return value: <code>bool</code> --> true = success; false = failed
:'''Clear calibration data'''
:{| class="wikitable"
|''<code> bool ClearTouchCalibrationData() </code>''
|}
:Description:
:: This function sets the registry entry <code>[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH] dword:"TouchCalibrationDone" </code>to the value 0. For saving the value permanent please call <code>SaveRegistry() </code>afterwards.
:Return value: <code>bool</code> --> true = success; false = failed
=== Registry ===
:'''Save HIVE registry'''
:{| class="wikitable"
|''<code> bool SaveRegistry() </code>''
|}
:Return value: <code>bool</code> --> true = success; false = failed
:'''Create backup'''
:{| class="wikitable"
|''<code> bool CreateRegistryBackup() </code>''
|}
:Description:
:: This function generates the files ave_HKLM_Reg.srg and Save_HKLCU_Reg.srg in the folder \Storage Card\. These files can be used at a later time to restore the registry.
:Return value: <code>bool</code> --> true = success; false = failed
:'''Restore backup'''
:{| class="wikitable"
|''<code> bool RestoreRegistryBackup() </code>''
|}
:Description:
:: This function restores the registry from the files Save_HKLM_Reg.srg and Save_HKLCU_Reg.srg in the folder \Storage Card\. Afterwards a restart is carried out automatically. If the backup files are not present, then the function returns the return value flase.
:Return value: <code>bool</code> --> true = this never happens because a soft reset is performed; false = failed
=== Watchdog & Reset ===
:'''Soft reset'''
:{| class="wikitable"
|''<code> void SoftReset() </code>''
|}
:'''Set Watchdog Timer'''
:{| class="wikitable"
|''<code> void SetWatchdog(unsigned char cTime) </code>''
|}
:Input values:
::<code>unsigned char cTime</code> = Watchdog timeout value (0 = 0.5sec., 1 = 1.0sec., ...)
:'''Retrigger Watchdog Timer'''
:{| class="wikitable"
|''<code> void ReloadWatchdog() </code>''
|}

Latest revision as of 15:42, 12 November 2012

FAQ

Q: How long does it take to start WinCE from MicroSD Card?
A: Start time is depending on the image size. With normal image size of 10MByte (nk.gz file) it takes roughly 18 up to 20 seconds to boot WinCE.
Q: How long does it take to start WinCE from NAND flash?
A: Start time is depending on the image size. With normal image size of 10MByte (nk.gz file) it takes roughly 16 up to 18 seconds to boot WinCE.

Registry Settings

LCD Controller

[HKEY_LOCAL_MACHINE\Drivers\Display\LCDC]
  "PanelType"=dword:1    ; LCD Panel identifier 
                         ; Description: Set "PanelType" = 0 to use the bootloader LCD controller settings, which can be programmed to NAND Flash via settings.bin file.
[HKEY_LOCAL_MACHINE\SYSTEM\GDI\ROTATION]
  "Angle"=dword:0        ; no rotation
                         ; "Angle"=dword:5A --> 90 degrees rotated clockwise
                         ; "Angle"=dword:B4 --> 180 degrees rotated clockwise
                         ; "Angle"=dword:10E --> 270 degrees rotated clockwise

Task Bar Look

[HKEY_LOCAL_MACHINE\Explorer]
  “QVGA“=dword:00000001  ; Change Task bar style: 0 --> normal Windows look, 1 --> PDA look

NAND Flash (FlashDisk) base address

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NAND_Flash]
  “FlashDiskBaseAddress“=dword:02000000  ; Configures the WinCE NAND FlashDisk Base address

DHHalLib (function library)

The DHHalLib provides hardware related functions for Windows Embedded CE 6 and Windows Embedded Compact 7. All the functionality is available from the user mode.

Version numbers

Read DHHalLib version
unsigned long DHHalLibGetVersion()
Return value: unsigned long --> version number (e.g. 0x01040001 for version 1.4.0.1)
BSP version
unsigned long BSPGetVersion()
Return value: unsigned long --> version number (e.g. 0x01040001 for version 1.4.0.1)
Note: The version number information is stored in the following registry key: [HKEY_LOCAL_MACHINE\Ident] dword:"BSPVersionNumber"
Read image version
unsigned long WinCEImageGetVersion()
Return value: unsigned long --> version number (e.g. 0x01040001 for version 1.4.0.1)

I2C

Read
bool I2CRead( unsigned char cI2CPort, unsigned char cDevId, unsigned char cI2CReg, bool bSendStop, unsigned char *pOutBuffer)
Input values:
unsigned char cI2CPort = DHCOM I2C port number (1.. 2)
unsigned char iDevId = I2C device address (0..127)
unsigned char iI2CReg = I2C device register address (0..255)
bool bSendStop = send or not send stop bit at the end of the transfer (true --> stop bit is generated)
unsigned char *pOutBuffer = Pointer to the read byte
Return value: bool --> true = success; false = failed
Write
bool I2CWrite( unsigned char cI2CPort, unsigned char cDevId, unsigned char cI2CReg, unsigned char cValue, bool bSendStop)
Input values:
unsigned char cI2CPort = DHCOM I2C port number (1.. 2)
unsigned char iDevId = I2C device address (0..127)
unsigned char iI2CReg = I2C device register address (0..255)
unsigned char iValue = Value to be written
bool bSendStop = send or not send stop bit at the end of the transfer (true --> stop bit is generated)
Return value: bool --> true = success; false = failed
Read multiple bytes
bool I2CReadMultipleBytes( unsigned char cI2CPort, unsigned char cDevId, unsigned char cI2CReg, unsigned char cBytes, bool bSendStop, unsigned char *pOutBuffer)
Input values:
unsigned char cI2CPort = DHCOM I2C port number (1.. 2)
unsigned char iDevId = I2C device address (0..127)
unsigned char iI2CReg = I2C device register address (0..255)
unsigned char cBytes = Number of bytes to be read (max. 255)
bool bSendStop = send or not send stop bit at the end of the transfer (true --> stop bit is generated)
unsigned char *pOutBuffer = Pointer to the read buffer
Return value: bool --> true = success; false = failed
Write multiple bytes
bool I2CWriteMultipleBytes( unsigned char cI2CPort, unsigned char cDevId, unsigned char cI2CReg, unsigned char cBytes, bool bSendStop, unsigned char *pInBuffer)
Input values:
unsigned char cI2CPort = DHCOM I2C port number (1.. 2)
unsigned char iDevId = I2C device address (0..127)
unsigned char iI2CReg = I2C device register address (0..255)
unsigned char cBytes = Number of bytes to be written (max. 255)
bool bSendStop = send or not send stop bit at the end of the transfer (true --> stop bit is generated)
unsigned char *pInBuffer = Pointer to the input buffer
Return value: bool --> true = success; false = failed
Bus scan
bool I2CProbe(unsigned char cI2CPort, unsigned char cDevId)
Description:
Scans the bus for the specified device address. Is this achievable, then the function returns "true".
Input values:
unsigned char cI2CPort = DHCOM I2C port number (1.. 2)
unsigned char iDevId = I2C device address (0..127)
Return value: bool --> true = success; false = failed

GPIO

Note: These functions can only access the DHCOM standard GPIOs. The mapping is done with the following enum.
  enum DHCOM_GPIOEnum
  {
    DHCOM_GPIO_A,
    DHCOM_GPIO_B,
    DHCOM_GPIO_C,
    DHCOM_GPIO_D,
    DHCOM_GPIO_E,
    DHCOM_GPIO_F,
    DHCOM_GPIO_G,
    DHCOM_GPIO_H,
    DHCOM_GPIO_I,
    DHCOM_GPIO_J,
    DHCOM_GPIO_K,
    DHCOM_GPIO_L,
    DHCOM_GPIO_M,
    DHCOM_GPIO_N,
    DHCOM_GPIO_O,
    DHCOM_GPIO_P,
    DHCOM_GPIO_Q,
    DHCOM_GPIO_R,
    DHCOM_GPIO_S,
    DHCOM_GPIO_T,
    DHCOM_GPIO_U,
    DHCOM_GPIO_NOT_DEFINED
  };
Direction
bool GPIOSetDirection( DHCOM_GPIOEnum eGpio, bool bInOut, bool bDefaultState)
Input values:
DHCOM_GPIOEnum eGpio = DHCOM GPIO pin name
bool bInOut = GPIO direction (1 = input / 0 = output)
bool bDefaultState = Default state (0 = low / 1 = high)
Return value: bool --> true = success; false = failed
Set state
void GPIOSetPin(DHCOM_GPIOEnum eGpio, bool bState)
Input values:
DHCOM_GPIOEnum eGpio = DHCOM GPIO pin name
bool bState = pin state ( 0 = low / 1 = high)
Read state
bool GPIOGetPin(DHCOM_GPIOEnum eGpio)
Input values:
DHCOM_GPIOEnum eGpio = DHCOM GPIO pin name
Return value: bool --> 0 = low; 1 = high

Memory

Read physical address
int ReadPhysicalAddress(int iPhyAddr, unsigned char cRegSize)
Input values:
int iPhyAddr = Physical address
unsigned char cRegSize = Register size (16 = 16bit; 32 = 32bit)
Return value: int --> current value of the physical address
Write physical address
int WritePhysicalAddress( int iPhyAddr, unsigned char cRegSize, int iValue, bool bReadBack)
Input values:
int iPhyAddr = physical address
unsigned char cRegSize = Register size (16 = 16bit; 32 = 32bit)
int iValue = Value to be written
bool bReadBack = true --> the current value is read back after the write; false --> the current value isn’t read back after the write
Return value: int --> content of the physical address after write, if bReadBack = true. Otherwise the function returns 0.
Map physical memory
PVOID UserMmMapIoSpace(ULONG PhysicalAddress, ULONG NumberOfBytes, BOOLEAN CacheEnable)
Input values:
ULONG PhysicalAddress = physical address
ULONG NumberOfBytes = Number of bytes to map
BOOLEAN CacheEnable = true --> Cached memory map; false --> Uncached memory map
Return value: PVOID --> virtual base address of the mapped memory
Note: From WinCE 6, the function MmMapIoSpace() can not be called from the user mode. THis library function provides a workaround.
UnMap physical memory
void UserMmUnmapIoSpace(PVOID BaseAddress, ULONG NumberOfBytes)
Input values:
PVOID BaseAddress = pointer to virtual base address of the mapped memory
ULONG NumberOfBytes = Number of mapped bytes
Note: From WinCE 6, the function MmUnmapIoSpace() can not be called from the user mode. THis library function provides a workaround.


Backlight

PWM
bool SetBacklightPWM(int iPercent)
Input values:
int iPercent = Backlight brightness in percent
Return value: bool --> true = success; false = failed

Touch screen

Calibrate touch
bool CalibrateTouch()
Return value: bool --> true = success; false = failed
Save calibration data
bool SaveTouchCalibrationData()
Description:
This function sets the registry entry [HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH] dword:"TouchCalibrationDone" to the value 1. For saving the value permanent please call SaveRegistry() afterwards.
Return value: bool --> true = success; false = failed
Clear calibration data
bool ClearTouchCalibrationData()
Description:
This function sets the registry entry [HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH] dword:"TouchCalibrationDone" to the value 0. For saving the value permanent please call SaveRegistry() afterwards.
Return value: bool --> true = success; false = failed

Registry

Save HIVE registry
bool SaveRegistry()
Return value: bool --> true = success; false = failed
Create backup
bool CreateRegistryBackup()
Description:
This function generates the files ave_HKLM_Reg.srg and Save_HKLCU_Reg.srg in the folder \Storage Card\. These files can be used at a later time to restore the registry.
Return value: bool --> true = success; false = failed
Restore backup
bool RestoreRegistryBackup()
Description:
This function restores the registry from the files Save_HKLM_Reg.srg and Save_HKLCU_Reg.srg in the folder \Storage Card\. Afterwards a restart is carried out automatically. If the backup files are not present, then the function returns the return value flase.
Return value: bool --> true = this never happens because a soft reset is performed; false = failed

Watchdog & Reset

Soft reset
void SoftReset()
Set Watchdog Timer
void SetWatchdog(unsigned char cTime)
Input values:
unsigned char cTime = Watchdog timeout value (0 = 0.5sec., 1 = 1.0sec., ...)
Retrigger Watchdog Timer
void ReloadWatchdog()