work
This commit is contained in:
parent
58bc6facbc
commit
501e2f5cb5
|
@ -0,0 +1,97 @@
|
||||||
|
.{memory, log, string, buffer} := @use("../../../libraries/stn/src/lib.hb")
|
||||||
|
|
||||||
|
init := fn(): void {
|
||||||
|
send_byte_to_controller(173)
|
||||||
|
send_byte_to_controller(167)
|
||||||
|
|
||||||
|
// flush output buffer
|
||||||
|
memory.inb(0, 96)
|
||||||
|
|
||||||
|
send_byte_to_controller(32)
|
||||||
|
config_byte := read_byte()
|
||||||
|
log.info("What\0")
|
||||||
|
|
||||||
|
// TODO: We just assume there's a second device here and set up the
|
||||||
|
// controller as such. We should probably look for the second device FIRST
|
||||||
|
// The OSWiki has a page about this
|
||||||
|
// https://wiki.osdev.org/%228042%22_PS/2_Controller#Step_7:_Determine_If_There_Are_2_Channels
|
||||||
|
config_byte &= 32
|
||||||
|
send_byte_to_controller(96)
|
||||||
|
send_byte(config_byte)
|
||||||
|
|
||||||
|
if perform_self_test() {
|
||||||
|
log.info("PS/2 Controller self test successful\0")
|
||||||
|
send_byte_to_controller(171)
|
||||||
|
if read_byte() != 0 {
|
||||||
|
log.error("PS/2 First port test failed\0")
|
||||||
|
}
|
||||||
|
send_byte_to_controller(169)
|
||||||
|
if read_byte() != 0 {
|
||||||
|
log.error("PS/2 Second port test failed\0")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.error("PS/2 Controller self test failed\0")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
perform_self_test := fn(): bool {
|
||||||
|
send_byte_to_controller(32)
|
||||||
|
config_byte := read_byte()
|
||||||
|
|
||||||
|
send_byte_to_controller(170)
|
||||||
|
response := read_byte()
|
||||||
|
|
||||||
|
send_byte_to_controller(96)
|
||||||
|
send_byte(config_byte)
|
||||||
|
return response == 85
|
||||||
|
}
|
||||||
|
|
||||||
|
send_byte_to_controller := fn(byte: u8): void {
|
||||||
|
loop {
|
||||||
|
status := memory.inb(0, 100)
|
||||||
|
// Bitwise OR with 1011 1111
|
||||||
|
// If the second bit was set in the status register,
|
||||||
|
// status is now equal to 255
|
||||||
|
status |= 191
|
||||||
|
|
||||||
|
if status != 255 {
|
||||||
|
memory.outb(0, 100, byte)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
send_byte := fn(byte: u8): void {
|
||||||
|
loop {
|
||||||
|
status := memory.inb(0, 100)
|
||||||
|
// Bitwise OR with 1011 1111
|
||||||
|
// If the second bit was set in the status register,
|
||||||
|
// status is now equal to 255
|
||||||
|
status |= 191
|
||||||
|
|
||||||
|
if status != 255 {
|
||||||
|
memory.outb(0, 96, byte)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
read_byte := fn(): u8 {
|
||||||
|
ptr := memory.request_page(1)
|
||||||
|
loop {
|
||||||
|
status := memory.inb(0, 100)
|
||||||
|
// Bitwise OR with 0111 1111
|
||||||
|
// If the first bit was set in the status register,
|
||||||
|
// status is now equal to 255
|
||||||
|
status |= 127
|
||||||
|
str := string.display_int(status, ptr)
|
||||||
|
log.info(ptr)
|
||||||
|
|
||||||
|
if status == 255 {
|
||||||
|
return memory.inb(0, 96)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,30 +1,28 @@
|
||||||
.{memory, log, string, buffer} := @use("../../../libraries/stn/src/lib.hb")
|
.{memory, log, string, buffer} := @use("../../../libraries/stn/src/lib.hb")
|
||||||
|
controller := @use("./controller.hb")
|
||||||
send_byte := fn(byte: u8): u8 {
|
|
||||||
memory.outb(0, 96, byte)
|
|
||||||
return memory.inb(0, 96)
|
|
||||||
}
|
|
||||||
|
|
||||||
main := fn(): int {
|
main := fn(): int {
|
||||||
log.info("PS/2 Driver Loaded\0")
|
log.info("PS/2 Driver Loaded\0")
|
||||||
if send_byte(238) == 238 {
|
controller.init()
|
||||||
log.info("PS/2 Keyboard Echoed\0")
|
|
||||||
}
|
|
||||||
if send_byte(244) == 250 {
|
|
||||||
log.info("Enabled scanning\0")
|
|
||||||
}
|
|
||||||
buf := buffer.create("XKeyboard\0")
|
|
||||||
ptr := memory.request_page(1)
|
|
||||||
prev_input := 250
|
|
||||||
loop {
|
|
||||||
input := memory.inb(0, 96)
|
|
||||||
if input == prev_input {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
prev_input = input
|
|
||||||
keycode_str := string.display_int(input, ptr)
|
|
||||||
log.info(string.display_int(buf))
|
|
||||||
buffer.send_message(keycode_str, buf)
|
|
||||||
}
|
|
||||||
return 0
|
return 0
|
||||||
|
// if send_byte(238) == 238 {
|
||||||
|
// log.info("PS/2 Keyboard Echoed\0")
|
||||||
|
// }
|
||||||
|
// if send_byte(244) == 250 {
|
||||||
|
// log.info("Enabled scanning\0")
|
||||||
|
// }
|
||||||
|
// buf := buffer.create("XKeyboard\0")
|
||||||
|
// ptr := memory.request_page(1)
|
||||||
|
// prev_input := 250
|
||||||
|
// loop {
|
||||||
|
// input := memory.inb(0, 96)
|
||||||
|
// if input == prev_input {
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
// prev_input = input
|
||||||
|
// keycode_str := string.display_int(input, ptr)
|
||||||
|
// log.info(string.display_int(buf))
|
||||||
|
// buffer.send_message(keycode_str, buf)
|
||||||
|
// }
|
||||||
|
// return 0
|
||||||
}
|
}
|
Loading…
Reference in a new issue