Hi,
I was trying to test the basic IRQ handling in Genode. I simplified the code from os/src/drivers/input/ps2/irq_handler.h and ran it on both QEMU and real machine. However, neither keyboard nor mouse interrupts can be properly captured by my code.
For keyboard (IRQ 1), it keeps triggering interrupt even when there is no key press. For mouse (IRQ 12), there is no interrupt at all. As the ps2_drv works fine in the demo app, I'm sure something is missing in my stand-alone code (or I need to include other modules?). I appreciate if anyone can point it out.
I attached my code here for your reference.
Best, Jilong
=========================================================== class Irq_handler : Genode::Thread<4096> { private:
Genode::Irq_connection _irq; int irq_num; public:
Irq_handler(int irq_number) : _irq(irq_number) { irq_num=irq_number; start(); }
void entry() {
while (1) { _irq.wait_for_irq(); Genode::printf("received an IRQ %d!\n",irq_num);
} } };
int main() { printf("Entered: test-irq\n"); Irq_handler ps2_mouse_irq(12); Irq_handler ps2_keyboard_irq(1); Genode::sleep_forever(); }
Hello Jilong Kuang,
am I right that you're using Genode on x86 as your PS2 interrupts are 1 and 12? Looking at your code it looks like you're not configuring the PS2 hardware at all, in fact you leave it as initialized by the BIOS. Therefore, the mouse port is disabled and the mouse is not initialized and as expected you see no interrupts from it.
For the keyboard, I could reproduce your reported behavior very easily with the attached patch. You have to click into the Qemu window very fast before Genode is booted, but then you will be able to see the interrupts logged / _max_handle decremented if the mouse is moved. As soon as the code stops to handle hardware events (_max_handle == 0) the interrupts occur again right after unmasking on wait_for_irq(). This is expected as we did not handle the event and programmed the PS2 device.
For your simple interrupt tests it may be easier to write a simple UART driver as PS2 is more complex than UARTs. Genode on Fiasco.OC uses the first UART via the kernel. So, I need to have a second serial interface.
Regards