首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

char device driver小结

2013-03-04 
char device driver总结概览:第一步:注册设备号信息#tail -f /var/log/message注册函数:register_chrdev_r

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


热点排行