diff options
| author | Franklin Wei <frankhwei536@gmail.com> | 2015-03-01 14:20:47 -0500 |
|---|---|---|
| committer | Franklin Wei <frankhwei536@gmail.com> | 2015-03-01 14:20:47 -0500 |
| commit | c7252588ebb95f97631e9470778c69afa00c35b5 (patch) | |
| tree | 06d760878e18f6cddbe4305cddd4d5dfa74529f8 /drivers | |
| parent | b8f54e63d2b8f8007c580adf2a6034c98a0f2eaa (diff) | |
| download | kappa-c7252588ebb95f97631e9470778c69afa00c35b5.zip kappa-c7252588ebb95f97631e9470778c69afa00c35b5.tar.gz kappa-c7252588ebb95f97631e9470778c69afa00c35b5.tar.bz2 kappa-c7252588ebb95f97631e9470778c69afa00c35b5.tar.xz | |
Huge restructure
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gfx-as.S | 101 | ||||
| -rw-r--r-- | drivers/gfx.c | 540 | ||||
| -rw-r--r-- | drivers/include/gfx.h | 105 | ||||
| -rw-r--r-- | drivers/include/gfx_font.h | 4 | ||||
| -rw-r--r-- | drivers/include/pcspkr.h | 3 | ||||
| -rw-r--r-- | drivers/include/ps2_keymaps.h | 39 | ||||
| -rw-r--r-- | drivers/include/ps2kbd.h | 66 | ||||
| -rw-r--r-- | drivers/include/vgatext.h | 9 | ||||
| -rw-r--r-- | drivers/pcspkr.c | 19 | ||||
| -rw-r--r-- | drivers/ps2kbd.c | 212 | ||||
| -rw-r--r-- | drivers/vgatext.c | 124 |
11 files changed, 0 insertions, 1222 deletions
diff --git a/drivers/gfx-as.S b/drivers/gfx-as.S deleted file mode 100644 index a58fa12..0000000 --- a/drivers/gfx-as.S +++ /dev/null @@ -1,101 +0,0 @@ - .extern fb_width - .extern fb_height - .extern fb_stride - .extern fb_bpp - .extern _gfx_fgcol - .extern _gfx_bgcol - .extern framebuffer - - .global gfx_clear_packed -gfx_clear_packed: - movl framebuffer, %eax - movzwl fb_stride, %ecx - movzwl fb_height, %edx - imull %ecx, %edx - addl %eax, %edx - pushl %ebx - movzwl fb_bpp, %ebx - movl _gfx_bgcol, %ecx -.L1: - movl %ecx, (%eax) - addl %ebx, %eax - cmpl %eax, %edx - ja .L1 -.L2: - popl %ebx - ret - - .global gfx_hline_fast - -gfx_hline_fast: - int $0x80 - pushl %ebx - movl 8(%esp), %eax - movl 12(%esp), %ecx - cmpl %eax, %ecx - jge .L3 - xchgl %eax, %ecx -.L3: - movzwl fb_stride, %edx - movzbl fb_bpp, %ebx - imull 16(%esp), %edx - addl framebuffer, %edx - imull %ebx, %ecx - imull %ebx, %eax - addl %edx, %eax - addl %ecx, %edx - movl _gfx_fgcol, %ecx - cmpl %edx, %eax - jnb .L5 -.L4: - movl %ecx, (%eax) - addl %ebx, %eax - cmpl %eax, %edx - ja .L4 -.L5: - popl %ebx - ret - - .global gfx_vline_fast - -gfx_vline_fast: - pushl %esi - pushl %ebx - movl 12(%esp), %eax - movl 16(%esp), %edx - cmpl %eax, %edx - jge .L6 - xchgl %eax, %edx -.L6: - movzwl fb_stride, %ebx - movzbl fb_bpp, %ecx - imull 20(%esp), %ecx - movl framebuffer, %esi - imull %ebx, %edx - imull %ebx, %eax - addl %ecx, %eax - addl %edx, %ecx - leal (%esi,%ecx), %edx - addl %esi, %eax - movl _gfx_fgcol, %ecx - cmpl %edx, %eax - jnb .L8 -.L7: - movl %ecx, (%eax) - addl %ebx, %eax - cmpl %eax, %edx - ja .L7 -.L8: - popl %ebx - popl %esi - ret - - .global gfx_drawpixel_32bpp -gfx_drawpixel_32bpp: - movzwl fb_stride32, %eax - movl framebuffer, %edx - imull 8(%esp), %eax - movl _gfx_fgcol, %ecx - addl 4(%esp), %eax - movl %ecx, (%edx,%eax,4) - ret diff --git a/drivers/gfx.c b/drivers/gfx.c deleted file mode 100644 index 2f4864b..0000000 --- a/drivers/gfx.c +++ /dev/null @@ -1,540 +0,0 @@ -#include <stdbool.h> -#include <stddef.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "gfx_font.h" -#include "log.h" -#include "multiboot.h" -#include "paging.h" -#include "panic.h" -#include "gfx.h" - -uint8_t *real_framebuffer = NULL; -uint8_t *temp_framebuffer = NULL; -uint8_t *framebuffer = NULL; -bool double_buffer = false; -uint16_t fb_width; -uint16_t fb_height; - -/* this is BYTES per pixel */ -uint8_t fb_bpp; -uint16_t fb_stride; -/* fb_stride / 4 */ -uint16_t fb_stride32; -const uint8_t *gfx_bpp = &fb_bpp; - -const uint16_t *gfx_width = &fb_width; -const uint16_t *gfx_height = &fb_height; - -static int cursor_x, cursor_y; -uint32_t _gfx_fgcol, _gfx_bgcol; - -void (*gfx_clear)(void); -void (*gfx_drawpixel)(int x, int y); -void (*gfx_hline)(int x1, int x2, int y); -void (*gfx_vline)(int y1, int y2, int x); - -void gfx_set_background(uint32_t col) -{ - _gfx_bgcol = col; -} - -uint32_t gfx_get_background(void) -{ - return _gfx_bgcol; -} - -void gfx_set_foreground(uint32_t col) -{ - _gfx_fgcol = col; -} - -uint32_t gfx_get_foreground(void) -{ - return _gfx_fgcol; -} - -/* assembly */ -void gfx_drawpixel_32bpp_checked(int x, int y) -{ - if(0 <= x && x < fb_width && - 0 <= y && y < fb_height) - ((uint32_t*)framebuffer)[y * fb_stride32 + x] = _gfx_fgcol; - else - panic("pixel OOB!\n"); -} - -/* implemented in assembly now */ -/* -void gfx_clear(uint32_t col) -{ - uint8_t *p = framebuffer; - uint8_t *stop = framebuffer + fb_width * fb_height * fb_bpp; - while(p < stop) - { - *(uint32_t*)p = col; - p += fb_bpp; - } -} -*/ - -void gfx_clear_unpacked(void) -{ - uint8_t *fb = framebuffer; - const uint32_t bg = _gfx_bgcol; - - const uint16_t padding = fb_stride - (fb_bpp * fb_width); - - for(int y = 0; y < fb_height; ++y) - { - for(int x = 0; x < fb_width; ++x) - { - *(uint32_t*)fb++ = bg; - } - fb += padding; - } -} - -void gfx_reset(void) -{ - _gfx_fgcol = VGA_RGBPACK(0xff, 0xff, 0xff); - _gfx_bgcol = VGA_RGBPACK(0, 0, 0); - gfx_clear(); - cursor_y = 0; - cursor_x = 0; -} - -void gfx_drawchar(int x, int y, int c) -{ - uint8_t *line_addr = framebuffer + (x * fb_bpp) + (y * fb_stride); - const uint32_t fg = _gfx_fgcol; - const uint16_t stride = fb_stride; - const uint8_t stop_y = MIN(FONT_HEIGHT, fb_height - y); - const uint8_t stop_x = MIN(FONT_WIDTH, fb_width - x); - if(c < 0 || c > 132) - return; - for(int i = 0; i < stop_y; ++i) - { - uint8_t mask_table[8] = {128, 64, 32, 16, 8, 4, 2, 1}; - for(int j = 0; j < stop_x; ++j) - { - if(gfx_font[c][i] & mask_table[j]) - ((uint32_t*)line_addr)[j] = fg; - } - line_addr += stride; - } -} - -void gfx_drawchar_bg(int x, int y, int c) -{ - uint8_t *line_addr = framebuffer + (x * fb_bpp) + (y * fb_stride); - const uint32_t fg = _gfx_fgcol; - const uint16_t stride = fb_stride; - const uint8_t stop_y = MIN(FONT_HEIGHT, fb_height - y); - const uint8_t stop_x = MIN(FONT_WIDTH, fb_width - x); - if(c < 0 || c > 132) - return; - for(int i = 0; i < stop_y; ++i) - { - uint8_t mask_table[8] = {128, 64, 32, 16, 8, 4, 2, 1}; - for(int j = 0; j < stop_x; ++j) - { - if(gfx_font[c][i] & mask_table[j]) - ((uint32_t*)line_addr)[j] = fg; - else - ((uint32_t*)line_addr)[j] = _gfx_bgcol; - } - line_addr += stride; - } -} - -void gfx_putchar(int ch) -{ - if(ch != '\n' && ch != '\b') - { - gfx_drawchar(cursor_x, cursor_y, ch); - cursor_x += FONT_WIDTH; - if(cursor_x >= fb_width) - { - cursor_x = 0; - cursor_y += FONT_HEIGHT; - if(cursor_y >= fb_height) - { - gfx_clear(); - cursor_y = 0; - } - } - } - else if(ch == '\n') - { - cursor_x = 0; - cursor_y += FONT_HEIGHT; - if(cursor_y >= fb_height) - { - gfx_clear(); - cursor_y = 0; - } - } - else if(ch == '\b') - { - int temp_x = cursor_x - FONT_WIDTH; - if(temp_x >= 0) - cursor_x = temp_x; - gfx_drawchar_bg(cursor_x, cursor_y, ' '); - } -} - -void gfx_puts(const char* str) -{ - while(*str) - { - gfx_putchar(*str++); - } -} - -/* implemented in assembly now */ -void gfx_hline_checked(int x1, int x2, int y) -{ - /* make sure x1 is to the left of x2 */ - if(x2 < x1) - { - int temp = x1; - x1 = x2; - x2 = temp; - } - - x1 = MAX(0, x1); - x2 = MIN(x2, fb_width); - - if(0 <= y && y < fb_height) - { - - uint8_t *base = framebuffer + y * fb_stride; - - uint8_t *dest = base + x1 * fb_bpp; - uint8_t *stop = base + x2 * fb_bpp; - const uint32_t col = _gfx_fgcol; - while(dest < stop) - { - *(uint32_t*)dest = col; - dest += fb_bpp; - } - } -} - -void gfx_vline_checked(int y1, int y2, int x) -{ - /* make sure y1 is above y2 */ - if(y2 < y1) - { - int temp = y1; - y1 = y2; - y2 = temp; - } - - y1 = MAX(0, y1); - y2 = MIN(y2, fb_height); - - if(0 <= x && x < fb_width) - { - uint8_t *dest = framebuffer + y1 * fb_stride + x * fb_bpp; - uint8_t *stop = framebuffer + y2 * fb_stride + x * fb_bpp; - const uint32_t col = _gfx_fgcol; - const uint16_t stride = fb_stride; - while(dest < stop) - { - *(uint32_t*)dest = col; - dest += stride; - } - } -} - -void gfx_fillrect(int x, int y, int w, int h) -{ - for(int i = 0; i < h; ++i) - { - gfx_hline(x, x + w, y + i); - } -} - -void gfx_drawline(int x1, int y1, int x2, int y2) -{ - int dx = abs(x2 - x1); - int sx = x1 < x2 ? 1 : -1; - int dy = -abs(y2 - y1); - int sy = y1 < y2 ? 1 : -1; - int err = dx + dy; - int e2; /* error value e_xy */ - - while(1) - { - gfx_drawpixel(x1, y1); - if (x1 == x2 && y1 == y2) - break; - e2 = err << 1; - if (e2 >= dy) - { - err += dy; - x1 += sx; - } - if (e2 <= dx) - { - err += dx; - y1 += sy; - } - } -} - -void gfx_drawcircle(int cx, int cy, int r) -{ - int d = 3 - (r * 2); - int x = 0; - int y = r; - while(x <= y) - { - gfx_drawpixel(cx + x, cy + y); - gfx_drawpixel(cx - x, cy + y); - gfx_drawpixel(cx + x, cy - y); - gfx_drawpixel(cx - x, cy - y); - gfx_drawpixel(cx + y, cy + x); - gfx_drawpixel(cx - y, cy + x); - gfx_drawpixel(cx + y, cy - x); - gfx_drawpixel(cx - y, cy - x); - if(d < 0) - { - d += (x * 4) + 6; - } - else - { - d += ((x - y) * 4) + 10; - --y; - } - ++x; - } -} - -void gfx_fillcircle(int cx, int cy, int r) -{ - int d = 3 - (r * 2); - int x = 0; - int y = r; - while(x <= y) - { - gfx_hline(cx - x, cx + x, cy + y); - gfx_hline(cx - x, cx + x, cy - y); - gfx_hline(cx - y, cx + y, cy + x); - gfx_hline(cx - y, cx + y, cy - x); - if(d < 0) - { - d += (x * 4) + 6; - } - else - { - d += ((x - y) * 4) + 10; - --y; - } - ++x; - } -} - -/* these next two functions were taken directly from the Rockbox project's XLCD - * library. - * Copyright (C) 2005 Jens Arnold */ - -/* sort the given coordinates by increasing x value */ -static void sort_points_by_increasing_y(int* y1, int* x1, - int* y2, int* x2, - int* y3, int* x3) -{ - int x, y; - if (*x1 > *x3) - { - if (*x2 < *x3) /* x2 < x3 < x1 */ - { - x = *x1; *x1 = *x2; *x2 = *x3; *x3 = x; - y = *y1; *y1 = *y2; *y2 = *y3; *y3 = y; - } - else if (*x2 > *x1) /* x3 < x1 < x2 */ - { - x = *x1; *x1 = *x3; *x3 = *x2; *x2 = x; - y = *y1; *y1 = *y3; *y3 = *y2; *y2 = y; - } - else /* x3 <= x2 <= x1 */ - { - x = *x1; *x1 = *x3; *x3 = x; - y = *y1; *y1 = *y3; *y3 = y; - } - } - else - { - if (*x2 < *x1) /* x2 < x1 <= x3 */ - { - x = *x1; *x1 = *x2; *x2 = x; - y = *y1; *y1 = *y2; *y2 = y; - } - else if (*x2 > *x3) /* x1 <= x3 < x2 */ - { - x = *x2; *x2 = *x3; *x3 = x; - y = *y2; *y2 = *y3; *y3 = y; - } - /* else already sorted */ - } -} - -/* draw a filled triangle, using horizontal lines for speed */ -void gfx_filltriangle(int x1, int y1, - int x2, int y2, - int x3, int y3) -{ - long fp_x1, fp_x2, fp_dx1, fp_dx2; - int y; - sort_points_by_increasing_y(&x1, &y1, &x2, &y2, &x3, &y3); - - if (y1 < y3) /* draw */ - { - fp_dx1 = ((x3 - x1) << 16) / (y3 - y1); - fp_x1 = (x1 << 16) + (1<<15) + (fp_dx1 >> 1); - - if (y1 < y2) /* first part */ - { - fp_dx2 = ((x2 - x1) << 16) / (y2 - y1); - fp_x2 = (x1 << 16) + (1<<15) + (fp_dx2 >> 1); - for (y = y1; y < y2; y++) - { - gfx_hline(fp_x1 >> 16, fp_x2 >> 16, y); - fp_x1 += fp_dx1; - fp_x2 += fp_dx2; - } - } - if (y2 < y3) /* second part */ - { - fp_dx2 = ((x3 - x2) << 16) / (y3 - y2); - fp_x2 = (x2 << 16) + (1<<15) + (fp_dx2 >> 1); - for (y = y2; y < y3; y++) - { - gfx_hline(fp_x1 >> 16, fp_x2 >> 16, y); - fp_x1 += fp_dx1; - fp_x2 += fp_dx2; - } - } - } -} - -static void gfx_bitmap32(int x, int y, const struct bitmap_t *bmp) -{ - /* SLOOW */ - uint8_t *data = bmp->data; - for(unsigned int i = y; i < y + bmp->h && i < fb_height; ++i) - { - for(unsigned int j = x; j < x + bmp->w && j < fb_width; ++j) - { - uint8_t r = *data++; - uint8_t g = *data++; - uint8_t b = *data++; - gfx_set_foreground(VGA_RGBPACK(r, g, b)); - gfx_drawpixel(j, i); - } - } -} - -void gfx_bitmap(int x, int y, const struct bitmap_t *bmp) -{ - gfx_bitmap32(x, y, bmp); -} - -void gfx_drawrect(int x, int y, int w, int h) -{ - gfx_hline(MAX(0, x), MIN(x + w, fb_width), MAX(0, y)); - gfx_hline(MAX(0, x), MIN(x + w, fb_width), MIN(y + h, fb_height)); - gfx_vline(MAX(0, y), MIN(y + h, fb_height),MAX(0, x)); - gfx_vline(MAX(0, y), MIN(y + h, fb_height),MIN(x + w, fb_width)); -} - -void gfx_update(void) -{ - memcpy(real_framebuffer, framebuffer, fb_height * fb_stride); -} - -void gfx_set_doublebuffer(bool yesno) -{ - if(yesno) - framebuffer = temp_framebuffer; - else - framebuffer = real_framebuffer; -} - -bool gfx_get_doublebuffer(void) -{ - if(framebuffer == temp_framebuffer) - return true; - else - return false; -} - -void gfx_putsxy(int x, int y, const char* str) -{ - while(*str) - { - gfx_drawchar(x, y, *str); - x += FONT_WIDTH; - str++; - } -} - -void gfx_putsxy_bg(int x, int y, const char* str) -{ - while(*str) - { - gfx_drawchar_bg(x, y, *str); - x += FONT_WIDTH; - str++; - } -} - -bool gfx_init(struct vbe_info_t *vbe_mode_info) -{ - real_framebuffer = (uint8_t*)vbe_mode_info->physbase; - gfx_set_doublebuffer(false); - fb_width = vbe_mode_info->Xres; - fb_height = vbe_mode_info->Yres; - fb_bpp = vbe_mode_info->bpp / 8; - fb_stride = vbe_mode_info->pitch; - fb_stride32 = fb_stride / sizeof(uint32_t); - gfx_hline = gfx_hline_checked; - gfx_vline = gfx_vline_checked; - temp_framebuffer = malloc(fb_height * fb_stride); - if(fb_bpp != 4) - { - printf("WARNING: BPP != 32, falling back to text mode...\n"); - return false; - } - else - { - extern void gfx_drawpixel_32bpp(int, int); - gfx_drawpixel = &gfx_drawpixel_32bpp; - } - - set_putchar(gfx_putchar); - set_puts(gfx_puts); - - /* A bit of fragile code here... don't call gfx_reset() before setting gfx_clear! */ - - if(fb_stride != fb_bpp * fb_width) - { - gfx_clear = &gfx_clear_unpacked; - gfx_reset(); - printf("WARNING: Internal framebuffer padding detected, support is experimental.\n"); - } - else - { - /* assembly */ - extern void gfx_clear_packed(void); - gfx_clear = &gfx_clear_packed; - gfx_reset(); - } - - printf("Real FB addr: 0x%x\n", (uint32_t)real_framebuffer); - - return true; -} diff --git a/drivers/include/gfx.h b/drivers/include/gfx.h deleted file mode 100644 index 5e97100..0000000 --- a/drivers/include/gfx.h +++ /dev/null @@ -1,105 +0,0 @@ -#ifndef _GFX_H_ -#define _GFX_H_ - -#include <stdbool.h> -#include <stdint.h> - -enum vga_color_t { - VGA_BLACK = 0, - VGA_BLUE = 1, - VGA_GREEN = 2, - VGA_CYAN = 3, - VGA_RED = 4, - VGA_MAGENTA = 5, - VGA_BROWN = 6, - VGA_LIGHT_GRAY = 7, - VGA_DARK_GRAY = 8, - VGA_LIGHT_BLUE = 9, - VGA_LIGHT_GREEN = 10, - VGA_LIGHT_CYAN = 11, - VGA_LIGHT_RED = 12, - VGA_LIGHT_MAGENTA = 13, - VGA_LIGHT_BROWN = 14, - VGA_WHITE = 15 -}; - -#define VGA_WIDTH 80 -#define VGA_HEIGHT 25 - -#define VGA_MAKE_COLOR(fg, bg) (fg | bg << 4) -#define VGA_MAKE_ENTRY(ch, col) (((uint16_t)ch)|((uint16_t)col<<8)) -#define VGA_RGBPACK(r, g, b) ((r << 16)|(g << 8)|(b << 0)) - -#define GFX_WHITE 0xFFFFFF -#define GFX_BLACK 0x000000 - -struct vbe_info_t; - -bool gfx_init(struct vbe_info_t *vbe_mode_info); - -extern void (*gfx_drawpixel)(int x, int y); - -/* transparent background */ -void gfx_drawchar(int x, int y, int ch); - -/* fills the background with bgcolor */ -void gfx_drawchar_bg(int x, int y, int ch); - -void gfx_putchar(int ch); - -void gfx_puts(const char* str); - -/* this function can be different from resolution to resolution */ -extern void (*gfx_clear)(void); - -void gfx_reset(void); - -void gfx_set_foreground(uint32_t); - -uint32_t gfx_get_foreground(void); - -void gfx_set_background(uint32_t); - -uint32_t gfx_get_background(void); - -void (*gfx_hline)(int x1, int x2, int y); - -void (*gfx_vline)(int y1, int y2, int x); - -void gfx_fillrect(int x1, int y1, int w, int h); - -void gfx_drawline(int x1, int y1, int x2, int y2); - -/* these circle algorithms are very fast */ -void gfx_drawcircle(int cx, int cy, int rad); - -void gfx_fillcircle(int cx, int cy, int rad); - -void gfx_filltriangle(int x1, int y1, int x2, int y2, int x3, int y3); - -extern const uint16_t *gfx_width, *gfx_height; - -/* this is _BYTES_ per pixel, NOT BITS per pixel! */ -extern const uint8_t *gfx_bpp; - -struct bitmap_t { - unsigned int w, h; - unsigned int bpp; - uint8_t *data; -}; - -void gfx_bitmap(int x, int y, const struct bitmap_t*); - -void gfx_drawrect(int x, int y, int w, int h); - -void gfx_set_doublebuffer(bool); - -bool gfx_get_doublebuffer(void); - -/* don't call this wo/ double buffering! */ -void gfx_update(void); - -void gfx_putsxy(int, int, const char*); - -void gfx_putsxy_bg(int, int, const char*); -#endif diff --git a/drivers/include/gfx_font.h b/drivers/include/gfx_font.h deleted file mode 100644 index f7db9d7..0000000 --- a/drivers/include/gfx_font.h +++ /dev/null @@ -1,4 +0,0 @@ -#include <stdint.h> -#define FONT_WIDTH 8 -#define FONT_HEIGHT 12 -extern const uint8_t gfx_font[][FONT_HEIGHT]; diff --git a/drivers/include/pcspkr.h b/drivers/include/pcspkr.h deleted file mode 100644 index 84e640f..0000000 --- a/drivers/include/pcspkr.h +++ /dev/null @@ -1,3 +0,0 @@ -#include <stdint.h> - -void pcspkr_play(uint32_t freq); diff --git a/drivers/include/ps2_keymaps.h b/drivers/include/ps2_keymaps.h deleted file mode 100644 index 0e8ae26..0000000 --- a/drivers/include/ps2_keymaps.h +++ /dev/null @@ -1,39 +0,0 @@ -#include <stdint.h> - -#define EXTENDED_SCANCODE 0xE0 - -#define ERROR_KEY 0 -#define PRINTING_KEY 1 -#define SPECIAL_KEY 2 - -#define SPECIAL_NONE 0 -#define SPECIAL_SHIFT 1 -#define SPECIAL_CTRL 2 -#define SPECIAL_BKSP 3 -#define SPECIAL_ALT 4 -#define SPECIAL_GUI 5 -#define SPECIAL_NUMLOCK 6 -#define SPECIAL_CAPLOCK 7 -#define SPECIAL_SCRLLOCK 8 -#define SPECIAL_UPARROW 9 -#define SPECIAL_DNARROW 10 -#define SPECIAL_LFTARROW 11 -#define SPECIAL_RTARROW 12 -#define SPECIAL_ESC 13 -#define SPECIAL_F1 21 -#define SPECIAL_F2 22 -#define SPECIAL_F3 23 -#define SPECIAL_F4 24 -#define SPECIAL_F5 25 -#define SPECIAL_F6 26 -#define SPECIAL_F7 27 -#define SPECIAL_F8 28 -#define SPECIAL_F9 29 -#define SPECIAL_F10 30 -#define SPECIAL_F11 31 -#define SPECIAL_F12 32 - -extern uint8_t ps2_set1_scancodes[128]; -extern char ps2_set1_ascii[128]; -extern char ps2_set1_shift[128]; -extern uint8_t ps2_set1_special[128]; diff --git a/drivers/include/ps2kbd.h b/drivers/include/ps2kbd.h deleted file mode 100644 index 9e353ee..0000000 --- a/drivers/include/ps2kbd.h +++ /dev/null @@ -1,66 +0,0 @@ -/* this is both a PS/2 keyboard AND a PS/2 MOUSE driver */ -#ifndef _PS2KBD_H_ -#define _PS2KBD_H_ - -#include <stdbool.h> -#include <stdint.h> - -#define PS2_SCROLL_LOCK (1 << 0) -#define PS2_NUM_LOCK (1 << 1) -#define PS2_CAPS_LOCK (1 << 2) - -#define BUTTON_UP (1 << 0) -#define BUTTON_LEFT (1 << 1) -#define BUTTON_DOWN (1 << 2) -#define BUTTON_RIGHT (1 << 3) - -#define MODIFIER_NONE 0 -#define MODIFIER_SHIFT (1 << 0) -#define MODIFIER_CTRL (1 << 1) -#define MODIFIER_ALT (1 << 2) - -struct ps2_specialkeys_t { - int shift :1; - int ctrl :1; - int bksp :1; - int alt :1; - int gui :1; - int numlock :1; - int capslock :1; - int scrllock :1; - int uparrow :1; - int downarrow :1; - int leftarrow :1; - int rightarrow :1; - int esc :1; - int f1 :1; - int f2 :1; - int f3 :1; - int f4 :1; - int f5 :1; - int f6 :1; - int f7 :1; - int f8 :1; - int f9 :1; - int f10 :1; - int f11 :1; - int f12 :1; -}; - -struct ps2_keyevent { - const struct ps2_specialkeys_t *special_keys; - char ascii; -}; - -/* returns which arrow keys are down */ -uint8_t ps2kbd_button_get(void); - -uint8_t ps2kbd_modifier_get(void); - -void ps2kbd_set_leds(uint8_t status); - -void ps2kbd_set_handler(void (*h)(const struct ps2_keyevent*)); - -void ps2kbd_init(void); - -#endif diff --git a/drivers/include/vgatext.h b/drivers/include/vgatext.h deleted file mode 100644 index 1cfe4c4..0000000 --- a/drivers/include/vgatext.h +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdint.h> - -void vgatext_init(void); -void vgatext_clear(void); -void vgatext_set_color(uint8_t); -uint8_t vgatext_get_color(void); -void vgatext_putchar_at(int ch, uint8_t color, int x, int y); -void vgatext_putchar(int ch); -void vgatext_puts(const char*); diff --git a/drivers/pcspkr.c b/drivers/pcspkr.c deleted file mode 100644 index 33c0540..0000000 --- a/drivers/pcspkr.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <stdint.h> -#include "io.h" -#include "pcspkr.h" - -void pcspkr_play(uint32_t freq) -{ - uint32_t div; - uint8_t tmp; - - div = 1193180 / freq; - outb(0x43, 0xb6); - outb(0x42, (uint8_t)(div)); - outb(0x42, (uint8_t)(div >> 8)); - - tmp = inb(0x61); - if (tmp != (tmp | 3)) { - outb(0x61, tmp | 3); - } -} diff --git a/drivers/ps2kbd.c b/drivers/ps2kbd.c deleted file mode 100644 index 29d02dc..0000000 --- a/drivers/ps2kbd.c +++ /dev/null @@ -1,212 +0,0 @@ -/* this is a PS/2 keyboard driver */ -#include <stdint.h> -#include <stdio.h> -#include <string.h> -#include "io.h" -#include "isr.h" -#include "ps2kbd.h" -#include "ps2_keymaps.h" - -static void ps2_wait(void) -{ - /* wait for the keyboard */ - while(1) - if ((inb(0x64) & 2) == 0) break; -} - -void ps2kbd_set_leds(uint8_t status) -{ - ps2_wait(); - outb(0x60, 0xED); - outb(0x60, status); -} - -#define IDX_UP 0 -#define IDX_LEFT 1 -#define IDX_DOWN 2 -#define IDX_RIGHT 3 - -static uint8_t ps2_arrowkeys[4]; - -uint8_t ps2kbd_button_get(void) -{ - uint8_t ret = 0; - if(ps2_arrowkeys[IDX_UP]) - ret |= BUTTON_UP; - if(ps2_arrowkeys[IDX_LEFT]) - ret |= BUTTON_LEFT; - if(ps2_arrowkeys[IDX_DOWN]) - ret |= BUTTON_DOWN; - if(ps2_arrowkeys[IDX_RIGHT]) - ret |= BUTTON_RIGHT; - return ret; -} - -static uint8_t ps2_ctrl; -static uint8_t ps2_shift; -static uint8_t ps2_alt; - -uint8_t ps2kbd_modifier_get(void) -{ - uint8_t ret = 0; - if(ps2_ctrl) - ret |= MODIFIER_CTRL; - if(ps2_shift) - ret |= MODIFIER_SHIFT; - if(ps2_alt) - ret |= MODIFIER_ALT; - return ret; -} - -static struct ps2_specialkeys_t special_keys; - -static void handle_special_key(uint8_t scancode, int release) -{ - int press = ~release; - switch(ps2_set1_special[scancode]) - { - case SPECIAL_SHIFT: - special_keys.shift = press; - break; - case SPECIAL_CTRL: - special_keys.ctrl = press; - break; - case SPECIAL_BKSP: - special_keys.bksp = press; - break; - case SPECIAL_ALT: - special_keys.alt = press; - break; - case SPECIAL_NUMLOCK: - special_keys.numlock = ~special_keys.numlock; - ps2kbd_set_leds((special_keys.capslock << 2) | (special_keys.numlock << 1) | special_keys.scrllock); - break; - case SPECIAL_CAPLOCK: - special_keys.capslock = ~special_keys.capslock; - ps2kbd_set_leds((special_keys.capslock << 2) | (special_keys.numlock << 1) | special_keys.scrllock); - break; - case SPECIAL_SCRLLOCK: - special_keys.scrllock = ~special_keys.scrllock; - ps2kbd_set_leds((special_keys.capslock << 2) | (special_keys.numlock << 1) | special_keys.scrllock); - break; - case SPECIAL_ESC: - special_keys.esc = press; - break; - case SPECIAL_F1: - special_keys.f1 = press; - break; - case SPECIAL_F2: - special_keys.f2 = press; - break; - case SPECIAL_F3: - special_keys.f3 = press; - break; - case SPECIAL_F4: - special_keys.f4 = press; - break; - case SPECIAL_F5: - special_keys.f5 = press; - break; - case SPECIAL_F6: - special_keys.f6 = press; - break; - case SPECIAL_F7: - special_keys.f7 = press; - break; - case SPECIAL_F8: - special_keys.f8 = press; - break; - case SPECIAL_F9: - special_keys.f9 = press; - break; - case SPECIAL_F10: - special_keys.f10 = press; - break; - case SPECIAL_F11: - special_keys.f11 = press; - break; - case SPECIAL_F12: - special_keys.f12 = press; - break; - } -} - -static void handle_extended_scancode(void) -{ - uint8_t temp = inb(0x60); - (void) temp; - //printf("Extended scancode: 0x%x\n", temp); -} - -void (*keyevent_handler)(const struct ps2_keyevent*); - -static void key_handler(struct regs_t *regs) -{ - (void) regs; - uint8_t scancode = inb(0x60); - //printf("INTR SCAN: 0x%x\n", scancode); - if(scancode == EXTENDED_SCANCODE) - { - handle_extended_scancode(); - return; - } - - /* AND by 0x7F to get in the range of [0,128) */ - - int type = ps2_set1_scancodes[scancode & 0x7F]; - int release = (scancode & (1<<7)) >> 7; - char ascii = '\0'; - switch(type) - { - case PRINTING_KEY: - { - if(!release) - { - int capitals = special_keys.capslock; - if(special_keys.shift) - capitals = ~capitals; - if(capitals) - ascii = ps2_set1_shift[scancode]; - else - ascii = ps2_set1_ascii[scancode]; - } - break; - } - case SPECIAL_KEY: - handle_special_key(scancode & 0x7F, release); - break; - } - if(special_keys.bksp) - ascii = '\b'; - if(keyevent_handler) - { - struct ps2_keyevent ev; - ev.special_keys = &special_keys; - ev.ascii = ascii; - keyevent_handler(&ev); - } -} - -static void ps2_set_scancode_set(uint8_t set) -{ - ps2_wait(); - outb(0x60, 0xF0); - outb(0x60, set); -} - -static void keyboard_init(void) -{ - set_interrupt_handler(IRQ(1), key_handler); - ps2_set_scancode_set(1); - memset(&special_keys, 0, sizeof(special_keys)); -} - -void ps2kbd_set_handler(void (*handler)(const struct ps2_keyevent*)) -{ - keyevent_handler = handler; -} - -void ps2kbd_init(void) -{ - keyboard_init(); -} diff --git a/drivers/vgatext.c b/drivers/vgatext.c deleted file mode 100644 index d0633af..0000000 --- a/drivers/vgatext.c +++ /dev/null @@ -1,124 +0,0 @@ -#include <stdint.h> -#include <stdio.h> -#include "gfx.h" -#include "io.h" -#include "panic.h" -#include "vgatext.h" - -static int term_x, term_y; -static uint8_t term_col; -/* VGA buffer starts at 0xB8000 on color or 0xB0000 on monochrome */ -static uint16_t *term_buf; - -static uint16_t video_detect_hardware(void) -{ - const uint16_t *ptr = (const uint16_t*)0x410; - return *ptr; -} - -void vgatext_init(void) -{ - uint16_t vid_type = video_detect_hardware() & 0x30; - if(vid_type == 0x20) - { - /* color */ - term_buf = (uint16_t*)0xB8000; - } - else if(vid_type == 0x30) - { - term_buf = (uint16_t*)0xB0000; - } - else - { - /* none */ - panic("VGATEXT init failed!"); - } - vgatext_set_color(VGA_MAKE_COLOR(VGA_LIGHT_GRAY, VGA_BLACK)); - vgatext_clear(); - set_putchar(vgatext_putchar); - set_puts(vgatext_puts); -} - -static void move_cursor(uint16_t cursor_idx) -{ - outb(0x3D4, 14); - outb(0x3D5, cursor_idx >> 8); // high byte - outb(0x3D4, 15); - outb(0x3D5, cursor_idx); // low byte -} - -static void update_cursor(void) -{ - move_cursor(term_y * VGA_WIDTH + term_x); -} - -void vgatext_clear(void) -{ - term_x = 0; - term_y = 0; - for(int y = 0; y < VGA_HEIGHT; ++y) - { - for(int x = 0; x < VGA_WIDTH; ++x) - { - term_buf[y * VGA_WIDTH + x] = VGA_MAKE_ENTRY(' ', term_col); - } - } -} - -void vgatext_set_color(uint8_t color) -{ - term_col = color; -} - -uint8_t vgatext_get_color(void) -{ - return term_col; -} - -void vgatext_putchar_at(int ch, uint8_t col, int x, int y) -{ - term_buf[y * VGA_WIDTH + x] = VGA_MAKE_ENTRY((char)ch, col); -} - -void vgatext_putchar(int ch) -{ - if(ch != '\n' && ch != '\b') - { - vgatext_putchar_at(ch, term_col, term_x, term_y); - if(++term_x == VGA_WIDTH) - { - term_x = 0; - if(++term_y == VGA_HEIGHT) - { - vgatext_clear(); - term_y = 0; - } - } - } - else if(ch == '\n') - { - term_x = 0; - if(++term_y == VGA_HEIGHT) - { - vgatext_clear(); - term_y = 0; - } - } - else if(ch == '\b') - { - int temp_x = term_x - 1; - if(temp_x >= 0) - term_x = temp_x; - vgatext_putchar_at(' ', term_col, term_x, term_y); - } - - update_cursor(); -} - -void vgatext_puts(const char *str) -{ - while(*str) - { - vgatext_putchar(*str++); - } -} |