We implemented console support (through serial port), for the current board types...
authorReactOS Portable Systems Group <ros-arm-bringup@svn.reactos.org>
Wed, 6 Feb 2008 07:32:47 +0000 (07:32 +0000)
committerReactOS Portable Systems Group <ros-arm-bringup@svn.reactos.org>
Wed, 6 Feb 2008 07:32:47 +0000 (07:32 +0000)
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

reactos/boot/freeldr/freeldr/arch/arm/boot.s
reactos/boot/freeldr/freeldr/arch/arm/ferouart.c [new file with mode: 0644]
reactos/boot/freeldr/freeldr/arch/arm/macharm.c
reactos/boot/freeldr/freeldr/arch/arm/stubs.c
reactos/boot/freeldr/freeldr/disk/ramdisk.c
reactos/boot/freeldr/freeldr/freeldr_arch.rbuild
reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h
reactos/boot/freeldr/freeldr/include/ramdisk.h

index 36bf04e..2683274 100644 (file)
@@ -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 (file)
index 0000000..351c3fb
--- /dev/null
@@ -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 <freeldr.h>
+
+/* 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);
+}
index d95ed54..da28a9b 100644 (file)
@@ -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 *******************************************************************/
 
 /* 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)
 {
index 87fbdb2..9ac1be9 100644 (file)
@@ -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());
 }
index e9353e7..fa1fcd2 100644 (file)
@@ -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 *******************************************************************/
index 177ec04..a6a9c01 100644 (file)
                                <define name="DEBUG" />
                                <define name="_NTHAL_" />
                                <file>boot.s</file>
+                               <file>ferouart.c</file>
                                <file>macharm.c</file>
                 <file>stubs.c</file>
                        </module>
index bc651d6..973f7e5 100644 (file)
@@ -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_
 #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
index 43f6808..12d1b35 100644 (file)
@@ -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_