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

tinyemu: Test Version of Apache NuttX RTOS for TinyEMU #51

Draft
wants to merge 9 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -62,3 +62,4 @@ uImage
.DS_Store
tools/gdb/__pycache__
/build
init.S
19 changes: 19 additions & 0 deletions arch/risc-v/src/qemu-rv/qemu_rv_head.S
Expand Up @@ -41,6 +41,25 @@

__start:

/* Print `123` to HTIF Console */
/* Load HTIF Base Address to Register t0 */
li t0, 0x40008000

/* Load to Register t1 the HTIF Command to print `1` */
li t1, 0x0101000000000031
/* Store 64-bit double-word from Register t1 to HTIF Base Address, Offset 0 */
sd t1, 0(t0)

/* Load to Register t1 the HTIF Command to print `2` */
li t1, 0x0101000000000032
/* Store 64-bit double-word from Register t1 to HTIF Base Address, Offset 0 */
sd t1, 0(t0)

/* Load to Register t1 the HTIF Command to print `3` */
li t1, 0x0101000000000033
/* Store 64-bit double-word from Register t1 to HTIF Base Address, Offset 0 */
sd t1, 0(t0)

/* Preserve a1 as it contains the pointer to DTB */
/* Load mhartid (cpuid) */

Expand Down
39 changes: 39 additions & 0 deletions boards/risc-v/qemu-rv/rv-virt/configs/nsh64/defconfig
Expand Up @@ -29,10 +29,48 @@ CONFIG_ARCH_STACKDUMP=y
CONFIG_BCH=y
CONFIG_BOARD_LOOPSPERMSEC=6366
CONFIG_BUILTIN=y
CONFIG_DEBUG_ASSERTIONS=y
CONFIG_DEBUG_ASSERTIONS_EXPRESSION=y
CONFIG_DEBUG_BINFMT=y
CONFIG_DEBUG_BINFMT_ERROR=y
CONFIG_DEBUG_BINFMT_INFO=y
CONFIG_DEBUG_BINFMT_WARN=y
CONFIG_DEBUG_FEATURES=y
CONFIG_DEBUG_FS=y
CONFIG_DEBUG_FS_ERROR=y
CONFIG_DEBUG_FS_INFO=y
CONFIG_DEBUG_FS_WARN=y
CONFIG_DEBUG_FULLOPT=y
CONFIG_DEBUG_IPC=y
CONFIG_DEBUG_IPC_ERROR=y
CONFIG_DEBUG_IPC_INFO=y
CONFIG_DEBUG_IPC_WARN=y
CONFIG_DEBUG_LIB=y
CONFIG_DEBUG_LIB_ERROR=y
CONFIG_DEBUG_LIB_INFO=y
CONFIG_DEBUG_LIB_WARN=y
CONFIG_DEBUG_MM=y
CONFIG_DEBUG_MM_ERROR=y
CONFIG_DEBUG_MM_INFO=y
CONFIG_DEBUG_MM_WARN=y
CONFIG_DEBUG_SCHED=y
CONFIG_DEBUG_SCHED_ERROR=y
CONFIG_DEBUG_SCHED_INFO=y
CONFIG_DEBUG_SCHED_WARN=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_DEBUG_TIMER=y
CONFIG_DEBUG_TIMER_ERROR=y
CONFIG_DEBUG_TIMER_INFO=y
CONFIG_DEBUG_TIMER_WARN=y
CONFIG_DEBUG_VIRTIO=y
CONFIG_DEBUG_VIRTIO_ERROR=y
CONFIG_DEBUG_VIRTIO_INFO=y
CONFIG_DEBUG_VIRTIO_WARN=y
CONFIG_DEVICE_TREE=y
CONFIG_DEV_SIMPLE_ADDRENV=y
CONFIG_DEV_ZERO=y
CONFIG_DRIVERS_VIRTIO=y
CONFIG_DRIVERS_VIRTIO_MMIO=y
CONFIG_ELF=y
CONFIG_EXAMPLES_HELLO=m
CONFIG_FS_HOSTFS=y
Expand All @@ -45,6 +83,7 @@ CONFIG_LIBC_ENVPATH=y
CONFIG_LIBC_EXECFUNCS=y
CONFIG_LIBC_PERROR_STDOUT=y
CONFIG_LIBC_STRERROR=y
CONFIG_NDEBUG=y
CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
Expand Down
18 changes: 13 additions & 5 deletions boards/risc-v/qemu-rv/rv-virt/src/qemu_rv_appinit.c
Expand Up @@ -28,6 +28,7 @@
#include <stdio.h>
#include <syslog.h>
#include <errno.h>
#include <debug.h>

#include <nuttx/board.h>
#include <nuttx/virtio/virtio-mmio.h>
Expand All @@ -38,14 +39,14 @@
* Pre-processor Definitions
****************************************************************************/

#define QEMU_VIRTIO_MMIO_BASE 0x10001000
#define QEMU_VIRTIO_MMIO_REGSIZE 0x1000
#define QEMU_VIRTIO_MMIO_BASE 0x40010000 // VIRTIO_BASE_ADDR. Previously: 0x10001000
#define QEMU_VIRTIO_MMIO_REGSIZE 0x1000 // VIRTIO_SIZE
#ifdef CONFIG_ARCH_USE_S_MODE
# define QEMU_VIRTIO_MMIO_IRQ 26
# define QEMU_VIRTIO_MMIO_IRQ 26 // TODO: Should this be 1? (VIRTIO_IRQ)
#else
# define QEMU_VIRTIO_MMIO_IRQ 28
# define QEMU_VIRTIO_MMIO_IRQ 28 // TODO: Should this be 1? (VIRTIO_IRQ)
#endif
#define QEMU_VIRTIO_MMIO_NUM 8
#define QEMU_VIRTIO_MMIO_NUM 1 // Number of VirtIO Devices. Previously: 8

/****************************************************************************
* Private Functions
Expand Down Expand Up @@ -119,3 +120,10 @@ int board_app_initialize(uintptr_t arg)
return OK;
#endif
}

// Based on virtio_mmio_create_virtqueue
// https://github.com/apache/nuttx/blob/master/drivers/virtio/virtio-mmio.c#L349-L414
void test_virtio(void)
{
_info("\n");
}
45 changes: 27 additions & 18 deletions drivers/serial/uart_16550.c
Expand Up @@ -609,10 +609,12 @@ static uart_dev_t g_uart3port =
static inline uart_datawidth_t u16550_serialin(FAR struct u16550_s *priv,
int offset)
{
return 0; ////
// Commented out the rest
#ifdef CONFIG_SERIAL_UART_ARCH_MMIO
return *((FAR volatile uart_datawidth_t *)priv->uartbase + offset);
// return *((FAR volatile uart_datawidth_t *)priv->uartbase + offset);
#else
return uart_getreg(priv->uartbase, offset);
// return uart_getreg(priv->uartbase, offset);
#endif
}

Expand All @@ -623,10 +625,11 @@ static inline uart_datawidth_t u16550_serialin(FAR struct u16550_s *priv,
static inline void u16550_serialout(FAR struct u16550_s *priv, int offset,
uart_datawidth_t value)
{
// Commented out the rest
#ifdef CONFIG_SERIAL_UART_ARCH_MMIO
*((FAR volatile uart_datawidth_t *)priv->uartbase + offset) = value;
// *((FAR volatile uart_datawidth_t *)priv->uartbase + offset) = value;
#else
uart_putreg(priv->uartbase, offset, value);
// uart_putreg(priv->uartbase, offset, value);
#endif
}

Expand All @@ -648,22 +651,24 @@ static inline void u16550_serialout(FAR struct u16550_s *priv, int offset,

static int u16550_wait(FAR struct u16550_s *priv)
{
int i;
// Nopez! No waiting for now
return OK; ////
// int i;

for (i = 0; i < UART_TIMEOUT_MS; i++)
{
uint32_t status = u16550_serialin(priv, UART_USR_OFFSET);
// for (i = 0; i < UART_TIMEOUT_MS; i++)
// {
// uint32_t status = u16550_serialin(priv, UART_USR_OFFSET);

if ((status & UART_USR_BUSY) == 0)
{
return OK;
}
// if ((status & UART_USR_BUSY) == 0)
// {
// return OK;
// }

up_mdelay(1);
}
// up_mdelay(1);
// }

_err("UART timeout\n");
return ERROR;
// _err("UART timeout\n");
// return ERROR;
}
#endif /* CONFIG_16550_WAIT_LCR */

Expand Down Expand Up @@ -1705,8 +1710,12 @@ static bool u16550_txempty(struct uart_dev_s *dev)
#ifdef HAVE_16550_CONSOLE
static void u16550_putc(FAR struct u16550_s *priv, int ch)
{
while ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) == 0);
u16550_serialout(priv, UART_THR_OFFSET, (uart_datawidth_t)ch);
// Hardcode the HTIF Base Address
*(volatile uint64_t *) 0x40008000 = 0x0101000000000000ul | ch;

// Previously:
// while ((u16550_serialin(priv, UART_LSR_OFFSET) & UART_LSR_THRE) == 0);
// u16550_serialout(priv, UART_THR_OFFSET, (uart_datawidth_t)ch);
}
#endif

Expand Down
57 changes: 57 additions & 0 deletions drivers/virtio/virtio-mmio.c
Expand Up @@ -867,6 +867,63 @@ int virtio_register_mmio_device(FAR void *regs, int irq)
goto err;
}

// Testing: Init VirtIO Device
// Based on virtio_serial_init
// https://github.com/apache/nuttx/blob/master/drivers/virtio/virtio-serial.c#L445-L511

struct virtio_device *vdev = &vmdev->vdev;
DEBUGASSERT(vdev != NULL);

virtio_set_status(vdev, VIRTIO_CONFIG_STATUS_DRIVER);
virtio_set_features(vdev, 0);
virtio_set_status(vdev, VIRTIO_CONFIG_FEATURES_OK);

#define VIRTIO_SERIAL_RX 0
#define VIRTIO_SERIAL_TX 1
#define VIRTIO_SERIAL_NUM 2
const char *vqnames[VIRTIO_SERIAL_NUM];
vqnames[VIRTIO_SERIAL_RX] = "virtio_serial_rx";
vqnames[VIRTIO_SERIAL_TX] = "virtio_serial_tx";

vq_callback callbacks[VIRTIO_SERIAL_NUM];
callbacks[VIRTIO_SERIAL_RX] = NULL; //// TODO: virtio_serial_rxready;
callbacks[VIRTIO_SERIAL_TX] = NULL; //// TODO: virtio_serial_txdone;
ret = virtio_create_virtqueues(vdev, 0, VIRTIO_SERIAL_NUM, vqnames,
callbacks);
DEBUGASSERT(ret >= 0);
virtio_set_status(vdev, VIRTIO_CONFIG_STATUS_DRIVER_OK);

// Testing: Send data to VirtIO Device
// Based on virtio_serial_dmasend
// https://github.com/apache/nuttx/blob/master/drivers/virtio/virtio-serial.c#L310-L345

DEBUGASSERT(vdev->vrings_info != NULL);
struct virtqueue *vq = vdev->vrings_info[VIRTIO_SERIAL_TX].vq;
DEBUGASSERT(vq != NULL);

/* Set the virtqueue buffer */
static char *HELLO_MSG = "Hello VirtIO from NuttX!\r\n";
struct virtqueue_buf vb[2];
vb[0].buf = HELLO_MSG;
vb[0].len = strlen(HELLO_MSG);
int num = 1;

/* Get the total send length */
uintptr_t len = strlen(HELLO_MSG);

// TODO: What's this?
// if (xfer->nlength != 0)
// {
// vb[1].buf = xfer->nbuffer;
// vb[1].len = xfer->nlength;
// num = 2;
// }

/* Add buffer to TX virtiqueue and notify the VirtIO Host */
virtqueue_add_buffer(vq, vb, num, 0, (FAR void *)len);
virtqueue_kick(vq);
// End of Testing

return ret;

err:
Expand Down