diff options
Diffstat (limited to 'src/drivers')
| -rw-r--r-- | src/drivers/8042.c | 16 | ||||
| -rw-r--r-- | src/drivers/8042.h | 64 | ||||
| -rw-r--r-- | src/drivers/framebuffer.c | 58 | ||||
| -rw-r--r-- | src/drivers/framebuffer.h | 35 | ||||
| -rw-r--r-- | src/drivers/pic.c | 28 | ||||
| -rw-r--r-- | src/drivers/pic.h | 9 |
6 files changed, 210 insertions, 0 deletions
diff --git a/src/drivers/8042.c b/src/drivers/8042.c new file mode 100644 index 0000000..c6d3f22 --- /dev/null +++ b/src/drivers/8042.c @@ -0,0 +1,16 @@ +#include "8042.h" +#include "drivers/framebuffer.h" +#include "core/asm.h" + +DEFINE_AZERTY; + +void _8042_keypress(){ + u8 data; + do { + inb(0x64,data); + } + while((data&0x01) == 0); + inb(0x60,data); + if(data<0x80) + putchar(AZERTY[data]); +} diff --git a/src/drivers/8042.h b/src/drivers/8042.h new file mode 100644 index 0000000..5e61ffd --- /dev/null +++ b/src/drivers/8042.h @@ -0,0 +1,64 @@ +#ifndef _8042_H +#define _8042_H + +#include "core/types.h" + +void _8042_keypress(); + +#define DEFINE_AZERTY char AZERTY[]={\ + '\0',\ + '\0',\ + '&',\ + '\0',\ + '"',\ + '\'',\ + '(',\ + '-',\ + '\0',\ + '_',/* 10 */\ + '\0',\ + '\0',\ + ')',\ + '=',\ + '\0',\ + '\t',\ + 'a',\ + 'z',\ + 'e',\ + 'r',\ + 't',\ + 'y',\ + 'u',\ + 'i',\ + 'o',\ + 'p',\ + '^',\ + '$',\ + '\0',\ + '\0',\ + 'q',/* 0x1E (30) */\ + 's',\ + 'd',\ + 'f',\ + 'g',\ + 'h',\ + 'j',\ + 'k',\ + 'l',\ + 'm',\ + '\0',\ + '\0',\ + '\0',\ + '*',\ + 'w',\ + 'x',\ + 'c',\ + 'v',\ + 'b',/* 0x30 (48) */\ + 'n',\ + ',',\ + ';',\ + ':',\ +} + +#endif
\ No newline at end of file diff --git a/src/drivers/framebuffer.c b/src/drivers/framebuffer.c new file mode 100644 index 0000000..110dc73 --- /dev/null +++ b/src/drivers/framebuffer.c @@ -0,0 +1,58 @@ +#include "framebuffer.h" + +#define MAX_COL 80 +#define MAX_LINE 25 + +VIDEO_STATE VS={ + (u8 *)0xB8000, + 0, + 0, + BLACK, + GRAY, +}; + +void putchar(char c){ + // Handle newline here + if(c=='\n'){ + VS.col=0; + VS.line+=1; + if(VS.line>=MAX_LINE){ + VS.line=MAX_LINE-1; + scrollup(); + } + return; + } + + // Print char + VS.mem[VS.col*2+MAX_COL*VS.line*2]=c; + VS.mem[VS.col*2+MAX_COL*VS.line*2+1]=VS.fg|VS.bg<<4; + + // Refresh location + VS.col+=1; + if(VS.col>= MAX_COL){ + VS.col=0; + VS.line+=1; + if(VS.line>=MAX_LINE){ + VS.line=MAX_LINE-1; + scrollup(); + } + } +} + +void clear(){ + for(char i=0;i<MAX_LINE;i++){ + scrollup(); + } +} + +void scrollup(){ + // Move VS.line up + for(char i=1;i<=MAX_LINE;i++){ + for(char j=0;j<=MAX_COL;j++) + VS.mem[j*2+MAX_COL*(i-1)*2]=VS.mem[j*2+MAX_COL*i*2]; + } + // Clear last VS.line + for(char i=0;i<=MAX_COL;i++){ + VS.mem[i*2+MAX_COL*(MAX_LINE-1)*2]='\0'; + } +} diff --git a/src/drivers/framebuffer.h b/src/drivers/framebuffer.h new file mode 100644 index 0000000..d265015 --- /dev/null +++ b/src/drivers/framebuffer.h @@ -0,0 +1,35 @@ +#ifndef FRAMEBUFFER_H +#define FRAMEBUFFER_H + +#include "core/types.h" + +typedef enum VIDEO_COLORS { + BLACK=0, BLUE=1, GREEN=2,CYAN=3, RED=4,PURPLE=5,BROWN=6,GRAY=7, + DARK_GRAY=8,LIGHT_BLUE=9,LIGHT_GREEN=10,LIGHT_CYAN=11,LIGHT_RED=12,LIGHT_PURPLE=13,YELLOW=14,WHITE=15 + +} VIDEO_COLORS; + +typedef struct VIDEO_STATE { + u8 *mem; + u8 col; + u8 line; + u8 bg; + u8 fg; +} VIDEO_STATE; + +/** + * Print char + */ +void putchar(char); + +/** + * Scroll the framebuffer from one line + */ +void scrollup(); + +/** + * Clear all char from the framebuffer + */ +void clear(); + +#endif diff --git a/src/drivers/pic.c b/src/drivers/pic.c new file mode 100644 index 0000000..d509e1d --- /dev/null +++ b/src/drivers/pic.c @@ -0,0 +1,28 @@ +#include "pic.h" +#include "core/asm.h" +#include "core/mem.h" +#include "core/syscall.h" + +void pic_init(){ + + // ICW1: Initialisation + outbj(0x20,0x11); // Master + outbj(0xA0,0x11); // Slave + + // ICW2: Map IRQ index to entry into the IDT + outbj(0x21,0x20); // Start interrupt at offset 0x20 in IDT (index 32) + outbj(0xA1,0x70); // Start interrupt at offset 0x50 in IDT (index 80) + + // ICW3: Indicate the connection between master and slave + outbj(0x21,0x02); // Slave connected to pin 2 + outbj(0xA1,0x01); // Indicate pin id to the slave (2-1) + + // ICW4: Operating mode + outbj(0x21,0x01); // Default operating mode + outbj(0xA1,0x01); // Default operating mode + + // OCW: Masking + outbj(0x21,0b11111100); +} + + diff --git a/src/drivers/pic.h b/src/drivers/pic.h new file mode 100644 index 0000000..19e0f5c --- /dev/null +++ b/src/drivers/pic.h @@ -0,0 +1,9 @@ +#ifndef PIC_H +#define PIC_H + +/** + * Configure + */ +void pic_init(); + +#endif
\ No newline at end of file |
