#include #include #include #include #include #include #include #include #include #include #include #include #include #define PROC_FILE_NAME "mousectl" struct timer_list my_timer; struct input_dev *jerry; struct notifier_block nb; int kb_notifier_fn(struct notifier_block *nb, unsigned long action, void* data){ struct keyboard_notifier_param *kp = (struct keyboard_notifier_param*)data; // kp->down inidicates if the key was pressed or released printk("Key: %d Lights: %d Shiftmax: %x\n", kp->value, kp->ledstate, kp->shift); input_report_rel(jerry, REL_Y, 10); input_sync(jerry); return 0; } ssize_t move_mouse(struct file *filp,const char *buf,size_t count,loff_t *offp) { char our_copy[16]; int n; if(count < 2) return count; strncpy(our_copy, buf, 15); our_copy[(count < 16)? count:16] = 0; sscanf(our_copy+1, "%d", &n); switch(buf[0]){ case 'U': input_report_rel(jerry, REL_Y, -n); break; case 'D': input_report_rel(jerry, REL_Y, n); break; case 'R': input_report_rel(jerry, REL_X, n); break; case 'L': input_report_rel(jerry, REL_X, -n); break; case 'C': input_report_key(jerry, BTN_LEFT, n); break; } input_sync(jerry); return count; } struct file_operations proc_fops = { write: move_mouse }; static int __init mm_init(void) { jerry = input_allocate_device(); jerry->name = "jerry"; set_bit(EV_REL, jerry->evbit); set_bit(REL_X, jerry->relbit); set_bit(REL_Y, jerry->relbit); set_bit(EV_KEY, jerry->evbit); set_bit(BTN_LEFT, jerry->keybit); input_register_device(jerry); proc_create(PROC_FILE_NAME,0,NULL,&proc_fops); nb.notifier_call = kb_notifier_fn; register_keyboard_notifier(&nb); return 0; } static void __exit mm_remove(void) { input_unregister_device(jerry); remove_proc_entry(PROC_FILE_NAME,NULL); unregister_keyboard_notifier(&nb); } MODULE_LICENSE("GPL"); module_init(mm_init); module_exit(mm_remove);