]> Zhao Yanbai Git Server - minix.git/commitdiff
arm:remove hardcoded base address for the in kernel serial. 82/582/3
authorKees Jongenburger <kees.jongenburger@gmail.com>
Thu, 23 May 2013 08:03:09 +0000 (10:03 +0200)
committerKees Jongenburger <kees.jongenburger@gmail.com>
Fri, 24 May 2013 09:17:52 +0000 (11:17 +0200)
Removed hardcoded base address for in kernel serial. This will ease
porting to different boards and allow us to remap i/o at later stage.

Change-Id: I4a4e00ed2aa2f94dfe928dc43a6816d3b94576b7

kernel/arch/earm/omap_serial.c
kernel/arch/earm/omap_serial.h
kernel/arch/earm/pre_init.c
kernel/main.c

index 4f82ac9c6c10a419921faa2be1f3571848a1abff..4f628b7a9d8d8083301505a01c78f689185d3d0e 100644 (file)
@@ -1,22 +1,59 @@
+#include <assert.h>
 #include <sys/types.h>
 #include <machine/cpu.h>
+#include <minix/type.h>
 #include <io.h>
 #include "omap_serial.h"
 
+struct omap_serial {
+       vir_bytes base;         
+};
+
+static struct omap_serial omap_serial = {
+       .base = 0,
+};
+
+/* 
+ * In kernel serial for the omap. The serial driver like most other
+ * drivers needs to be started early and even before the MMU is turned on.
+ * We start by directly accessing the hardware memory address. Later on
+ * a when the MMU is turned on we still use a 1:1 mapping for these addresses.
+ *
+ * Pretty soon we are going to remap these addresses at later stage. And this
+ * requires us to use a dynamic base address. The idea is to receive a callback
+ * from VM with the new address to use.
+ *
+ * We also anticipate on the beaglebone port an try to keep the differences between
+ * the drivers to a minimum by initializing a struct here and not using (to much) 
+ * constants in the code.
+ *
+ * The serial driver also gets used in the "pre_init" stage before the kernel is loaded
+ * in high memory so keep in mind there are two copies of this code in the kernel.
+ */
+void omap3_ser_init(){
+#ifdef DM37XX
+       omap_serial.base = OMAP3_DEBUG_UART_BASE;
+       //map(OMAP3_DEBUG_UART_BASE,&callback);
+#endif
+    assert(omap_serial.base);
+}
+
 void omap3_ser_putc(char c)
 {
+    assert(omap_serial.base);
+
     int i;
 
     /* Wait until FIFO's empty */
     for (i = 0; i < 100000; i++)
-       if (mmio_read(OMAP3_DEBUG_UART_LSR) & OMAP3_LSR_THRE)
+       if (mmio_read(omap_serial.base +  OMAP3_LSR) & OMAP3_LSR_THRE)
            break;
 
     /* Write character */
-    mmio_write(OMAP3_DEBUG_UART_THR, c);
+    mmio_write(omap_serial.base + OMAP3_THR, c);
 
     /* And wait again until FIFO's empty to prevent TTY from overwriting */
     for (i = 0; i < 100000; i++)
-       if (mmio_read(OMAP3_DEBUG_UART_LSR) & (OMAP3_LSR_THRE | OMAP3_LSR_TEMT))
+       if (mmio_read(omap_serial.base + OMAP3_LSR) & (OMAP3_LSR_THRE | OMAP3_LSR_TEMT))
            break;
 }
index 3cb8a344e42b24ad0427aeda91636774461bffd6..9d3b4bb744d2defb9d18e33267d5dfee576d4f3b 100644 (file)
 /* Supplementary status register fields */
 #define OMAP3_SSR_TX_FIFO_FULL (1 << 0) /* Transmit FIFO full */
 
-#define OMAP3_DEBUG_UART_THR (OMAP3_DEBUG_UART_BASE + OMAP3_THR)
-#define OMAP3_DEBUG_UART_LSR (OMAP3_DEBUG_UART_BASE + OMAP3_LSR)
-#define OMAP3_DEBUG_UART_SSR (OMAP3_DEBUG_UART_BASE + OMAP3_SSR)
-
 #ifndef __ASSEMBLY__
 
+void omap3_ser_init();
 void omap3_ser_putc(char c);
 
 #endif /* __ASSEMBLY__ */
index 45464e4ea917d2b06f8283c2cf4b52a9f99e09e3..0d62bac7a5642878c92fd3339bc66816224fc4b0 100644 (file)
@@ -130,7 +130,7 @@ void setup_mbi(multiboot_info_t *mbi)
        /* Final 'module' is actually a string holding the boot cmdline */
        mbi->cmdline = MB_PARAM_MOD;
 
-       mbi->mmap_addr = (void*)&mb_memmap;
+       mbi->mmap_addr =(u32_t)&mb_memmap;
        mbi->mmap_length = sizeof(mb_memmap);
 
        mb_memmap.size = sizeof(multiboot_memory_map_t);
@@ -267,6 +267,7 @@ kinfo_t *pre_init(u32_t magic, u32_t ebx)
        /* Clear BSS */
        memset(&_edata, 0, (u32_t)&_end - (u32_t)&_edata);
 
+       omap3_ser_init();       
        /* Get our own copy boot params pointed to by ebx.
         * Here we find out whether we should do serial output.
         */
@@ -286,7 +287,13 @@ kinfo_t *pre_init(u32_t magic, u32_t ebx)
        return &kinfo;
 }
 
+/* pre_init gets executed at the memory location where the kernel was loaded by the boot loader.
+ * at that stage we only have a minium set of functionality present (all symbols gets renamed to
+ * ensure this). The following methods are used in that context. Once we jump to kmain they are no
+ * longer used and the "real" implementations are visible
+ */
 int send_sig(endpoint_t proc_nr, int sig_nr) { return 0; }
 void minix_shutdown(timer_t *t) { arch_shutdown(RBT_PANIC); }
 void busy_delay_ms(int x) { }
 int raise(int n) { panic("raise(%d)\n", n); }
+
index 288ba24e7dd07abef43ac50c63179e302e61ef20..cf80c954e70027a299f42960aa2c9f449309429c 100644 (file)
@@ -127,6 +127,10 @@ void kmain(kinfo_t *local_cbi)
   memcpy(&kinfo, local_cbi, sizeof(kinfo));
   memcpy(&kmess, kinfo.kmess, sizeof(kmess));
 
+#ifdef __arm__
+  /* We want to initialize serial before we do any output */
+  omap3_ser_init();
+#endif
   /* We can talk now */
   printf("MINIX booting\n");