diff --git a/include/kernel/devices/device.h b/include/kernel/devices/device.h index 2a14c6f..628fccd 100644 --- a/include/kernel/devices/device.h +++ b/include/kernel/devices/device.h @@ -13,9 +13,7 @@ __attribute__((section(".device"))) \ static struct device name##_dev -// Define dev_t -typedef uint16_t dev_t; - +// Struct used to define device struct device { dev_t major; diff --git a/include/kernel/devices/tty.h b/include/kernel/devices/tty.h index 2b17218..6939bbf 100644 --- a/include/kernel/devices/tty.h +++ b/include/kernel/devices/tty.h @@ -3,9 +3,9 @@ #include #include -#include -#include +#include #include +#include // Define default buffer size. // TODO: remove me ? @@ -54,6 +54,9 @@ struct keyboard_obj_s } cursor; } tty; } saved; + + // FIXME Dirty place, remove / move me ! + struct tty_s *tty; }; // primitives. diff --git a/include/kernel/drivers/screen.h b/include/kernel/drivers/screen.h new file mode 100644 index 0000000..0690c2c --- /dev/null +++ b/include/kernel/drivers/screen.h @@ -0,0 +1,11 @@ +#ifndef __KERNEL_DRIVERS_SCREEN_H__ +# define __KERNEL_DRIVERS_SCREEN_H__ + +#include +#include + +// Define screen informations. +#define DISPLAY_SCREEN_WIDTH (128) +#define DISPLAY_SCREEN_HEIGHT (64) + +#endif /*__KERNEL_DRIVERS_SCREEN_H__*/ diff --git a/include/kernel/util/draw.h b/include/kernel/util/draw.h index ea0a949..e2cd888 100644 --- a/include/kernel/util/draw.h +++ b/include/kernel/util/draw.h @@ -3,8 +3,9 @@ #include #include +#include -// Define font bitmap informations. +// Define the (hardcoded) font bitmap informations. #define KERNEL_FONT_BITMAP_WIDTH (127) // Bitmap width #define KERNEL_FONT_BITMAP_HEIGHT (23) // Bitmap height #define KERNEL_FONT_BITMAP_CWIDTH (4) // Character width (bitmap) @@ -14,12 +15,9 @@ #define KERNEL_FONT_NB_CHAR_X ((KERNEL_FONT_BITMAP_WIDTH / KERNEL_FONT_BITMAP_CWIDTH) + 1) #define KERNEL_FONT_NB_CHAR_Y ((KERNEL_FONT_BITMAP_HEIGHT / KERNEL_FONT_BITMAP_CHEIGHT) + 1) -// Define screen informations. -#define DISPLAY_SCREEN_WIDTH (128) -#define DISPLAY_SCREEN_HEIGHT (64) - // Define Number of vertical lines // and horizontal lines. +// TODO: move me to ? #define DISPLAY_VCHAR_MAX (DISPLAY_SCREEN_HEIGHT / (KERNEL_FONT_REAL_HEIGHT + 1)) #define DISPLAY_HCHAR_MAX (DISPLAY_SCREEN_WIDTH / (KERNEL_FONT_REAL_WIDTH + 1)) diff --git a/include/kernel/util/types.h b/include/kernel/util/types.h index 9a9a85b..8ce8c38 100644 --- a/include/kernel/util/types.h +++ b/include/kernel/util/types.h @@ -27,8 +27,8 @@ typedef enum mpu_e } mpu_t; typedef int pid_t; - typedef int16_t mode_t; +typedef uint16_t dev_t; typedef uint16_t umode_t; // Force inline function. diff --git a/include/lib/unistd.h b/include/lib/unistd.h index 5bc4c7c..f494c74 100644 --- a/include/lib/unistd.h +++ b/include/lib/unistd.h @@ -3,10 +3,10 @@ #include #include -#include +#include // Define syscall LIST -#include +#include //TODO: move me diff --git a/src/kernel/devices/tty/operations/open.c b/src/kernel/devices/tty/operations/open.c index 414aba4..9a22da2 100644 --- a/src/kernel/devices/tty/operations/open.c +++ b/src/kernel/devices/tty/operations/open.c @@ -1,5 +1,4 @@ #include -#include #include // Internal TTY object. diff --git a/src/kernel/devices/tty/operations/read.c b/src/kernel/devices/tty/operations/read.c index e63f7a0..0af328a 100644 --- a/src/kernel/devices/tty/operations/read.c +++ b/src/kernel/devices/tty/operations/read.c @@ -23,7 +23,6 @@ ssize_t tty_read(void *inode, void *buffer, size_t count) extern struct keycache_s *keylist; struct keycache_s *keynode; struct keyboard_obj_s keyboard; - struct tty_s *tty; int first_key; int timer_fd; @@ -32,7 +31,6 @@ ssize_t tty_read(void *inode, void *buffer, size_t count) return (0); // get tty device - tty = inode; // Initialize internal struc. memset(buffer, '\0', count); @@ -42,14 +40,15 @@ ssize_t tty_read(void *inode, void *buffer, size_t count) keyboard.buffer.clen = 0; keyboard.mode = 0x00; keyboard.cvisible = 0; + keyboard.tty = inode; // save TTY informations. - keyboard.saved.tty.cursor.x = tty->cursor.x; - keyboard.saved.tty.cursor.y = tty->cursor.y; + keyboard.saved.tty.cursor.x = keyboard.tty->cursor.x; + keyboard.saved.tty.cursor.y = keyboard.tty->cursor.y; // Initialize timer for cursor. // FIXME: find real ticks value !! - timer_fd = timer_install(&cursor_callback, &keyboard, 500 * 500 * 2, 1); + timer_fd = timer_install(&cursor_callback, &keyboard, 500 * 500 * 2, TIMER_START); if (timer_fd == -1) return (0); @@ -233,8 +232,8 @@ static void tty_buffer_display(struct keyboard_obj_s *keyboard) size_t size; // Restore TTY X/Y axis positions. - tty.cursor.x = keyboard->saved.tty.cursor.x; - tty.cursor.y = keyboard->saved.tty.cursor.y; + keyboard->tty->cursor.x = keyboard->saved.tty.cursor.x; + keyboard->tty->cursor.y = keyboard->saved.tty.cursor.y; // Workaround for [EXE] key. size = @@ -325,16 +324,16 @@ static void cursor_callback(struct keyboard_obj_s *keyboard) { // Geneate TTY buffer cursor position. x = keyboard->buffer.cursor + keyboard->saved.tty.cursor.x; - y = x / tty.cursor.max.x; - x = x - (y * tty.cursor.max.x); + y = x / keyboard->tty->cursor.max.x; + x = x - (y * keyboard->tty->cursor.max.x); y = y + keyboard->saved.tty.cursor.y; // Save current cursor position and // resotre saved position. - int sttyx = tty.cursor.x; - int sttyy = tty.cursor.x; - tty.cursor.x = x; - tty.cursor.y = y; + int sttyx = keyboard->tty->cursor.x; + int sttyy = keyboard->tty->cursor.x; + keyboard->tty->cursor.x = x; + keyboard->tty->cursor.y = y; // Get Display X and Y position. tty_ioctl(NULL, TTY_IOCTL_GETDX, &x); @@ -345,8 +344,8 @@ static void cursor_callback(struct keyboard_obj_s *keyboard) kvram_display(); // Restore TTY cursor position - tty.cursor.x = sttyx; - tty.cursor.y = sttyy; + keyboard->tty->cursor.x = sttyx; + keyboard->tty->cursor.y = sttyy; } // Update cursor status. diff --git a/src/kernel/devices/tty/operations/write.c b/src/kernel/devices/tty/operations/write.c index 3468063..2e62ec7 100644 --- a/src/kernel/devices/tty/operations/write.c +++ b/src/kernel/devices/tty/operations/write.c @@ -130,6 +130,9 @@ static void tty_display(struct tty_s *tty) } } + // clear screen + kvram_clear(); + // Display "on-screen" string lines. y = -1; while (++y < line) @@ -158,6 +161,9 @@ ssize_t tty_write(void *inode, const void *buffer, size_t count) { ssize_t written; + // Start atomic operation. + atomic_start(); + // Update internal buffer and display // TTY on the screen. written = tty_buffer_update(inode, buffer, count); @@ -165,6 +171,9 @@ ssize_t tty_write(void *inode, const void *buffer, size_t count) // TODO: Monotonic display ? tty_display(inode); + // Stop atomic operation + atomic_stop(); + // Return the number of char written into // TTY's internal buffer. return (written); diff --git a/src/kernel/drivers/timers/constructor.c b/src/kernel/drivers/timers/constructor.c index 5a87373..b82020f 100644 --- a/src/kernel/drivers/timers/constructor.c +++ b/src/kernel/drivers/timers/constructor.c @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -15,6 +15,9 @@ struct timer_cache_s timercache[TIMER_NUMBER]; __attribute__((constructor)) void timer_constructor(void) { + // Start atomic operations + atomic_start(); + // Initialise internal cache for (int i = 0 ; i < TIMER_NUMBER ; i = i + 1) { @@ -23,9 +26,6 @@ void timer_constructor(void) timercache[i].arg = NULL; } - // Start atomic operations - atomic_start(); - // Configure TMU SH7305_TMU.TSTR.STR0 = 0; // Stop timer 0 SH7305_TMU.TSTR.STR1 = 0; // Stop timer 1 diff --git a/src/kernel/drivers/timers/install.c b/src/kernel/drivers/timers/install.c index bdc57f9..e7dbc5c 100644 --- a/src/kernel/drivers/timers/install.c +++ b/src/kernel/drivers/timers/install.c @@ -1,4 +1,4 @@ -#include +#include #include #include diff --git a/src/kernel/drivers/timers/start.c b/src/kernel/drivers/timers/start.c index f4f937c..7c4d454 100644 --- a/src/kernel/drivers/timers/start.c +++ b/src/kernel/drivers/timers/start.c @@ -1,4 +1,4 @@ -#include +#include #include #include diff --git a/src/kernel/drivers/timers/stop.c b/src/kernel/drivers/timers/stop.c index 7636828..66b24a4 100644 --- a/src/kernel/drivers/timers/stop.c +++ b/src/kernel/drivers/timers/stop.c @@ -1,4 +1,4 @@ -#include +#include #include #include diff --git a/src/kernel/drivers/timers/uninstall.c b/src/kernel/drivers/timers/uninstall.c index 9ae94e0..1a3f61d 100644 --- a/src/kernel/drivers/timers/uninstall.c +++ b/src/kernel/drivers/timers/uninstall.c @@ -1,4 +1,4 @@ -#include +#include #include #include diff --git a/src/kernel/scheduler/start.c b/src/kernel/scheduler/start.c index dc8ec8d..3c73528 100644 --- a/src/kernel/scheduler/start.c +++ b/src/kernel/scheduler/start.c @@ -2,7 +2,7 @@ #include #include #include -#include +#include // Internal data used by the scheduler handler uint32_t sched_timer_id = 0; diff --git a/src/kernel/syscall/handler.c b/src/kernel/syscall/handler.c index 0778892..5233ed6 100644 --- a/src/kernel/syscall/handler.c +++ b/src/kernel/syscall/handler.c @@ -12,7 +12,7 @@ static void sys_test(uint32_t a, uint32_t b, uint32_t c, uint32_t d) DBG_WAIT; } -static const void *sys_handler[16] = { +static const void *sys_handler[9] = { // Kernel Test sys_test, // test @@ -29,19 +29,19 @@ static const void *sys_handler[16] = { sys_lseek, // lseek // Display - kvram_display, // kvram_display +/* kvram_display, // kvram_display kvram_clear, // kvram_clear printk, // printk kvram_ascii, // kvram_ascii kvram_reverse, // kvram_reverse kvram_scroll, // kvram_scroll - kvram_clr_str_area // kvram_clr_str_area + kvram_clr_str_area // kvram_clr_str_area*/ }; void *sys_get_handler(int sysno) { // Check sysno validity - if (sysno < 0 || sysno >= 16) + if (sysno < 0 || sysno >= 9) return (NULL); // DEBUG diff --git a/src/kernel/util/draw/ascii.c b/src/kernel/util/draw/ascii.c index 24100ba..22fbe36 100644 --- a/src/kernel/util/draw/ascii.c +++ b/src/kernel/util/draw/ascii.c @@ -1,5 +1,4 @@ #include -#include #include // Font bitmap. diff --git a/src/kernel/util/draw/clear.c b/src/kernel/util/draw/clear.c index 52e7e24..46d06cf 100644 --- a/src/kernel/util/draw/clear.c +++ b/src/kernel/util/draw/clear.c @@ -1,5 +1,4 @@ #include -#include #include // Internal Video RAM diff --git a/src/kernel/util/draw/print.c b/src/kernel/util/draw/print.c new file mode 100644 index 0000000..19c9016 --- /dev/null +++ b/src/kernel/util/draw/print.c @@ -0,0 +1,20 @@ +#include + +void kvram_print(int x, int y, char const *string, size_t len) +{ + size_t i; + + // Generate pixel positions + x = x * (KERNEL_FONT_REAL_WIDTH + 1); + y = y * (KERNEL_FONT_REAL_HEIGHT + 1); + + i = -1; + while (++i < len) + { + // display ASCII char + kvram_ascii(x, y, string[i]); + + // Update X position. + x = x + KERNEL_FONT_REAL_WIDTH + 1; + } +} diff --git a/src/kernel/util/draw/reverse.c b/src/kernel/util/draw/reverse.c index 126aa2e..8a6803b 100644 --- a/src/kernel/util/draw/reverse.c +++ b/src/kernel/util/draw/reverse.c @@ -1,5 +1,4 @@ #include -#include #include /* kvram_reverse() - Reverse Video RAM area */ diff --git a/src/kernel/util/string/strcmp.c b/src/kernel/util/string/strcmp.c index 5fa9cd7..d9038f0 100644 --- a/src/kernel/util/string/strcmp.c +++ b/src/kernel/util/string/strcmp.c @@ -11,3 +11,12 @@ int strcmp(const char *s1, const char *s2) } return (*s1 - *s2); } + +int strncmp(const char *s1, const char *s2, size_t n) +{ + if (s1 == NULL || s2 == NULL || n == 0) + return (0); + size_t i = -1; + while (++i < n - 1 && s1[i] != '\0' && s2[i] != '\0' && s1[i] == s2[i]); + return (s1[i] - s2[i]); +}