mirror of https://github.com/mgba-emu/mgba.git
GBA: Implement light sensor GPIO interface with a hardcoded value for the moment
This commit is contained in:
parent
a6f895da7d
commit
9b1769d67d
|
@ -24,6 +24,8 @@ static void _gyroReadPins(struct GBACartridgeGPIO* gpio);
|
||||||
|
|
||||||
static void _rumbleReadPins(struct GBACartridgeGPIO* gpio);
|
static void _rumbleReadPins(struct GBACartridgeGPIO* gpio);
|
||||||
|
|
||||||
|
static void _lightReadPins(struct GBACartridgeGPIO* gpio);
|
||||||
|
|
||||||
static const int RTC_BYTES[8] = {
|
static const int RTC_BYTES[8] = {
|
||||||
0, // Force reset
|
0, // Force reset
|
||||||
0, // Empty
|
0, // Empty
|
||||||
|
@ -46,7 +48,13 @@ void GBAGPIOInit(struct GBACartridgeGPIO* gpio, uint16_t* base) {
|
||||||
void GBAGPIOWrite(struct GBACartridgeGPIO* gpio, uint32_t address, uint16_t value) {
|
void GBAGPIOWrite(struct GBACartridgeGPIO* gpio, uint32_t address, uint16_t value) {
|
||||||
switch (address) {
|
switch (address) {
|
||||||
case GPIO_REG_DATA:
|
case GPIO_REG_DATA:
|
||||||
gpio->pinState = value;
|
gpio->pinState &= ~gpio->direction;
|
||||||
|
gpio->pinState |= value;
|
||||||
|
if (gpio->readWrite) {
|
||||||
|
uint16_t old = gpio->gpioBase[0];
|
||||||
|
old &= ~gpio->direction;
|
||||||
|
gpio->gpioBase[0] = old | gpio->pinState;
|
||||||
|
}
|
||||||
_readPins(gpio);
|
_readPins(gpio);
|
||||||
break;
|
break;
|
||||||
case GPIO_REG_DIRECTION:
|
case GPIO_REG_DIRECTION:
|
||||||
|
@ -58,12 +66,6 @@ void GBAGPIOWrite(struct GBACartridgeGPIO* gpio, uint32_t address, uint16_t valu
|
||||||
default:
|
default:
|
||||||
GBALog(gpio->p, GBA_LOG_WARN, "Invalid GPIO address");
|
GBALog(gpio->p, GBA_LOG_WARN, "Invalid GPIO address");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gpio->readWrite) {
|
|
||||||
uint16_t old = gpio->gpioBase[0];
|
|
||||||
old &= ~gpio->direction;
|
|
||||||
gpio->gpioBase[0] = old | (value & gpio->direction);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GBAGPIOInitRTC(struct GBACartridgeGPIO* gpio) {
|
void GBAGPIOInitRTC(struct GBACartridgeGPIO* gpio) {
|
||||||
|
@ -92,13 +94,18 @@ void _readPins(struct GBACartridgeGPIO* gpio) {
|
||||||
if (gpio->gpioDevices & GPIO_RUMBLE) {
|
if (gpio->gpioDevices & GPIO_RUMBLE) {
|
||||||
_rumbleReadPins(gpio);
|
_rumbleReadPins(gpio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (gpio->gpioDevices & GPIO_LIGHT_SENSOR) {
|
||||||
|
_lightReadPins(gpio);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _outputPins(struct GBACartridgeGPIO* gpio, unsigned pins) {
|
void _outputPins(struct GBACartridgeGPIO* gpio, unsigned pins) {
|
||||||
if (gpio->readWrite) {
|
if (gpio->readWrite) {
|
||||||
uint16_t old = gpio->gpioBase[0];
|
uint16_t old = gpio->gpioBase[0];
|
||||||
old &= gpio->direction;
|
old &= gpio->direction;
|
||||||
gpio->gpioBase[0] = old | (pins & ~gpio->direction & 0xF);
|
gpio->pinState = old | (pins & ~gpio->direction & 0xF);
|
||||||
|
gpio->gpioBase[0] = gpio->pinState;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,6 +316,33 @@ void _rumbleReadPins(struct GBACartridgeGPIO* gpio) {
|
||||||
rumble->setRumble(rumble, gpio->p3);
|
rumble->setRumble(rumble, gpio->p3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// == Light sensor
|
||||||
|
|
||||||
|
void GBAGPIOInitLightSensor(struct GBACartridgeGPIO* gpio) {
|
||||||
|
gpio->gpioDevices |= GPIO_LIGHT_SENSOR;
|
||||||
|
gpio->lightCounter = 0;
|
||||||
|
gpio->lightEdge = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _lightReadPins(struct GBACartridgeGPIO* gpio) {
|
||||||
|
if (gpio->p2) {
|
||||||
|
// Boktai chip select
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (gpio->p1) {
|
||||||
|
GBALog(0, GBA_LOG_DEBUG, "[SOLAR] Got reset");
|
||||||
|
gpio->lightCounter = 0;
|
||||||
|
}
|
||||||
|
if (gpio->p0 && gpio->lightEdge) {
|
||||||
|
++gpio->lightCounter;
|
||||||
|
}
|
||||||
|
gpio->lightEdge = !gpio->p0;
|
||||||
|
|
||||||
|
bool sendBit = gpio->lightCounter >= 0x80;
|
||||||
|
_outputPins(gpio, sendBit << 3);
|
||||||
|
GBALog(0, GBA_LOG_DEBUG, "[SOLAR] Output %u with pins %u", gpio->lightCounter, gpio->pinState);
|
||||||
|
}
|
||||||
|
|
||||||
// == Serialization
|
// == Serialization
|
||||||
|
|
||||||
void GBAGPIOSerialize(struct GBACartridgeGPIO* gpio, struct GBASerializedState* state) {
|
void GBAGPIOSerialize(struct GBACartridgeGPIO* gpio, struct GBASerializedState* state) {
|
||||||
|
|
|
@ -103,6 +103,9 @@ struct GBACartridgeGPIO {
|
||||||
|
|
||||||
uint16_t gyroSample;
|
uint16_t gyroSample;
|
||||||
bool gyroEdge;
|
bool gyroEdge;
|
||||||
|
|
||||||
|
int lightCounter : 12;
|
||||||
|
bool lightEdge;
|
||||||
};
|
};
|
||||||
|
|
||||||
void GBAGPIOInit(struct GBACartridgeGPIO* gpio, uint16_t* gpioBase);
|
void GBAGPIOInit(struct GBACartridgeGPIO* gpio, uint16_t* gpioBase);
|
||||||
|
@ -114,6 +117,8 @@ void GBAGPIOInitGyro(struct GBACartridgeGPIO* gpio);
|
||||||
|
|
||||||
void GBAGPIOInitRumble(struct GBACartridgeGPIO* gpio);
|
void GBAGPIOInitRumble(struct GBACartridgeGPIO* gpio);
|
||||||
|
|
||||||
|
void GBAGPIOInitLightSensor(struct GBACartridgeGPIO* gpio);
|
||||||
|
|
||||||
struct GBASerializedState;
|
struct GBASerializedState;
|
||||||
void GBAGPIOSerialize(struct GBACartridgeGPIO* gpio, struct GBASerializedState* state);
|
void GBAGPIOSerialize(struct GBACartridgeGPIO* gpio, struct GBASerializedState* state);
|
||||||
void GBAGPIODeserialize(struct GBACartridgeGPIO* gpio, struct GBASerializedState* state);
|
void GBAGPIODeserialize(struct GBACartridgeGPIO* gpio, struct GBASerializedState* state);
|
||||||
|
|
Loading…
Reference in New Issue