1
0
mirror of https://github.com/mist-devel/mist-firmware.git synced 2026-02-26 16:23:35 +00:00

Merge pull request #133 from teiram/serial-sink

Serial sink support
This commit is contained in:
gyurco
2026-01-16 18:06:02 +01:00
committed by GitHub
5 changed files with 95 additions and 15 deletions

View File

@@ -11,7 +11,7 @@ TODAY = `date +"%m/%d/%y"`
PRJ = firmware
SRC = hw/AT91SAM/Cstartup_SAM7.c hw/AT91SAM/hardware.c hw/AT91SAM/spi.c hw/AT91SAM/mmc.c hw/AT91SAM/at91sam_usb.c hw/AT91SAM/usbdev.c
SRC += fdd.c firmware.c fpga.c hdd.c main.c menu.c menu-minimig.c menu-8bit.c osd.c state.c syscalls.c user_io.c settings.c data_io.c boot.c idxfile.c config.c tos.c ikbd.c xmodem.c ini_parser.c cue_parser.c mist_cfg.c archie.c pcecd.c neocd.c snes.c zx_col.c arc_file.c c64files.c font.c utils.c
SRC += fdd.c firmware.c fpga.c hdd.c main.c menu.c menu-minimig.c menu-8bit.c osd.c state.c syscalls.c user_io.c settings.c data_io.c boot.c idxfile.c config.c tos.c ikbd.c xmodem.c ini_parser.c cue_parser.c mist_cfg.c archie.c pcecd.c neocd.c snes.c zx_col.c arc_file.c c64files.c font.c utils.c serial_sink.c
SRC += usb/usb.c usb/max3421e.c usb/usb-max3421e.c usb/usbdebug.c usb/hub.c usb/hid.c usb/hidparser.c usb/xboxusb.c usb/timer.c usb/asix.c usb/pl2303.c usb/usbrtc.c usb/storage.c usb/joymapping.c usb/joystick.c
SRC += fat_compat.c
SRC += FatFs/diskio.c FatFs/ff.c FatFs/ffunicode.c

2
main.c
View File

@@ -55,6 +55,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "snes.h"
#include "zx_col.h"
#include "arc_file.h"
#include "serial_sink.h"
#include "font.h"
#include "tos.h"
#include "usb.h"
@@ -148,6 +149,7 @@ int main(void)
c64files_init();
snes_init();
zx_init();
serial_sink_init();
Timer_Init();
USART_Init(115200);

49
serial_sink.c Normal file
View File

@@ -0,0 +1,49 @@
/*
* serial_sink.c
*
*/
#include "serial_sink.h"
static serial_sink_t* SINKS[NUM_SINKS];
void console_start() {
iprintf("\033[1;36m");
}
void console_end() {
iprintf("\033[0m");
}
void console_echo(uint8_t value) {
if (value != 0xff && value != 0x00) {
iprintf("%c", value);
}
}
static serial_sink_t console_sink = {0, 8,
&console_start,
&console_echo,
&console_end
};
void serial_sink_init() {
memset(SINKS, 0, sizeof(SINKS));
serial_sink_register(&console_sink);
}
bool serial_sink_register(serial_sink_t *sink) {
if (sink && sink->index < NUM_SINKS) {
if (!SINKS[sink->index]) {
SINKS[sink->index] = sink;
return true;
} else {
iprintf("Trying to overwrite serial sink with index %d\n", sink->index);
}
}
return false;
}
serial_sink_t *serial_sink_get(uint8_t index) {
return SINKS[index];
}

26
serial_sink.h Normal file
View File

@@ -0,0 +1,26 @@
/*
* serial_sink.h
*
*/
#ifndef SERIAL_SINK_H
#define SERIAL_SINK_H
#include <inttypes.h>
#include <stdbool.h>
#define NUM_SINKS 8
typedef struct {
uint8_t index;
uint8_t burst;
void (*begin)(void);
void (*process_data)(uint8_t data);
void (*end)(void);
} serial_sink_t;
void serial_sink_init();
bool serial_sink_register(serial_sink_t *sink);
serial_sink_t *serial_sink_get(uint8_t index);
#endif /* SERIAL_SINK_H */

View File

@@ -35,6 +35,7 @@
#ifdef HAVE_HDMI
#include "it6613/HDMI_TX.h"
#endif
#include "serial_sink.h"
// up to 16 key can be remapped
#define MAX_REMAP 16
@@ -1474,23 +1475,25 @@ void user_io_poll() {
// check for serial data to be sent
// check for incoming serial data. this is directly forwarded to the
// arm rs232 and mixes with debug output.
// check for incoming serial data.
spi_uio_cmd_cont(UIO_SIO_IN);
// status byte is 1000000A with A=1 if data is available
if((f = spi_in(0)) == 0x81) {
iprintf("\033[1;36m");
// status byte is 1000xxxA with A=1 if data is available
// xxx is the channel
if (((f = spi_in()) & 0x81) == 0x81) {
uint8_t channel = (f >> 1) & 0x07;
uint8_t lastf = f;
serial_sink_t *sink = serial_sink_get(channel);
if (sink) {
if (sink->begin) sink->begin();
while (f == lastf && p < sink->burst) {
c = spi_in();
sink->process_data(c);
// character 0xff is returned if FPGA isn't configured
while((f == 0x81) && (c!= 0xff) && (c != 0x00) && (p < 8)) {
c = spi_in();
if(c != 0xff && c != 0x00)
iprintf("%c", c);
f = spi_in();
p++;
f = spi_in();
p++;
}
if (sink->end) sink->end();
}
iprintf("\033[0m");
}
DisableIO();
}