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