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:
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ():
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user