#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" #include "init.hh" static Keyboard kbd, tp static Display lcd static Kernel::Cap lockleds, pwm // Event types. enum type: KBD = 0x10000 TP static void setup (): unsigned state = 0 Kernel::Caps my_caps = Kernel::my_memory.create_caps (4 + 1) unsigned my_slot = my_caps.use () unsigned slot = Kernel::alloc_slot () while true: Kernel::wait () Kernel::Cap reply = Kernel::get_reply () Kernel::Caps caps = Kernel::get_arg () switch Kernel::recv.data[0].value (): case Init::REGISTER_GPIO: caps.use (slot) for unsigned i = 0; i < 4; ++i: my_caps.set (i, Kernel::Cap (slot, i).copy ()) kbd = Kernel::Cap (my_slot, 0) tp = Kernel::Cap (my_slot, 1) lockleds = Kernel::Cap (my_slot, 2) pwm = Kernel::Cap (my_slot, 3) break case Init::REGISTER_LCD: caps.use (slot) my_caps.set (4, Kernel::Cap (slot, 0).copy ()) lcd = Kernel::Cap (my_slot, 4) break default: kdebug ("unknown setup request for init\n") continue reply.invoke () Kernel::free_cap (caps) Kernel::free_cap (reply) if ++state == 2: break Kernel::free_cap (my_caps) Kernel::free_slot (slot) Kernel::schedule () Kernel::Cap kc = Kernel::my_receiver.create_capability (KBD) kbd.set_cb (kc) Kernel::Cap tc = Kernel::my_receiver.create_capability (TP) tp.set_cb (tc) pwm.call (1) char const *decode_kbd = "0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*() T\n[],.-=/\\;|`'UDLREIKBPFZMS{}CA\":" Kernel::Num start (): // Set up lcd first Kernel::schedule () setup () while true: Kernel::wait () switch Kernel::recv.protected_data.value (): case KBD: unsigned code = Kernel::recv.data[0].l if code & Keyboard::RELEASE: break kdebug_char (decode_kbd[code]) if code == 0: Kernel::Caps ().print (~0) break case TP: unsigned leds = 0 if Kernel::recv.data[0].l & 1: leds |= 0x1 else: leds |= 0x4 if !(Kernel::recv.data[0].l & Keyboard::RELEASE): leds |= 0x2 lockleds.call (leds) break