Files
danos/system/drivers/ps2-bus/mouse.zig
T
2026-07-11 21:39:27 +01:00

65 lines
2.5 KiB
Zig

//! PS/2 Mouse Driver
//!
//! Spawned by the ps2-bus driver once the controller is initialized and port 2
//! 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/mouse: no HID argument\n");
return;
}
writeLine("system/drivers/ps2-bus/mouse: starting for hid {s}\n", .{hid});
const buffer = runtime.allocator().alloc(device.DeviceDescriptor, 64) catch {
_ = runtime.system.write("system/drivers/ps2-bus/mouse: out of memory\n");
return;
};
const mouse_device_descriptor = device.findDeviceDescriptorByHid(buffer, hid) orelse {
writeLine("system/drivers/ps2-bus/mouse: no device for hid {s}\n", .{hid});
return;
};
// The mouse's own node (PNP0F13) carries IRQ12 and is not claimed by the bus,
// so this driver takes exclusive ownership of it. Port IO still goes through
// the bus, which owns the shared 8042 ports.
if (!device.claim(mouse_device_descriptor.id)) {
writeLine("system/drivers/ps2-bus/mouse: unable to claim device for hid {s}\n", .{hid});
return;
}
writeLine("system/drivers/ps2-bus/mouse: claimed device for hid {s}\n", .{hid});
// Broadcast mouse events through the input service so programs can listen for them
// (docs/input.md). As with the keyboard, decoding real PS/2 mouse packets is a
// follow-up; for now we publish the synthetic stand-in stream. The fan-out path is
// real, only the source of the movement is placeholder.
var source = runtime.input.connectSource() orelse {
_ = runtime.system.write("system/drivers/ps2-bus/mouse: input service unavailable\n");
return;
};
_ = runtime.system.write("system/drivers/ps2-bus/mouse: ok\n");
var step: usize = 0;
while (true) : (step +%= 1) {
_ = source.publishMouseEvent(runtime.input.syntheticMouseEvent(step));
runtime.system.sleep(200);
}
}
pub const panic = runtime.panic;
comptime {
_ = &runtime.start._start;
}