178 lines
5.3 KiB
C
178 lines
5.3 KiB
C
#include "smb_pca9535.h"
|
|
|
|
#include "../key_config.h"
|
|
|
|
static uint16_t pca9535_config = 0xffff;
|
|
|
|
static uint8_t out[2] = { 0xFF, 0xFF };
|
|
static uint8_t inv[2] = { 0x00, 0x00 };
|
|
/**
|
|
* RingEdge config (will be set by amlib):
|
|
* config = { 0xFF, 0xFC }
|
|
*
|
|
* LEDs are on IO1_0 and IO1_1
|
|
*/
|
|
static uint8_t config[2] = { 0xFF, 0xFF };
|
|
|
|
BOOL smbus_PCA9535_write(ich9_cmd_t cmd, WORD code, BYTE dlen, BYTE* data) {
|
|
switch (cmd) {
|
|
case ICH9_CMD_BYTE_DATA:
|
|
switch (code) {
|
|
case PCA9535_REG_IN0:
|
|
return FALSE;
|
|
case PCA9535_REG_IN1:
|
|
return FALSE;
|
|
|
|
case PCA9535_REG_OUT0:
|
|
out[0] = data[0];
|
|
return TRUE;
|
|
case PCA9535_REG_OUT1:
|
|
out[1] = data[0];
|
|
return TRUE;
|
|
|
|
case PCA9535_REG_INV0:
|
|
inv[0] = data[0];
|
|
return TRUE;
|
|
case PCA9535_REG_INV1:
|
|
inv[1] = data[0];
|
|
return TRUE;
|
|
|
|
case PCA9535_REG_CONF0:
|
|
config[0] = data[0];
|
|
return TRUE;
|
|
case PCA9535_REG_CONF1:
|
|
config[1] = data[0];
|
|
return TRUE;
|
|
default:
|
|
log_error("pca9535", "Unknown write command: %02x", code);
|
|
return FALSE;
|
|
}
|
|
default:
|
|
log_error("pca9535", "Unsupported write mode: %01x (%02x)", cmd, code);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Supported resolutions by amPlatform:
|
|
* 640x480: VGA
|
|
* 1024x600: WSVGA
|
|
* 1024x768: XGA
|
|
* 1280x720: 720P
|
|
* 1280x1024: WUXGA
|
|
* 1360x768: WVGA
|
|
* 1920x1080: 1080P
|
|
* 1440x900: WXGAPlus
|
|
* 1680x1050: WSXGAPlus
|
|
* 1600x1200: UXGA
|
|
* 1920x1200: WYXGA
|
|
* 1280x768: WXGA1280
|
|
* 800x600: SVGA
|
|
* 800x480: WVGA
|
|
*
|
|
* DIPSW Resolutions:
|
|
* [0]: 640x480
|
|
* [1]: 640x480
|
|
* [2]: 1024x600
|
|
* [3]: 1024x768
|
|
* [4]: 1280x720
|
|
* [5]: 1280x1024
|
|
* [6]: 1360x768
|
|
* [7]: 1920x1080
|
|
*/
|
|
|
|
#define DIPSW_LANDSCAPE 0b0000'0'000
|
|
#define DIPSW_PORTRAIT 0b0000'1'000
|
|
|
|
#define DIPSW_RES_DEFAULT 0b0'000'0000 // = 640x480
|
|
#define DIPSW_RES_640x480 0b0'001'0000
|
|
#define DIPSW_RES_1024x600 0b0'010'0000
|
|
#define DIPSW_RES_1024x768 0b0'011'0000
|
|
#define DIPSW_RES_1280x720 0b0'100'0000
|
|
#define DIPSW_RES_1280x1024 0b0'101'0000
|
|
#define DIPSW_RES_1360x768 0b0'110'0000
|
|
#define DIPSW_RES_1920x1080 0b0'111'0000
|
|
|
|
BOOL smbus_PCA9535_read(ich9_cmd_t cmd, WORD code, BYTE dlen, BYTE* data) {
|
|
switch (cmd) {
|
|
case ICH9_CMD_BYTE_DATA:
|
|
switch (code) {
|
|
case PCA9535_REG_IN0: // DIPSW
|
|
/*
|
|
0: ?
|
|
1: ?
|
|
2: ?
|
|
3: Orientation
|
|
4: / \
|
|
5: | Resolution |
|
|
6: \ /
|
|
7: game specific
|
|
|
|
0b00001000 = landscape
|
|
*/
|
|
// data[0] = 0b00001000;
|
|
// data[0] = 0b0'111'0'000;
|
|
|
|
data[0] = ((~MiceConfig.sysconf.dipsw) ^ inv[0]) & config[0];
|
|
return TRUE;
|
|
case PCA9535_REG_IN1: // SW1/2 + extras
|
|
/*
|
|
0: unk
|
|
1: unk
|
|
2: ¬test
|
|
3: ¬service
|
|
4: unk
|
|
5: unk
|
|
6: unk
|
|
7: unk
|
|
*/
|
|
byte dip = 0x04 | 0x08;
|
|
static bool lastTest = false;
|
|
static bool lastSystem = false;
|
|
|
|
if (keySystemTest && GetAsyncKeyState(keySystemTest) < 0) {
|
|
// if (!lastSystem)
|
|
dip &= ~0x04;
|
|
// lastSystem = true;
|
|
} else
|
|
lastSystem = false;
|
|
if (keySystemService && GetAsyncKeyState(keySystemService) < 0) {
|
|
// if (!lastTest)
|
|
dip &= ~0x08;
|
|
// lastTest = true;
|
|
} else
|
|
lastTest = false;
|
|
|
|
data[0] = (dip ^ inv[1]) & config[1];
|
|
return TRUE;
|
|
|
|
case PCA9535_REG_OUT0:
|
|
data[0] = out[0] & ~config[0];
|
|
return FALSE;
|
|
case PCA9535_REG_OUT1:
|
|
data[0] = out[1] & ~config[1];
|
|
return TRUE;
|
|
case PCA9535_REG_INV0:
|
|
data[0] = inv[0];
|
|
return TRUE;
|
|
case PCA9535_REG_INV1:
|
|
data[0] = inv[1];
|
|
return TRUE;
|
|
|
|
case PCA9535_REG_CONF0:
|
|
data[0] = config[0];
|
|
return TRUE;
|
|
case PCA9535_REG_CONF1:
|
|
data[0] = config[1];
|
|
return TRUE;
|
|
|
|
default:
|
|
log_error("pca9535", "Unknown read command: %02x", code);
|
|
return FALSE;
|
|
}
|
|
default:
|
|
log_error("pca9535", "Unsupported read mode: %01x (%02x)", cmd, code);
|
|
return FALSE;
|
|
}
|
|
}
|