Skip to content

Commit

Permalink
Merge pull request #1063 from veremenko-y/pico_ttyconfig
Browse files Browse the repository at this point in the history
rpipico: configurable ttys
  • Loading branch information
EtchedPixels authored Jun 7, 2024
2 parents 370581e + 03ff288 commit 238d9b5
Show file tree
Hide file tree
Showing 19 changed files with 319 additions and 195 deletions.
4 changes: 4 additions & 0 deletions Kernel/platform/platform-rpipico/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,12 @@ image:: world uf2conv
arm-none-eabi-objcopy -I binary -O elf32-littlearm --change-section-vma .data=0x10018000 filesystem.ftl filesystem.elf
./uf2conv filesystem.ftl filesystem.uf2 0x10018000

image-sd:: world uf2conv
./update-flash.sh sd

clean:
rm -rf build
rm -f uf2conv
$(MAKE) -C ../../../Library/libs -f Makefile.armm0 clean
$(MAKE) -C ../../../Applications/util -f Makefile.armm0 clean
$(MAKE) -C ../../../Applications/V7/cmd -f Makefile.armm0 clean
Expand Down
9 changes: 4 additions & 5 deletions Kernel/platform/platform-rpipico/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,16 +77,15 @@ extern uint8_t progbase[USERMEM];
/* We need a tidier way to do this from the loader */
#define CMDLINE NULL /* Location of root dev name */

#define BOOTDEVICE 0x0000 /* hda */
#define BOOTDEVICENAMES "hd#"
#define SWAPDEV (swap_dev) /* dynamic swap */

/* Device parameters */
#define NUM_DEV_TTY_UART 1
#define NUM_DEV_TTY_USB (CFG_TUD_CDC)
#define NUM_DEV_TTY_USB 4
#define NUM_DEV_TTY (NUM_DEV_TTY_UART + NUM_DEV_TTY_USB)

#define USB_TO_TTY(x) (x + 1 + NUM_DEV_TTY_UART)
#define TTY_TO_USB(x) (x - 1 - NUM_DEV_TTY_UART)
#define DEV_USB_DETECT_TIMEOUT 5000 /* (ms) Total timeout time to detect USB host connection*/
#define DEV_USB_INIT_TIMEOUT 2000 /* (ms) Total timeout to try not swallow messages */

#define TTYDEV BOOT_TTY /* Device used by kernel for messages, panics */
#define NBUFS 20 /* Number of block buffers */
Expand Down
97 changes: 44 additions & 53 deletions Kernel/platform/platform-rpipico/core1.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
*/

#include <kernel.h>
#include <printf.h>
#include "picosdk.h"
#include "config.h"
#include "core1.h"
Expand Down Expand Up @@ -41,18 +42,14 @@ struct console_t
bool sleeping;
};

static struct console_t console_table[NUM_DEV_TTY_USB];
static struct console_t usb_console_table[NUM_DEV_TTY_USB];
int usb_host_connected;
critical_section_t critical_section;

static void console_buf_write(struct console_buf_t *buf, uint8_t b)
{
/*
can deadlock core1 thread
while(buf->len >= CONFIG_CONSOLE_BUF_LEN)
tight_loop_contents();
*/
critical_section_enter_blocking(&critical_section);
if(buf->len < CONFIG_CONSOLE_BUF_LEN)
if (buf->len < CONFIG_CONSOLE_BUF_LEN)
{
buf->buffer[buf->windex] = b;
buf->windex = (buf->windex + 1) % CONFIG_CONSOLE_BUF_LEN;
Expand All @@ -64,77 +61,73 @@ static void console_buf_write(struct console_buf_t *buf, uint8_t b)
static uint8_t console_buf_read(struct console_buf_t *buf)
{
critical_section_enter_blocking(&critical_section);
if(buf->len == 0)
uint8_t b = 0;
if (buf->len != 0)
{
panic("rd undrf");
b = buf->buffer[buf->rindex];
buf->rindex = (buf->rindex + 1) % CONFIG_CONSOLE_BUF_LEN;
buf->len--;
}
uint8_t b = buf->buffer[buf->rindex];
buf->rindex = (buf->rindex + 1) % CONFIG_CONSOLE_BUF_LEN;
buf->len--;
critical_section_exit(&critical_section);
return b;
}

int usbconsole_read(uint8_t *buffer, int size)
int usbconsole_getc(uint8_t usb_num)
{
if(size & 0x01)
{
panic("buf size");
}
int written = 0;
for(int i = 0; i < NUM_DEV_TTY && written < size; i++)
int c = -1;
struct console_buf_t *buf = &usb_console_table[usb_num - 1].rbuf;
if (buf->len > 0)
{
struct console_buf_t *buf = &console_table[i].rbuf;
if (buf->len > 0)
{
buffer[0] = USB_TO_TTY(i);
buffer[1] = console_buf_read(buf);
buffer += 2;
written += 2;
}
c = console_buf_read(buf);
}
return written;
return c;
}

extern bool usbconsole_is_writable(uint8_t minor)
extern ttyready_t usbconsole_ready(uint8_t usb_num)
{
minor = TTY_TO_USB(minor);
return console_table[minor].wbuf.len < CONFIG_CONSOLE_BUF_LEN;
if (usb_console_table[usb_num - 1].wbuf.len < CONFIG_CONSOLE_BUF_LEN)
{
return TTY_READY_NOW;
}
return TTY_READY_SOON;
}

extern bool usbconsole_is_available(uint8_t minor)
extern bool usbconsole_is_available(uint8_t usb_num)
{
minor = TTY_TO_USB(minor);
return minor <= NUM_DEV_TTY_USB;
return usb_host_connected && usb_num != 0 && usb_num <= NUM_DEV_TTY_USB;
}

extern void usbconsole_putc(uint8_t minor, uint8_t b)
extern void usbconsole_putc(uint8_t usb_num, uint8_t c)
{
minor = TTY_TO_USB(minor);
if (minor >= NUM_DEV_TTY_USB)
while(usbconsole_ready(usb_num) != TTY_READY_NOW)
{
panic("ttydev");
tight_loop_contents();
}
struct console_buf_t *buf = &console_table[minor].wbuf;
struct console_buf_t *buf = &usb_console_table[usb_num - 1].wbuf;
if (buf->len >= CONFIG_CONSOLE_BUF_LEN)
{
panic("ovf");
return;
}

console_buf_write(buf, b);
console_buf_write(buf, c);
}

extern void usbconsole_setsleep(uint8_t minor, bool sleeping)
extern void usbconsole_sleeping(uint8_t usb_num)
{
console_table[TTY_TO_USB(minor)].sleeping = sleeping;
usb_console_table[usb_num - 1].sleeping = true;
}

extern bool usbconsole_is_sleeping(uint8_t minor)

void tud_mount_cb(void)
{
return console_table[TTY_TO_USB(minor)].sleeping;
usb_host_connected = 1;
}

void tud_umount_cb(void)
{
usb_host_connected = 0;
}

#if NUM_DEV_TTY_USB > 0
static void core1_main(void)
{
tusb_init();
Expand All @@ -148,12 +141,11 @@ static void core1_main(void)
all tty's will appear disconnected, which seems to be the case for pi pico
*/

for(int i = 0; i < CFG_TUD_CDC; i++)
for (int i = 0; i < CFG_TUD_CDC; i++)
{
if (tud_cdc_n_write_available(i)
&& console_table[i].wbuf.len)
if (tud_cdc_n_write_available(i) && usb_console_table[i].wbuf.len)
{
uint8_t b = console_buf_read(&console_table[i].wbuf);
uint8_t b = console_buf_read(&usb_console_table[i].wbuf);
tud_cdc_n_write_char(i, b);
tud_cdc_n_write_flush(i);
}
Expand All @@ -165,7 +157,7 @@ static void core1_main(void)
{
continue;
}
struct console_buf_t *buf = &console_table[i].rbuf;
struct console_buf_t *buf = &usb_console_table[i].rbuf;
if (buf->len < CONFIG_CONSOLE_BUF_LEN)
{
uint8_t b = tud_cdc_n_read_char(i);
Expand All @@ -174,11 +166,10 @@ static void core1_main(void)
}
}
}
#endif

void core1_init(void)
{
multicore_reset_core1();
//multicore_reset_core1();
critical_section_init(&critical_section);
#if NUM_DEV_TTY_USB > 0
multicore_launch_core1(core1_main);
Expand Down
15 changes: 7 additions & 8 deletions Kernel/platform/platform-rpipico/core1.h
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
#ifndef USBCONSOLE_H
#define USBCONSOLE_H

extern void core1_init(void);
#include <tty.h>

extern int usbconsole_read(uint8_t *buffer, int size);
extern bool usbconsole_is_writable(uint8_t minor);
extern bool usbconsole_is_available(uint8_t minor);
extern void usbconsole_putc(uint8_t minor, uint8_t b);
extern void usbconsole_setsleep(uint8_t minor, bool sleeping);
extern bool usbconsole_is_sleeping(uint8_t minor);
extern void core1_init(void);

extern int usbconsole_getc(uint8_t usb_num);
extern ttyready_t usbconsole_ready(uint8_t usb_num);
extern bool usbconsole_is_available(uint8_t usb_num);
extern void usbconsole_putc(uint8_t usb_num, uint8_t c);
extern void usbconsole_sleeping(uint8_t usb_num);

#endif

12 changes: 7 additions & 5 deletions Kernel/platform/platform-rpipico/devices.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,18 +61,20 @@ static void timer_tick_cb(unsigned alarm)

void device_init(void)
{
/* Timer interrup must be initialized before blcok devices.
set_boot_line uses pause syscall which will not be operational otherwise. */
hardware_alarm_claim(0);
update_us_since_boot(&now, time_us_64());
hardware_alarm_set_callback(0, timer_tick_cb);
hardware_alarm_force_irq(0);

/* The flash device is too small to be useful, and a corrupt flash will
* cause a crash on startup... oddly. */
#ifdef CONFIG_PICO_FLASH
flash_dev_init();
#endif
sd_rawinit();
devsd_init();

hardware_alarm_claim(0);
update_us_since_boot(&now, time_us_64());
hardware_alarm_set_callback(0, timer_tick_cb);
hardware_alarm_force_irq(0);
}

/* vim: sw=4 ts=4 et: */
Expand Down
Loading

0 comments on commit 238d9b5

Please sign in to comment.