60 lines
2.4 KiB
Zig
60 lines
2.4 KiB
Zig
//! PS/2 Keyboard Driver
|
|
//!
|
|
//! Spawned by the ps2-bus driver once the controller is initialized and port 1
|
|
//! has passed its interface test and device reset. The bus driver hands us our
|
|
//! device HID as argv[1]; we use it to locate our own device descriptor.
|
|
|
|
const std = @import("std");
|
|
const runtime = @import("runtime");
|
|
const ps2 = @import("ps2-library.zig");
|
|
const device = runtime.device;
|
|
|
|
fn writeLine(comptime fmt: []const u8, arguments: anytype) void {
|
|
var line: [128]u8 = undefined;
|
|
_ = runtime.system.write(std.fmt.bufPrint(&line, fmt, arguments) catch return);
|
|
}
|
|
|
|
pub fn main(init: runtime.process.Init) void {
|
|
const hid = init.arguments.get(1).?;
|
|
if (hid.len == 0) {
|
|
_ = runtime.system.write("system/drivers/ps2-bus/keyboard: no HID argument\n");
|
|
return;
|
|
}
|
|
writeLine("system/drivers/ps2-bus/keyboard: starting for hid {s}\n", .{hid});
|
|
|
|
const buffer = runtime.allocator().alloc(device.DeviceDescriptor, 64) catch {
|
|
_ = runtime.system.write("system/drivers/ps2-bus/keyboard: out of memory\n");
|
|
return;
|
|
};
|
|
if (device.findDeviceDescriptorByHid(buffer, hid) == null) {
|
|
writeLine("system/drivers/ps2-bus/keyboard: no device for hid {s}\n", .{hid});
|
|
return;
|
|
}
|
|
|
|
// The 8042 ports (0x60/0x64) and this keyboard's IRQ1 both live on the same
|
|
// PNP0303 node, which the ps2-bus driver exclusively owns — so the keyboard is
|
|
// served through the bus and does not claim the controller itself.
|
|
_ = runtime.system.write("system/drivers/ps2-bus/keyboard: served by ps2-bus (controller owned by bus)\n");
|
|
|
|
// Broadcast keyboard events through the input service so programs can listen for them
|
|
// (docs/input.md). Until the bus reads real IRQ1 scancodes and hands them here (a
|
|
// follow-up), we publish the same synthetic stand-in stream the demo source uses — the
|
|
// fan-out path is real, only the source of the bytes is placeholder.
|
|
var source = runtime.input.connectSource() orelse {
|
|
_ = runtime.system.write("system/drivers/ps2-bus/keyboard: input service unavailable\n");
|
|
return;
|
|
};
|
|
_ = runtime.system.write("system/drivers/ps2-bus/keyboard: ok\n");
|
|
|
|
var step: usize = 0;
|
|
while (true) : (step +%= 1) {
|
|
_ = source.publishKeyboardEvent(runtime.input.syntheticKeyEvent(step));
|
|
runtime.system.sleep(200);
|
|
}
|
|
}
|
|
|
|
pub const panic = runtime.panic;
|
|
comptime {
|
|
_ = &runtime.start._start;
|
|
}
|