ps2: use irqs via device interface

Issue #1486 and #1471
This commit is contained in:
Alexander Boettcher 2015-03-30 11:37:08 +02:00 committed by Christian Helmuth
parent 7770a0fbbe
commit e527f6e5ac
3 changed files with 135 additions and 10 deletions

120
repos/os/run/input.run Normal file
View File

@ -0,0 +1,120 @@
#
# Build
#
set build_components {
core init
drivers/input
drivers/timer
drivers/pci
test/input
}
build $build_components
create_boot_directory
#
# Generate config
#
append config {
<config>
<parent-provides>
<service name="ROM"/>
<service name="RAM"/>
<service name="IRQ"/>
<service name="IO_MEM"/>
<service name="IO_PORT"/>
<service name="CAP"/>
<service name="PD"/>
<service name="RM"/>
<service name="CPU"/>
<service name="LOG"/>
<service name="SIGNAL"/>
</parent-provides>
<default-route/>
<start name="timer">
<resource name="RAM" quantum="1M"/>
<provides><service name="Timer"/></provides>
<route>
<service name="CAP"> <parent/> </service>
<service name="LOG"> <parent/> </service>
<service name="RM"> <parent/> </service>
<service name="ROM"> <parent/> </service>
<service name="SIGNAL"> <parent/> </service>
</route>
</start>
<start name="pci_drv">
<resource name="RAM" quantum="1M"/>
<provides>
<service name="PCI"/>
</provides>
<route>
<service name="CAP"> <parent/> </service>
<service name="IO_PORT"> <parent/> </service>
<service name="IRQ"> <parent/> </service>
<service name="LOG"> <parent/> </service>
<service name="RAM"> <parent/> </service>
<service name="RM"> <parent/> </service>
<service name="ROM"> <parent/> </service>
<service name="SIGNAL"> <parent/> </service>
</route>
<config>
<policy label="ps2_drv">
<device name="PS2"/>
</policy>
</config>
</start>
<start name="ps2_drv">
<resource name="RAM" quantum="1M"/>
<provides><service name="Input"/></provides>
<route>
<service name="CAP"> <parent/> </service>
<service name="IO_PORT"> <parent/> </service>
<service name="LOG"> <parent/> </service>
<service name="RM"> <parent/> </service>
<service name="SIGNAL"> <parent/> </service>
<service name="PCI"> <child name="pci_drv"/> </service>
</route>
</start>
<start name="test-input">
<resource name="RAM" quantum="1M"/>
<route>
<service name="LOG"> <parent/> </service>
<service name="RM"> <parent/> </service>
<service name="SIGNAL"> <parent/> </service>
<service name="Input"> <child name="ps2_drv"/> </service>
<service name="Timer"> <child name="timer"/> </service>
</route>
</start>
</config>}
install_config $config
#
# Boot modules
#
# generic modules
set boot_modules {
core init
timer
pci_drv
ps2_drv
test-input
}
# platform-specific modules
build_boot_image $boot_modules
append qemu_args " -m 256 "
run_genode_until forever

View File

@ -26,7 +26,7 @@ class Irq_handler
{
private:
Genode::Irq_connection _irq;
Genode::Irq_session_client _irq;
Genode::Signal_rpc_member<Irq_handler> _dispatcher;
Input_driver &_input_driver;
@ -40,17 +40,16 @@ class Irq_handler
public:
Irq_handler(Server::Entrypoint &ep,
int irq_number, Input_driver &input_driver)
Irq_handler(Server::Entrypoint &ep, Input_driver &input_driver,
Genode::Irq_session_capability irq_cap)
:
_irq(irq_number),
_irq(irq_cap),
_dispatcher(ep, *this, &Irq_handler::_handle),
_input_driver(input_driver)
{
_irq.sigh(_dispatcher);
_irq.ack_irq();
}
};
#endif /* _IRQ_HANDLER_H_ */

View File

@ -11,14 +11,16 @@
* under the terms of the GNU General Public License version 2.
*/
/* Genode includes */
/* base includes */
#include <base/env.h>
#include <base/printf.h>
#include <base/sleep.h>
/* os includes */
#include <input/component.h>
#include <input/root.h>
#include <cap_session/connection.h>
#include <os/server.h>
#include <pci_session/connection.h>
/* local includes */
#include "i8042.h"
@ -40,16 +42,20 @@ struct Main
Ps2_mouse ps2_mouse;
Ps2_keyboard ps2_keybd;
Irq_handler ps2_mouse_irq;
Pci::Connection platform;
Pci::Device_client device_ps2;
Irq_handler ps2_keybd_irq;
Irq_handler ps2_mouse_irq;
Main(Server::Entrypoint &ep)
: ep(ep), root(ep.rpc_ep(), session),
ps2_mouse(*i8042.aux_interface(), session.event_queue()),
ps2_keybd(*i8042.kbd_interface(), session.event_queue(),
i8042.kbd_xlate()),
ps2_mouse_irq(ep, 12, ps2_mouse),
ps2_keybd_irq(ep, 1, ps2_keybd)
device_ps2(platform.device("PS2")),
ps2_keybd_irq(ep, ps2_keybd, device_ps2.irq(0)),
ps2_mouse_irq(ep, ps2_mouse, device_ps2.irq(1))
{
env()->parent()->announce(ep.manage(root));
}