x86: support PIT via platform driver

Issue #1578
This commit is contained in:
Alexander Boettcher 2016-07-11 11:59:32 +02:00 committed by Christian Helmuth
parent ef7c51548d
commit 7b35927147

View File

@ -14,7 +14,7 @@
#include "irq.h" #include "irq.h"
namespace Nonpci { class Ps2; } namespace Nonpci { class Ps2; class Pit; }
class Nonpci::Ps2 : public Platform::Device_component class Nonpci::Ps2 : public Platform::Device_component
{ {
@ -82,6 +82,37 @@ class Nonpci::Ps2 : public Platform::Device_component
}; };
class Nonpci::Pit : public Platform::Device_component
{
private:
enum {
IRQ_PIT = 0,
PIT_PORT = 0x40,
PORTS_WIDTH = 4
};
Genode::Io_port_connection _ports;
public:
Pit(Genode::Rpc_entrypoint * ep, Platform::Session_component * session)
:
Platform::Device_component(ep, session, IRQ_PIT),
_ports(PIT_PORT, PORTS_WIDTH)
{ }
Genode::Io_port_session_capability io_port(Genode::uint8_t io_port) override
{
if (io_port == 0)
return _ports.cap();
return Genode::Io_port_session_capability();
}
};
/** /**
* Platform session component devices which are non PCI devices, e.g. PS2 * Platform session component devices which are non PCI devices, e.g. PS2
*/ */
@ -93,7 +124,7 @@ Platform::Device_capability Platform::Session_component::device(String const &na
using namespace Genode; using namespace Genode;
char const * device_name = name.string(); char const * device_name = name.string();
const char * devices [] = { "PS2" }; const char * devices [] = { "PS2", "PIT" };
unsigned devices_i = 0; unsigned devices_i = 0;
for (; devices_i < sizeof(devices) / sizeof(devices[0]); devices_i++) for (; devices_i < sizeof(devices) / sizeof(devices[0]); devices_i++)
@ -118,6 +149,9 @@ Platform::Device_capability Platform::Session_component::device(String const &na
case 0: case 0:
dev = new (_md_alloc) Nonpci::Ps2(_ep, this); dev = new (_md_alloc) Nonpci::Ps2(_ep, this);
break; break;
case 1:
dev = new (_md_alloc) Nonpci::Pit(_ep, this);
break;
default: default:
return Device_capability(); return Device_capability();
} }