char device driver总结
概览:
第一步:注册设备号 信息#tail -f /var/log/message
注册函数:
register_chrdev_region() 或 查看#lsmod
alloc_chrdev_region() 或 查看#cat /proc/devices
register_chrdev()
注销函数:
unregist_chrdev_region() 或
unregister_chrdev()
第二步:初始化cdev并添加到系统
初始化cdev
静态初始化 cdev_init() 或
动态初始化 cdev_alloc()
添加到系统函数
cdev_add()
从系统删除函数
cdev_del()
第三步:创建设备节点
创建类
class_create() 将放于/sysfs 查看#ls /sys/class
删除类
class_destroy()
创建节点
device_create() 或 class_device_create() 将存放于/dev 查看#ls /dev
删除节点
device_destroy() 或 class_device_destroy()
第四步:简单示例
/***************************************************************************************************
第一步:注册设备号
***************************************************************************************************/
Linux内核中所有已分配的字符设备编号都记录在一个名为 chrdevs 散列表里。
该散列表中的每一个元素是一个 char_device_struct 结构,它的定义如下:
#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/cdev.h>#include <linux/device.h>int hello_major = 555;int hello_minor = 0;int number_of_devices = 1;struct cdev cdev;dev_t dev = 0;struct file_operations hello_fops = { .owner = THIS_MODULE };static void char_reg_setup_cdev(void) {int error, devno = MKDEV(hello_major, hello_minor);cdev_init(&cdev, &hello_fops);cdev.owner = THIS_MODULE;cdev.ops = &hello_fops;error = cdev_add(&cdev, devno, 1);if (error)printk (KERN_NOTICE "Error %d adding char_reg_setup_cdev", error);}struct class *my_class;static int __init hello_2_init (void){int result;struct device *dev;dev = MKDEV (hello_major, hello_minor);result = register_chrdev_region (dev, number_of_devices, "hello");if (result<0) {printk (KERN_WARNING "hello: can't get major number %d/n", hello_major);return result;}char_reg_setup_cdev ();/* create your own class under /sysfs */my_class = class_create(THIS_MODULE, "my_class");if(IS_ERR(my_class)){printk("Err: failed in creating class./n");return -1;}/* register your own device in sysfs, and this will cause udev to create corresponding device node */dev=device_create( my_class, NULL, MKDEV(hello_major, 0), "hello" "%d", 0 );if(dev==NULL)printk("<5>create device error!!!!\n");printk (KERN_INFO "Registered character driver/n");return 0;}static void __exit hello_2_exit (void){dev_t devno = MKDEV (hello_major, hello_minor);cdev_del (&cdev);device_destroy(my_class, MKDEV(hello_major, 0)); //delete device node under /devclass_destroy(my_class); //delete class created by usunregister_chrdev_region (devno, number_of_devices);printk (KERN_INFO "char driver cleaned up/n");}module_init( hello_2_init);module_exit( hello_2_exit);MODULE_LICENSE ("GPL");