Exemple #1
0
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;
}
Exemple #2
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;
}
Exemple #3
0
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;
}
Exemple #4
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;
}
Exemple #5
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);
}
Exemple #6
0
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;
}
Exemple #7
0
struct robject *tmpfs_dir_cons(rp_t source, int argc, char **argv) {
	return rdi_dir_cons(robject_new_index(), ACCS_READ | ACCS_WRITE);
}