cleaned up some log messages, polished up the kb driver a bit, etc
This commit is contained in:
3
Makefile
3
Makefile
@ -48,6 +48,9 @@ os.iso: kernel.elf
|
|||||||
run: os.iso
|
run: os.iso
|
||||||
$(TERM_EXEC) "gdb kernel.elf -x util/gdbcmds" &
|
$(TERM_EXEC) "gdb kernel.elf -x util/gdbcmds" &
|
||||||
qemu-system-i386 -s -cdrom os.iso
|
qemu-system-i386 -s -cdrom os.iso
|
||||||
|
|
||||||
|
bochs: os.iso
|
||||||
|
bochs -f util/bochsrc.txt -q
|
||||||
|
|
||||||
#TODO: when i inevitably do add libc, this is going to fail because they have the same name as the libk objects
|
#TODO: when i inevitably do add libc, this is going to fail because they have the same name as the libk objects
|
||||||
#TODO: so we'll need to do a batch rename on one of the two object files,
|
#TODO: so we'll need to do a batch rename on one of the two object files,
|
||||||
|
@ -16,6 +16,8 @@ static idtr_t idtr;
|
|||||||
|
|
||||||
static bool vectors[IDT_MAX_DESCRIPTORS];
|
static bool vectors[IDT_MAX_DESCRIPTORS];
|
||||||
|
|
||||||
|
extern struct keyboard_state keyb_state;
|
||||||
|
|
||||||
void exception_handler(unsigned int i)
|
void exception_handler(unsigned int i)
|
||||||
{
|
{
|
||||||
if (i <= 31) { // TODO: implement proper handling for each exception, also implement the proper gates & error code checking
|
if (i <= 31) { // TODO: implement proper handling for each exception, also implement the proper gates & error code checking
|
||||||
@ -28,10 +30,7 @@ void exception_handler(unsigned int i)
|
|||||||
|
|
||||||
if (i == PIC_KEYB) {
|
if (i == PIC_KEYB) {
|
||||||
unsigned char in = inb(0x60);
|
unsigned char in = inb(0x60);
|
||||||
#ifdef __TESTING__
|
do_keypress(decode_scancode(in));
|
||||||
printf("scancode: %x\n", in);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PIC_sendEOI(1);
|
PIC_sendEOI(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,19 +40,21 @@ void init_kb(void)
|
|||||||
#ifdef __TESTING__
|
#ifdef __TESTING__
|
||||||
puts("Initializing keyboard driver!");
|
puts("Initializing keyboard driver!");
|
||||||
#endif
|
#endif
|
||||||
|
keyb_state.ready = false;
|
||||||
init_queue(&kb_cmd_queue);
|
init_queue(&kb_cmd_queue);
|
||||||
|
|
||||||
keyb_state.leds = 0;
|
keyb_state.leds = 0;
|
||||||
|
keyb_state.flags = 0;
|
||||||
|
|
||||||
queue_kb_command(KEYB_CMD_ENABLE_SCANNING);
|
queue_kb_command(KEYB_CMD_ENABLE_SCANNING);
|
||||||
queue_kb_command(KEYB_CMD_SET_DEFAULT_PARAMS);
|
|
||||||
|
|
||||||
//queue_kb_command(KEYB_CMD_SET_TYPEMATIC);
|
|
||||||
//queue_kb_command(0x1F);
|
|
||||||
|
|
||||||
|
queue_kb_command(KEYB_CMD_SET_TYPEMATIC);
|
||||||
|
queue_kb_command(0x1F);
|
||||||
|
|
||||||
send_kb_commands();
|
send_kb_commands();
|
||||||
|
|
||||||
|
keyb_state.ready = true;
|
||||||
|
|
||||||
|
|
||||||
#ifdef __TESTING__
|
#ifdef __TESTING__
|
||||||
puts("Initialized keyboard driver!");
|
puts("Initialized keyboard driver!");
|
||||||
@ -89,7 +91,85 @@ void send_kb_commands(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
kb_key_press_t decode_scancode(uint8_t scancode)
|
kb_key_code_t decode_scancode(uint8_t scancode)
|
||||||
{return (kb_key_press_t) scancode;}
|
{return (kb_key_code_t) scancode;}
|
||||||
|
|
||||||
|
key_press_t do_keypress(kb_key_code_t keycode)
|
||||||
|
{
|
||||||
|
key_press_t packet;
|
||||||
|
|
||||||
|
if (!keyb_state.ready) {
|
||||||
|
packet.key_code = KEY_NONE;
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (keycode >= KEY_ESC_R) {
|
||||||
|
packet.key_code = keycode - KEY_PRESS_RELEASE_DIFF;
|
||||||
|
packet.release = true;
|
||||||
|
} else {
|
||||||
|
packet.key_code = keycode;
|
||||||
|
packet.release = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (keycode) {
|
||||||
|
case KEY_LEFT_SHIFT:
|
||||||
|
keyb_state.flags |= (STATUS_FLAG_LSHIFT);
|
||||||
|
break;
|
||||||
|
case KEY_LEFT_SHIFT_R:
|
||||||
|
keyb_state.flags &= ~(STATUS_FLAG_LSHIFT);
|
||||||
|
break;
|
||||||
|
case KEY_RIGHT_SHIFT:
|
||||||
|
keyb_state.flags |= (STATUS_FLAG_RSHIFT);
|
||||||
|
break;
|
||||||
|
case KEY_RIGHT_SHIFT_R:
|
||||||
|
keyb_state.flags &= ~(STATUS_FLAG_RSHIFT);
|
||||||
|
break;
|
||||||
|
case KEY_LEFT_CTRL:
|
||||||
|
keyb_state.flags |= (STATUS_FLAG_CTRL);
|
||||||
|
break;
|
||||||
|
case KEY_LEFT_CTRL_R:
|
||||||
|
keyb_state.flags &= ~(STATUS_FLAG_CTRL);
|
||||||
|
break;
|
||||||
|
case KEY_LEFT_ALT:
|
||||||
|
keyb_state.flags |= (STATUS_FLAG_ALT);
|
||||||
|
break;
|
||||||
|
case KEY_LEFT_ALT_R:
|
||||||
|
keyb_state.flags &= ~(STATUS_FLAG_ALT);
|
||||||
|
break;
|
||||||
|
case KEY_CAPSLOCK:
|
||||||
|
keyb_state.flags ^= (STATUS_FLAG_CAPS_LOCK);
|
||||||
|
keyb_state.leds ^= (KEYB_LED_CAP_LCK);
|
||||||
|
queue_kb_command(KEYB_CMD_SET_LEDS);
|
||||||
|
queue_kb_command(keyb_state.leds);
|
||||||
|
break;
|
||||||
|
case KEY_NUMLOCK:
|
||||||
|
keyb_state.flags ^= (STATUS_FLAG_NUM_LOCK);
|
||||||
|
keyb_state.leds ^= (KEYB_LED_NUM_LCK);
|
||||||
|
queue_kb_command(KEYB_CMD_SET_LEDS);
|
||||||
|
queue_kb_command(keyb_state.leds);
|
||||||
|
break;
|
||||||
|
case KEY_SCROLLLOCK:
|
||||||
|
keyb_state.flags ^= (STATUS_FLAG_NUM_LOCK);
|
||||||
|
keyb_state.leds ^= (KEYB_LED_SCRL_LCK);
|
||||||
|
queue_kb_command(KEYB_CMD_SET_LEDS);
|
||||||
|
queue_kb_command(keyb_state.leds);
|
||||||
|
break;
|
||||||
|
// case KEY_INSERT TODO: this shit baby
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
send_kb_commands();
|
||||||
|
packet.flags = keyb_state.flags;
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* shift
|
||||||
|
* ctrl
|
||||||
|
* alt
|
||||||
|
* caps
|
||||||
|
* num
|
||||||
|
* scroll
|
||||||
|
*/
|
||||||
|
@ -56,7 +56,7 @@ void pic_disable(void)
|
|||||||
outb(PIC1_DATA, 0xFF);
|
outb(PIC1_DATA, 0xFF);
|
||||||
outb(PIC2_DATA, 0xFF);
|
outb(PIC2_DATA, 0xFF);
|
||||||
#ifdef __TESTING__
|
#ifdef __TESTING__
|
||||||
kinfo("Disabled the PIC");
|
kinfo("Masked off the PIC");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,10 +72,14 @@ void IRQ_set_mask(uint8_t IRQline) // Masked IRQlines are ignored by the PIC, ma
|
|||||||
IRQline -= 8;
|
IRQline -= 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("%x %x\n", port, IRQline);
|
|
||||||
|
|
||||||
value = inb(port) | (1 << IRQline);
|
value = inb(port) | (1 << IRQline);
|
||||||
outb(port, value);
|
outb(port, value);
|
||||||
|
|
||||||
|
#ifdef __TESTING__
|
||||||
|
kinfo("Masked IRQ line");
|
||||||
|
printf("IRQ line: %d\n", IRQline);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void IRQ_clear_mask(uint8_t IRQline)
|
void IRQ_clear_mask(uint8_t IRQline)
|
||||||
@ -92,6 +96,10 @@ void IRQ_clear_mask(uint8_t IRQline)
|
|||||||
|
|
||||||
value = inb(port) & ~(1 << IRQline);
|
value = inb(port) & ~(1 << IRQline);
|
||||||
outb(port, value);
|
outb(port, value);
|
||||||
|
#ifdef __TESTING__
|
||||||
|
kinfo("Cleared mask from IRQ line");
|
||||||
|
printf("IRQ line: %d\n", IRQline);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t __pic_get_irq_reg(int ocw3)
|
static uint16_t __pic_get_irq_reg(int ocw3)
|
||||||
|
@ -45,13 +45,24 @@
|
|||||||
#define KEYB_RESP_RESEND (0xFE)
|
#define KEYB_RESP_RESEND (0xFE)
|
||||||
#define KEYB_RESP_ERR_TWO (0xFF)
|
#define KEYB_RESP_ERR_TWO (0xFF)
|
||||||
|
|
||||||
|
|
||||||
|
#define STATUS_FLAG_RSHIFT (1 << 0)
|
||||||
|
#define STATUS_FLAG_LSHIFT (1 << 1)
|
||||||
|
#define STATUS_FLAG_CTRL (1 << 2)
|
||||||
|
#define STATUS_FLAG_ALT (1 << 3)
|
||||||
|
#define STATUS_FLAG_SCRL_LOCK (1 << 4)
|
||||||
|
#define STATUS_FLAG_NUM_LOCK (1 << 5)
|
||||||
|
#define STATUS_FLAG_CAPS_LOCK (1 << 6)
|
||||||
|
#define STATUS_FLAG_INSERT (1 << 7)
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
KEY_NONE,
|
||||||
KEY_ESC = 0x01,
|
KEY_ESC = 0x01,
|
||||||
KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0,
|
KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0,
|
||||||
KEY_MINUS, KEY_EQUALS,
|
KEY_MINUS, KEY_EQUALS,
|
||||||
KEY_BACKSPACE, KEY_TAB,
|
KEY_BACKSPACE, KEY_TAB,
|
||||||
KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P,
|
KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P,
|
||||||
KEY_LEFT_BRACKET, KEY_RIGHT_BRACKET, KEY_ENTER, KET_LEFT_CTRL,
|
KEY_LEFT_BRACKET, KEY_RIGHT_BRACKET, KEY_ENTER, KEY_LEFT_CTRL,
|
||||||
KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L,
|
KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L,
|
||||||
KEY_SEMICOLON, KEY_SINGLE_QUOTE, KEY_BACK_TICK, KEY_LEFT_SHIFT, KEY_BACKSLASH,
|
KEY_SEMICOLON, KEY_SINGLE_QUOTE, KEY_BACK_TICK, KEY_LEFT_SHIFT, KEY_BACKSLASH,
|
||||||
KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M,
|
KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M,
|
||||||
@ -78,7 +89,7 @@ typedef enum {
|
|||||||
KEY_TAB_R,
|
KEY_TAB_R,
|
||||||
KEY_Q_R, KEY_W_R, KEY_E_R, KEY_R_R, KEY_T_R, KEY_Y_R, KEY_U_R, KEY_I_R, KEY_O_R, KEY_P_R,
|
KEY_Q_R, KEY_W_R, KEY_E_R, KEY_R_R, KEY_T_R, KEY_Y_R, KEY_U_R, KEY_I_R, KEY_O_R, KEY_P_R,
|
||||||
KEY_LEFT_BRACKET_R, KEY_RIGHT_BRACKET_R,
|
KEY_LEFT_BRACKET_R, KEY_RIGHT_BRACKET_R,
|
||||||
KEY_ENTER_R, KET_LEFT_CTRL_R,
|
KEY_ENTER_R, KEY_LEFT_CTRL_R,
|
||||||
KEY_A_R, KEY_S_R, KEY_D_R, KEY_F_R, KEY_G_R, KEY_H_R, KEY_J_R, KEY_K_R, KEY_L_R,
|
KEY_A_R, KEY_S_R, KEY_D_R, KEY_F_R, KEY_G_R, KEY_H_R, KEY_J_R, KEY_K_R, KEY_L_R,
|
||||||
KEY_SEMICOLON_R, KEY_SINGLE_QUOTE_R, KEY_BACK_TICK_R, KEY_LEFT_SHIFT_R, KEY_BACKSLASH_R,
|
KEY_SEMICOLON_R, KEY_SINGLE_QUOTE_R, KEY_BACK_TICK_R, KEY_LEFT_SHIFT_R, KEY_BACKSLASH_R,
|
||||||
KEY_Z_R, KEY_X_R, KEY_C_R, KEY_V_R, KEY_B_R, KEY_N_R, KEY_M_R,
|
KEY_Z_R, KEY_X_R, KEY_C_R, KEY_V_R, KEY_B_R, KEY_N_R, KEY_M_R,
|
||||||
@ -98,15 +109,20 @@ typedef enum {
|
|||||||
KEY_KP_PERIOD_R,
|
KEY_KP_PERIOD_R,
|
||||||
KEY_F11_R = 0xD7,
|
KEY_F11_R = 0xD7,
|
||||||
KEY_F12_R,
|
KEY_F12_R,
|
||||||
} kb_key_press_t;
|
} kb_key_code_t;
|
||||||
|
|
||||||
struct keypress {
|
#define KEY_PRESS_RELEASE_DIFF (KEY_ESC_R - KEY_ESC)
|
||||||
kb_key_press_t key_code;
|
|
||||||
uint8_t
|
typedef struct {
|
||||||
};
|
kb_key_code_t key_code;
|
||||||
|
uint8_t flags;
|
||||||
|
bool release;
|
||||||
|
} key_press_t ;
|
||||||
|
|
||||||
struct keyboard_state {
|
struct keyboard_state {
|
||||||
|
bool ready;
|
||||||
uint8_t leds;
|
uint8_t leds;
|
||||||
|
uint8_t flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -116,7 +132,7 @@ void send_kb_commands(void);
|
|||||||
void queue_kb_command(uint8_t command);
|
void queue_kb_command(uint8_t command);
|
||||||
|
|
||||||
|
|
||||||
kb_key_press_t decode_scancode(uint8_t scancode);
|
kb_key_code_t decode_scancode(uint8_t scancode);
|
||||||
char decode_key_enum(kb_key_press_t keycode);
|
key_press_t do_keypress(kb_key_code_t keycode);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
11
util/bochsrc.txt
Normal file
11
util/bochsrc.txt
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
megs: 32
|
||||||
|
display_library: sdl
|
||||||
|
romimage: file=/usr/share/bochs/BIOS-bochs-latest
|
||||||
|
vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest
|
||||||
|
ata0-master: type=cdrom, path=os.iso, status=inserted
|
||||||
|
boot: cdrom
|
||||||
|
log: bochslog.txt
|
||||||
|
clock: sync=realtime, time0=local
|
||||||
|
cpu: count=1, ips=10000000
|
||||||
|
com1: enabled=1, mode=file, dev=com1.out
|
||||||
|
|
Reference in New Issue
Block a user