rp2040

RP2040 Programming without SDK
Log | Files | Refs

commit 5a718f4e0005fd215cf4362025175a187e26cdaa
parent cc23c47c55bfd937c7e30d0e01438e951e9e5e04
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Sun, 24 Aug 2025 07:30:57 +0900

add console programme

Diffstat:
Acons/cons.c | 130+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 130 insertions(+), 0 deletions(-)

diff --git a/cons/cons.c b/cons/cons.c @@ -0,0 +1,130 @@ +#include <errno.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/ioctl.h> +#include <sys/termios.h> +#include <unistd.h> + +int device_open(); +int setparms(int fd, int baud); +int flush(int fd); + +#define ERRLEN 128 +char err[ERRLEN]; + +int +main(void) +{ + int fd; + int ret = 0; + struct termios *term; + + fd = device_open(); + if (fd < 0) { + fprintf(stderr, "can't open device: %s\n", strerror(errno)); + return 1; + } + if (setparms(fd, 115200) < 0) { + fprintf(stderr, "setparm: %s\n", err); + return 1; + } + + if (flush(fd) < 0) { + fprintf(stderr, "flush: %s\n", strerror(errno)); + ret = errno; + goto defer; + } + + char buf[10]; + int n; + for (;;) { + n = read(0, buf, 10); + if (n == 0) { + fprintf(stderr, "eof\n"); + break; + } else if (n < 0) { + fprintf(stderr, "read stdin: %s\n", strerror(errno)); + ret = errno; + goto defer; + } + n = write(fd, buf, n); + if (n < 0) { + fprintf(stderr, "write to tty %s\n", strerror(errno)); + ret = errno; + goto defer; + } + n = read(fd, buf, 10); + if (n < 0) { + fprintf(stderr, "read tty: %s\n", strerror(errno)); + ret = errno; + goto defer; + } + n = write(1, buf, n); + if (n < 0) { + fprintf(stderr, "write to stdout %s\n", strerror(errno)); + ret = errno; + goto defer; + } + } + +defer: + close(fd); + return ret; +} + +int +device_open() +{ + int n; + int fd; + + fd = open("/dev/ttyU0", O_RDWR|O_NDELAY|O_NOCTTY); + if (fd < 0) + return -1; + n = fcntl(fd, F_GETFL, 0); + fcntl(fd, F_SETFL, n&~O_NDELAY); + return fd; +} + +int +setparms(int fd, int baud) +{ + struct termios tty; + if (tcgetattr(fd, &tty) < 0) { + snprintf(err, ERRLEN, "tcgetattr: %s", strerror(errno)); + return -1; + } + if (cfsetospeed(&tty, (speed_t)baud) < 0) { + snprintf(err, ERRLEN, "cfsetospeed: %s", strerror(errno)); + return -1; + } + if (cfsetispeed(&tty, (speed_t)baud) < 0) { + snprintf(err, ERRLEN, "cfsetispeed: %s", strerror(errno)); + return -1; + } + tty.c_cflag = (tty.c_cflag&~CSIZE) | CS8; + tty.c_iflag = IGNBRK; + tty.c_lflag = 0; + tty.c_oflag = 0; + tty.c_cflag |= CLOCAL|CREAD; + tty.c_cc[VMIN] = 1; + tty.c_cc[VTIME] = 5; + tty.c_iflag &= ~(IXON|IXOFF|IXANY); // TODO: xon, xoff? + // TODO: parity + tty.c_cflag &= ~CSTOPB; // stop bit == 1 + if (tcsetattr(fd, TCSANOW, &tty) < 0) { + snprintf(err, ERRLEN, "tcseattr: %s", strerror(errno)); + return -1; + } + // TODO: rs485 + return 0; +} + +int +flush(int fd) +{ + int out = 0; + return ioctl(fd, TIOCFLUSH, &out); +}