summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/acorn_bmu.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/acorn_bmu.h')
-rw-r--r--src/devices/machine/acorn_bmu.h87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/devices/machine/acorn_bmu.h b/src/devices/machine/acorn_bmu.h
new file mode 100644
index 00000000000..475404c2895
--- /dev/null
+++ b/src/devices/machine/acorn_bmu.h
@@ -0,0 +1,87 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/*********************************************************************
+
+ Acorn Battery Management Unit
+
+*********************************************************************/
+
+#ifndef MAME_MACHINE_ACORN_BMU_H
+#define MAME_MACHINE_ACORN_BMU_H
+
+#pragma once
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> acorn_bmu_device
+
+class acorn_bmu_device : public device_t
+{
+public:
+ acorn_bmu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ void scl_w(int state);
+ void sda_w(int state);
+ int sda_r();
+
+protected:
+ // device-level overrides
+ virtual void device_start() override ATTR_COLD;
+
+private:
+ static constexpr uint8_t BMU_SLAVE_ADDRESS = 0xa2;
+
+ // internal state
+ int m_slave_address;
+ int m_scl;
+ int m_sdaw;
+ int m_sdar;
+ int m_state;
+ int m_bits;
+ int m_shift;
+ int m_devsel;
+ int m_register;
+
+ enum { STATE_IDLE, STATE_DEVSEL, STATE_REGISTER, STATE_DATAIN, STATE_DATAOUT, STATE_READSELACK };
+
+ // registers
+ enum
+ {
+ BMU_VERSION = 0x50,
+ BMU_TEMPERATURE = 0x52,
+ BMU_CURRENT = 0x54,
+ BMU_VOLTAGE = 0x56,
+ BMU_STATUS = 0x5c,
+ BMU_CHARGE_RATE = 0x5e,
+ BMU_CAPACITY_NOMINAL = 0x80,
+ BMU_CAPACITY_MEASURED = 0x82,
+ BMU_CAPACITY_USED = 0x88,
+ BMU_CAPACITY_USABLE = 0x8a,
+ BMU_CHARGE_ESTIMATE = 0x8e,
+ BMU_COMMAND = 0x90,
+ BMU_AUTOSTART = 0x9e
+ };
+
+ // flags
+ enum
+ {
+ STATUS_THRESHOLD_3 = 1 << 0, // Battery fully charged
+ STATUS_LID_OPEN = 1 << 1, // Lid open
+ STATUS_THRESHOLD_2 = 1 << 2, // Battery flat [shutdown now]
+ STATUS_THRESHOLD_1 = 1 << 3, // Battery low [warn user]
+ STATUS_CHARGING_FAULT = 1 << 4, // Fault in charging system
+ STATUS_CHARGE_STATE_KNOWN = 1 << 5, // Charge state known
+ STATUS_BATTERY_PRESENT = 1 << 6, // Battery present
+ STATUS_CHARGER_PRESENT = 1 << 7 // Charger present
+ };
+
+ uint8_t m_estimate;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(ACORN_BMU, acorn_bmu_device)
+
+#endif // MAME_MACHINE_ACORN_BMU_H