RefOS is now working fine on am335x / beaglebone black.
Patches attached.

Tim
From 3761794154c71239bd79748a0c5b44d5ae4d1b0e Mon Sep 17 00:00:00 2001
From: Tim Newsham <[email protected]>
Date: Sat, 14 Mar 2015 15:36:30 -1000
Subject: [PATCH 1/2] - allow UART to be used even in debug mode

---
 src/plat/am335x/machine/hardware.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/plat/am335x/machine/hardware.c b/src/plat/am335x/machine/hardware.c
index f940654..41a4eb1 100644
--- a/src/plat/am335x/machine/hardware.c
+++ b/src/plat/am335x/machine/hardware.c
@@ -42,9 +42,7 @@ BOOT_CODE p_region_t get_avail_p_reg(unsigned int i)
 
 const p_region_t BOOT_RODATA dev_p_regs[] = {
     /* SoC devices: */
-#ifndef DEBUG
     { /* .start = */ UART0_PADDR, /* .end = */ UART0_PADDR + (1 << PAGE_BITS) },
-#endif
     { /* .start = */ DMTIMER2_PADDR, /* .end = */ DMTIMER2_PADDR + (1 << PAGE_BITS) },
     { /* .start = */ DMTIMER3_PADDR, /* .end = */ DMTIMER3_PADDR + (1 << PAGE_BITS) },
     { /* .start = */ DMTIMER4_PADDR, /* .end = */ DMTIMER4_PADDR + (1 << PAGE_BITS) },
-- 
1.9.1

From 747af66d974abe2f0f53f5d5320e86317ac4e973 Mon Sep 17 00:00:00 2001
From: Tim Newsham <[email protected]>
Date: Sun, 15 Mar 2015 21:11:58 -1000
Subject: [PATCH 1/2] - add getchar support (not yet tested)

---
 src/plat/am335x/serial.c | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/plat/am335x/serial.c b/src/plat/am335x/serial.c
index a2a94c1..92e13d6 100644
--- a/src/plat/am335x/serial.c
+++ b/src/plat/am335x/serial.c
@@ -11,22 +11,32 @@
 #include <string.h>
 #include <stdlib.h>
 #include "serial.h"
+#include <sel4/sel4.h>
 
-#define UART_SR1_TRDY  BIT(5)
-#define UTXD           0x00
-#define USR1           0x14
+#define RHR         0x00
+#define THR         0x00
+#define LSR         0x14
+#define RHR_MASK    MASK(8)
+#define LSR_TXFIFOE BIT(5)
+#define LSR_RXFIFOE BIT(0)
 
 #define REG_PTR(base, off)     ((volatile uint32_t *)((base) + (off)))
 
 static int uart_getchar(ps_chardevice_t *d)
 {
-    return EOF; // XXX
+    int ch = EOF;
+
+    if (*REG_PTR(d->vaddr, LSR) & LSR_RXFIFOE) {
+        ch = *REG_PTR(d->vaddr, RHR) & RHR_MASK;
+    }
+    return ch;
 }
 
 static int uart_putchar(ps_chardevice_t* d, int c)
 {
-    while (!(*REG_PTR(d->vaddr, USR1) & UART_SR1_TRDY));
-    *REG_PTR(d->vaddr, UTXD) = c;
+    while (!(*REG_PTR(d->vaddr, LSR) & LSR_TXFIFOE))
+        continue;
+    *REG_PTR(d->vaddr, THR) = c;
     if (c == '\n') {
         uart_putchar(d, '\r');
     }
-- 
1.9.1

From 9f6ddcc387fa0682bb00ab34af56d499639deada Mon Sep 17 00:00:00 2001
From: Tim Newsham <[email protected]>
Date: Mon, 16 Mar 2015 10:42:33 -1000
Subject: [PATCH 2/2] - enable receive interrupts on am335x uart

---
 src/plat/am335x/serial.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/plat/am335x/serial.c b/src/plat/am335x/serial.c
index 92e13d6..02efd43 100644
--- a/src/plat/am335x/serial.c
+++ b/src/plat/am335x/serial.c
@@ -11,12 +11,13 @@
 #include <string.h>
 #include <stdlib.h>
 #include "serial.h"
-#include <sel4/sel4.h>
 
 #define RHR         0x00
 #define THR         0x00
+#define IER         0x04
 #define LSR         0x14
 #define RHR_MASK    MASK(8)
+#define IER_RHRIT   BIT(0)
 #define LSR_TXFIFOE BIT(5)
 #define LSR_RXFIFOE BIT(0)
 
@@ -47,7 +48,7 @@ static int uart_putchar(ps_chardevice_t* d, int c)
 static void
 uart_handle_irq(ps_chardevice_t* d UNUSED)
 {
-    /* TODO */
+    /* nothing to do */
 }
 
 
@@ -101,6 +102,7 @@ int uart_init(const struct dev_defn* defn,
     dev->irqs       = defn->irqs;
     dev->ioops      = *ops;
 
+    *REG_PTR(dev->vaddr, IER) = IER_RHRIT;
     return 0;
 }
 
-- 
1.9.1

From c818af28b3e3bcb863cee2a82f6f1aef1b4298a6 Mon Sep 17 00:00:00 2001
From: Tim Newsham <[email protected]>
Date: Sun, 15 Mar 2015 21:13:36 -1000
Subject: [PATCH] - fix uncachable io mappings

---
 impl/apps/process_server/src/dispatchers/data_syscall.c | 2 +-
 impl/libs/librefos/src/refos-util/device_io.c           | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/impl/apps/process_server/src/dispatchers/data_syscall.c b/impl/apps/process_server/src/dispatchers/data_syscall.c
index 23d7abe..6af47c1 100644
--- a/impl/apps/process_server/src/dispatchers/data_syscall.c
+++ b/impl/apps/process_server/src/dispatchers/data_syscall.c
@@ -58,7 +58,7 @@ data_open_handler(void *rpc_userptr , char* rpc_name , int rpc_flags , int rpc_m
     }
 
     /* Set physical address mode, if required. */
-    if (rpc_flags == PROCSERV_DSPACE_FLAG_DEVICE_PADDR) {
+    if ((rpc_flags & PROCSERV_DSPACE_FLAG_DEVICE_PADDR) != 0) {
         int error = EACCESSDENIED;
         if (pcb->systemCapabilitiesMask & PROCESS_PERMISSION_DEVICE_MAP) {
             error = ram_dspace_set_to_paddr(newDataspace, (uint32_t) rpc_mode);
diff --git a/impl/libs/librefos/src/refos-util/device_io.c b/impl/libs/librefos/src/refos-util/device_io.c
index d8cb09c..89f3acf 100644
--- a/impl/libs/librefos/src/refos-util/device_io.c
+++ b/impl/libs/librefos/src/refos-util/device_io.c
@@ -58,7 +58,7 @@ dev_io_map(void* cookie, uintptr_t paddr, size_t size, int cached, ps_mem_flags_
 
     /* Open and map the device MMIO dataspace. */
     (*deviceMapping) = data_open_map(REFOS_PROCSERV_EP, "anon",
-            DSPACE_FLAG_DEVICE_PADDR | (cached ? DSPACE_FLAG_UNCACHED : 0),
+            DSPACE_FLAG_DEVICE_PADDR | (cached ? 0 : DSPACE_FLAG_UNCACHED),
             (int) paddr, size, size);
     if (deviceMapping->err) {
         ROS_ERROR("Could not open and map device dataspace.");
@@ -252,4 +252,4 @@ devio_init(dev_io_ops_t *io)
 
     /* Initialise MMIO mapping table. */
     chash_init(&io->MMIOMappings, DEVICE_MMIO_MAPPING_HASHTABLE_SIZE);
-}
\ No newline at end of file
+}
-- 
1.9.1

_______________________________________________
Devel mailing list
[email protected]
https://sel4.systems/lists/listinfo/devel

Reply via email to