Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

hal/imxrt: Support RTT as a HAL console #600

Merged
merged 1 commit into from
Oct 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion hal/arm/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@
# TODO handle other common ARM stuff (e.g GIC) and
# select relevant components here

OBJS += $(addprefix $(PREFIX_O)hal/arm/, scs.o)
OBJS += $(addprefix $(PREFIX_O)hal/arm/, scs.o rtt.o)
158 changes: 158 additions & 0 deletions hal/arm/rtt.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
/*
* Phoenix-RTOS
*
* SEGGER's Real Time Transfer - simplified driver
*
* Copyright 2023-2024 Phoenix Systems
* Author: Gerard Swiderski, Daniel Sawka
*
* This file is part of Phoenix-RTOS.
*
* %LICENSE%
*/

#include "include/errno.h"
#include "syspage.h"
#include "hal/arm/barriers.h"

#include <board_config.h>
#include "rtt.h"

#ifndef RTT_SYSPAGE_MAP_NAME
#define RTT_SYSPAGE_MAP_NAME "rtt"
#endif

#ifndef RTT_CB_SIZE
#define RTT_CB_SIZE 256
#endif


struct rtt_pipe {
const char *name;
volatile unsigned char *ptr;
unsigned int sz;
volatile unsigned int wr;
volatile unsigned int rd;
unsigned int flags;
};


struct rtt_desc {
char tag[16];
unsigned int txChannels;
unsigned int rxChannels;
struct rtt_pipe channels[];
};


static struct {
volatile struct rtt_desc *rtt;
} common;


static int rtt_check(unsigned int chan, rtt_dir_t dir)
{
if ((dir == rtt_dir_up) && (chan >= common.rtt->txChannels)) {
return -ENODEV;
}

if ((dir == rtt_dir_down) && (chan >= common.rtt->rxChannels)) {
return -ENODEV;
}

return 0;
}


int _hal_rttWrite(unsigned int chan, const void *buf, unsigned int count)
{
unsigned int sz;
unsigned int rd;
unsigned int wr;
unsigned int todo;
volatile unsigned char *dstBuf;

if (rtt_check(chan, rtt_dir_up) < 0) {
return -ENODEV;
}

hal_cpuDataMemoryBarrier();
dstBuf = common.rtt->channels[chan].ptr;
sz = common.rtt->channels[chan].sz - 1;
rd = (common.rtt->channels[chan].rd + sz) & sz;
wr = common.rtt->channels[chan].wr & sz;
todo = count;

/* TODO: Support all buffer modes (currently only trim is used, regardless of flags) */
while ((todo != 0) && (rd != wr)) {
dstBuf[wr] = *(const unsigned char *)buf++;
wr = (wr + 1) & sz;
todo--;
}

hal_cpuDataMemoryBarrier();
common.rtt->channels[chan].wr = wr;

return count - todo;
}


int _hal_rttTxAvail(unsigned int chan)
{
unsigned int sz;
unsigned int rd;
unsigned int wr;

if (rtt_check(chan, rtt_dir_up) < 0) {
return -ENODEV;
}

hal_cpuDataMemoryBarrier();
sz = common.rtt->channels[chan].sz - 1;
rd = (common.rtt->channels[chan].rd + sz) & sz;
wr = common.rtt->channels[chan].wr & sz;

if (wr > rd) {
return sz + 1 - (wr - rd);
}
else {
return rd - wr;
}
}


int _hal_rttReset(unsigned int chan, rtt_dir_t dir)
{
if (rtt_check(chan, dir) < 0) {
return -ENODEV;
Darchiv marked this conversation as resolved.
Show resolved Hide resolved
}

hal_cpuDataMemoryBarrier();
if (dir == rtt_dir_up) {
common.rtt->channels[chan].wr = common.rtt->channels[chan].rd;
Darchiv marked this conversation as resolved.
Show resolved Hide resolved
}
else {
chan = common.rtt->txChannels + chan;
common.rtt->channels[chan].rd = common.rtt->channels[chan].wr;
}
hal_cpuDataMemoryBarrier();
return 0;
}


int _hal_rttInit(void)
{
const syspage_map_t *map = syspage_mapNameResolve(RTT_SYSPAGE_MAP_NAME);

if (map == NULL) {
return -ENOENT;
}

if (map->start + RTT_CB_SIZE > map->end) {
return -EINVAL;
}

/* TODO: Place CB always at the start of the map? */
common.rtt = (void *)(map->end - RTT_CB_SIZE);
return 0;
}
47 changes: 47 additions & 0 deletions hal/arm/rtt.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/*
* Phoenix-RTOS
*
* SEGGER's Real Time Transfer - simplified driver
*
* Copyright 2023-2024 Phoenix Systems
* Author: Gerard Swiderski, Daniel Sawka
*
* This file is part of Phoenix-RTOS.
*
* %LICENSE%
*/

#ifndef HAL_ARM_RTT_H_
#define HAL_ARM_RTT_H_


typedef enum {
rtt_dir_up, /* tx: target -> host */
rtt_dir_down, /* rx: host -> target */
} rtt_dir_t;


typedef enum {
rtt_mode_skip = 0, /* write if the whole message can be written at once; discard the message otherwise */
rtt_mode_trim = 1, /* write anything if possible; discard the remaining unwritten data otherwise */
rtt_mode_blocking = 2, /* wait until writable */
} rtt_mode_t;


/* Initialize rtt internal structures */
int _hal_rttInit(void);


/* Non-blocking write to channel */
int _hal_rttWrite(unsigned int chan, const void *buf, unsigned int count);


/* Check for available space in tx */
int _hal_rttTxAvail(unsigned int chan);


/* Reset fifo pointers */
int _hal_rttReset(unsigned int chan, rtt_dir_t dir);


#endif /* end of HAL_ARM_RTT_H_ */
48 changes: 41 additions & 7 deletions hal/armv7m/imxrt/10xx/console.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
*
* Operating system kernel
*
* HAL console (iMXRT USART)
* HAL console (iMXRT USART + RTT)
*
* Copyright 2016-2017 Phoenix Systems
* Author: Pawel Pisarczyk, Artur Wodejko, Aleksander Kaminski
Expand All @@ -14,21 +14,35 @@
*/

#include "hal/console.h"
#include "hal/arm/rtt.h"
#include "include/arch/armv7m/imxrt/10xx/imxrt10xx.h"
#include "imxrt10xx.h"
#include "lib/helpers.h"
#include <arch/cpu.h>

#include <board_config.h>

#ifndef UART_CONSOLE
#define UART_CONSOLE 1
#ifndef UART_CONSOLE_KERNEL
#ifdef UART_CONSOLE
#define UART_CONSOLE_KERNEL UART_CONSOLE
#else
#define UART_CONSOLE_KERNEL 1
#endif
#endif

#ifndef RTT_CONSOLE_KERNEL
#if RTT_ENABLED
#define RTT_CONSOLE_KERNEL 0
#else
#define RTT_CONSOLE_KERNEL
#endif
#endif

#define CONCAT3(a, b, c) a##b##c
#define CONSOLE_BAUD(n) (CONCAT3(UART, n, _BAUDRATE))

#if CONSOLE_BAUD(UART_CONSOLE)
#define CONSOLE_BAUDRATE CONSOLE_BAUD(UART_CONSOLE)
#if !ISEMPTY(UART_CONSOLE_KERNEL) && CONSOLE_BAUD(UART_CONSOLE_KERNEL)
#define CONSOLE_BAUDRATE CONSOLE_BAUD(UART_CONSOLE_KERNEL)
#else
#define CONSOLE_BAUDRATE 115200
#endif
Expand Down Expand Up @@ -63,16 +77,23 @@ void hal_consolePrint(int attr, const char *s)

void hal_consolePutch(char c)
{
#if RTT_ENABLED && !ISEMPTY(RTT_CONSOLE_KERNEL)
_hal_rttWrite(RTT_CONSOLE_KERNEL, &c, 1);
#endif

#if !ISEMPTY(UART_CONSOLE_KERNEL)
while (!(*(console_common.uart + uart_stat) & (1 << 23)))
;

*(console_common.uart + uart_data) = c;
#endif
}


void _hal_consoleInit(void)
#if !ISEMPTY(UART_CONSOLE_KERNEL)
static void _hal_uartInit(void)
{
u32 t, console = UART_CONSOLE - 1;
u32 t, console = UART_CONSOLE_KERNEL - 1;

static const struct {
volatile u32 *base;
Expand Down Expand Up @@ -155,3 +176,16 @@ void _hal_consoleInit(void)
/* Enable TX and RX */
*(console_common.uart + uart_ctrl) |= (1 << 19) | (1 << 18);
}
#endif


void _hal_consoleInit(void)
{
#if RTT_ENABLED && !ISEMPTY(RTT_CONSOLE_KERNEL)
_hal_rttInit();
#endif

#if !ISEMPTY(UART_CONSOLE_KERNEL)
_hal_uartInit();
#endif
}
48 changes: 41 additions & 7 deletions hal/armv7m/imxrt/117x/console.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
*
* Operating system kernel
*
* HAL console (i.MX RT1170 UART)
* HAL console (i.MX RT1170 UART + RTT)
*
* Copyright 2016-2017, 2019 Phoenix Systems
* Author: Pawel Pisarczyk, Artur Wodejko, Aleksander Kaminski
Expand All @@ -14,21 +14,35 @@
*/

#include "hal/console.h"
#include "hal/arm/rtt.h"
#include "include/arch/armv7m/imxrt/11xx/imxrt1170.h"
#include "imxrt117x.h"
#include "lib/helpers.h"
#include <arch/cpu.h>

#include <board_config.h>

#ifndef UART_CONSOLE
#define UART_CONSOLE 11
#ifndef UART_CONSOLE_KERNEL
#ifdef UART_CONSOLE
#define UART_CONSOLE_KERNEL UART_CONSOLE
#else
#define UART_CONSOLE_KERNEL 11
#endif
#endif

#ifndef RTT_CONSOLE_KERNEL
#if RTT_ENABLED
#define RTT_CONSOLE_KERNEL 0
#else
#define RTT_CONSOLE_KERNEL
#endif
#endif

#define CONCAT3(a, b, c) a##b##c
#define CONSOLE_BAUD(n) (CONCAT3(UART, n, _BAUDRATE))

#if CONSOLE_BAUD(UART_CONSOLE)
#define CONSOLE_BAUDRATE CONSOLE_BAUD(UART_CONSOLE)
#if !ISEMPTY(UART_CONSOLE_KERNEL) && CONSOLE_BAUD(UART_CONSOLE_KERNEL)
agkaminski marked this conversation as resolved.
Show resolved Hide resolved
#define CONSOLE_BAUDRATE CONSOLE_BAUD(UART_CONSOLE_KERNEL)
#else
#define CONSOLE_BAUDRATE 115200
#endif
Expand Down Expand Up @@ -63,16 +77,23 @@ void hal_consolePrint(int attr, const char *s)

void hal_consolePutch(char c)
{
#if RTT_ENABLED && !ISEMPTY(RTT_CONSOLE_KERNEL)
_hal_rttWrite(RTT_CONSOLE_KERNEL, &c, 1);
#endif

#if !ISEMPTY(UART_CONSOLE_KERNEL)
while (!(*(console_common.uart + uart_stat) & (1 << 23)))
;

*(console_common.uart + uart_data) = c;
#endif
}


void _hal_consoleInit(void)
#if !ISEMPTY(UART_CONSOLE_KERNEL)
static void _hal_uartInit(void)
{
u32 t, console = UART_CONSOLE - 1;
u32 t, console = UART_CONSOLE_KERNEL - 1;

static const struct {
volatile u32 *base;
Expand Down Expand Up @@ -156,3 +177,16 @@ void _hal_consoleInit(void)
/* Enable TX and RX */
*(console_common.uart + uart_ctrl) |= (1 << 19) | (1 << 18);
}
#endif


void _hal_consoleInit(void)
{
#if RTT_ENABLED && !ISEMPTY(RTT_CONSOLE_KERNEL)
_hal_rttInit();
#endif

#if !ISEMPTY(UART_CONSOLE_KERNEL)
_hal_uartInit();
#endif
}
Loading
Loading