serial lpuart driver (reading characters and sending them to the shell)
[barrelfish] / usr / drivers / domain / main.c
1 /**
2  * \file
3  * \brief Driver domain example.
4  *
5  * Implements a simple driver domain. This domain does two things:
6  *
7  * (a) it prints all the driver modules found
8  *     There are a three things necessary for the driver module system to work:
9  *     - A custom ELF section in the driver domain called .bfdrivers where
10  *       all bfdriver structs are located.
11  *     - A linker script that defines the section and two symbols
12  *       `bfdrivers_start` and `bfdrivers_end` that mark the end and beginning
13  *       of the section.
14  *     - A special way to link the driver modules (using addModules) in hake,
15  *       which makes sure the symbols are included in the binary without explicitly
16  *       referencing them.
17  *     For more information on how works, check the driverkit.h file as well
18  *     along with modules.c in lib/driverkit.
19  *
20  * (b) it connects to the driver domain controller (Kaluga) and makes
21  *     sure it handles it's requests (defined in ddomain.if) to create,
22  *     destroy driver instances.
23  *     The corresponding code for (b) is found in the driverkit library
24  *     specifically in file ddomain_service.c
25  */
26 /*
27  * Copyright (c) 2016, ETH Zurich.
28  * All rights reserved.
29  *
30  * This file is distributed under the terms in the attached LICENSE file.
31  * If you do not find this file, copies can be found by writing to:
32  * ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group.
33  */
34
35 #include <stdlib.h>
36 #include <stdio.h>
37 #include <string.h>
38 #include <assert.h>
39
40 #include <barrelfish/barrelfish.h>
41 #include <driverkit/driverkit.h>
42 #include <barrelfish/nameservice_client.h>
43
44 /**
45  * Instantiate the driver domain.
46  *
47  * Connect to Kaluga and wait for eventual ddomain requests.
48  */
49 int main(int argc, char** argv)
50 {
51     if(argc<3){
52         USER_PANIC("Not enough arguments. argv[2] for ddomain communication!\n");
53     }
54
55     iref_t kaluga_iref = 0;
56     errval_t err = nameservice_blocking_lookup("ddomain_controller", &kaluga_iref);
57     assert(err_is_ok(err));
58     err = ddomain_communication_init(kaluga_iref, atoi(argv[2]));
59     assert(err_is_ok(err));
60
61 #ifdef __ARM_ARCH_8A__
62     while(1) {
63         err = event_dispatch_non_block(get_default_waitset());
64         if (err != LIB_ERR_NO_EVENT) {
65             if (err_is_fail(err)) {
66                 USER_PANIC_ERR(err, "error in event_dispatch for messages_wait_and_handle_next hack");
67             }
68         }
69     }
70 #else 
71     while(1) {
72         err = event_dispatch(get_default_waitset());
73         if (err_is_fail(err)) {
74             USER_PANIC_ERR(err, "error in event_dispatch for messages_wait_and_handle_next hack");
75         }
76     }
77 #endif
78
79     return 0;
80 }