int main(int argc, char **argv) { #if USE_IRQ uint8_t status; #else bool first; #endif command(0xa8); // enable aux. PS2 command(0xf6); // load default config command(0xf4); // enable mouse command(0xf3); // set sample rate: outb(0x60, 10); // 10 samples per second #if USE_IRQ wait_signal(); outb(0x64, 0x20); status = inb(0x60); status &= ~0x20; // enable mouse clock status |= 0x02; // enable IRQ12 wait_signal(); outb(0x64, 0x60); wait_signal(); outb(0x60, status); wait_signal(); #endif rdi_init(); mouse = rdi_file_cons(robject_new_index(), ACCS_READ | ACCS_EVENT); #if USE_IRQ rdi_set_irq(12, mouse_irq); #endif fs_plink("/dev/mouse", RP_CONS(getpid(), mouse->index), NULL); msendb(RP_CONS(getppid(), 0), ACTION_CHILD); #if USE_IRQ _done(); #else while (1) { first = true; while ((inb(0x64) & 0x21) != 0x21) { if (first) { send_event_delta(dx, dy); send_event_button(buttons); dx = dy = 0; } first = false; sleep(); } read_byte(); } #endif return 0; }
struct robject *pipe_file_cons(rp_t source, int argc, char **argv) { struct robject *new_r; struct pipe *pipe; new_r = rdi_file_cons(robject_new_index(), ACCS_READ | ACCS_WRITE); pipe = pipe_new(); robject_set_data(new_r, "pipe", pipe); return new_r; }
int main(int argc, char **argv) { struct robject *canvas; char *modesstr0; char *modestr; int i; rdi_init(); canvas = rdi_file_cons(robject_new_index(), ACCS_READ | ACCS_WRITE | ACCS_EVENT); robject_set_data(canvas, "type", (void*) "canvas share"); svga_init(); // generate list of modes modesstr = strdup(""); for (i = 0; i < modelist_count; i++) { modesstr0 = modesstr; modestr = malloc(16); sprintf(modestr, "%d:%d:%d ", modelist[i].w, modelist[i].h, modelist[i].d); modesstr = strvcat(modesstr, modestr, NULL); free(modesstr0); } svga_set_mode(svga_find_mode(640, 480, 24)); buffer = malloc(svga.w * svga.h * 4); /* set up driver interface */ robject_set_call(canvas, "getmode", svga_rcall_getmode, STAT_READER); robject_set_call(canvas, "listmodes", svga_rcall_listmodes, STAT_READER); robject_set_call(canvas, "unshare", svga_rcall_unshare, STAT_WRITER); robject_set_call(canvas, "setmode", svga_rcall_setmode, STAT_WRITER); robject_set_call(canvas, "syncrect", svga_rcall_syncrect, STAT_WRITER); robject_set_call(canvas, "sync", svga_rcall_sync, STAT_WRITER); rdi_global_share_hook = svga_share; /* register the driver as /dev/svga0 */ fs_plink("/dev/svga0", RP_CONS(getpid(), canvas->index), NULL); msendb(RP_CONS(getppid(), 0), PORT_CHILD); _done(); return 0; }
int main(int argc, char **argv) { struct robject *root; rdi_init(); // create root directory root = rdi_dir_cons(robject_new_index(), ACCS_READ | ACCS_WRITE); // set interface functions robject_set_call(rdi_class_file, "reset", tmpfs_reset, AC_WRITE); rdi_global_read_hook = tmpfs_read; rdi_global_write_hook = tmpfs_write; rdi_global_cons_file_hook = tmpfs_file_cons; rdi_global_cons_dir_hook = tmpfs_dir_cons; rdi_global_cons_link_hook = tmpfs_link_cons; // daemonize msendb(RP_CONS(getppid(), 0), ACTION_CHILD); _done(); return 0; }
struct robject *tarfs_link_cons(rp_t source, int argc, char **argv) { return rdi_link_cons(robject_new_index(), ACCS_READ | ACCS_WRITE, NULL); }
int main(int argc, char **argv) { struct tar_block *block; struct robject *root; struct robject *file; size_t i, n; off_t *poff, *size; /* reject if no parent is speicified */ if (argc < 2) { fprintf(stderr, "%s: no parent driver specified\n", argv[0]); abort(); } else { /* get parent driver stream */ parent = fopen(argv[1], "r"); if (!parent) { /* parent does not exist - fail */ fprintf(stderr, "%s: no parent driver %s\n", argv[0], argv[1]); abort(); } } rdi_init(); /* create root directory */ root = rdi_dir_cons(robject_new_index(), ACCS_READ | ACCS_WRITE); /* allocate buffer space for header block */ block = malloc(512); for (i = 0, n = 1;; n++) { /* read in file header block */ fseek(parent, i, SEEK_SET); fread(block, 1, 512, parent); /* break if it's a terminating block */ if (block->filename[0] == '\0' || block->filename[0] == ' ') { break; } if (block->filename[strlen(block->filename) - 1] == '/') { /* add directory to VFS */ block->filename[strlen(block->filename) - 1] = 0; file = rdi_dir_cons(robject_new_index(), ACCS_READ | ACCS_WRITE); rdi_vfs_add(root, block->filename, file); /* move to next file header */ i += 512; } else { /* add file to VFS */ file = rdi_file_cons(robject_new_index(), ACCS_READ); rdi_vfs_add(root, block->filename, file); poff = malloc(sizeof(off_t)); size = malloc(sizeof(off_t)); *poff = i + 512; *size = getvalue(block->filesize, 12); robject_set_data(file, "size", size); robject_set_data(file, "parent-offset", poff); /* move to next file header */ i += ((*size / 512) + 1) * 512; if (*size % 512) i += 512; } } free(block); /* set up interface */ rdi_global_read_hook = tarfs_read; rdi_global_cons_link_hook = tarfs_link_cons; /* daemonize */ msendb(RP_CONS(getppid(), 0), ACTION_CHILD); _done(); return EXIT_SUCCESS; }
struct robject *tmpfs_dir_cons(rp_t source, int argc, char **argv) { return rdi_dir_cons(robject_new_index(), ACCS_READ | ACCS_WRITE); }