mirror of
git://projects.qi-hardware.com/iris.git
synced 2025-04-21 12:27:27 +03:00
working device swapping
This commit is contained in:
@@ -85,8 +85,7 @@ static unsigned *inuse
|
||||
|
||||
// Get the initial block device and filesystem.
|
||||
static Directory receive_devices ():
|
||||
String data
|
||||
Filesystem fs
|
||||
Kernel::Caps data, fs
|
||||
bool have_data = false, have_fs = false
|
||||
Device fs_dev, data_dev
|
||||
for unsigned i = 0; i < 2; ++i:
|
||||
@@ -115,9 +114,11 @@ static Directory receive_devices ():
|
||||
data_dev.use (data)
|
||||
fs = fs_dev.create_user (Kernel::my_memory)
|
||||
fs_dev.use (fs)
|
||||
Directory root = fs.use_device_ro (data.copy ())
|
||||
Filesystem fs_cap = fs.get (0)
|
||||
Directory root = fs_cap.use_device_ro (data.copy ())
|
||||
Kernel::free_cap (data)
|
||||
Kernel::free_cap (fs)
|
||||
Kernel::free_cap (fs_cap)
|
||||
Kernel::free_cap (data_dev)
|
||||
Kernel::free_cap (fs_dev)
|
||||
return root
|
||||
@@ -371,7 +372,9 @@ static void handle_init (unsigned id):
|
||||
Kernel::free_cap (reply)
|
||||
break
|
||||
case Parent::INIT_DONE:
|
||||
memories.set (id + num_files, Kernel::get_reply ())
|
||||
Kernel::Cap reply = Kernel::get_reply ()
|
||||
memories.set (id + num_files, reply.copy ())
|
||||
Kernel::free_cap (reply)
|
||||
return
|
||||
default:
|
||||
kdebug ("unknown init request\n")
|
||||
@@ -393,14 +396,16 @@ static void get_device ():
|
||||
kdebug (" to ")
|
||||
kdebug_num (id)
|
||||
kdebug ("\n")
|
||||
Kernel::Cap cap = d->dev.create_user (Kernel::Memory (memory_slot, id), 0, 0x15000)
|
||||
Kernel::Caps cap = d->dev.create_user (Kernel::Memory (memory_slot, id), 0, 0x15000)
|
||||
Kernel::Caps (terminal_slot, id).set (d->id, cap.copy ())
|
||||
for unsigned i = 0; i < num_files; ++i:
|
||||
if inuse[i * Dev::num_devs + d->id] == 2:
|
||||
inuse[i * Dev::num_devs + d->id] = 1
|
||||
inuse[id * Dev::num_devs + d->id] = 2
|
||||
d->dev.use (cap)
|
||||
reply.invoke (0, 0, cap.copy ())
|
||||
Kernel::Cap ret = cap.get (0)
|
||||
reply.invoke (0, 0, ret.copy ())
|
||||
Kernel::free_cap (ret)
|
||||
Kernel::free_cap (cap)
|
||||
else:
|
||||
kdebug ("device not found: ")
|
||||
@@ -451,9 +456,11 @@ Kernel::Num start ():
|
||||
Kernel::set_recv_arg (term)
|
||||
mem.create_caps (Dev::num_devs)
|
||||
// set up system request.
|
||||
Keyboard sysreq = sysreq_dev.create_user (Kernel::my_memory)
|
||||
sysreq_dev.use (sysreq)
|
||||
Kernel::Caps sysreq_caps = sysreq_dev.create_user (Kernel::my_memory)
|
||||
sysreq_dev.use (sysreq_caps)
|
||||
Keyboard sysreq = sysreq_caps.get (0)
|
||||
Kernel::free_cap (sysreq_dev)
|
||||
Kernel::free_cap (sysreq_caps)
|
||||
Kernel::Cap cap = Kernel::my_receiver.create_capability (Kernel::Num (0, SYSREQ))
|
||||
sysreq.set_cb (cap.copy ())
|
||||
Kernel::free_cap (sysreq)
|
||||
@@ -462,11 +469,13 @@ Kernel::Num start ():
|
||||
Dev *display_dev = Dev::find (Display::ID, 0)
|
||||
if !display_dev:
|
||||
Kernel::panic (0, "no display")
|
||||
Display display = display_dev->dev.create_user (Kernel::my_memory, 0, 0x15000)
|
||||
Kernel::Caps display_caps = display_dev->dev.create_user (Kernel::my_memory, 0, 0x15000)
|
||||
Display display = display_caps.get (0)
|
||||
Dev *keyboard_dev = Dev::find (Keyboard::ID, 0)
|
||||
if !keyboard_dev:
|
||||
Kernel::panic (0, "no keyboard")
|
||||
Keyboard keyboard = keyboard_dev->dev.create_user (Kernel::my_memory, 0, 0x15000)
|
||||
Kernel::Caps keyboard_caps = keyboard_dev->dev.create_user (Kernel::my_memory, 0, 0x15000)
|
||||
Keyboard keyboard = keyboard_caps.get (0)
|
||||
kdebug ("init done\n")
|
||||
root.unlock_ro ()
|
||||
Kernel::free_slot (slot)
|
||||
@@ -481,8 +490,8 @@ Kernel::Num start ():
|
||||
// System request.
|
||||
if Kernel::recv.data[0].l & Keyboard::RELEASE:
|
||||
continue
|
||||
keyboard_dev->dev.use (keyboard)
|
||||
display_dev->dev.use (display)
|
||||
keyboard_dev->dev.use (keyboard_caps)
|
||||
display_dev->dev.use (display_caps)
|
||||
keyboard.set_cb (keyboard_cb)
|
||||
in_system = true
|
||||
continue
|
||||
@@ -540,15 +549,34 @@ Kernel::Num start ():
|
||||
break
|
||||
if Kernel::recv.data[0].l & Keyboard::RELEASE:
|
||||
continue
|
||||
unsigned const r = 50
|
||||
unsigned which = 0
|
||||
switch Kernel::recv.data[0].l:
|
||||
case Key::UP:
|
||||
case Key::DOWN:
|
||||
case Key::LEFT:
|
||||
case Key::RIGHT:
|
||||
case Key::VOLUME_UP:
|
||||
case Key::VOLUME_DOWN:
|
||||
kdebug ("key pressed.\n")
|
||||
// Set ball.
|
||||
for int y = -r; y < r; ++y:
|
||||
for int x = -r; x < r; ++x:
|
||||
if x * x + y * y > r * r:
|
||||
((unsigned *)0x15000)[(120 + y) * 320 + 160 + x] = 0x000000
|
||||
else:
|
||||
((unsigned *)0x15000)[(120 + y) * 320 + 160 + x] = 0xffffff
|
||||
which = 2
|
||||
break
|
||||
case Key::VOLUME_UP:
|
||||
// Set square.
|
||||
for int y = -r; y < r; ++y:
|
||||
for int x = -r; x < r; ++x:
|
||||
((unsigned *)0x15000)[(120 + y) * 320 + 160 + x] = 0xffffff
|
||||
which = 1
|
||||
break
|
||||
if which != 0:
|
||||
for Dev *d = Dev::devs; d; d = d->next:
|
||||
if d->code != Display::ID || d->idx != 0:
|
||||
continue
|
||||
for unsigned f = 0; f < num_files; ++f:
|
||||
if inuse[f * Dev::num_devs + d->id] == 0:
|
||||
continue
|
||||
inuse[f * Dev::num_devs + d->id] = (--which ? 2 : 1)
|
||||
break
|
||||
default:
|
||||
Kernel::panic (Kernel::recv.protected_data.h, "unknown source of request")
|
||||
|
||||
@@ -567,8 +567,8 @@ Kernel::Num start ():
|
||||
map_cpm ()
|
||||
Udc udc
|
||||
|
||||
//Kernel::Cap logcap = Kernel::my_receiver.create_capability (LOG)
|
||||
//__asm__ volatile ("li $a0, 1\nlw $a1, %0\nbreak" :: "m"(logcap.code): "a0", "a1", "memory")
|
||||
Kernel::Cap logcap = Kernel::my_receiver.create_capability (LOG)
|
||||
__asm__ volatile ("li $a0, 1\nlw $a1, %0\nbreak" :: "m"(logcap.code): "a0", "a1", "memory")
|
||||
udc.init ()
|
||||
Kernel::register_interrupt (IRQ_UDC)
|
||||
Device fs_dev = Kernel::my_receiver.create_capability (FS)
|
||||
|
||||
Reference in New Issue
Block a user