Listing 3. aaaabbbb.c #include #include #include MODULE_LICENSE("GPL"); struct input_dev ex2_dev; void ex2_timeout(unsigned long unused/*UNUSED*/) { int x; for (x=0;x<4;x++) { /* letter a or A */ input_report_key(&ex2_dev, KEY_A, 1); input_sync(&ex2_dev); input_report_key(&ex2_dev, KEY_A, 0); input_sync(&ex2_dev); } for (x=0;x<4;x++) { /* letter b or B */ input_report_key(&ex2_dev, KEY_B, 1); input_sync(&ex2_dev); input_report_key(&ex2_dev, KEY_B, 0); input_sync(&ex2_dev); } /* set timer for four seconds */ mod_timer(&ex2_dev.timer,jiffies+4*HZ ); } static int __init ex2_init(void) { /* extra safe initialisation */ memset(&ex2_dev, 0, sizeof(struct input_dev)); init_input_dev(&ex2_dev); /* set up descriptive labels */ ex2_dev.name = "Example 2 device"; /* phys is unique on a running system */ ex2_dev.phys = "A/Fake/Path"; ex2_dev.id.bustype = BUS_HOST; ex2_dev.id.vendor = 0x0001; ex2_dev.id.product = 0x0002; ex2_dev.id.version = 0x0100; /* this device has two keys (A and B) */ set_bit(EV_KEY, ex2_dev.evbit); set_bit(KEY_B, ex2_dev.keybit); set_bit(KEY_A, ex2_dev.keybit); /* and finally register with the input core */ input_register_device(&ex2_dev); /* set up a repeating timer */ init_timer(&ex2_dev.timer); ex2_dev.timer.function = ex2_timeout; ex2_dev.timer.expires = jiffies + HZ; add_timer(&ex2_dev.timer); return 0; } static void __exit ex2_exit(void) { del_timer_sync(&ex2_dev.timer); input_unregister_device(&ex2_dev); } module_init(ex2_init); module_exit(ex2_exit);