2 * PROJECT: ReactOS Boot Loader
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: boot/freeldr/arch/arm/marcharm.c
5 * PURPOSE: Provides abstraction between the ARM Boot Loader and FreeLDR
6 * PROGRAMMERS: ReactOS Portable Systems Group
9 /* INCLUDES *******************************************************************/
12 #define RGB565(r, g, b) (((r >> 3) << 11)| ((g >> 2) << 5)| ((b >> 3) << 0))
14 /* GLOBALS ********************************************************************/
16 UCHAR BootStack
[0x4000];
17 PUCHAR BootStackEnd
= &BootStack
[0x3FFF];
18 PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock
;
19 ULONG BootDrive
, BootPartition
;
20 VOID
ArmPrepareForReactOS(IN BOOLEAN Setup
);
21 ADDRESS_RANGE ArmBoardMemoryMap
[16];
22 ULONG ArmBoardMemoryMapRangeCount
;
24 /* FUNCTIONS ******************************************************************/
27 ArmInit(IN PARM_BOARD_CONFIGURATION_BLOCK BootContext
)
32 // Remember the pointer
34 ArmBoardBlock
= BootContext
;
37 // Let's make sure we understand the LLB
39 ASSERT(ArmBoardBlock
->MajorVersion
== ARM_BOARD_CONFIGURATION_MAJOR_VERSION
);
40 ASSERT(ArmBoardBlock
->MinorVersion
== ARM_BOARD_CONFIGURATION_MINOR_VERSION
);
43 // This should probably go away once we support more boards
45 ASSERT((ArmBoardBlock
->BoardType
== MACH_TYPE_FEROCEON
) ||
46 (ArmBoardBlock
->BoardType
== MACH_TYPE_VERSATILE_PB
) ||
47 (ArmBoardBlock
->BoardType
== MACH_TYPE_OMAP3_BEAGLE
));
50 // Save data required for memory initialization
52 ArmBoardMemoryMapRangeCount
= ArmBoardBlock
->MemoryMapEntryCount
;
53 ASSERT(ArmBoardMemoryMapRangeCount
!= 0);
54 ASSERT(ArmBoardMemoryMapRangeCount
< 16);
55 for (i
= 0; i
< ArmBoardMemoryMapRangeCount
; i
++)
60 RtlCopyMemory(&ArmBoardMemoryMap
[i
],
61 &ArmBoardBlock
->MemoryMap
[i
],
62 sizeof(ADDRESS_RANGE
));
66 // Call FreeLDR's portable entrypoint with our command-line
68 BootMain(ArmBoardBlock
->CommandLine
);
72 ArmDiskGetDriveGeometry(IN ULONG DriveNumber
,
73 OUT PGEOMETRY Geometry
)
79 ArmDiskReadLogicalSectors(IN ULONG DriveNumber
,
80 IN ULONGLONG SectorNumber
,
88 ArmDiskGetCacheableBlockCount(IN ULONG DriveNumber
)
93 PCONFIGURATION_COMPONENT_DATA
96 PCONFIGURATION_COMPONENT_DATA RootNode
;
99 // Create the root node
101 FldrCreateSystemKey(&RootNode
);
105 // There's no such thing as "PnP" on embedded hardware.
106 // The boot loader will send us a device tree, similar to ACPI
107 // or OpenFirmware device trees, and we will convert it to ARC.
111 // Return the root node
117 ArmMemGetMemoryMap(OUT PBIOS_MEMORY_MAP BiosMemoryMap
,
118 IN ULONG MaxMemoryMapSize
)
121 // Return whatever the board returned to us (CS0 Base + Size and FLASH0)
123 RtlCopyMemory(BiosMemoryMap
,
124 ArmBoardBlock
->MemoryMap
,
125 ArmBoardBlock
->MemoryMapEntryCount
* sizeof(BIOS_MEMORY_MAP
));
126 return ArmBoardBlock
->MemoryMapEntryCount
;
130 MachInit(IN PCCH CommandLine
)
133 // Setup board-specific ARM routines
135 switch (ArmBoardBlock
->BoardType
)
138 // Check for Feroceon-base boards
140 case MACH_TYPE_FEROCEON
:
144 // Check for ARM Versatile PB boards
146 case MACH_TYPE_VERSATILE_PB
:
148 /* Copy Machine Routines from Firmware Table */
149 MachVtbl
.ConsPutChar
= ArmBoardBlock
->ConsPutChar
;
150 MachVtbl
.ConsKbHit
= ArmBoardBlock
->ConsKbHit
;
151 MachVtbl
.ConsGetCh
= ArmBoardBlock
->ConsGetCh
;
155 // Check for TI OMAP3 boards
156 // For now that means only Beagle, but ZOOM and others should be ok too
158 case MACH_TYPE_OMAP3_BEAGLE
:
166 // Setup generic ARM routines for all boards
168 MachVtbl
.PrepareForReactOS
= ArmPrepareForReactOS
;
169 MachVtbl
.GetMemoryMap
= ArmMemGetMemoryMap
;
170 MachVtbl
.HwDetect
= ArmHwDetect
;
173 // Setup disk I/O routines
175 MachVtbl
.DiskReadLogicalSectors
= ArmDiskReadLogicalSectors
;
176 MachVtbl
.DiskGetDriveGeometry
= ArmDiskGetDriveGeometry
;
177 MachVtbl
.DiskGetCacheableBlockCount
= ArmDiskGetCacheableBlockCount
;
180 // Now set default disk handling routines -- we don't need to override
182 MachVtbl
.DiskGetBootPath
= DiskGetBootPath
;
183 MachVtbl
.DiskNormalizeSystemPath
= DiskNormalizeSystemPath
;
186 // We can now print to the console
188 TuiPrintf("%s for ARM\n", GetFreeLoaderVersionString());
189 TuiPrintf("Bootargs: %s\n\n", CommandLine
);