quinn-os/tty_fs.c
2021-12-05 11:42:57 +10:00

63 lines
1.4 KiB
C

#include "keyboard.h"
#include "tty_fs.h"
#include "console.h"
#include "string.h"
#include "memory.h"
char tty_buf[TTY_BUF_SIZE];
void tty_input(struct vfs_device_t *device, char c) {
if (device != (void *)0) {
struct tty_dev_data *data = (struct tty_dev_data *)device->fs_data;
if (data->tty_buf_at == TTY_BUF_SIZE) {
return;
}
data->tty_buf[data->tty_buf_at++] = c;
if (data->echo == 1) {
data->tty_write(&c, 1); // ECHO ON!
}
}
}
int tty_write_data(struct vfs_device_t *device, char *buffer, int len, int offset) {
struct tty_dev_data *data = (struct tty_dev_data *)device->fs_data;
data->tty_write(buffer, len);
return len;
}
int tty_read_data(struct vfs_device_t *device, char *buffer, int len, int offset) {
struct tty_dev_data *data = (struct tty_dev_data *)device->fs_data;
if (len + offset > data->tty_buf_at) {
len = data->tty_buf_at - offset;
}
if (len > 0) {
memcpy(buffer, &(data->tty_buf)[offset], len);
memcpy(&(data->tty_buf)[offset], &(data->tty_buf)[offset + len], data->tty_buf_at - len);
data->tty_buf_at -= len;
return len;
}
return 0;
}
int tty_init(struct vfs_device_t *device) {
if (device->device == 0) {
// console
struct tty_dev_data *data = (struct tty_dev_data *)malloc(sizeof(struct tty_dev_data));
if (!data) {
return 0;
}
data->tty_buf_at = 0;
data->tty_write = putdata;
data->echo = 1;
device->fs_data = (void *)data;
return 1;
}
}