From: ReactOS Portable Systems Group Date: Wed, 6 Feb 2008 07:32:47 +0000 (+0000) Subject: We implemented console support (through serial port), for the current board types... X-Git-Tag: backups/hyperion@33110~865 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=75172afb72af37375b23d20a5ff09807a5e0ee22 We implemented console support (through serial port), for the current board types supported (Feroceon, using UART 16550). We added a new ClockRate member to the ARM Board Block structure. We now print out the FreeLDR header after initialization to give some output to the user that we are alive. Started putting shared stuff in headers. Fixed copy/paste leftovers from file headers (wrong file names, implementation details, author). svn path=/trunk/; revision=32151 --- 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_