1
0
mirror of git://projects.qi-hardware.com/iris.git synced 2025-04-21 12:27:27 +03:00

better interfaces

This commit is contained in:
Bas Wijnen
2009-09-06 23:34:50 +02:00
parent a838dd63c6
commit a2e13cbcda
8 changed files with 95 additions and 106 deletions

View File

@@ -21,12 +21,6 @@
#include "iris.hh"
// This shouldn't really be here. But where should it be?
// Requests made by initial threads to tell init about themselves.
enum init_requests:
INIT_SET_GPIO = 1
INIT_SET_LCD
// List interface.
template <typename _T> //
struct List : public Kernel::Cap:

View File

@@ -17,6 +17,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "devices.hh"
#include "init.hh"
#define ARCH
#include "arch.hh"
@@ -53,12 +54,6 @@ enum event_type:
TOUCHPAD_EVENT
NUM_EVENTS
enum cap_type:
CAP_KEYBOARD = 32
CAP_TOUCHPAD
CAP_LOCKLEDS
CAP_PWM
static Kernel::Cap events[NUM_EVENTS]
static void event (event_type type, unsigned data):
@@ -265,20 +260,7 @@ Kernel::Num start ():
Lockleds leds
Pwm pwm
Kernel::Caps c = Kernel::my_memory.create_caps (4)
unsigned init_slot = c.use ()
Kernel::set_recv_arg (Kernel::Cap (init_slot, 0))
Kernel::my_receiver.create_capability (CAP_KEYBOARD)
Kernel::set_recv_arg (Kernel::Cap (init_slot, 1))
Kernel::my_receiver.create_capability (CAP_TOUCHPAD)
Kernel::set_recv_arg (Kernel::Cap (init_slot, 2))
Kernel::my_receiver.create_capability (CAP_LOCKLEDS)
Kernel::set_recv_arg (Kernel::Cap (init_slot, 3))
Kernel::my_receiver.create_capability (CAP_PWM)
Kernel::my_parent.ocall (c, INIT_SET_GPIO)
free_cap (c)
Kernel::free_slot (init_slot)
((Init)Kernel::my_parent).register_gpio ()
if kbd.is_scanning ():
Kernel::my_receiver.set_alarm (ALARM_INTERVAL)
@@ -304,25 +286,23 @@ Kernel::Num start ():
// Reregister the interrupt.
Kernel::register_interrupt (IRQ_GPIO0)
break
case CAP_KEYBOARD:
kdebug ("gpio: keyboard callback registered.\n")
case Init::GPIO_KEYBOARD:
set_cb (KEYBOARD_EVENT)
Kernel::recv.reply.invoke ()
kbd.send_initial ()
event (KEYBOARD_EVENT, ~0)
break
case CAP_TOUCHPAD:
kdebug ("gpio: touchpad callback registered.\n")
case Init::GPIO_TOUCHPAD:
set_cb (TOUCHPAD_EVENT)
Kernel::recv.reply.invoke ()
tp.send_initial ()
event (TOUCHPAD_EVENT, ~0)
break
case CAP_LOCKLEDS:
case Init::GPIO_LOCKLEDS:
leds.set (Kernel::recv.data[0].l)
Kernel::recv.reply.invoke ()
break
case CAP_PWM:
case Init::GPIO_PWM:
pwm.set_backlight (Kernel::recv.data[0].l)
Kernel::recv.reply.invoke ()
break

View File

@@ -18,6 +18,7 @@
#include "devices.hh"
#include "iris.hh"
#include "init.hh"
static Keyboard kbd, tp
static Display lcd
@@ -30,33 +31,39 @@ enum type:
static void setup ():
unsigned state = 0
Kernel::recv.arg = Kernel::alloc_cap ()
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_SET_GPIO:
kdebug ("gpio\n")
Kernel::Caps caps = Kernel::get_arg ()
Kernel::Cap reply = Kernel::get_reply ()
unsigned gpio_slot = caps.use ()
kbd = Kernel::Cap (gpio_slot, 0)
tp = Kernel::Cap (gpio_slot, 1)
lockleds = Kernel::Cap (gpio_slot, 2)
pwm = Kernel::Cap (gpio_slot, 3)
reply.invoke ()
Kernel::free_cap (reply)
++state
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_SET_LCD:
kdebug ("lcd\n")
lcd = Kernel::get_arg ()
Kernel::recv.reply.invoke ()
++state
case Init::REGISTER_LCD:
caps.use (slot)
my_caps.set (4, Kernel::Cap (slot, 0).copy ())
lcd = Kernel::Cap (my_slot, 4)
break
if state == 2:
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 ()
kdebug ("init registering keyboard\n")
Kernel::Cap kc = Kernel::my_receiver.create_capability (KBD)
kbd.set_cb (kc)
Kernel::Cap tc = Kernel::my_receiver.create_capability (TP)
@@ -68,9 +75,7 @@ char const *decode_kbd = "0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*() T\n[],.
Kernel::Num start ():
// Set up lcd first
Kernel::schedule ()
kdebug ("start init\n")
setup ()
kdebug ("run init\n")
while true:
Kernel::wait ()
switch Kernel::recv.protected_data.value ():

View File

@@ -17,6 +17,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "devices.hh"
#include "init.hh"
#define ARCH
#include "arch.hh"
@@ -26,10 +27,6 @@ extern unsigned char const charset[127-32][6]
#define assert(x) do { while (!(x)) kdebug ("assertion failed " #x); } while (0)
enum types:
LCD_EOF_CB = 32
LCD_LOG
// For now, support only 16 bpp.
// Screen is 800x480 tft.
static unsigned h = 800, v = 480, hs = 80, vs = 20, fps = 60, Bpp = 2
@@ -161,11 +158,10 @@ Kernel::Num start ():
__asm__ volatile ("lw $a0, %0\ncache 0x15, 0($a0)" :: "m"(dptr) : "memory", "a0")
reset ()
Kernel::Cap logcap = Kernel::my_receiver.create_capability (LCD_LOG)
Kernel::Cap logcap = Kernel::my_receiver.create_capability (Init::LCD_LOG)
__asm__ volatile ("li $a0, 1\nlw $a1, %0\nbreak" :: "m"(logcap.code): "a0", "a1", "memory")
Kernel::Cap set_eof_cb = Kernel::my_receiver.create_capability (LCD_EOF_CB)
Kernel::my_parent.ocall (set_eof_cb, INIT_SET_LCD)
((Init)Kernel::my_parent).register_lcd ()
unsigned slot = Kernel::alloc_slot ()
Kernel::Cap eof_cb = Kernel::alloc_cap ()
@@ -177,14 +173,14 @@ Kernel::Num start ():
lcd_clr_eof ()
eof_cb.invoke ()
break
case LCD_EOF_CB:
case Init::LCD_SET_EOF_CB:
Kernel::free_cap (eof_cb)
eof_cb = Kernel::recv.arg
Kernel::recv.arg = Kernel::alloc_cap ()
Kernel::recv.reply.invoke ()
Kernel::register_interrupt (IRQ_LCD)
break
case LCD_LOG:
case Init::LCD_LOG:
log_char (Kernel::recv.data[0].l)
break
default: