#pypp 0 // Iris: micro-kernel for a capability-based operating system. // boot-programs/init.ccp: System boot manager. // Copyright 2009 Bas Wijnen // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "devices.hh" #include "iris.hh" static Keyboard kbd, tp static Display lcd static Cap lockleds, pwm // Event types. enum type: KBD = 0x10000 TP static void setup (): unsigned state = 0 unsigned slot = alloc_slot () while true: Cap::OMessage msg Kernel::wait (&msg, slot) switch msg.data[0].value (): case INIT_SET_GPIO: kdebug ("gpio\n") Caps caps = Cap (slot, 1) unsigned gpio_slot = caps.use () Cap (slot, 0).invoke () kbd = Cap (gpio_slot, 0) tp = Cap (gpio_slot, 1) lockleds = Cap (gpio_slot, 2) pwm = Cap (gpio_slot, 3) ++state break case INIT_SET_LCD: kdebug ("lcd\n") lcd = Cap (slot, 1).clone () Cap (slot, 0).invoke () ++state break if state == 2: break Caps caps = __my_memory.create_caps (2) Cap kc = __my_receiver.create_capability (KBD, Cap (slot, 0)) kdebug ("init0: ") caps.print (0) kbd.set_cb (kc) kdebug ("init1: ") caps.print (0) Cap tc = __my_receiver.create_capability (TP, Cap (slot, 1)) kdebug ("init2: ") caps.print (1) tp.set_cb (tc) kdebug ("init3: ") caps.print (1) pwm.call (1) free_slot (slot) char const *decode_kbd = "0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*() T\n[],.-=/\\;|`'UDLREIKBPFZMS{}CA\":" Num start (): // Set up lcd first Kernel::schedule () kdebug ("start init\n") setup () kdebug ("run init\n") while true: Cap::OMessage msg Kernel::wait (&msg) switch msg.cap_protected.value (): case KBD: unsigned code = msg.data[0].l if code & Keyboard::RELEASE: break kdebug_char (decode_kbd[code]) break case TP: unsigned leds = 0 if msg.data[0].l & 1: leds |= 0x1 else: leds |= 0x4 if !(msg.data[0].l & Keyboard::RELEASE): leds |= 0x2 lockleds.call (leds) break