src/gba/hardware.h (view raw)
1/* Copyright (c) 2013-2015 Jeffrey Pfau
2 *
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6#ifndef GBA_HARDWARE_H
7#define GBA_HARDWARE_H
8
9#include "util/common.h"
10
11#include "macros.h"
12
13#include <time.h>
14
15#define IS_GPIO_REGISTER(reg) ((reg) == GPIO_REG_DATA || (reg) == GPIO_REG_DIRECTION || (reg) == GPIO_REG_CONTROL)
16
17struct GBARotationSource {
18 void (*sample)(struct GBARotationSource*);
19
20 int32_t (*readTiltX)(struct GBARotationSource*);
21 int32_t (*readTiltY)(struct GBARotationSource*);
22
23 int32_t (*readGyroZ)(struct GBARotationSource*);
24};
25
26struct GBALuminanceSource {
27 void (*sample)(struct GBALuminanceSource*);
28
29 uint8_t (*readLuminance)(struct GBALuminanceSource*);
30};
31
32struct GBARTCSource {
33 void (*sample)(struct GBARTCSource*);
34
35 time_t (*unixTime)(struct GBARTCSource*);
36};
37
38struct GBARTCGenericSource {
39 struct GBARTCSource d;
40 struct GBA* p;
41 enum {
42 RTC_NO_OVERRIDE,
43 RTC_FIXED,
44 RTC_FAKE_EPOCH
45 } override;
46 int64_t value;
47};
48
49enum GBAHardwareDevice {
50 HW_NO_OVERRIDE = 0x8000,
51 HW_NONE = 0,
52 HW_RTC = 1,
53 HW_RUMBLE = 2,
54 HW_LIGHT_SENSOR = 4,
55 HW_GYRO = 8,
56 HW_TILT = 16
57};
58
59enum GPIORegister {
60 GPIO_REG_DATA = 0xC4,
61 GPIO_REG_DIRECTION = 0xC6,
62 GPIO_REG_CONTROL = 0xC8
63};
64
65enum GPIODirection {
66 GPIO_WRITE_ONLY = 0,
67 GPIO_READ_WRITE = 1
68};
69
70DECL_BITFIELD(RTCControl, uint32_t);
71DECL_BIT(RTCControl, MinIRQ, 3);
72DECL_BIT(RTCControl, Hour24, 6);
73DECL_BIT(RTCControl, Poweroff, 7);
74
75enum RTCCommand {
76 RTC_RESET = 0,
77 RTC_DATETIME = 2,
78 RTC_FORCE_IRQ = 3,
79 RTC_CONTROL = 4,
80 RTC_TIME = 6
81};
82
83DECL_BITFIELD(RTCCommandData, uint32_t);
84DECL_BITS(RTCCommandData, Magic, 0, 4);
85DECL_BITS(RTCCommandData, Command, 4, 3);
86DECL_BIT(RTCCommandData, Reading, 7);
87
88#pragma pack(push, 1)
89struct GBARTC {
90 int32_t bytesRemaining;
91 int32_t transferStep;
92 int32_t bitsRead;
93 int32_t bits;
94 int32_t commandActive;
95 RTCCommandData command;
96 RTCControl control;
97 uint8_t time[7];
98};
99#pragma pack(pop)
100
101struct GBARumble {
102 void (*setRumble)(struct GBARumble*, int enable);
103};
104
105DECL_BITFIELD(GPIOPin, uint16_t);
106
107struct GBACartridgeHardware {
108 struct GBA* p;
109 int devices;
110 enum GPIODirection readWrite;
111 uint16_t* gpioBase;
112
113 uint16_t pinState;
114 uint16_t direction;
115
116 struct GBARTC rtc;
117
118 uint16_t gyroSample;
119 bool gyroEdge;
120
121 unsigned lightCounter : 12;
122 uint8_t lightSample;
123 bool lightEdge;
124
125 uint16_t tiltX;
126 uint16_t tiltY;
127 int tiltState;
128};
129
130void GBAHardwareInit(struct GBACartridgeHardware* gpio, uint16_t* gpioBase);
131void GBAHardwareClear(struct GBACartridgeHardware* gpio);
132
133void GBAHardwareInitRTC(struct GBACartridgeHardware* gpio);
134void GBAHardwareInitGyro(struct GBACartridgeHardware* gpio);
135void GBAHardwareInitRumble(struct GBACartridgeHardware* gpio);
136void GBAHardwareInitLight(struct GBACartridgeHardware* gpio);
137void GBAHardwareInitTilt(struct GBACartridgeHardware* gpio);
138
139void GBAHardwareGPIOWrite(struct GBACartridgeHardware* gpio, uint32_t address, uint16_t value);
140void GBAHardwareTiltWrite(struct GBACartridgeHardware* gpio, uint32_t address, uint8_t value);
141uint8_t GBAHardwareTiltRead(struct GBACartridgeHardware* gpio, uint32_t address);
142
143struct GBAVideo;
144bool GBAHardwarePlayerCheckScreen(const struct GBAVideo* video);
145
146void GBARTCGenericSourceInit(struct GBARTCGenericSource* rtc, struct GBA* gba);
147
148struct GBASerializedState;
149void GBAHardwareSerialize(const struct GBACartridgeHardware* gpio, struct GBASerializedState* state);
150void GBAHardwareDeserialize(struct GBACartridgeHardware* gpio, const struct GBASerializedState* state);
151
152#endif