Implement additional AS99127F reset register
This commit is contained in:
@@ -24,6 +24,7 @@
|
|||||||
#include <86box/86box.h>
|
#include <86box/86box.h>
|
||||||
#include <86box/device.h>
|
#include <86box/device.h>
|
||||||
#include <86box/io.h>
|
#include <86box/io.h>
|
||||||
|
#include <86box/timer.h>
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include <86box/i2c.h>
|
#include <86box/i2c.h>
|
||||||
#include <86box/hwm.h>
|
#include <86box/hwm.h>
|
||||||
@@ -50,6 +51,7 @@ typedef struct {
|
|||||||
uint32_t local;
|
uint32_t local;
|
||||||
hwm_values_t *values;
|
hwm_values_t *values;
|
||||||
device_t *lm75[2];
|
device_t *lm75[2];
|
||||||
|
pc_timer_t hard_reset_timer;
|
||||||
|
|
||||||
uint8_t regs[256];
|
uint8_t regs[256];
|
||||||
uint8_t regs_782d[2][16];
|
uint8_t regs_782d[2][16];
|
||||||
@@ -369,10 +371,18 @@ lm78_write(lm78_t *dev, uint8_t reg, uint8_t val, uint8_t bank)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0x81:
|
||||||
|
/* CUV4X-LS performs a hard reset through this register. */
|
||||||
|
if ((dev->local & LM78_AS99127F) && (val == 0xa9)) {
|
||||||
|
lm78_log("LM78: Hard reset requested through AS99127F\n");
|
||||||
|
timer_set_delay_u64(&dev->hard_reset_timer, 1); /* hard reset on a timer to avoid issues caused by invalidation of the I2C bus */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case 0x87:
|
case 0x87:
|
||||||
/* AS99127F boards perform a soft reset through this register */
|
/* Other AS99127F boards perform a soft reset through this register. */
|
||||||
if ((dev->local & LM78_AS99127F) && (val == 0x01)) {
|
if ((dev->local & LM78_AS99127F) && (val == 0x01)) {
|
||||||
lm78_log("LM78: Reset requested through AS99127F\n");
|
lm78_log("LM78: Soft reset requested through AS99127F\n");
|
||||||
resetx86();
|
resetx86();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -382,6 +392,13 @@ lm78_write(lm78_t *dev, uint8_t reg, uint8_t val, uint8_t bank)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
lm78_hard_reset_timer(void *priv)
|
||||||
|
{
|
||||||
|
pc_reset_hard();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
lm78_reset(lm78_t *dev, uint8_t initialization)
|
lm78_reset(lm78_t *dev, uint8_t initialization)
|
||||||
{
|
{
|
||||||
@@ -500,6 +517,8 @@ lm78_init(const device_t *info)
|
|||||||
if (dev->local & LM78_AS99127F) {
|
if (dev->local & LM78_AS99127F) {
|
||||||
/* AS99127: different -12V Rin value (bruteforced) */
|
/* AS99127: different -12V Rin value (bruteforced) */
|
||||||
defaults.voltages[5] = LM78_NEG_VOLTAGE(12000, 2400);
|
defaults.voltages[5] = LM78_NEG_VOLTAGE(12000, 2400);
|
||||||
|
|
||||||
|
timer_add(&dev->hard_reset_timer, lm78_hard_reset_timer, dev, 0);
|
||||||
} else if (dev->local & LM78_W83782D) {
|
} else if (dev->local & LM78_W83782D) {
|
||||||
/* W83782D: different negative voltage formula */
|
/* W83782D: different negative voltage formula */
|
||||||
defaults.voltages[5] = LM78_NEG_VOLTAGE2(12000, 232);
|
defaults.voltages[5] = LM78_NEG_VOLTAGE2(12000, 232);
|
||||||
|
Reference in New Issue
Block a user