Listing 3. aaaabbbb.c

#include <linux/input.h>
#include <linux/module.h>
#include <linux/init.h>

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);

