ReactOS  0.4.14-dev-614-gbfd8a84
machxbox.c
Go to the documentation of this file.
1 /*
2  * FreeLoader
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18 
19 #include <freeldr.h>
20 
21 #include <debug.h>
22 DBG_DEFAULT_CHANNEL(HWDETECT);
23 
24 
25 BOOLEAN
27 {
28  /* We emulate PCI BIOS here, there are 2 known working PCI buses on an original Xbox */
29 
30  BusData->NoBuses = 2;
31  BusData->MajorRevision = 1;
32  BusData->MinorRevision = 0;
33  BusData->HardwareMechanism = 1;
34  return TRUE;
35 }
36 
37 extern
38 VOID
40 
41 static
42 ULONG
44 {
45  /*
46  * Xbox may have maximum two Serial COM ports
47  * if the Super I/O chip is connected via LPC
48  */
50  ULONG ComBase = 0;
51 
52  // Enter Configuration
54 
55  // Select serial device
58 
59  // Check if selected device is active
61  if (READ_PORT_UCHAR(LPC_IO_BASE + 1) == 1)
62  {
63  // Read LSB
65  ComBase = READ_PORT_UCHAR(LPC_IO_BASE + 1);
66  // Read MSB
68  ComBase |= (READ_PORT_UCHAR(LPC_IO_BASE + 1) << 8);
69  // Read IRQ
71  *Irq = READ_PORT_UCHAR(LPC_IO_BASE + 1);
72  }
73 
74  // Exit Configuration
76 
77  return ComBase;
78 }
79 
80 extern
81 VOID
83 
84 VOID
86 {
87  TRACE("XboxGetExtendedBIOSData(): UNIMPLEMENTED\n");
90 }
91 
92 // NOTE: Similar to machpc.c!PcGetHarddiskConfigurationData(),
93 // but without extended geometry support.
94 static
97 {
98  PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
99  PCM_DISK_GEOMETRY_DEVICE_DATA DiskGeometry;
100  //EXTENDED_GEOMETRY ExtGeometry;
101  GEOMETRY Geometry;
102  ULONG Size;
103 
104  //
105  // Initialize returned size
106  //
107  *pSize = 0;
108 
109  /* Set 'Configuration Data' value */
110  Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
112  PartialResourceList = FrLdrHeapAlloc(Size, TAG_HW_RESOURCE_LIST);
113  if (PartialResourceList == NULL)
114  {
115  ERR("Failed to allocate a full resource descriptor\n");
116  return NULL;
117  }
118 
119  memset(PartialResourceList, 0, Size);
120  PartialResourceList->Version = 1;
121  PartialResourceList->Revision = 1;
122  PartialResourceList->Count = 1;
123  PartialResourceList->PartialDescriptors[0].Type =
125 // PartialResourceList->PartialDescriptors[0].ShareDisposition =
126 // PartialResourceList->PartialDescriptors[0].Flags =
127  PartialResourceList->PartialDescriptors[0].u.DeviceSpecificData.DataSize =
129 
130  /* Get pointer to geometry data */
131  DiskGeometry = (PVOID)(((ULONG_PTR)PartialResourceList) + sizeof(CM_PARTIAL_RESOURCE_LIST));
132 
133  /* Get the disk geometry */
134  //ExtGeometry.Size = sizeof(EXTENDED_GEOMETRY);
135 
136  if (XboxDiskGetDriveGeometry(DriveNumber, &Geometry))
137  {
138  DiskGeometry->BytesPerSector = Geometry.BytesPerSector;
139  DiskGeometry->NumberOfCylinders = Geometry.Cylinders;
140  DiskGeometry->SectorsPerTrack = Geometry.Sectors;
141  DiskGeometry->NumberOfHeads = Geometry.Heads;
142  }
143  else
144  {
145  ERR("Reading disk geometry failed\n");
146  FrLdrHeapFree(PartialResourceList, TAG_HW_RESOURCE_LIST);
147  return NULL;
148  }
149  TRACE("Disk %x: %u Cylinders %u Heads %u Sectors %u Bytes\n",
150  DriveNumber,
151  DiskGeometry->NumberOfCylinders,
152  DiskGeometry->NumberOfHeads,
153  DiskGeometry->SectorsPerTrack,
154  DiskGeometry->BytesPerSector);
155 
156  //
157  // Return configuration data
158  //
159  *pSize = Size;
160  return PartialResourceList;
161 }
162 
163 static
164 VOID
166 {
167  PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
169  ULONG Size;
170 
171  /* Set 'Configuration Data' value */
172  Size = sizeof(CM_PARTIAL_RESOURCE_LIST) -
174  PartialResourceList = FrLdrHeapAlloc(Size, TAG_HW_RESOURCE_LIST);
175  if (PartialResourceList == NULL)
176  {
177  TRACE("Failed to allocate resource descriptor\n");
178  return;
179  }
180 
181  /* Initialize resource descriptor */
182  memset(PartialResourceList, 0, Size);
183  PartialResourceList->Version = 1;
184  PartialResourceList->Revision = 1;
185  PartialResourceList->Count = 0;
186 
187  /* Create new bus key */
188  FldrCreateComponentKey(SystemKey,
189  AdapterClass,
190  MultiFunctionAdapter,
191  0x0,
192  0x0,
193  0xFFFFFFFF,
194  "ISA",
195  PartialResourceList,
196  Size,
197  &BusKey);
198 
199  /* Increment bus number */
200  (*BusNumber)++;
201 
202  /* Detect ISA/BIOS devices */
203  DetectBiosDisks(SystemKey, BusKey);
205 
206  /* FIXME: Detect more ISA devices */
207 }
208 
209 static
210 UCHAR
212 {
213  /* On a PC we use CMOS/RTC I/O ports 0x70 and 0x71 to detect floppies.
214  * However an Xbox CMOS memory range [0x10, 0x70) and [0x80, 0x100)
215  * is filled with 0x55 0xAA 0x55 0xAA ... byte pattern which is used
216  * to validate the date/time settings by Xbox OS.
217  *
218  * Technically it's possible to connect a floppy drive to Xbox, but
219  * CMOS detection method should not be used here. */
220 
221  WARN("XboxGetFloppyCount() is UNIMPLEMENTED, returning 0\n");
222  return 0;
223 }
224 
227 {
229  ULONG BusNumber = 0;
230 
231  TRACE("DetectHardware()\n");
232 
233  /* Create the 'System' key */
234  FldrCreateSystemKey(&SystemKey);
235 
238 
239  /* TODO: Build actual xbox's hardware configuration tree */
240  DetectPciBios(SystemKey, &BusNumber);
241  DetectIsaBios(SystemKey, &BusNumber);
242 
243  TRACE("DetectHardware() Done\n");
244  return SystemKey;
245 }
246 
248 {
249  /* UNIMPLEMENTED */
250 }
251 
252 
253 /******************************************************************************/
254 
255 VOID
256 XboxMachInit(const char *CmdLine)
257 {
258  /* Set LEDs to red before anything is initialized */
259  XboxSetLED("rrrr");
260 
261  /* Initialize our stuff */
262  XboxMemInit();
263  XboxVideoInit();
264 
265  /* Setup vtbl */
282  MachVtbl.Beep = PcBeep;
294 
295  /* Set LEDs to orange after init */
296  XboxSetLED("oooo");
297 }
298 
299 VOID
301 {
302  /* On XBOX, prepare video and turn off the floppy motor */
304  DiskStopFloppyMotor();
305 }
306 
307 /* EOF */
struct _CM_PARTIAL_RESOURCE_LIST CM_PARTIAL_RESOURCE_LIST
BOOLEAN XboxConsKbHit(VOID)
Definition: xboxcons.c:59
VOID DetectSerialPorts(PCONFIGURATION_COMPONENT_DATA BusKey, GET_SERIAL_PORT MachGetSerialPort, ULONG Count)
Definition: machpc.c:656
PCONFIGURATION_COMPONENT_DATA XboxHwDetect(VOID)
Definition: machxbox.c:226
#define CmResourceTypeDeviceSpecific
Definition: hwresource.cpp:127
PFREELDR_MEMORY_DESCRIPTOR(* GetMemoryMap)(PULONG MaxMemoryMapSize)
Definition: machine.h:63
#define ExtendedBIOSDataSize
Definition: winldr.c:421
#define TRUE
Definition: types.h:120
FORCEINLINE VOID FrLdrHeapFree(PVOID MemoryPointer, ULONG Tag)
Definition: mm.h:170
_In_ PIRP _In_ PDEVICE_OBJECT Device
Definition: fatprocs.h:2020
#define LPC_CONFIG_DEVICE_BASE_ADDRESS_LOW
Definition: machxbox.h:37
GLint x0
Definition: linetemp.h:95
ULONG(* GET_SERIAL_PORT)(ULONG Index, PULONG Irq)
Definition: hardware.h:49
VOID(* GetExtendedBIOSData)(PULONG ExtendedBIOSDataArea, PULONG ExtendedBIOSDataSize)
Definition: machine.h:64
ULONG Cylinders
Definition: disk.h:26
VOID(* VideoClearScreen)(UCHAR Attr)
Definition: machine.h:45
unsigned char * PUCHAR
Definition: retypes.h:3
UCHAR NTAPI READ_PORT_UCHAR(PUCHAR Address)
Definition: mach.c:528
#define WARN(fmt,...)
Definition: debug.h:111
PCONFIGURATION_COMPONENT_DATA(* HwDetect)(VOID)
Definition: machine.h:77
_In_opt_ ULONG Base
Definition: rtlfuncs.h:2343
UCHAR HardwareMechanism
Definition: pci.h:110
VOID(* VideoGetDisplaySize)(PULONG Width, PULONG Height, PULONG Depth)
Definition: machine.h:47
static UCHAR XboxGetFloppyCount(VOID)
Definition: machxbox.c:211
VOID XboxVideoCopyOffScreenBufferToVRAM(PVOID Buffer)
Definition: xboxvideo.c:205
_Inout_ __drv_aliasesMem PSLIST_ENTRY _Inout_ PSLIST_ENTRY _In_ ULONG Count
Definition: exfuncs.h:1015
UCHAR MinorRevision
Definition: pci.h:108
VOID XboxVideoClearScreen(UCHAR Attr)
Definition: xboxvideo.c:104
VOID XboxConsPutChar(int c)
Definition: xboxcons.c:26
BOOLEAN(* VideoIsPaletteFixed)(VOID)
Definition: machine.h:54
UCHAR(* GetFloppyCount)(VOID)
Definition: machine.h:66
BOOLEAN XboxFindPciBios(PPCI_REGISTRY_INFO BusData)
Definition: machxbox.c:26
uint32_t ULONG_PTR
Definition: typedefs.h:63
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@376::@385 DeviceSpecificData
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@376 u
GET_HARDDISK_CONFIG_DATA GetHarddiskConfigurationData
Definition: hardware.c:40
VOID XboxMemInit(VOID)
Definition: xboxmem.c:56
VOID XboxVideoSetTextCursorPosition(UCHAR X, UCHAR Y)
Definition: xboxvideo.c:193
FIND_PCI_BIOS FindPciBios
Definition: hwpci.c:26
BOOLEAN PcInitializeBootDevices(VOID)
Definition: hwdisk.c:468
UCHAR MajorRevision
Definition: pci.h:107
VOID(* VideoGetFontsFromFirmware)(PULONG RomFontPointers)
Definition: machine.h:49
#define MAX_XBOX_COM_PORTS
Definition: machxbox.h:25
#define LPC_CONFIG_DEVICE_NUMBER
Definition: machxbox.h:34
int XboxConsGetCh(void)
Definition: xboxcons.c:66
#define LPC_IO_BASE
Definition: machxbox.h:27
unsigned char BOOLEAN
BOOLEAN(* DiskGetDriveGeometry)(UCHAR DriveNumber, PGEOMETRY DriveGeometry)
Definition: machine.h:68
VOID(* VideoSetTextCursorPosition)(UCHAR X, UCHAR Y)
Definition: machine.h:50
smooth NULL
Definition: ftsmooth.c:416
ULONG XboxVideoGetBufferSize(VOID)
Definition: xboxvideo.c:181
#define LPC_ENTER_CONFIG_KEY
Definition: machxbox.h:28
void * PVOID
Definition: retypes.h:9
TIMEINFO *(* GetTime)(VOID)
Definition: machine.h:72
_In_opt_ PUNICODE_STRING _In_ PDRIVER_OBJECT _In_ PDEVICE_OBJECT _In_ INTERFACE_TYPE _In_ ULONG BusNumber
Definition: halfuncs.h:156
VOID XboxVideoGetFontsFromFirmware(PULONG RomFontPointers)
Definition: xboxvideo.c:187
BOOLEAN(* InitializeBootDevices)(VOID)
Definition: machine.h:76
BOOLEAN XboxDiskReadLogicalSectors(UCHAR DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer)
Definition: xboxdisk.c:413
ULONG Sectors
Definition: disk.h:28
#define ExtendedBIOSDataArea
Definition: winldr.c:420
FORCEINLINE PVOID FrLdrHeapAlloc(SIZE_T MemorySize, ULONG Tag)
Definition: mm.h:163
#define TRACE(s)
Definition: solgame.cpp:4
DBG_DEFAULT_CHANNEL(HWDETECT)
VOID(* VideoGetPaletteColor)(UCHAR Color, UCHAR *Red, UCHAR *Green, UCHAR *Blue)
Definition: machine.h:56
BOOLEAN XboxVideoIsPaletteFixed(VOID)
Definition: xboxvideo.c:221
VOID DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey, PCONFIGURATION_COMPONENT_DATA BusKey)
Definition: hardware.c:339
PFREELDR_MEMORY_DESCRIPTOR XboxMemGetMemoryMap(ULONG *MemoryMapSize)
Definition: xboxmem.c:104
VOID XboxVideoGetDisplaySize(PULONG Width, PULONG Height, PULONG Depth)
Definition: xboxvideo.c:173
static const UCHAR Index[8]
Definition: usbohci.c:18
VOID XboxPrepareForReactOS(VOID)
Definition: machxbox.c:300
#define LPC_CONFIG_DEVICE_ACTIVATE
Definition: machxbox.h:35
VOID XboxHwIdle(VOID)
Definition: machxbox.c:247
VOID DetectPciBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
Definition: hwpci.c:176
BOOLEAN(* DiskReadLogicalSectors)(UCHAR DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer)
Definition: machine.h:67
BOOLEAN(* ConsKbHit)(VOID)
Definition: machine.h:42
VOID XboxVideoSync(VOID)
Definition: xboxvideo.c:239
CHAR CmdLine[MAX_PATH]
Definition: mach.c:34
VOID XboxMachInit(const char *CmdLine)
Definition: machxbox.c:256
unsigned char UCHAR
Definition: xmlstorage.h:181
CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1]
Definition: hwresource.cpp:119
VOID(* VideoPutChar)(int Ch, UCHAR Attr, unsigned X, unsigned Y)
Definition: machine.h:52
VOID XboxVideoInit(VOID)
Definition: xboxvideo.c:131
void XboxSetLED(PCSTR pattern)
Definition: xboxi2c.c:198
#define LPC_DEVICE_SERIAL_PORT_1
Definition: machxbox.h:31
VOID XboxVideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y)
Definition: xboxvideo.c:114
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
static ULONG XboxGetSerialPort(ULONG Index, PULONG Irq)
Definition: machxbox.c:43
VOID(* VideoSetPaletteColor)(UCHAR Color, UCHAR Red, UCHAR Green, UCHAR Blue)
Definition: machine.h:55
VOID XboxVideoPrepareForReactOS(VOID)
Definition: xboxvideo.c:252
#define LPC_EXIT_CONFIG_KEY
Definition: machxbox.h:29
VOID PcBeep(VOID)
Definition: i386rtl.c:25
VOID XboxVideoHideShowTextCursor(BOOLEAN Show)
Definition: xboxvideo.c:199
VOID(* PrepareForReactOS)(VOID)
Definition: machine.h:59
VOID NTAPI FldrCreateComponentKey(IN PCONFIGURATION_COMPONENT_DATA SystemNode, IN CONFIGURATION_CLASS Class, IN CONFIGURATION_TYPE Type, IN IDENTIFIER_FLAG Flags, IN ULONG Key, IN ULONG Affinity, IN PCHAR IdentifierString, IN PCM_PARTIAL_RESOURCE_LIST ResourceList, IN ULONG Size, OUT PCONFIGURATION_COMPONENT_DATA *ComponentKey)
Definition: archwsup.c:147
ULONG(* VideoGetBufferSize)(VOID)
Definition: machine.h:48
#define LPC_DEVICE_SERIAL_PORT_2
Definition: machxbox.h:32
int(* ConsGetCh)(VOID)
Definition: machine.h:43
#define ERR(fmt,...)
Definition: debug.h:109
ULONG(* DiskGetCacheableBlockCount)(UCHAR DriveNumber)
Definition: machine.h:69
VOID(* ConsPutChar)(int Ch)
Definition: machine.h:41
BOOLEAN XboxDiskGetDriveGeometry(UCHAR DriveNumber, PGEOMETRY Geometry)
Definition: xboxdisk.c:456
MACHVTBL MachVtbl
Definition: arcemul.c:21
ULONG BytesPerSector
Definition: disk.h:29
#define LPC_CONFIG_DEVICE_BASE_ADDRESS_HIGH
Definition: machxbox.h:36
VOID DetectSerialPointerPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey, PUCHAR Base)
VOID(* HwIdle)(VOID)
Definition: machine.h:78
Definition: disk.h:24
unsigned int * PULONG
Definition: retypes.h:1
UCHAR NoBuses
Definition: pci.h:109
VOID(* VideoSync)(VOID)
Definition: machine.h:57
VOID XboxVideoSetPaletteColor(UCHAR Color, UCHAR Red, UCHAR Green, UCHAR Blue)
Definition: xboxvideo.c:227
unsigned int ULONG
Definition: retypes.h:1
VOID XboxVideoGetPaletteColor(UCHAR Color, UCHAR *Red, UCHAR *Green, UCHAR *Blue)
Definition: xboxvideo.c:233
void WRITE_PORT_UCHAR(PUCHAR Address, UCHAR Value)
Definition: mach.c:532
#define LPC_CONFIG_DEVICE_INTERRUPT
Definition: machxbox.h:38
VOID(* VideoCopyOffScreenBufferToVRAM)(PVOID Buffer)
Definition: machine.h:53
VIDEODISPLAYMODE(* VideoSetDisplayMode)(char *DisplayMode, BOOLEAN Init)
Definition: machine.h:46
VOID NTAPI FldrCreateSystemKey(OUT PCONFIGURATION_COMPONENT_DATA *SystemNode)
Definition: archwsup.c:89
VOID XboxGetExtendedBIOSData(PULONG ExtendedBIOSDataArea, PULONG ExtendedBIOSDataSize)
Definition: machxbox.c:85
VIDEODISPLAYMODE XboxVideoSetDisplayMode(char *DisplayMode, BOOLEAN Init)
Definition: xboxvideo.c:166
VOID(* Beep)(VOID)
Definition: machine.h:58
#define memset(x, y, z)
Definition: compat.h:39
TIMEINFO * XboxGetTime(VOID)
Definition: xboxrtc.c:40
static VOID DetectIsaBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
Definition: machxbox.c:165
static PCM_PARTIAL_RESOURCE_LIST XboxGetHarddiskConfigurationData(UCHAR DriveNumber, ULONG *pSize)
Definition: machxbox.c:96
struct _CM_DISK_GEOMETRY_DEVICE_DATA CM_DISK_GEOMETRY_DEVICE_DATA
#define TAG_HW_RESOURCE_LIST
Definition: hardware.h:26
ULONG XboxDiskGetCacheableBlockCount(UCHAR DriveNumber)
Definition: xboxdisk.c:516
VOID(* VideoHideShowTextCursor)(BOOLEAN Show)
Definition: machine.h:51
ULONG Heads
Definition: disk.h:27