136 lines
2.8 KiB
C++
136 lines
2.8 KiB
C++
|
/*
|
||
|
* \brief USB driver main program
|
||
|
* \author Norman Feske
|
||
|
* \author Sebastian Sumpf <sebastian.sumpf@genode-labs.com>
|
||
|
* \date 2012-01-29
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Copyright (C) 2012 Genode Labs GmbH
|
||
|
*
|
||
|
* This file is part of the Genode OS framework, which is distributed
|
||
|
* under the terms of the GNU General Public License version 2.
|
||
|
*/
|
||
|
|
||
|
|
||
|
/* Genode */
|
||
|
#include <base/rpc_server.h>
|
||
|
#include <base/printf.h>
|
||
|
#include <base/sleep.h>
|
||
|
#include <cap_session/connection.h>
|
||
|
#include <os/config.h>
|
||
|
#include <util/xml_node.h>
|
||
|
|
||
|
/* Local */
|
||
|
#include "storage/component.h"
|
||
|
#include "routine.h"
|
||
|
#include "signal.h"
|
||
|
|
||
|
extern "C" {
|
||
|
#include <dde_kit/timer.h>
|
||
|
}
|
||
|
|
||
|
using namespace Genode;
|
||
|
|
||
|
extern "C" void subsys_usb_init();
|
||
|
extern "C" void subsys_input_init();
|
||
|
extern "C" void module_ehci_hcd_init();
|
||
|
extern "C" void module_evdev_init();
|
||
|
extern "C" void module_hid_init();
|
||
|
extern "C" void module_hid_init_core();
|
||
|
extern "C" void module_uhci_hcd_init();
|
||
|
extern "C" void module_usb_mouse_init();
|
||
|
extern "C" void module_usb_kbd_init();
|
||
|
extern "C" void module_usb_stor_init();
|
||
|
|
||
|
extern "C" void start_input_service(void *ep);
|
||
|
|
||
|
Routine *Routine::_current = 0;
|
||
|
Routine *Routine::_dead = 0;
|
||
|
bool Routine::_all = false;
|
||
|
|
||
|
void breakpoint() { PDBG("BREAK"); }
|
||
|
|
||
|
|
||
|
static void init(bool hid, bool stor)
|
||
|
{
|
||
|
/* start jiffies */
|
||
|
dde_kit_timer_init(0, 0);
|
||
|
|
||
|
/* USB */
|
||
|
subsys_usb_init();
|
||
|
|
||
|
/* input + HID */
|
||
|
if (hid) {
|
||
|
subsys_input_init();
|
||
|
module_evdev_init();
|
||
|
|
||
|
/* HID */
|
||
|
module_hid_init();
|
||
|
module_usb_mouse_init();
|
||
|
module_usb_kbd_init();
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Host controller.
|
||
|
*
|
||
|
* ehci_hcd should always be loaded before uhci_hcd and ohci_hcd, not after
|
||
|
*/
|
||
|
module_ehci_hcd_init();
|
||
|
module_uhci_hcd_init();
|
||
|
|
||
|
/* storage */
|
||
|
if (stor)
|
||
|
module_usb_stor_init();
|
||
|
}
|
||
|
|
||
|
|
||
|
int main(int, char **)
|
||
|
{
|
||
|
/*
|
||
|
* Initialize server entry point
|
||
|
*/
|
||
|
enum { STACK_SIZE = 4096 };
|
||
|
static Cap_connection cap;
|
||
|
static Rpc_entrypoint ep_hid(&cap, STACK_SIZE, "usb_hid_ep");
|
||
|
static Signal_receiver recv;
|
||
|
|
||
|
bool hid = false;
|
||
|
bool stor = false;
|
||
|
|
||
|
try {
|
||
|
config()->xml_node().sub_node("hid");
|
||
|
start_input_service(&ep_hid);
|
||
|
hid = true;
|
||
|
} catch (Config::Invalid) {
|
||
|
PDBG("No <config> node found - not starting any USB services");
|
||
|
return 0;
|
||
|
} catch (Xml_node::Nonexistent_sub_node) {
|
||
|
PDBG("No <hid> config node found - not starting the USB HID (Input) service");
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
config()->xml_node().sub_node("storage");
|
||
|
stor = true;
|
||
|
} catch (Xml_node::Nonexistent_sub_node) {
|
||
|
PDBG("No <storage> config node found - not starting the USB Storage (Block) service");
|
||
|
}
|
||
|
|
||
|
Timer::init(&recv);
|
||
|
Irq::init(&recv);
|
||
|
Event::init(&recv);
|
||
|
Service_handler::s()->receiver(&recv);
|
||
|
Storage::init(&recv);
|
||
|
|
||
|
Routine::add(0, 0, "Main", true);
|
||
|
Routine::current_use_first();
|
||
|
init(hid, stor);
|
||
|
|
||
|
Routine::remove();
|
||
|
|
||
|
/* will never be reached */
|
||
|
sleep_forever();
|
||
|
|
||
|
return 0;
|
||
|
}
|