Date:2010-05-05 01:09:32 (13 years 7 months ago)
Author:Bas Wijnen
Commit:a4b5d94200105352d02298e552bee04c1a377a47
Message:removed old device handling

Files: boot-programs/bootinit.ccp (5 diffs)
boot-programs/udc.ccp (7 diffs)
devices.hhp (5 diffs)
init.config (2 diffs)
invoke.ccp (1 diff)
mips/nanonote/Makefile.arch (1 diff)
source/buzzer.ccp (2 diffs)
source/display-emu.ccp (1 diff)
source/elfrun.ccp (1 diff)
source/lcd.ccp (4 diffs)
source/nanonote-gpio.ccp (2 diffs)

Change Details

boot-programs/bootinit.ccp
5858void *operator new (unsigned size):
5959    return new char[size]
6060
61static bool have_data_mem, have_fs_mem
62static Iris::Memory data_mem, fs_mem
63
6461// Get the initial block device and filesystem.
6562static Iris::Directory receive_devices ():
66    Iris::Caps data, fs
63    Iris::String data
64    Iris::Filesystem fs
6765    bool have_data = false, have_fs = false
68    Iris::Device fs_dev, data_dev
6966    for unsigned i = 0; i < 2; ++i:
7067        Iris::wait ()
7168        if Iris::recv.data[0].l != Iris::Parent::PROVIDE_DEVICE:
...... 
7471            case Iris::String::ID:
7572                if have_data:
7673                    Iris::panic (0, "duplicate device.")
77                data_dev = Iris::get_arg ()
74                data = Iris::get_arg ()
7875                Iris::recv.reply.invoke ()
7976                have_data = true
8077                break
8178            case Iris::Filesystem::ID:
8279                if have_fs:
8380                    Iris::panic (0, "duplicate filesystem.")
84                fs_dev = Iris::get_arg ()
81                fs = Iris::get_arg ()
8582                Iris::recv.reply.invoke ()
8683                have_fs = true
8784                break
8885            default:
8986                Iris::panic (Iris::recv.data[1].l, "unexpected device")
9087    // Initialize the root file system.
91    data = data_dev.create_user (Iris::my_memory)
92    data_dev.use (data)
93    fs = fs_dev.create_user (Iris::my_memory)
94    fs_dev.use (fs)
95    Iris::Filesystem fs_cap = fs.get (0)
96    Iris::Directory root = fs_cap.use_device_ro (data.copy ())
97    have_data_mem = data_dev.call (0).l
98    if have_data_mem:
99        data_mem = Iris::get_arg ()
100    have_fs_mem = fs_dev.call (0).l
101    if have_fs_mem:
102        fs_mem = Iris::get_arg ()
88    Iris::Directory root = fs.use_device_ro (data.copy ())
10389    Iris::free_cap (data)
10490    Iris::free_cap (fs)
105    Iris::free_cap (fs_cap)
106    Iris::free_cap (data_dev)
107    Iris::free_cap (fs_dev)
10891    return root
10992
11093static bool stringcmp (char const *s1, char const *s2, unsigned size):
...... 
283266    if Iris::recv.data[0].l != Iris::Parent::PROVIDE_DEVICE || Iris::recv.data[1].l != Iris::Elfrun::ID:
284267        Iris::panic (0, "elfrun doesn't provide correct capability")
285268    Iris::Cap reply = Iris::get_reply ()
286    Iris::Device elfrun_dev = Iris::get_arg ()
269    Iris::Elfrun elfrun = Iris::get_arg ()
287270    Iris::my_caps.set (parent_cap.idx (), Iris::Cap (CAP_NONE))
288271    Iris::free_cap (parent_cap)
289272    reply.invoke ()
290273    Iris::free_cap (reply)
291274
292275    parent_cap = Iris::my_receiver.create_capability (0)
293    Iris::Caps elfrun = elfrun_dev.create_user (Iris::my_memory)
294    elfrun_dev.use (elfrun)
295    Iris::Elfrun elfrun_cap = elfrun.get (0)
296    Iris::free_cap (elfrun)
297276    Iris::String init_string = find (root, INIT_NAME)
298    Iris::Caps init_caps = elfrun_cap.run_string (top_memory.copy (), init_string.copy (), parent_cap.copy (), 8, 63)
277    Iris::Caps init_caps = elfrun.run_string (top_memory.copy (), init_string.copy (), parent_cap.copy (), 8, 63)
299278
300279    Iris::Thread init = init_caps.get (__thread_num)
301280    init.make_priv ()
...... 
319298                    case Iris::Elfrun::ID:
320299                        if have_elfrun:
321300                            Iris::panic (0, "Init requests elfrun twice")
322                        Iris::recv.reply.invoke (0, 0, elfrun_cap.copy ())
301                        Iris::recv.reply.invoke (0, 0, elfrun.copy ())
323302                        have_elfrun = true
324303                        break
325304                    default:
...... 
332311                // Special response: kill boot threads.
333312                Iris::Cap reply = Iris::get_reply ()
334313                root.unlock_ro ()
335                if have_data_mem:
336                    top_memory.destroy (data_mem)
337                if have_fs_mem:
338                    top_memory.destroy (fs_mem)
339314                reply.invoke ()
340315                Iris::free_cap (reply)
341316                top_memory.destroy (Iris::my_memory)
boot-programs/udc.ccp
571571    __asm__ volatile ("li $a0, 1\nlw $a1, %0\nbreak" :: "m"(logcap.code): "a0", "a1", "memory")
572572    udc.init ()
573573    Iris::register_interrupt (IRQ_UDC)
574    Iris::Device fs_dev = Iris::my_receiver.create_capability (FS)
575    Iris::Device data_dev = Iris::my_receiver.create_capability (DATA)
576    Iris::my_parent.provide_device <Iris::Filesystem> (fs_dev.copy ())
577    Iris::my_parent.provide_device <Iris::String> (data_dev.copy ())
578    Iris::free_cap (fs_dev)
579    Iris::free_cap (data_dev)
580    unsigned data_current_user = 0, fs_current_user = 0
581    unsigned next_user
574    Iris::Filesystem fs = Iris::my_receiver.create_capability (FS)
575    Iris::String data = Iris::my_receiver.create_capability (DATA)
576    Iris::my_parent.provide_device <Iris::Filesystem> (fs.copy ())
577    Iris::my_parent.provide_device <Iris::String> (data.copy ())
578    Iris::free_cap (fs)
579    Iris::free_cap (data)
582580    unsigned state = 0
583581    while true:
584582        Iris::wait ()
585583        Iris::Cap reply = Iris::get_reply ()
586584        Iris::Cap arg = Iris::get_arg ()
587        switch Iris::recv.protected_data.h:
588            case 0:
589                switch Iris::recv.protected_data.l:
590                    case IRQ_UDC:
591                        udc.interrupt (state)
592                        Iris::register_interrupt (IRQ_UDC)
593                        break
594                    case LOG:
595                        udc.log (Iris::recv.data[0].l)
596                        break
597                    case FS:
598                        Iris::Device::host (FS, fs_current_user, reply, arg)
599                        continue
600                    case DATA:
601                        Iris::Device::host (DATA, data_current_user, reply, arg)
602                        continue
603                    default:
604                        udc.log ('~')
605                        char digit[] = "0123456789abcdef"
606                        for unsigned i = 0; i < 8; ++i:
607                            udc.log (digit[(Iris::recv.protected_data.l >> (4 * (7 - i))) & 0xf])
608                        udc.log ('\n')
609                        break
585        switch Iris::recv.protected_data.l:
586            case IRQ_UDC:
587                udc.interrupt (state)
588                Iris::register_interrupt (IRQ_UDC)
589                break
590            case LOG:
591                udc.log (Iris::recv.data[0].l)
610592                break
611593            case DATA:
612                if data_current_user != Iris::recv.protected_data.l:
613                    break
594                //kdebug ("data request\n")
614595                switch Iris::recv.data[0].l:
596                    case Iris::Device::RESET:
615597                    case Iris::String::GET_SIZE:
616598                    case Iris::String::GET_CHARS:
617599                        reply.invoke (0)
...... 
626608                        continue
627609                break
628610            case FS:
629                if fs_current_user != Iris::recv.protected_data.l:
630                    break
611                //kdebug ("fs request\n")
631612                switch Iris::recv.data[0].l:
613                    case Iris::Device::RESET:
614                        reply.invoke (0)
615                        Iris::free_cap (reply)
616                        Iris::free_cap (arg)
617                        continue
632618                    case Iris::Filesystem::USE_DEVICE:
633619                    case Iris::Filesystem::USE_DEVICE_RO:
634                        Iris::Directory dir = Iris::my_receiver.create_capability (Iris::Num (0, DIRECTORY))
620                        Iris::Directory dir = Iris::my_receiver.create_capability (DIRECTORY)
635621                        reply.invoke (0, 0, dir.copy ())
636622                        Iris::free_cap (dir)
637623                        Iris::free_cap (reply)
...... 
644630                        continue
645631                break
646632            case DIRECTORY:
633                //kdebug ("dir request\n")
647634                switch Iris::recv.data[0].l:
648635                    case Iris::Directory::GET_NAME:
649                        Iris::Cap name = Iris::my_receiver.create_capability (Iris::Num (Iris::recv.data[1].l, NAME))
636                        Iris::Cap name = Iris::my_receiver.create_capability (Iris::Num (NAME, Iris::recv.data[1].l))
650637                        reply.invoke (0, 0, name.copy ())
651638                        Iris::free_cap (name)
652639                        Iris::free_cap (reply)
...... 
666653                            kdebug ("index out of supported range\n")
667654                            Iris::panic (0)
668655                        //kdebug ("sending file\n")
669                        Iris::Cap file = Iris::my_receiver.create_capability (Iris::Num (Iris::recv.data[1].l, FILE))
656                        Iris::Cap file = Iris::my_receiver.create_capability (Iris::Num (FILE, Iris::recv.data[1].l))
670657                        reply.invoke (0, 0, file.copy ())
671658                        Iris::free_cap (file)
672659                        Iris::free_cap (reply)
...... 
680667                        continue
681668                break
682669            case FILE:
670                //kdebug ("file request\n")
683671                switch Iris::recv.data[0].l:
684672                    case Iris::String::GET_SIZE:
685673                    case Iris::String::GET_CHARS:
686674                    case Iris::String::GET_PAGE:
687                        udc.send (Iris::recv.data[0].l | ((Iris::recv.data[1].l >> PAGE_BITS) << 16), Iris::recv.protected_data.l, reply, arg)
675                        udc.send (Iris::recv.data[0].l | ((Iris::recv.data[1].l >> PAGE_BITS) << 16), Iris::recv.protected_data.h, reply, arg)
688676                        continue
689677                    default:
690678                        reply.invoke (Iris::ERR_INVALID_OPERATION)
...... 
693681                        continue
694682                break
695683            case NAME:
684                //kdebug ("name request\n")
696685                switch Iris::recv.data[0].l:
697686                    case Iris::String::GET_SIZE:
698687                        reply.invoke (16)
...... 
701690                        continue
702691                    case Iris::String::GET_CHARS:
703692                        state = Iris::recv.data[0].l
704                        udc.send (Iris::Directory::GET_NAME, Iris::recv.protected_data.l, reply, arg)
693                        udc.send (Iris::Directory::GET_NAME, Iris::recv.protected_data.h, reply, arg)
705694                        continue
706695                    default:
707696                        reply.invoke (Iris::ERR_INVALID_OPERATION)
708697                        Iris::free_cap (reply)
709698                        Iris::free_cap (arg)
710699                        continue
700            default:
701                kdebug ("other request:")
702                kdebug_num (Iris::recv.protected_data.l)
703                kdebug ("\n")
704                udc.log ('~')
705                char digit[] = "0123456789abcdef"
706                for unsigned i = 0; i < 8; ++i:
707                    udc.log (digit[(Iris::recv.protected_data.l >> (4 * (7 - i))) & 0xf])
708                udc.log ('\n')
709                break
711710        reply.invoke ()
712711        Iris::free_cap (reply)
713712        Iris::free_cap (arg)
devices.hhp
8585    struct Device : public Iris::Cap:
8686        Device (Iris::Cap c = Iris::Cap ()) : Iris::Cap (c):
8787        enum request:
88            CREATE_USER = WString::ID
89            DESTROY_USER
90            UNUSE
91            USE
88            RESET = WString::ID
9289            ID
93        // Create a new user for this device. It will not be the active user.
94        // The provided storage must allow object creation; no other actions may be used by the terminal.
95        Iris::Cap create_user (Iris::Memory storage, unsigned arg1 = 0, Iris::Num arg2 = 0):
96            iocall (storage, Iris::Num (CAP_MASTER_DIRECT | CREATE_USER, arg1), arg2)
97            return Iris::get_arg ()
98        // Destroy a user. It is made inactive if it was active.
99        void destroy_user (Iris::Cap user):
100            ocall (user, CAP_MASTER_DIRECT | DESTROY_USER)
101        // Make user inactive.
102        void unuse (Iris::Cap user):
103            ocall (user, CAP_MASTER_DIRECT | UNUSE)
104        // Make user active. It makes the previous active user inactive.
105        void use (Iris::Cap user):
106            ocall (user, CAP_MASTER_DIRECT | USE)
107        // Convenience function for threads implementing a device.
108        static void host (unsigned id, unsigned &current_user, Iris::Cap &reply, Iris::Cap &arg, unsigned capssize = 3, unsigned (*create)(Iris::Memory mem, Iris::Caps caps) = NULL, void (*destroy)(unsigned id, Iris::Caps caps) = NULL, void (*use)(unsigned id, Iris::Caps caps) = NULL, void (*unuse)(unsigned id, Iris::Caps caps) = NULL):
109            static unsigned last_user
110            switch Iris::recv.data[0].l:
111                case Device::CREATE_USER:
112                    Iris::Memory mem (arg)
113                    Iris::Caps caps = mem.create_caps (capssize)
114                    unsigned user
115                    if create:
116                        user = create (mem, caps)
117                    else:
118                        // Increment last_user; skip 0.
119                        // FIXME: if this really wraps, it is possible that two users share their id.
120                        if !++last_user:
121                            ++last_user
122                        user = last_user
123                    Iris::Cap c = Iris::my_receiver.create_capability (Iris::Num (user, id))
124                    caps.set (0, c.copy ())
125                    caps.set (1, mem.copy ())
126                    reply.invoke (0, 0, caps.copy ())
127                    Iris::free_cap (c)
128                    Iris::free_cap (caps)
129                    Iris::free_cap (reply)
130                    Iris::free_cap (arg)
131                    break
132                case Device::DESTROY_USER:
133                    Iris::Caps caps (arg)
134                    Iris::Cap c = caps.get (0)
135                    Iris::Num user = Iris::my_receiver.get_protected (c)
136                    Iris::free_cap (c)
137                    if user.h != id:
138                        Iris::panic (user.h, "invalid id for destroy")
139                    // TODO: unuse.
140                    if destroy:
141                        destroy (user.l, caps)
142                    reply.invoke ()
143                    Iris::free_cap (reply)
144                    Iris::free_cap (arg)
145                    break
146                case Device::USE:
147                    Iris::Caps caps (arg)
148                    Iris::Cap c = caps.get (0)
149                    Iris::Num user = Iris::my_receiver.get_protected (c)
150                    Iris::free_cap (c)
151                    if user.h != id:
152                        Iris::panic (user.h, "invalid id for use")
153                    // TODO: send unuse signal.
154                    current_user = user.l
155                    if use:
156                        use (user.l, caps)
157                    c = caps.get (2)
158                    c.invoke (1)
159                    Iris::free_cap (c)
160                    reply.invoke ()
161                    Iris::free_cap (reply)
162                    Iris::free_cap (arg)
163                    break
164                case Device::UNUSE:
165                    Iris::Caps caps (arg)
166                    Iris::Cap c = caps.get (0)
167                    Iris::Num user = Iris::my_receiver.get_protected (c)
168                    Iris::free_cap (c)
169                    if user.h != id:
170                        Iris::panic (user.h, "invalid id for unuse")
171                    if unuse:
172                        unuse (user.l, caps)
173                    if user.l == current_user:
174                        c = caps.get (2)
175                        c.invoke (0)
176                        Iris::free_cap (c)
177                        current_user = 0
178                    reply.invoke ()
179                    Iris::free_cap (reply)
180                    Iris::free_cap (arg)
181                    break
182                default:
183                    kdebug ("invalid request\n")
184                    reply.invoke (~0)
185                    Iris::free_cap (reply)
186                    Iris::free_cap (arg)
187                    break
90        // Reset the device. This is called by the terminal while switching owners.
91        void reset ():
92            call (CAP_MASTER_DIRECT | RESET)
18893
18994    struct Elfrun : public Iris::Cap:
19095        Elfrun (Iris::Cap c = Iris::Cap ()) : Iris::Cap (c):
...... 
255160            call (CAP_MASTER_DIRECT | EXIT, code)
256161
257162    // Keyboard interface.
258    struct Keyboard : public Iris::Cap:
259        Keyboard (Iris::Cap c = Iris::Cap ()) : Iris::Cap (c):
163    struct Keyboard : public Device:
164        Keyboard (Iris::Cap c = Iris::Cap ()) : Iris::Device (c):
260165        enum request:
261166            SET_CB = Parent::ID
262167            GET_NUM_KEYS
...... 
276181            call (CAP_MASTER_DIRECT | GET_KEYS, first)
277182
278183    // Buzzer interface.
279    struct Buzzer : public Iris::Cap:
280        Buzzer (Iris::Cap c = Iris::Cap ()) : Iris::Cap (c):
184    struct Buzzer : public Device:
185        Buzzer (Iris::Cap c = Iris::Cap ()) : Iris::Device (c):
281186        enum request:
282187            BEEP = Keyboard::ID
283188            STOP
...... 
290195            call (CAP_MASTER_DIRECT | STOP)
291196
292197    // Display interface.
293    struct Display : public Iris::Cap:
294        Display (Iris::Cap c = Iris::Cap ()) : Iris::Cap (c):
198    struct Display : public Device:
199        Display (Iris::Cap c = Iris::Cap ()) : Iris::Device (c):
295200        enum request:
296201            SET_EOF_CB = Buzzer::ID
297202            MAP_FB
...... 
310215            Iris::panic (0, "using undefined interface Display::get_info ()")
311216
312217    // Numerical setting, such as a display backlight.
313    struct Setting : public Iris::Cap:
314        Setting (Iris::Cap c = Iris::Cap ()) : Iris::Cap (c):
218    struct Setting : public Iris::Device:
219        Setting (Iris::Cap c = Iris::Cap ()) : Iris::Device (c):
315220        enum request:
316221            SET = Display::ID
317222            GET_RANGE
init.config
22    load driver_lcd = "lcd.elf"
33    #load driver_buzzer = "buzzer.elf"
44    #load driver_gpio = "gpio.elf"
5    #load ball = "ball.elf"
5    load ball = "ball.elf"
66
77    # killbootthreads destroy bootinit, bootfs and bootstore.
88    killbootthreads
...... 
2626    sysreq sysreq
2727
2828    # give <name> / <type> [, <index>] = <cap> give this capability to this program when it requests it.
29    #give ball / Display = display
29    give ball / Display = display
3030
3131    # run <name> run a previously loaded program (normally).
32    #run ball
32    run ball
3333
3434    # include <name> include a loaded file as another config file.
invoke.ccp
296296                        reply_cap (CAPTYPE_THREAD | CAP_MASTER, (unsigned)ret, &ret->refs)
297297                        kdebug ("(created thread ")
298298                        kdebug_num ((unsigned)ret)
299                        kdebug (")")
299                        kdebug (")\n")
300300                    else:
301301                        dpanic (0x23311992, "out of memory creating thread")
302302                        reply_num (Iris::ERR_OUT_OF_MEMORY)
mips/nanonote/Makefile.arch
2929boot_sources = mips/init.cc mips/nanonote/board.cc
3030arch_headers = mips/arch.hh mips/nanonote/jz4740.hh mips/nanonote/board.hh devices.hh
3131boot_threads = bootinit udc
32programs = init gpio lcd display-emu bsquare ball buzzer metronome elfrun
32programs = init gpio lcd bsquare ball buzzer metronome elfrun
3333
3434all: test
3535
source/buzzer.ccp
5757
5858    DevBuzzer buzzer
5959
60    Iris::Device dev = Iris::my_receiver.create_capability (BUZZER)
60    Iris::Buzzer dev = Iris::my_receiver.create_capability (BUZZER)
6161    Iris::my_parent.provide_device <Iris::Buzzer> (dev.copy ())
6262    Iris::free_cap (dev)
6363    Iris::my_parent.init_done ()
64    unsigned user (~0)
65    unsigned next_user (0)
6664    while true:
6765        Iris::wait ()
68        switch Iris::recv.protected_data.h:
69            case ~0:
70                // Alarm.
71                buzzer.stop ()
72                break
73            case 0:
74                switch Iris::recv.protected_data.l:
75                    case BUZZER:
76                        // Buzzer device control request.
77                        Iris::Cap reply = Iris::get_reply ()
78                        Iris::Cap arg = Iris::get_arg ()
79                        Iris::Device::host (BUZZER, user, reply, arg)
80                        break
81                    default:
82                        kdebug ("invalid buzzer request\n")
83                        break
84                break
66        if Iris::recv.protected_data.h == ~0:
67            // Alarm.
68            buzzer.stop ()
69            break
70        switch Iris::recv.protected_data.l:
8571            case BUZZER:
8672                // Buzzer device user request.
87                if Iris::recv.protected_data.l != user:
88                    kdebug ("invalid user requesting buzzer\n")
89                    Iris::recv.reply.invoke ()
90                    break
9173                switch Iris::recv.data[0].l:
74                    case Iris::Device::RESET:
75                        buzzer.stop ()
76                        Iris::recv.reply.invoke ()
77                        break
9278                    case Iris::Buzzer::BEEP:
9379                        // Volume is not used by this buzzer.
9480                        Iris::Cap arg = Iris::get_arg ()
...... 
10793                break
10894            default:
10995                kdebug ("Buzzer: unknown num: ")
110                kdebug_num (Iris::recv.protected_data.h)
96                kdebug_num (Iris::recv.protected_data.l)
11197                kdebug ("\n")
source/display-emu.ccp
1#pypp 0
2// Iris: micro-kernel for a capability-based operating system.
3// source/display-emu.ccp: Display interface emulation layer.
4// Copyright 2009 Bas Wijnen <wijnen@debian.org>
5//
6// This program is free software: you can redistribute it and/or modify
7// it under the terms of the GNU General Public License as published by
8// the Free Software Foundation, either version 3 of the License, or
9// (at your option) any later version.
10//
11// This program is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15//
16// You should have received a copy of the GNU General Public License
17// along with this program. If not, see <http://www.gnu.org/licenses/>.
18
19#include <devices.hh>
20#include <iris.hh>
21
22Iris::Num start ():
23    Iris::Device d = Iris::my_receiver.create_capability (0)
24    Iris::my_parent.provide_device <Iris::Display> (d.copy (), 0x10000)
25    Iris::free_cap (d)
26    Iris::my_parent.init_done ()
27    Iris::Display real = Iris::my_parent.get_device <Iris::Display> (0)
28    while true:
29        Iris::wait ()
30        Iris::Cap arg = Iris::get_arg ()
31        Iris::Cap reply = Iris::get_reply ()
32        switch Iris::recv.protected_data.h:
33            case 0:
34                switch Iris::recv.data[0].l:
35                    case Iris::Device::CREATE_USER:
36                        Iris::Memory mem (arg)
37                        Iris::Caps ret = mem.create_caps (3)
38                        Iris::Cap target = Iris::my_receiver.create_capability (Iris::Num (0, 1))
39                        ret.set (0, target.copy ())
40                        ret.set (1, mem)
41                        Iris::free_cap (target)
42                        for unsigned i = 0; i < 320 * 240 * 4; i += PAGE_SIZE:
43                            Iris::Page p = Iris::my_memory.mapping ((void *)(0x15000 + i))
44                            Iris::Page t = mem.create_page ()
45                            t.set_flags (Iris::Page::PAYING, Iris::Page::PAYING)
46                            p.share (t, Iris::Page::FORGET)
47                            mem.map (t, 0x15000 + i)
48                            Iris::my_memory.destroy (t)
49                            Iris::free_cap (t)
50                            Iris::free_cap (p)
51                        reply.invoke (0, 0, ret.copy ())
52                        Iris::free_cap (ret)
53                        break
54                    case Iris::Device::DESTROY_USER:
55                        Iris::panic (0, "destroying emulation user")
56                    case Iris::Device::USE:
57                    case Iris::Device::UNUSE:
58                        reply.invoke ()
59                        break
60                    default:
61                        kdebug_num (Iris::recv.data[0].l)
62                        kdebug ("\n")
63                        Iris::panic (0, "invalid emulation command")
64                break
65            case 1:
66                switch Iris::recv.data[0].l:
67                    case Iris::Display::SET_EOF_CB:
68                        real.set_eof_cb (arg.copy ())
69                        while Iris::recv.data[0].l != 0:
70                            Iris::my_parent.wait <Iris::Display> (0)
71                            real.set_eof_cb (arg.copy ())
72                        reply.invoke ()
73                        break
74                    default:
75                        kdebug_num (Iris::recv.data[0].l)
76                        kdebug_char ('\n')
77                        Iris::panic (Iris::recv.data[0].l, "invalid operation on display emulation")
78                break
79            default:
80                Iris::panic (0, "bug in display emulation")
81        Iris::free_cap (arg)
82        Iris::free_cap (reply)
source/elfrun.ccp
234234Iris::Num start ():
235235    kdebug ("elfrun started.\n")
236236    init_alloc ()
237    Iris::Device dev = Iris::my_receiver.create_capability (0)
237    Iris::Elfrun dev = Iris::my_receiver.create_capability (0)
238238    Iris::my_parent.provide_device <Iris::Elfrun> (dev.copy ())
239    Iris::free_cap (dev)
239240
240    unsigned user = ~0
241241    while true:
242242        Iris::wait ()
243243        Iris::Cap reply = Iris::get_reply ()
244244        Iris::Cap arg = Iris::get_arg ()
245        Iris::print_caps ()
246        switch Iris::recv.protected_data.h:
247            case 0:
248                Iris::Device::host (1, user, reply, arg)
245        switch Iris::recv.data[0].l:
246            case Iris::Elfrun::RUN_STRING:
247                unsigned num_slots = Iris::recv.data[1].l
248                unsigned num_caps = Iris::recv.data[1].h
249                parent_memory = Iris::Caps (arg).get (Iris::Elfrun::PARENT_MEMORY)
250                parent = Iris::Caps (arg).get (Iris::Elfrun::PARENT)
251                Iris::String data = Iris::Caps (arg).get (Iris::Elfrun::DATA)
252                map_string (data)
253                Iris::Caps ret = run (data, parent_memory, parent, num_slots, num_caps)
254                reply.invoke (0, 0, ret.copy ())
255                free_cap (ret)
256                free_cap (parent_memory)
257                free_cap (parent)
258                free_cap (data)
249259                break
250            case 1:
251                switch Iris::recv.data[0].l:
252                    case Iris::Elfrun::RUN_STRING:
253                        unsigned num_slots = Iris::recv.data[1].l
254                        unsigned num_caps = Iris::recv.data[1].h
255                        parent_memory = Iris::Caps (arg).get (Iris::Elfrun::PARENT_MEMORY)
256                        parent = Iris::Caps (arg).get (Iris::Elfrun::PARENT)
257                        Iris::String data = Iris::Caps (arg).get (Iris::Elfrun::DATA)
258                        map_string (data)
259                        Iris::Caps ret = run (data, parent_memory, parent, num_slots, num_caps)
260                        reply.invoke (0, 0, ret.copy ())
261                        free_cap (ret)
262                        free_cap (parent_memory)
263                        free_cap (parent)
264                        free_cap (data)
265                        break
266                    case Iris::Elfrun::RUN_CAPS:
267                        unsigned num_slots = Iris::recv.data[1].l
268                        unsigned num_caps = Iris::recv.data[1].h
269                        unsigned p = Iris::recv.data[0].h
270                        parent_memory = Iris::Caps (arg).get (Iris::Elfrun::PARENT_MEMORY)
271                        parent = Iris::Caps (arg).get (Iris::Elfrun::PARENT)
272                        Iris::Caps data = Iris::Caps (arg).get (Iris::Elfrun::DATA)
273                        map_caps (data, p)
274                        Iris::Caps ret = run (data, parent_memory, parent, num_slots, num_caps)
275                        reply.invoke (0, 0, ret.copy ())
276                        free_cap (ret)
277                        free_cap (parent_memory)
278                        free_cap (parent)
279                        free_cap (data)
280                        break
281                    default:
282                        Iris::panic (0, "invalid operation for elfrun")
283                        reply.invoke (~0)
284                        break
285                Iris::free_cap (arg)
286                Iris::free_cap (reply)
260            case Iris::Elfrun::RUN_CAPS:
261                unsigned num_slots = Iris::recv.data[1].l
262                unsigned num_caps = Iris::recv.data[1].h
263                unsigned p = Iris::recv.data[0].h
264                parent_memory = Iris::Caps (arg).get (Iris::Elfrun::PARENT_MEMORY)
265                parent = Iris::Caps (arg).get (Iris::Elfrun::PARENT)
266                Iris::Caps data = Iris::Caps (arg).get (Iris::Elfrun::DATA)
267                map_caps (data, p)
268                Iris::Caps ret = run (data, parent_memory, parent, num_slots, num_caps)
269                reply.invoke (0, 0, ret.copy ())
270                free_cap (ret)
271                free_cap (parent_memory)
272                free_cap (parent)
273                free_cap (data)
274                break
275            default:
276                Iris::panic (0, "invalid operation for elfrun")
277                reply.invoke (~0)
278                break
279        Iris::free_cap (arg)
280        Iris::free_cap (reply)
source/lcd.ccp
369369    Iris::free_cap (backlight)
370370
371371    // Register the display device.
372    Iris::Cap display = Iris::my_receiver.create_capability (LCD)
372    Iris::Display display = Iris::my_receiver.create_capability (LCD)
373373    Iris::my_parent.provide_device <Iris::Display> (display.copy ())
374374    Iris::free_cap (display)
375375    Iris::my_parent.init_done ()
...... 
377377    Iris::Cap eof_cb
378378    bool have_eof = false
379379    is_on = true
380    unsigned lcd_user = 0
381    unsigned current_backlight = 0
382380    while true:
383381        Iris::wait ()
384382        //log_msg ()
385        switch Iris::recv.protected_data.h:
386            case 0:
387                switch Iris::recv.protected_data.l:
388                    case IRQ_LCD:
389                        have_eof = false
390                        eof_cb.invoke ()
391                        Iris::free_cap (eof_cb)
392                        break
393                    #if defined (TRENDTAC)
394                    case LOG:
395                        log_char (Iris::recv.data[0].l)
396                        break
397                    #endif
398                    case BACKLIGHT:
399                        Iris::Cap reply = Iris::get_reply ()
400                        Iris::Cap arg = Iris::get_arg ()
401                        Iris::Device::host (BACKLIGHT, current_backlight, reply, arg)
402                        break
403                    case LCD:
404                        Iris::Cap reply = Iris::get_reply ()
405                        Iris::Cap arg = Iris::get_arg ()
406                        Iris::Device::host (LCD, lcd_user, reply, arg, 3, create, destroy, use, unuse)
407                        break
408                    default:
409                        Iris::panic (Iris::recv.protected_data.l, "invalid operation for master lcd")
410                        break
383        switch Iris::recv.protected_data.l:
384            case IRQ_LCD:
385                have_eof = false
386                eof_cb.invoke ()
387                Iris::free_cap (eof_cb)
388                break
389            #if defined (TRENDTAC)
390            case LOG:
391                log_char (Iris::recv.data[0].l)
411392                break
393            #endif
412394            case BACKLIGHT:
413                if current_backlight != Iris::recv.protected_data.l:
414                    log_char ('&')
415                    log_num (current_backlight)
416                    log_num (Iris::recv.protected_data)
417                    log_char ('\n')
418                    break
419395                switch Iris::recv.data[0].l:
396                    case Iris::Device::RESET:
397                        Iris::recv.reply.invoke ()
398                        break
420399                    case Iris::Setting::SET:
421400                        // TODO
422401                        unsigned state = Iris::recv.data[1].l
...... 
444423                        break
445424                break
446425            case LCD:
447                if descriptor.frame != Iris::recv.protected_data.l:
448                    //Iris::panic (0, "invalid user requesting lcd")
449                    Iris::recv.reply.invoke (~0)
450                    break
451426                switch Iris::recv.data[0].l:
427                    case Iris::Device::RESET:
428                        Iris::recv.reply.invoke ()
429                        break
452430                    case Iris::Display::SET_EOF_CB:
453431                        Iris::Cap reply = Iris::get_reply ()
454432                        Iris::Cap arg = Iris::get_arg ()
...... 
469447                        Iris::panic (Iris::recv.data[0].l, "invalid operation for lcd")
470448                break
471449            default:
472                Iris::panic (0, "invalid master operation type for lcd")
450                Iris::panic (0, "invalid operation type for lcd")
473451                break
source/nanonote-gpio.ccp
211211    Iris::my_parent.init_done ()
212212    if kbd.scanning ():
213213        Iris::my_receiver.set_alarm (SCAN_INTERVAL)
214    unsigned user (0), power_user (0)
215    unsigned next_user (0)
216214    Iris::register_interrupt (IRQ_GPIO3)
217215    while true:
218216        Iris::wait ()
219        switch Iris::recv.protected_data.h:
220            case ~0:
221                // Alarm.
217        if Iris::recv.protected_data.h == ~0:
218            // Alarm.
219            kbd.scan ()
220            if kbd.scanning ():
221                Iris::my_receiver.set_alarm (SCAN_INTERVAL)
222            continue
223        switch Iris::recv.protected_data.l:
224            case IRQ_GPIO3:
225                // Interrupt.
226                pwr.scan ()
222227                kbd.scan ()
223228                if kbd.scanning ():
224229                    Iris::my_receiver.set_alarm (SCAN_INTERVAL)
225                break
226            case 0:
227                switch Iris::recv.protected_data.l:
228                    case IRQ_GPIO3:
229                        // Interrupt.
230                        pwr.scan ()
231                        kbd.scan ()
232                        if kbd.scanning ():
233                            Iris::my_receiver.set_alarm (SCAN_INTERVAL)
234                        Iris::register_interrupt (IRQ_GPIO3)
235                        break
236                    case PWR:
237                        // Power button request.
238                        Iris::Cap reply = Iris::get_reply ()
239                        Iris::Cap arg = Iris::get_arg ()
240                        Iris::Device::host (PWR, power_user, reply, arg)
241                        break
242                    case KBD_DEV:
243                        // Keyboard device control request.
244                        Iris::Cap reply = Iris::get_reply ()
245                        Iris::Cap arg = Iris::get_arg ()
246                        Iris::Device::host (KBD_DEV, user, reply, arg)
247                        break
248                    default:
249                        break
230                Iris::register_interrupt (IRQ_GPIO3)
250231                break
251232            case KBD_DEV:
252233                // Keyboard device user request.
253                if Iris::recv.protected_data.l != user:
254                    kdebug ("invalid user requesting keyboard\n")
255                    Iris::recv.reply.invoke ()
256                    break
257234                switch Iris::recv.data[0].l:
235                    case Iris::Device::RESET:
236                        Iris::recv.reply.invoke ()
237                        break
258238                    case Iris::Keyboard::SET_CB:
259239                        Iris::Cap reply = Iris::get_reply ()
260240                        kbd.active (Iris::get_arg ())
...... 
272252                        break
273253                break
274254            case PWR:
275                if Iris::recv.protected_data.l != power_user:
276                    kdebug ("invalid user requesting power\n")
277                    Iris::recv.reply.invoke ()
278                    break
279255                switch Iris::recv.data[0].l:
256                    case Iris::Device::RESET:
257                        Iris::recv.reply.invoke ()
258                        break
280259                    case Iris::Keyboard::SET_CB:
281260                        Iris::Cap reply = Iris::get_reply ()
282261                        pwr.set_cb (Iris::get_arg ())

Archive Download the corresponding diff file

Branches:
master



interactive