diff options
Diffstat (limited to 'SrcShared/Hardware/EmRegsVZPalmM500.cpp')
-rw-r--r-- | SrcShared/Hardware/EmRegsVZPalmM500.cpp | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/SrcShared/Hardware/EmRegsVZPalmM500.cpp b/SrcShared/Hardware/EmRegsVZPalmM500.cpp new file mode 100644 index 0000000..420de8b --- /dev/null +++ b/SrcShared/Hardware/EmRegsVZPalmM500.cpp @@ -0,0 +1,259 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2000-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#include "EmCommon.h" +#include "EmRegsVZPalmM500.h" +#include "EmRegsVZPrv.h" + +#include "EmSPISlaveADS784x.h" // EmSPISlaveADS784x + +#define hwrVZPortBALARM_LED 0x40 // (L) Alarm LED + +#define hwrVZPortDSpi1Card 0x20 // (-) SPI #1, slot 0, SD/MMC Card Detect EOR Wake EOR Ready (aka IRQ2) +#define hwrVZPortDPowerFail 0x80 // (L) Power Fail interrupt (aka IRQ6) + +#define hwrVZPortGEL_ON 0x02 // (L) EL_ON +#define hwrVZPortGADC_CS_N 0x04 // (H) ADC_CS# +#define hwrVZPortG232_SHDN_N 0x08 // (L) 232_SHDN# + +#define hwrVZPortKLCDOn 0x02 // (-) LCD_DISP_ON (RW#) +#define hwrVZPortKAC_PWR_N 0x04 // (-) AC_PWR# (LDS#) +#define hwrVZPortKVibeEn 0x10 // (-) VIBE_EN +#define hwrVZPortKKbdRow0 0x20 // (H) Keyboard Row 0 +#define hwrVZPortKKbdRow1 0x40 // (H) Keyboard Row 1 +#define hwrVZPortKKbdRow2 0x80 // (H) Keyboard Row 2 + +#define hwrVZPortMIR_SD 0x20 // (L) Infrared Shut-down + + +const int kNumButtonRows = 3; +const int kNumButtonCols = 4; + +const uint16 kGenericMonoMap[kNumButtonRows][kNumButtonCols] = +{ + { keyBitHard1, keyBitHard2, keyBitHard3, keyBitHard4 }, + { keyBitPageUp, keyBitPageDown, 0, 0 }, + { keyBitPower, keyBitContrast, keyBitHard2, 0 } +}; + + +// --------------------------------------------------------------------------- +// ¥ EmRegsVZPalmM500::EmRegsVZPalmM500 +// --------------------------------------------------------------------------- + +EmRegsVZPalmM500::EmRegsVZPalmM500 (void) : + EmRegsVZ (), + fSPISlaveADC (new EmSPISlaveADS784x (kChannelSet1)) +{ +} + + +// --------------------------------------------------------------------------- +// ¥ EmRegsVZPalmM500::~EmRegsVZPalmM500 +// --------------------------------------------------------------------------- + +EmRegsVZPalmM500::~EmRegsVZPalmM500 (void) +{ + delete fSPISlaveADC; +} + + +// --------------------------------------------------------------------------- +// ¥ EmRegsVZPalmM500::GetLCDScreenOn +// --------------------------------------------------------------------------- + +Bool EmRegsVZPalmM500::GetLCDScreenOn (void) +{ + return (READ_REGISTER (portKData) & hwrVZPortKLCDOn) != 0; +} + + +// --------------------------------------------------------------------------- +// ¥ EmRegsVZPalmM500::GetLCDBacklightOn +// --------------------------------------------------------------------------- + +Bool EmRegsVZPalmM500::GetLCDBacklightOn (void) +{ + return (READ_REGISTER (portGData) & hwrVZPortGEL_ON) != 0; +} + + +// --------------------------------------------------------------------------- +// ¥ EmRegsVZPalmM500::GetLineDriverState +// --------------------------------------------------------------------------- +// Return whether or not the line drivers for the given object are open or +// closed. + +Bool EmRegsVZPalmM500::GetLineDriverState (EmUARTDeviceType type) +{ + if (type == kUARTSerial) + return (READ_REGISTER (portGData) & hwrVZPortG232_SHDN_N) != 0; + + if (type == kUARTIR) + return (READ_REGISTER (portMData) & hwrVZPortMIR_SD) == 0; + + if (type == kUARTMystery) + return true; + + return false; +} + + +// --------------------------------------------------------------------------- +// ¥ EmRegsVZPalmM500::GetUARTDevice +// --------------------------------------------------------------------------- +// Return what sort of device is hooked up to the given UART. + +EmUARTDeviceType EmRegsVZPalmM500::GetUARTDevice (int uartNum) +{ + Bool serEnabled = this->GetLineDriverState (kUARTSerial); + Bool irEnabled = this->GetLineDriverState (kUARTIR); + + // It's probably an error to have them both enabled at the same + // time. !!! TBD: make this an error message. + + EmAssert (!(serEnabled && irEnabled)); + + /* + From Michael Cortopassi: + + UART 1 for IRda + UART 2 for hotsync + */ + + if (uartNum == 0) + { + if (irEnabled) + return kUARTIR; + } + else if (uartNum == 1) + { + if (serEnabled) + return kUARTSerial; + } + + return kUARTNone; +} + + +// --------------------------------------------------------------------------- +// ¥ EmRegsVZPalmM500::GetVibrateOn +// --------------------------------------------------------------------------- + +Bool EmRegsVZPalmM500::GetVibrateOn (void) +{ + return (READ_REGISTER (portKData) & hwrVZPortKVibeEn) != 0; +} + + +// --------------------------------------------------------------------------- +// ¥ EmRegsVZPalmM500::GetLEDState +// --------------------------------------------------------------------------- + +uint16 EmRegsVZPalmM500::GetLEDState (void) +{ + uint16 result = kLEDOff; + UInt8 portBData = READ_REGISTER (portBData); + + if (portBData & hwrVZPortBALARM_LED) + result |= kLEDGreen; + + return result; +} + + +// --------------------------------------------------------------------------- +// ¥ EmRegsVZPalmM500::GetPortInputValue +// --------------------------------------------------------------------------- +// Return the GPIO values for the pins on the port. These values are used +// if the select pins are high. + +uint8 EmRegsVZPalmM500::GetPortInputValue (int port) +{ + uint8 result = EmRegsVZ::GetPortInputValue (port); + + if (port == 'K') + { + // Make sure hwrVZPortKAC_PWR_N is set, or the dock-status routines + // will report that we're powered (even if we aren't docked!). + + result |= hwrVZPortKAC_PWR_N; + } + + return result; +} + + +// --------------------------------------------------------------------------- +// ¥ EmRegsVZPalmM500::GetPortInternalValue +// --------------------------------------------------------------------------- +// Return the dedicated values for the pins on the port. These values are +// used if the select pins are low. + +uint8 EmRegsVZPalmM500::GetPortInternalValue (int port) +{ + uint8 result = EmRegsVZ::GetPortInternalValue (port); + + if (port == 'D') + { + // Make sure that hwrVZPortDPowerFail is set. If it's clear, + // the battery code will make the device go to sleep immediately. + // + // Also make sure that hwrVZPortDSpi1Card is set. If it's clear, + // the slot driver will think there's a card installed and will try querying it. + + result |= hwrVZPortDPowerFail | hwrVZPortDSpi1Card; + } + + return result; +} + + +// --------------------------------------------------------------------------- +// ¥ EmRegsVZPalmM500::GetKeyInfo +// --------------------------------------------------------------------------- + +void EmRegsVZPalmM500::GetKeyInfo (int* numRows, int* numCols, + uint16* keyMap, Bool* rows) +{ + *numRows = kNumButtonRows; + *numCols = kNumButtonCols; + + memcpy (keyMap, kGenericMonoMap, sizeof (kGenericMonoMap)); + + // Determine what row is being asked for. + + UInt8 portKDir = READ_REGISTER (portKDir); + UInt8 portKData = READ_REGISTER (portKData); + + rows[0] = (portKDir & hwrVZPortKKbdRow0) != 0 && (portKData & hwrVZPortKKbdRow0) == 0; + rows[1] = (portKDir & hwrVZPortKKbdRow1) != 0 && (portKData & hwrVZPortKKbdRow1) == 0; + rows[2] = (portKDir & hwrVZPortKKbdRow2) != 0 && (portKData & hwrVZPortKKbdRow2) == 0; +} + + +// --------------------------------------------------------------------------- +// ¥ EmRegsVZPalmM500::GetSPISlave +// --------------------------------------------------------------------------- + +EmSPISlave* EmRegsVZPalmM500::GetSPISlave (void) +{ + if ((READ_REGISTER (portGData) & hwrVZPortGADC_CS_N) == 0) + { + return fSPISlaveADC; + } + + return NULL; +} + + |