rr) {
printk("Error : Error in Adding Davinci buttons");
unregister_chrdev_region(dev, BUTTON_NR_DEVS);
return -err;
}
af_class = class_simple_create(THIS_MODULE, DEVICE_NAME);
if (!af_class) {
printk("Error : Error in creating device class");
unregister_chrdev_region(dev, BUTTON_NR_DEVS);
class_simple_device_remove(dev);
class_simple_destroy(af_class);
cdev_del(&c_dev);
return -EIO;
}
result =devfs_mk_cdev(dev, S_IFCHR | S_IRUSR | S_IWUSR,DEVICE_NAME);
if (result < 0) {
printk("Error : Error in devfs_mk_cdev");
unregister_chrdev_region(dev, BUTTON_NR_DEVS);
class_simple_device_remove(dev);
class_simple_destroy(af_class);
cdev_del(&c_dev);
return result;
}
/* register simple device class */
class_simple_device_add(af_class, dev, NULL, DEVICE_NAME);
printk("Button register Successfully\n");
return 0;
}
/*
*
*/
static void __exit davinci_buttons_exit(void)
{
/* 卸载驱动程序 */
unregister_chrdev_region(dev, BUTTON_NR_DEVS);
/* remove simple class device */
class_simple_device_remove(dev);
devfs_remove(DEVICE_NAME);
/* destroy simple class */
class_simple_destroy(af_class);
cdev_del(&c_dev);
printk("Button register release\n");
}
/* 这两行指定驱动程序的初始化函数和卸载函数 */
module_init(davinci_buttons_init);
module_exit(davinci_buttons_exit);
/* 描述驱动程序的一些信息,不是必须的 */
MODULE_AUTHOR("jiaxinxu"); // 驱动程序的作者
MODULE_DESCRIPTION("JC_IR BUTTON Driver"); // 一些描述信息
MODULE_LICENSE("GPL"); // 遵循的协议
insmod驱动后
输入cat /dev/buttons 显示按键的输出