mirror of
git://projects.qi-hardware.com/iris.git
synced 2025-04-21 12:27:27 +03:00
work on device swapping
This commit is contained in:
@@ -178,7 +178,7 @@ static void reset ():
|
||||
// Reset the controller.
|
||||
write_reg (BACKLIGHT1, 0x1e)
|
||||
// Enable display.
|
||||
write_reg (BACKLIGHT1, 0x5f)
|
||||
write_reg (BACKLIGHT1, 0x5e)
|
||||
// Set data to rgbrgbrgb input, with a delta color filter.
|
||||
write_reg (COLOR, 0x01)
|
||||
#endif
|
||||
@@ -361,16 +361,12 @@ Kernel::Num start ():
|
||||
Kernel::free_cap (reply)
|
||||
Kernel::free_cap (arg)
|
||||
break
|
||||
Kernel::Caps caps = mem.create_caps (4)
|
||||
caps.set (1, mem.copy ())
|
||||
unsigned slot = caps.use ()
|
||||
unsigned physical = mem.alloc_range (pages)
|
||||
if physical & ~PAGE_MASK:
|
||||
kdebug ("can't allocate framebuffer\n")
|
||||
Kernel::panic (0)
|
||||
assert (physical & PAGE_MASK && ~physical)
|
||||
Kernel::set_recv_arg (Kernel::Cap (slot, 0))
|
||||
Kernel::my_receiver.create_capability (Kernel::Num (physical, LCD))
|
||||
Kernel::Cap ret = Kernel::my_receiver.create_capability (Kernel::Num (physical, LCD))
|
||||
for unsigned i = 0; i < pages; ++i:
|
||||
Kernel::Page p = mem.create_page ()
|
||||
p.alloc_physical (physical + (i << PAGE_BITS), false, true)
|
||||
@@ -378,13 +374,13 @@ Kernel::Num start ():
|
||||
//Kernel::panic (0xdeaddead)
|
||||
mem.map (p, address + (i << PAGE_BITS))
|
||||
Kernel::free_cap (p)
|
||||
Kernel::free_slot (slot)
|
||||
reply.invoke (0, 0, caps.copy ())
|
||||
Kernel::free_cap (caps)
|
||||
reply.invoke (0, 0, ret.copy ())
|
||||
Kernel::free_cap (ret)
|
||||
break
|
||||
case Device::DESTROY_USER:
|
||||
unsigned slot = Kernel::Caps (arg).use ()
|
||||
unsigned physical = Kernel::my_receiver.get_protected (Kernel::Cap (slot, 0)).l
|
||||
//Kernel::Memory mem (arg)
|
||||
unsigned address = Kernel::recv.data[1].l & PAGE_MASK
|
||||
unsigned physical = Kernel::my_receiver.get_protected (arg).l
|
||||
if physical == ~0:
|
||||
kdebug ("unable to destroy framebuffer with wrong cap0\n")
|
||||
Kernel::panic (0)
|
||||
@@ -394,22 +390,18 @@ Kernel::Num start ():
|
||||
#ifdef NANONOTE
|
||||
write_reg (BACKLIGHT1, 0x5e)
|
||||
#endif
|
||||
Kernel::Memory mem = Kernel::Cap (slot, 1)
|
||||
for unsigned i = 0; i < pages; ++i:
|
||||
mem.destroy (Kernel::Cap (slot, 2 + i))
|
||||
mem.destroy (arg)
|
||||
Kernel::free_slot (slot)
|
||||
//for unsigned i = 0; i < pages; ++i:
|
||||
//if address != ~0:
|
||||
//Kernel::Page p = mem.mapping ((void *)(address + (i << PAGE_BITS)))
|
||||
//mem.destroy (p)
|
||||
//Kernel::free_cap (p)
|
||||
reply.invoke ()
|
||||
break
|
||||
case Device::USE:
|
||||
Kernel::Cap first = Kernel::Caps (arg).get (0)
|
||||
unsigned physical = Kernel::my_receiver.get_protected (first).l
|
||||
unsigned physical = Kernel::my_receiver.get_protected (arg).l
|
||||
if physical == ~0:
|
||||
kdebug ("unable to use framebuffer with wrong cap0\n")
|
||||
Kernel::panic (0)
|
||||
break
|
||||
Kernel::free_cap (first)
|
||||
bool was_unused = descriptor.frame == ~0
|
||||
Kernel::panic (0, "unable to use framebuffer with wrong cap0")
|
||||
bool was_unused = descriptor.frame == 0
|
||||
descriptor.frame = physical
|
||||
unsigned dptr = (unsigned)&descriptor
|
||||
__asm__ volatile ("lw $a0, %0\ncache 0x15, 0($a0)" :: "m"(dptr) : "memory", "a0")
|
||||
@@ -421,18 +413,15 @@ Kernel::Num start ():
|
||||
reply.invoke ()
|
||||
break
|
||||
case Device::UNUSE:
|
||||
Kernel::Cap first = Kernel::Caps (arg).get (0)
|
||||
unsigned physical = Kernel::my_receiver.get_protected (first).l
|
||||
unsigned physical = Kernel::my_receiver.get_protected (arg).l
|
||||
if physical == ~0:
|
||||
kdebug ("unable to unuse framebuffer with wrong cap0\n")
|
||||
Kernel::panic (0)
|
||||
break
|
||||
Kernel::free_cap (first)
|
||||
Kernel::panic (0, "unable to unuse framebuffer with wrong cap0")
|
||||
if descriptor.frame == physical:
|
||||
lcd_clr_ena ()
|
||||
#ifdef NANONOTE
|
||||
write_reg (BACKLIGHT1, 0x5e)
|
||||
#endif
|
||||
descriptor.frame = 0
|
||||
reply.invoke ()
|
||||
break
|
||||
default:
|
||||
@@ -480,8 +469,8 @@ Kernel::Num start ():
|
||||
break
|
||||
case LCD:
|
||||
if descriptor.frame != Kernel::recv.protected_data.l:
|
||||
kdebug ("invalid user requesting lcd\n")
|
||||
Kernel::panic (0)
|
||||
//Kernel::panic (0, "invalid user requesting lcd")
|
||||
Kernel::recv.reply.invoke (~0)
|
||||
break
|
||||
switch Kernel::recv.data[0].l:
|
||||
case Display::SET_EOF_CB:
|
||||
@@ -489,8 +478,7 @@ Kernel::Num start ():
|
||||
Kernel::Cap arg = Kernel::get_arg ()
|
||||
if have_eof:
|
||||
Kernel::free_cap (eof_cb)
|
||||
kdebug ("replacing eof_cb\n")
|
||||
Kernel::panic (0)
|
||||
Kernel::panic (0, "replacing eof_cb")
|
||||
else:
|
||||
lcd_clr_eof ()
|
||||
Kernel::register_interrupt (IRQ_LCD)
|
||||
@@ -500,10 +488,9 @@ Kernel::Num start ():
|
||||
Kernel::free_cap (reply)
|
||||
break
|
||||
case Display::GET_INFO:
|
||||
kdebug ("get_info isn't defined yet.\n")
|
||||
Kernel::panic (0)
|
||||
Kernel::panic (0, "get_info isn't defined yet.")
|
||||
default:
|
||||
Kernel::panic (0, "invalid operation for lcd")
|
||||
Kernel::panic (Kernel::recv.data[0].l, "invalid operation for lcd")
|
||||
break
|
||||
default:
|
||||
Kernel::panic (0, "invalid master operation type for lcd")
|
||||
|
||||
@@ -4,10 +4,9 @@
|
||||
|
||||
static unsigned *framebuffer
|
||||
static int const r = 10
|
||||
static int colour
|
||||
|
||||
void ball (int x, int y, bool print):
|
||||
static unsigned bg
|
||||
static unsigned count
|
||||
for int ty = y - r; ty < y + r; ++ty:
|
||||
if ty < 0 || ty >= 240:
|
||||
continue
|
||||
@@ -16,16 +15,13 @@ void ball (int x, int y, bool print):
|
||||
continue
|
||||
if (x - tx) * (x - tx) + (y - ty) * (y - ty) > r * r:
|
||||
continue
|
||||
framebuffer[ty * 320 + tx] = (print ? 0xffffff : bg)
|
||||
if ++count >= 30:
|
||||
bg += 0x010307
|
||||
count = 0
|
||||
framebuffer[ty * 320 + tx] = (print ? colour : 0)
|
||||
|
||||
Kernel::Num start ():
|
||||
Kernel::my_parent.init_done ()
|
||||
colour = 0xffffff
|
||||
framebuffer = (unsigned *)0x15000
|
||||
Kernel::Caps caps = Kernel::my_parent.get_device <Display> ()
|
||||
Display display = caps.get (0)
|
||||
Display display = Kernel::my_parent.get_device <Display> (0x10000)
|
||||
int x = r, y = r, dx = 3, dy = 0
|
||||
Kernel::Cap eof = Kernel::my_receiver.create_capability (0)
|
||||
while true:
|
||||
|
||||
@@ -871,7 +871,6 @@ import sys
|
||||
|
||||
charsize = 25 * 4 + 1
|
||||
for c in range (128 - 32):
|
||||
line = []
|
||||
for l in range (8):
|
||||
offset = 2 + c * charsize + 25 * (l >> 1) + 12 * (l & 1)
|
||||
ln = ""
|
||||
|
||||
61
source/display-emu.ccp
Normal file
61
source/display-emu.ccp
Normal file
@@ -0,0 +1,61 @@
|
||||
#pypp 0
|
||||
#include <devices.hh>
|
||||
#include <iris.hh>
|
||||
|
||||
Kernel::Num start ():
|
||||
Device d = Kernel::my_receiver.create_capability (0)
|
||||
Kernel::my_parent.provide_device <Display> (d.copy (), 0x10000)
|
||||
Kernel::free_cap (d)
|
||||
Kernel::my_parent.init_done ()
|
||||
Display real = Kernel::my_parent.get_device <Display> (0)
|
||||
while true:
|
||||
Kernel::wait ()
|
||||
Kernel::Cap arg = Kernel::get_arg ()
|
||||
Kernel::Cap reply = Kernel::get_reply ()
|
||||
switch Kernel::recv.protected_data.h:
|
||||
case 0:
|
||||
switch Kernel::recv.data[0].l:
|
||||
case Device::CREATE_USER:
|
||||
Kernel::Memory mem (arg)
|
||||
Kernel::Cap target = Kernel::my_receiver.create_capability (Kernel::Num (0, 1))
|
||||
for unsigned i = 0; i < 320 * 240 * 4; i += PAGE_SIZE:
|
||||
Kernel::Page p = Kernel::my_memory.mapping ((void *)(0x15000 + i))
|
||||
Kernel::Page t = mem.create_page ()
|
||||
t.set_flags (Kernel::Page::PAYING, Kernel::Page::PAYING)
|
||||
p.share (t, Kernel::Page::FORGET)
|
||||
mem.map (t, 0x15000 + i)
|
||||
Kernel::my_memory.destroy (t)
|
||||
Kernel::free_cap (t)
|
||||
Kernel::free_cap (p)
|
||||
reply.invoke (0, 0, target)
|
||||
Kernel::free_cap (target)
|
||||
break
|
||||
case Device::DESTROY_USER:
|
||||
Kernel::panic (0, "destroying emulation user")
|
||||
case Device::USE:
|
||||
case Device::UNUSE:
|
||||
reply.invoke ()
|
||||
break
|
||||
default:
|
||||
kdebug_num (Kernel::recv.data[0].l)
|
||||
kdebug ("\n")
|
||||
Kernel::panic (0, "invalid emulation command")
|
||||
break
|
||||
case 1:
|
||||
switch Kernel::recv.data[0].l:
|
||||
case Display::SET_EOF_CB:
|
||||
real.set_eof_cb (arg.copy ())
|
||||
while Kernel::recv.data[0].l != 0:
|
||||
Kernel::my_parent.wait <Display> (0)
|
||||
real.set_eof_cb (arg.copy ())
|
||||
reply.invoke ()
|
||||
break
|
||||
default:
|
||||
kdebug_num (Kernel::recv.data[0].l)
|
||||
kdebug_char ('\n')
|
||||
Kernel::panic (Kernel::recv.data[0].l, "invalid operation on display emulation")
|
||||
break
|
||||
default:
|
||||
Kernel::panic (0, "bug in display emulation")
|
||||
Kernel::free_cap (arg)
|
||||
Kernel::free_cap (reply)
|
||||
Reference in New Issue
Block a user