diff --git a/reactos/boot/freeldr/freeldr/arch/arm/boot.s b/reactos/boot/freeldr/freeldr/arch/arm/boot.s index 36bf04e8d2a..2683274ef96 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/boot.s +++ b/reactos/boot/freeldr/freeldr/arch/arm/boot.s @@ -3,7 +3,7 @@ * LICENSE: GPL - See COPYING in the top level directory * FILE: boot/freeldr/arch/arm/boot.s * PURPOSE: Implements the entry point for ARM machines - * PROGRAMMERS: alex@winsiderss.com + * PROGRAMMERS: ReactOS Portable Systems Group */ /* INCLUDES *******************************************************************/ diff --git a/reactos/boot/freeldr/freeldr/arch/arm/ferouart.c b/reactos/boot/freeldr/freeldr/arch/arm/ferouart.c new file mode 100644 index 00000000000..351c3fbb50c --- /dev/null +++ b/reactos/boot/freeldr/freeldr/arch/arm/ferouart.c @@ -0,0 +1,130 @@ +/* + * PROJECT: ReactOS Boot Loader + * LICENSE: GPL - See COPYING in the top level directory + * FILE: boot/freeldr/arch/arm/ferouart.c + * PURPOSE: Implements code for Feroceon boards using the 16550 UART + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include + +/* GLOBALS ********************************************************************/ + +// +// UART Registers +// +#define UART0_RBR (ArmBoardBlock->UartRegisterBase + 0x00) +#define UART0_THR UART0_RBR +#define UART0_IER (ArmBoardBlock->UartRegisterBase + 0x04) +#define UART0_FCR (ArmBoardBlock->UartRegisterBase + 0x08) +#define UART0_LCR (ArmBoardBlock->UartRegisterBase + 0x0C) +#define UART0_MCR (ArmBoardBlock->UartRegisterBase + 0x10) +#define UART0_LSR (ArmBoardBlock->UartRegisterBase + 0x14) +#define UART0_MSR (ArmBoardBlock->UartRegisterBase + 0x18) +#define UART0_SCR (ArmBoardBlock->UartRegisterBase + 0x1C) + +// +// When we enable the divisor latch +// +#define UART0_DLL UART0_RBR +#define UART0_DLM UART0_IER + +// +// FCR Values +// +#define FCR_FIFO_EN 0x01 +#define FCR_RXSR 0x02 +#define FCR_TXSR 0x04 + +// +// LCR Values +// +#define LCR_WLS_8 0x03 +#define LCR_1_STB 0x00 +#define LCR_DIVL_EN 0x80 +#define LCR_NO_PAR 0x00 + +// +// LSR Values +// +#define LSR_DR 0x01 +#define LSR_THRE 0x20 + +/* FUNCTIONS ******************************************************************/ + +VOID +ArmFeroSerialInit(IN ULONG Baudrate) +{ + ULONG BaudClock; + + // + // Calculate baudrate clock divider to set the baud rate + // + BaudClock = (ArmBoardBlock->ClockRate / 16) / Baudrate; + + // + // Disable interrupts + // + WRITE_REGISTER_UCHAR(UART0_IER, 0); + + // + // Set the baud rate to 115200 bps + // + WRITE_REGISTER_UCHAR(UART0_LCR, LCR_DIVL_EN); + WRITE_REGISTER_UCHAR(UART0_DLL, BaudClock); + WRITE_REGISTER_UCHAR(UART0_DLM, (BaudClock >> 8) & 0xFF); + + // + // Set 8 bits for data, 1 stop bit, no parity + // + WRITE_REGISTER_UCHAR(UART0_LCR, LCR_WLS_8 | LCR_1_STB | LCR_NO_PAR); + + // + // Clear and enable FIFO + // + WRITE_REGISTER_UCHAR(UART0_FCR, FCR_FIFO_EN | FCR_RXSR | FCR_TXSR); +} + +VOID +ArmFeroPutChar(IN INT Char) +{ + // + // Properly support new-lines + // + if (Char == '\n') ArmFeroPutChar('\r'); + + // + // Wait for ready + // + while ((READ_REGISTER_UCHAR(UART0_LSR) & LSR_THRE) == 0); + + // + // Send the character + // + WRITE_REGISTER_UCHAR(UART0_THR, Char); +} + +INT +ArmFeroGetCh(VOID) +{ + // + // Wait for ready + // + while ((READ_REGISTER_UCHAR(UART0_LSR) & LSR_DR) == 0); + + // + // Read the character + // + return READ_REGISTER_UCHAR(UART0_RBR); +} + +BOOLEAN +ArmFeroKbHit(VOID) +{ + // + // Return if something is ready + // + return ((READ_REGISTER_UCHAR(UART0_LSR) & LSR_DR) != 0); +} diff --git a/reactos/boot/freeldr/freeldr/arch/arm/macharm.c b/reactos/boot/freeldr/freeldr/arch/arm/macharm.c index d95ed546df3..da28a9b269f 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/macharm.c +++ b/reactos/boot/freeldr/freeldr/arch/arm/macharm.c @@ -2,8 +2,8 @@ * PROJECT: ReactOS Boot Loader * LICENSE: GPL - See COPYING in the top level directory * FILE: boot/freeldr/arch/arm/marcharm.c - * PURPOSE: Implements ARM-specific machine initialization - * PROGRAMMERS: alex@winsiderss.com + * PURPOSE: Provides abstraction between the ARM Boot Loader and FreeLDR + * PROGRAMMERS: ReactOS Portable Systems Group */ /* INCLUDES *******************************************************************/ @@ -12,38 +12,10 @@ /* GLOBALS ********************************************************************/ -// -// The only things we support -// -typedef enum _ARM_BOARD_TYPE -{ - // - // Marvell Feroceon-based SoC: - // Buffalo Linkstation, KuroBox Pro, D-Link DS323 and others - // - ARM_FEROCEON = 1, -} ARM_BOARD_TYPE; - -// -// Compatible boot-loaders should return us this information -// -#define ARM_BOARD_CONFIGURATION_MAJOR_VERSION 1 -#define ARM_BOARD_CONFIGURATION_MINOR_VERSION 1 -typedef struct _ARM_BOARD_CONFIGURATION_BLOCK -{ - ULONG MajorVersion; - ULONG MinorVersion; - ARM_BOARD_TYPE BoardType; - ULONG TimerRegisterBase; - ULONG UartRegisterBase; - PBIOS_MEMORY_MAP MemoryMap; - CHAR CommandLine[256]; -} ARM_BOARD_CONFIGURATION_BLOCK, *PARM_BOARD_CONFIGURATION_BLOCK; +PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock; /* FUNCTIONS ******************************************************************/ -PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock; - VOID ArmInit(IN PARM_BOARD_CONFIGURATION_BLOCK BootContext) { diff --git a/reactos/boot/freeldr/freeldr/arch/arm/stubs.c b/reactos/boot/freeldr/freeldr/arch/arm/stubs.c index 87fbdb21993..9ac1be960bc 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/stubs.c +++ b/reactos/boot/freeldr/freeldr/arch/arm/stubs.c @@ -3,7 +3,7 @@ * LICENSE: GPL - See COPYING in the top level directory * FILE: boot/freeldr/arch/arm/stubs.c * PURPOSE: Non-completed ARM hardware-specific routines - * PROGRAMMERS: alex@winsiderss.com + * PROGRAMMERS: ReactOS Portable Systems Group */ /* INCLUDES *******************************************************************/ @@ -24,26 +24,6 @@ FrLdrStartup(IN ULONG Magic) // } -VOID -ArmConsPutChar(INT Char) -{ - while (TRUE); -} - -BOOLEAN -ArmConsKbHit(VOID) -{ - while (TRUE); - return FALSE; -} - -INT -ArmConsGetCh(VOID) -{ - while (TRUE); - return FALSE; -} - BOOLEAN ArmDiskGetBootVolume(IN PULONG DriveNumber, IN PULONGLONG StartSector, @@ -155,11 +135,31 @@ VOID MachInit(IN PCCH CommandLine) { // - // Setup ARM routines + // Setup board-specific ARM routines + // + switch (ArmBoardBlock->BoardType) + { + // + // Check for Feroceon-base boards + // + case ARM_FEROCEON: + + // + // These boards use a UART16550. Set us up for 115200 bps + // + ArmFeroSerialInit(115200); + MachVtbl.ConsPutChar = ArmFeroPutChar; + MachVtbl.ConsKbHit = ArmFeroKbHit; + MachVtbl.ConsGetCh = ArmFeroGetCh; + break; + + default: + ASSERT(FALSE); + } + + // + // Setup generic ARM routines // - MachVtbl.ConsPutChar = ArmConsPutChar; - MachVtbl.ConsKbHit = ArmConsKbHit; - MachVtbl.ConsGetCh = ArmConsGetCh; MachVtbl.PrepareForReactOS = ArmPrepareForReactOS; MachVtbl.GetMemoryMap = ArmMemGetMemoryMap; MachVtbl.DiskGetBootVolume = ArmDiskGetBootVolume; @@ -173,4 +173,9 @@ MachInit(IN PCCH CommandLine) MachVtbl.DiskGetDriveGeometry = ArmDiskGetDriveGeometry; MachVtbl.DiskGetCacheableBlockCount = ArmDiskGetCacheableBlockCount; MachVtbl.HwDetect = ArmHwDetect; + + // + // We can now print to the console + // + TuiPrintf("%s for ARM\n", GetFreeLoaderVersionString()); } diff --git a/reactos/boot/freeldr/freeldr/disk/ramdisk.c b/reactos/boot/freeldr/freeldr/disk/ramdisk.c index e9353e78f03..fa1fcd26157 100644 --- a/reactos/boot/freeldr/freeldr/disk/ramdisk.c +++ b/reactos/boot/freeldr/freeldr/disk/ramdisk.c @@ -3,7 +3,7 @@ * LICENSE: GPL - See COPYING in the top level directory * FILE: boot/freeldr/arch/i386/ramdisk.c * PURPOSE: Implements routines to support booting from a RAM Disk - * PROGRAMMERS: alex@winsiderss.com + * PROGRAMMERS: ReactOS Portable Systems Group */ /* INCLUDES *******************************************************************/ diff --git a/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild b/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild index 177ec04436b..a6a9c019fc0 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild @@ -101,6 +101,7 @@ boot.s + ferouart.c macharm.c stubs.c diff --git a/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h b/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h index bc651d6480e..973f7e5fb12 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h +++ b/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h @@ -2,8 +2,8 @@ * PROJECT: ReactOS Boot Loader * LICENSE: GPL - See COPYING in the top level directory * FILE: boot/freeldr/include/arch/arm/hardware.h - * PURPOSE: Implements routines to support booting from a RAM Disk - * PROGRAMMERS: alex@winsiderss.com + * PURPOSE: Header for ARC definitions (to be cleaned up) + * PROGRAMMERS: ReactOS Portable Systems Group */ #ifndef _ARM_HARDWARE_ @@ -13,6 +13,35 @@ #include "../../reactos/registry.h" #endif +// +// The only things we support +// +typedef enum _ARM_BOARD_TYPE +{ + // + // Marvell Feroceon-based SoC: + // Buffalo Linkstation, KuroBox Pro, D-Link DS323 and others + // + ARM_FEROCEON = 1, +} ARM_BOARD_TYPE; + +// +// Compatible boot-loaders should return us this information +// +#define ARM_BOARD_CONFIGURATION_MAJOR_VERSION 1 +#define ARM_BOARD_CONFIGURATION_MINOR_VERSION 1 +typedef struct _ARM_BOARD_CONFIGURATION_BLOCK +{ + ULONG MajorVersion; + ULONG MinorVersion; + ARM_BOARD_TYPE BoardType; + ULONG ClockRate; + ULONG TimerRegisterBase; + ULONG UartRegisterBase; + PBIOS_MEMORY_MAP MemoryMap; + CHAR CommandLine[256]; +} ARM_BOARD_CONFIGURATION_BLOCK, *PARM_BOARD_CONFIGURATION_BLOCK; + // // Static heap for ARC Hardware Component Tree // 16KB oughta be enough for anyone. @@ -63,4 +92,18 @@ FldrSetConfigurationData( IN ULONG Size ); +VOID +ArmFeroSerialInit(IN ULONG Baudrate); + +VOID +ArmFeroPutChar(IN INT Char); + +INT +ArmFeroGetCh(VOID); + +BOOLEAN +ArmFeroKbHit(VOID); + +extern PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock; + #endif diff --git a/reactos/boot/freeldr/freeldr/include/ramdisk.h b/reactos/boot/freeldr/freeldr/include/ramdisk.h index 43f68087aed..12d1b356bec 100644 --- a/reactos/boot/freeldr/freeldr/include/ramdisk.h +++ b/reactos/boot/freeldr/freeldr/include/ramdisk.h @@ -3,7 +3,7 @@ * LICENSE: GPL - See COPYING in the top level directory * FILE: boot/freeldr/include/ramdisk.h * PURPOSE: Header file for ramdisk support - * PROGRAMMERS: alex@winsiderss.com + * PROGRAMMERS: ReactOS Portable Systems Group */ #ifndef _RAMDISK_