Serial comm kernel process

This commit is contained in:
2025-09-07 21:44:46 +02:00
parent 9644ad0b4e
commit 80a788617e
8 changed files with 90 additions and 64 deletions

View File

@ -16,6 +16,7 @@
#include "kproc/kproc.h"
#include "ps2kbproc/ps2kbproc.h"
#include "termproc/termproc.h"
#include "serialproc/serialproc.h"
#define PROC_REAPER_FREQ 30
@ -298,6 +299,9 @@ void proc_init(void) {
termproc_init(proc_spawnkern(&termproc_fn, "termproc"));
proc_register(TERMPROC);
serialproc_init(proc_spawnkern(&serialproc_fn, "serialproc"));
proc_register(SERIALPROC);
Proc *init = proc_spawnuser("base", "/bin/init");
init->pipes[0] = TERMPROC->pipes[1];
proc_register(init);

View File

@ -0,0 +1,73 @@
#include <stdint.h>
#include <stddef.h>
#include "proc/proc.h"
#include "ipc/pipe/pipe.h"
#include "hal/hal.h"
#include "dlmalloc/malloc.h"
#define SERIAL_PORT 0x3f8
Proc *SERIALPROC;
void serialproc_init(Proc *proc) {
SERIALPROC = proc;
SERIALPROC->pipes[0] = dlmalloc(sizeof(IpcPipe));
ipc_pipeinit(SERIALPROC->pipes[0]);
SERIALPROC->pipes[1] = dlmalloc(sizeof(IpcPipe));
ipc_pipeinit(SERIALPROC->pipes[1]);
io_out8(SERIAL_PORT + 1, 0x00);
io_out8(SERIAL_PORT + 3, 0x80);
io_out8(SERIAL_PORT + 0, 0x03);
io_out8(SERIAL_PORT + 1, 0x00);
io_out8(SERIAL_PORT + 3, 0x03);
io_out8(SERIAL_PORT + 2, 0xc7);
io_out8(SERIAL_PORT + 4, 0x0b);
io_out8(SERIAL_PORT + 4, 0x1e);
io_out8(SERIAL_PORT + 0, 0xae);
if (io_in8(SERIAL_PORT + 0) != 0xae) {
return;
}
io_out8(SERIAL_PORT + 4, 0x0f);
}
int serialproc_received(void) {
return io_in8(SERIAL_PORT + 5) & 1;
}
uint8_t serialproc_read(void) {
while (serialproc_received() == 0);
return io_in8(SERIAL_PORT);
}
int serialproc_trans_empty(void) {
return io_in8(SERIAL_PORT + 5) & 0x20;
}
void serialproc_write(uint8_t value) {
while (!serialproc_trans_empty());
io_out8(SERIAL_PORT, value);
}
void serialproc_fn(void) {
char buf[0x100];
for (;;) {
hal_memset(buf, 0, sizeof(buf));
int32_t read = ipc_piperead(SERIALPROC->pipes[1], (uint8_t *)buf, sizeof(buf));
if (read > 0) {
for (size_t i = 0; i < sizeof(buf); i++) {
serialproc_write(buf[i]);
}
}
if (serialproc_received() == 0) {
continue;
}
uint8_t inchar = io_in8(SERIAL_PORT);
ipc_pipewrite(SERIALPROC->pipes[0], &inchar, sizeof(inchar));
}
}

View File

@ -0,0 +1,11 @@
#ifndef PROC_SERIALPROC_SERIALPROC_H_
#define PROC_SERIALPROC_SERIALPROC_H_
#include "proc/proc.h"
extern Proc *SERIALPROC;
void serialproc_init(Proc *proc);
void serialproc_fn(void);
#endif // PROC_SERIALPROC_SERIALPROC_H_