svn repository for sources
play

SVN repository for sources Source code for the Lab is available via - PDF document

Faculty of Computer Science Institute for System Architecture, Operating Systems Group Keyboard Driver & Pong Client 2007 SVN repository for sources Source code for the Lab is available via SVN:


  1. Faculty of Computer Science Institute for System Architecture, Operating Systems Group Keyboard Driver & Pong Client 2007 SVN repository for sources Source code for the Lab is available via SVN: http://os.inf.tu-dresden.de/Studium/Praktikum/src/trunk/kpr2007 To check out the repository use: • svn co <URL> <target_dir> To get an update go to your working copy and use: • svn up TU Dresden Slide 2

  2. Course Goal Pong Server Paddle Client 1 Paddle Client 2 Keyboard Driver Memory Manager Loader File System Console Name Server RootServer Sigma0 Fiasco Kernel TU Dresden Slide 3 Keyboard Driver • Programs keyboard hardware • Provides interface for several clients: Paddle Client 1 Paddle Client 2 ‘n’, ‘m’ ‘y’, ‘x’ Keyboard Driver TU Dresden Slide 4

  3. Fiasco-UX Keyboard Driver • Fiasco-UX provides keyboard and mouse input through graphical console – Interrupt 1 to signal input event – Ring buffer with list of input events: typedef struct input_ev { long long time; /* event timestamp */ unsigned short type; /* type: 1 … key event * (includes mouse buttons) * 2 … mouse move */ unsigned short code; /* key: keycode * move: 0 … X direction * 1 … Y direction */ unsigned int value; /* key: 1 … button pressed * 0 … button released * move: distance */ } input_ev_t; TU Dresden Slide 5 Attach Keyboard Interrupt #include <l4/sys/ipc.h> #include <l4/rmgr/librmgr.h> l4_threadid_t irq_id; l4_msgdope_t result; l4_umword_t dummy; int ret; /* attach interrupt */ l4_make_taskid_from_irq(INPUT_IRQ_NUM, &irq_id); ret = l4_ipc_receive(irq_id, 0, &dummy, &dummy, L4_IPC_TIMEOUT(0,0,0,1,0,0), &result); if (ret != L4_IPC_RETIMEOUT) /* error … */ /* interrupt handler loop */ while(1) { /* send 0, 0 to IRQ to enable it wait for interrupt */ ret = l4_ipc_{call|replay_and_wait}(irq_id, L4_IPC_SHORT_MSG, 0, 0, L4_IPC_SHORT_MSG, &dummy, &dummy, L4_IPC_NEVER, &result); /* handle interrupt */ … } TU Dresden Slide 6

  4. Map Event Buffer • Event buffer is I/O memory #include <l4/base/rm.h> #include <l4/base/memory.h> #include <l4/base/name.h> #include <l4/base/info_page.h> #include <l4/base/exceptions.h> ... L4::Memory input; L4::Rm rm; void *input_buffer_addr; try { input = L4::Info_page::info_page()->root().resolve("dev/input"); rm = L4::Info_page::info_page()->region_mapper(); input_buffer_addr = rm.attach((void*)0x40000000, 1024*1024*4, L4::Rm::Search_addr, input, 0); } catch (L4::Base_exception const &e) { L4::cout << "Error looking up input device: " << e.str() << "\n"; return -1; } TU Dresden Slide 7 Use Event Buffer • If interrupt received, walk through event buffer  One interrupt can signal several input events input_ev_t * ev; int input_pos = 0; /* read input events */ while(1) { ev = (input_ev_t *)(input_buffer_addr + input_pos * sizeof(input_ev_t)); /* end of valid input events is marked with timestamp 0 */ if (ev->time == 0) break; if (ev->type == INPUT_EV_KEY) { /* got keyboard event */ … } /* mark event handled */ ev->time = 0; /* next event */ input_pos++; if (input_pos == INPUT_NUM_OBJS) input_pos = 0; } TU Dresden Slide 8

  5. Keyboard Driver – Assignment • Given: l4/libinput/input.h – provides input event structure, keycode  character mapping • Design keyboard driver – Interrupt handling – Event buffering – Should support several clients • Write C++ interface, server and client TU Dresden Slide 9 Pong Client • Uses keyboard driver to wait for key events • Attaches to Pong server to move paddles Pong Server Paddle moves Paddle Client 1 Paddle Client 2 Key events Keyboard Driver TU Dresden Slide 10

  6. Pong Server • Pong Server interface kpr/pong/example/main.cc: class Paddle – Modify class Paddle to fit your needs – Methods: • int connect() // connect to a paddle and // returns the ID • int lifes() // get the number of lifes left • void move(int pos) // move to possition // 0 <= pos <= 1023 • run() // must be implemented by you TU Dresden Slide 11 Pong Client – Assignments • Register Pong server at your name server l4/kpr/pong/server/dummies.h : void pong_names_register(l4_threadid_t id, char const * name) { /* fill in your name server functions */ } • Write Pong client which – uses keyboard driver to get input events, – implements paddle moves  sets paddle position, – initializes and periodically requests lifes TU Dresden Slide 12

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend