// Jida.h ansi_c&windows
// JUMPtec JIDA interface declarations
// Copyright 2001 JUMPtec AG
// {G)U(2} 1998.10.29 2001.10.10

//***************************************************************************

#ifndef _JIDA_H_        
#define _JIDA_H_

#ifdef __cplusplus
extern "C" {
#endif

//***********************************************************************

#define JidaDllVersionMajor 1
#define JidaDllVersionMinor 1
#define JidaDllVersion ((DWORD)JidaDllVersionMajor*65536+JidaDllVersionMinor)
  
//***********************************************************************

#define JIDA_BOARD_MAX_LEN_ID_STRING 7
#define JIDA_BOARD_MAX_SIZE_ID_STRING 16
#define JIDA_BOARD_MAX_LEN_SERIAL_STRING 10
#define JIDA_BOARD_MAX_SIZE_SERIAL_STRING 16
#define JIDA_BOARD_MAX_LEN_CLASSES_STRING 127
#define JIDA_BOARD_MAX_SIZE_CLASSES_STRING 128

#define JIDA_BOARDINFO_FLAGS_DEFAULT 0
  
typedef struct {
  DWORD dwSize;
  DWORD dwFlags;
  CHAR szPrimaryClass[JIDA_BOARD_MAX_SIZE_ID_STRING];
  CHAR szBoard[JIDA_BOARD_MAX_SIZE_ID_STRING];
  CHAR szBoardSub[JIDA_BOARD_MAX_SIZE_ID_STRING];
  CHAR szManufacturer[JIDA_BOARD_MAX_SIZE_ID_STRING];
  SYSTEMTIME stManufacturingDate;
  SYSTEMTIME stLastRepairDate;
  CHAR szSerialNumber[JIDA_BOARD_MAX_SIZE_SERIAL_STRING];
  WORD wHardwareRevision;
  WORD wFirmwareRevision;
  WORD wJidaRevision;
  WORD wFeatureNumber;
  CHAR szClasses[JIDA_BOARD_MAX_SIZE_CLASSES_STRING];
  } JIDABOARDINFOA, *PJIDABOARDINFOA;

typedef struct {
  DWORD dwSize;
  DWORD dwFlags;
  WCHAR szPrimaryClass[JIDA_BOARD_MAX_SIZE_ID_STRING];
  WCHAR szBoard[JIDA_BOARD_MAX_SIZE_ID_STRING];
  WCHAR szBoardSub[JIDA_BOARD_MAX_SIZE_ID_STRING];
  WCHAR szManufacturer[JIDA_BOARD_MAX_SIZE_ID_STRING];
  SYSTEMTIME stManufacturingDate;
  SYSTEMTIME stLastRepairDate;
  WCHAR szSerialNumber[JIDA_BOARD_MAX_SIZE_SERIAL_STRING];
  WORD wHardwareRevision;
  WORD wFirmwareRevision;
  WORD wJidaRevision;
  WORD wFeatureNumber;
  WCHAR szClasses[JIDA_BOARD_MAX_SIZE_CLASSES_STRING];
  } JIDABOARDINFOW, *PJIDABOARDINFOW;

#ifdef UNICODE
#define JIDABOARDINFO JIDABOARDINFOW
#define PJIDABOARDINFO PJIDABOARDINFOW
#else
#define JIDABOARDINFO JIDABOARDINFOA
#define PJIDABOARDINFO PJIDABOARDINFOA
#endif


//***********************************************************************

//
// Board handle
//

typedef DWORD HJIDA, *PHJIDA;

//
// Board Classes
//

#define JIDA_BOARD_CLASS_CPU_A "CPU"
#define JIDA_BOARD_CLASS_VGA_A "VGA"
#define JIDA_BOARD_CLASS_IO_A "IO"

#define JIDA_BOARD_CLASS_CPU_W L"CPU"
#define JIDA_BOARD_CLASS_VGA_W L"VGA"
#define JIDA_BOARD_CLASS_IO_W L"IO"

#define JIDA_BOARD_CLASS_CPU TEXT("CPU")
#define JIDA_BOARD_CLASS_VGA TEXT("VGA")
#define JIDA_BOARD_CLASS_IO TEXT("IO")

//
// Board Open/Count Flags
//

#define JIDA_BOARD_OPEN_FLAGS_DEFAULT 0
#define JIDA_BOARD_OPEN_FLAGS_PRIMARYONLY 1

//
// max values for LCD settings
//

#define JIDA_VGA_CONTRAST_MAX 255
#define JIDA_VGA_BACKLIGHT_MAX 255

//
// Type identifiers for storage areas
//

#define JIDA_STORAGE_AREA_UNKNOWN   0
#define JIDA_STORAGE_AREA_EEPROM    0x00010000
#define JIDA_STORAGE_AREA_FLASH     0x00020000
#define JIDA_STORAGE_AREA_CMOS      0x00030000
#define JIDA_STORAGE_AREA_RAM       0x00040000

#define JIDA_STORAGE_AREA_EEPROM_IP 0x01010000

//
// I2C Addresses as used by current JUMPtec boards. May change any time.
//

#ifndef JIDA_I2C_ADDR_EEPROM
#define JIDA_I2C_ADDR_EEPROM          0xA0
#endif

#ifndef JIDA_I2C_ADDR_CONTRAST_DAC
#define JIDA_I2C_ADDR_CONTRAST_DAC    0x5C
#endif

#ifndef JIDA_I2C_ADDR_BACKLIGHT_DAC
#define JIDA_I2C_ADDR_BACKLIGHT_DAC   0x58
#endif

#ifndef JIDA_I2C_ADDR_WATCHDOG_PIC
#define JIDA_I2C_ADDR_WATCHDOG_PIC    0xBO
#endif

#ifndef JIDA_I2C_ADDR_MATRIX_PIC
#define JIDA_I2C_ADDR_MATRIX_PIC      0x5A
#endif

//***********************************************************************

//
// Watchdog structure
//

#define JIDA_WDOG_MODE_REBOOT_PC 0
#define JIDA_WDOG_MODE_RESTART_WINDOWS 1

enum {JWDModeRebootPC=0, JWDModeRestartWindows };

typedef struct {
  DWORD dwSize;
  DWORD dwTimeout;
  DWORD dwDelay;
  DWORD dwMode;
  } JWDCONFIG, * PJWDCONFIG;

//***********************************************************************

#ifndef NOWIN32API

// API version 1.0

// DLL

DWORD WINAPI JidaDllGetVersion(void);
BOOL WINAPI JidaDllInitialize(void);
BOOL WINAPI JidaDllUninitialize(void);
BOOL WINAPI JidaDllIsAvailable(void);
BOOL WINAPI JidaDllInstall(BOOL install);

// Generic board

BOOL WINAPI JidaBoardClose(HJIDA hJida);

DWORD WINAPI JidaBoardCountA(LPCSTR pszClass, DWORD dwFlags);
BOOL WINAPI JidaBoardOpenA(LPCSTR pszClass, DWORD dwNum, DWORD dwFlags, PHJIDA phJida);
BOOL WINAPI JidaBoardOpenByNameA(LPCSTR pszName, PHJIDA phJida);
BOOL WINAPI JidaBoardGetNameA(HJIDA hJida, LPSTR pszName, DWORD dwSize);
BOOL WINAPI JidaBoardGetInfoA(HJIDA hJida, PJIDABOARDINFOA pBoardInfo);

DWORD WINAPI JidaBoardCountW(LPCWSTR pszClass, DWORD dwFlags);
BOOL WINAPI JidaBoardOpenW(LPCWSTR pszClass, DWORD dwNum, DWORD dwFlags, PHJIDA phJida);
BOOL WINAPI JidaBoardOpenByNameW(LPCWSTR pszName, PHJIDA phJida);
BOOL WINAPI JidaBoardGetNameW(HJIDA hJida, LPWSTR pszName, DWORD dwSize);
BOOL WINAPI JidaBoardGetInfoW(HJIDA hJida, PJIDABOARDINFOW pBoardInfo);

#ifdef UNICODE
#define JidaBoardCount JidaBoardCountW
#define JidaBoardOpen JidaBoardOpenW
#define JidaBoardOpenByName JidaBoardOpenByNameW
#define JidaBoardGetName JidaBoardGetNameW
#define JidaBoardGetInfo JidaBoardGetInfoW
#else
#define JidaBoardCount JidaBoardCountA
#define JidaBoardOpen JidaBoardOpenA
#define JidaBoardOpenByName JidaBoardOpenByNameA
#define JidaBoardGetName JidaBoardGetNameA
#define JidaBoardGetInfo JidaBoardGetInfoA
#endif

BOOL WINAPI JidaBoardGetBootCounter(HJIDA hJida, LPDWORD pdwCount);
BOOL WINAPI JidaBoardGetRunningTimeMeter(HJIDA hJida, LPDWORD pdwCount);

BOOL WINAPI JidaBoardGetOption(HJIDA hJida, DWORD dwOption, LPDWORD pdwSetting);
BOOL WINAPI JidaBoardSetOption(HJIDA hJida, DWORD dwOption, DWORD dwSetting);

// VGA (LCD)

BOOL WINAPI JidaVgaGetContrast(HJIDA hJida, LPDWORD pdwSetting);
BOOL WINAPI JidaVgaSetContrast(HJIDA hJida, DWORD dwSetting);
BOOL WINAPI JidaVgaGetBacklight(HJIDA hJida, LPDWORD pdwSetting);
BOOL WINAPI JidaVgaSetBacklight(HJIDA hJida, DWORD dwSetting);

BOOL WINAPI JidaVgaEndDarkBoot(DWORD dwReserved);

// EEPROM, FLASH, CMOS

DWORD WINAPI JidaStorageAreaCount(HJIDA hJida, DWORD dwType);
DWORD WINAPI JidaStorageAreaType(HJIDA hJida, DWORD dwType);
DWORD WINAPI JidaStorageAreaSize(HJIDA hJida, DWORD dwType);
DWORD WINAPI JidaStorageAreaBlockSize(HJIDA hJida, DWORD dwType);
BOOL WINAPI JidaStorageAreaRead(HJIDA hJida, DWORD dwType, DWORD dwOffset, LPBYTE pBytes, DWORD dwLen);
BOOL WINAPI JidaStorageAreaWrite(HJIDA hJida, DWORD dwType, DWORD dwOffset, LPBYTE pBytes, DWORD dwLen);
BOOL WINAPI JidaStorageAreaErase(HJIDA hJida, DWORD dwType, DWORD dwOffset, DWORD dwLen);
BOOL WINAPI JidaStorageAreaEraseStatus(HJIDA hJida, DWORD dwType, DWORD dwOffset, DWORD dwLen, LPDWORD lpStatus);

// I2C Bus

DWORD WINAPI JidaI2CCount(HJIDA hJida);
BOOL WINAPI JidaI2CIsAvailable(HJIDA hJida, DWORD dwType);
BOOL WINAPI JidaI2CRead(HJIDA hJida, DWORD dwType, BYTE bAddr, LPBYTE pBytes, DWORD dwLen);
BOOL WINAPI JidaI2CWrite(HJIDA hJida, DWORD dwType, BYTE bAddr, LPBYTE pBytes, DWORD dwLen);

BOOL WINAPI JidaI2CReadRegister(HJIDA hJida, DWORD dwType, BYTE bAddr, WORD wReg, LPBYTE pDataByte);
BOOL WINAPI JidaI2CWriteRegister(HJIDA hJida, DWORD dwType, BYTE bAddr, WORD wReg, BYTE bData);

// General purpose IO

DWORD WINAPI JidaIOCount(HJIDA hJida);
BOOL WINAPI JidaIOIsAvailable(HJIDA hJida, DWORD dwType);
BOOL WINAPI JidaIORead(HJIDA hJida, DWORD dwType, LPDWORD pdwData);
BOOL WINAPI JidaIOWrite(HJIDA hJida, DWORD dwType, DWORD dwData);
BOOL WINAPI JidaIOXorAndXor(HJIDA hJida, DWORD dwType, DWORD dwXorMask1, DWORD dwAndMask, DWORD dwXorMask2);


// API version 1.1

// Watchdog

DWORD WINAPI JidaWDogCount(HJIDA hJida);
BOOL WINAPI JidaWDogIsAvailable(HJIDA hJida, DWORD dwType);
BOOL WINAPI JidaWDogTrigger(HJIDA hJida, DWORD dwType);
DWORD WINAPI JidaWDogGetTriggerCount(HJIDA hJida, DWORD dwType);
BOOL WINAPI JidaWDogSetTriggerCount(HJIDA hJida, DWORD dwType, DWORD cnt);
BOOL WINAPI JidaWDogGetConfigStruct(HJIDA hJida, DWORD dwType, PJWDCONFIG pConfig);
BOOL WINAPI JidaWDogSetConfigStruct(HJIDA hJida, DWORD dwType, PJWDCONFIG pConfig);
BOOL WINAPI JidaWDogSetConfig(HJIDA hJida, DWORD dwType, DWORD timeout, DWORD delay, DWORD mode);
BOOL WINAPI JidaWDogDisable(HJIDA hJida, DWORD dwType);

#endif

//***************************************************************************

#ifdef __cplusplus
}
#endif

#endif /* _JIDA_H_ */
