/* * This function is called when the module is loaded */ int init_module(void) { int major; /* Major number assigned to our device driver */ int minor; /* Minor number assigned to the associated character device */ /* Register driver */ if (alloc_chrdev_region (&start, 0, 1, DEVICE_NAME)) { printk(KERN_INFO "Can't register chrdev_region()"); return -ENOMEM; } printk(KERN_INFO "Device registered correctly with major number %d\n", MAJOR(start)); /* Create associated cdev */ if ((chardev=cdev_alloc())==NULL) { printk(KERN_INFO "cdev_alloc() failed "); unregister_chrdev_region(start, 1); return -ENOMEM; } chardevClass = class_create(THIS_MODULE, CLASS_NAME); if (IS_ERR(chardevClass)) //$ls /sys/class { printk(KERN_INFO "class_create() failed "); unregister_chrdev_region(start, 1); return PTR_ERR(chardevClass); } cdev_init(chardev,&fops); if (cdev_add(chardev,start,1)) { printk(KERN_INFO "cdev_add() failed "); class_destroy(chardevClass); unregister_chrdev_region(start, 1); return -ENOMEM; } chardevDevice = device_create(chardevClass, NULL, start, NULL, DEVICE_NAME); if (IS_ERR(chardevDevice)) //$ls /dev/ { device_destroy(chardevClass, start); class_destroy(chardevClass); unregister_chrdev_region(start, 1); return PTR_ERR(chardevDevice); } // Leds start kbd_driver= get_kbd_driver_handler(); set_leds(kbd_driver,ALL_LEDS_ON); major=MAJOR(start); minor=MINOR(start); printk(KERN_INFO "I was assigned major number %d. To talk to\n", major); printk(KERN_INFO "the driver. Try to cat and echo to the device file.\n"); printk(KERN_INFO "Remove the device file and module when done.\n"); return SUCCESS; }
/* This syscall modify the the led state */ SYSCALL_DEFINE1(ledctl,unsigned int,leds) { if((leds<0)||(leds>7)) return -EINVAL; kbd_driver= get_kbd_driver_handler(); if(kbd_driver==NULL) return -ENODEV; leds = convert(leds); if(set_leds(kbd_driver,leds) < 0) return -ENOTSUPP; return 0; }
/* Module init function */ static int __init procleds_init(void) { int ret = 0; /* get & set KDB driver */ kbd_driver = get_kbd_driver_handler(); /* Create procfs entry */ proc_entry = proc_create( "leds", 0666, NULL, &proc_entry_fops); if (proc_entry == NULL) { ret = -ENOMEM; printk(KERN_INFO "PROCLEDS: Can't create /proc entry\n"); } else { printk(KERN_INFO "PROCLEDS: Module loaded\n"); } return ret; }
SYSCALL_DEFINE1(ledctl, unsigned int, leds){ struct tty_driver* handler = get_kbd_driver_handler(); unsigned int status = 0, i = 0; for (i = 0 ; i < 3 ; i++){ if (leds & (0x1 << i)){ if (i == 0) status |= 0x1; else if (i == 1) status |= 0x4; else if (i == 2) status |= 0x2; } } set_leds(handler, status); return 0; }
static int __init modleds_init(void) { proc_entry = proc_create( "modleds", 0666, NULL, &proc_entry_fops); kbd_driver= get_kbd_driver_handler(); return 0; }
static int __init modleds_init(void) { kbd_driver= get_kbd_driver_handler(); set_leds(kbd_driver,ALL_LEDS_ON); return 0; }