分析mtk_disp_mgr.c(引出一个典型的字符设备的创建过程)

来源:互联网 发布:iconkit for mac 编辑:程序博客网 时间:2024/06/11 23:29

一. 在该模块的probe函数中,有如下代码:

static dev_t mtk_disp_mgr_devno;static struct cdev *mtk_disp_mgr_cdev;static struct class *mtk_disp_mgr_class;static const struct file_operations mtk_disp_mgr_fops = {    .owner = THIS_MODULE,    .mmap = mtk_disp_mgr_mmap,    .unlocked_ioctl = mtk_disp_mgr_ioctl,    .open = mtk_disp_mgr_open,    .release = mtk_disp_mgr_release,    .read = mtk_disp_mgr_read,};static int mtk_disp_mgr_probe(struct platform_device *pdev){struct class_device;struct class_device *class_dev = NULL;int i;if (alloc_chrdev_region(&mtk_disp_mgr_devno, 0, 1, DISP_SESSION_DEVICE))return -EFAULT;/* alloc_chrdev_region 动态分配字符设备的编号 */mtk_disp_mgr_cdev = cdev_alloc();/*cdev_alloc 初始化 cdev。(已经定义了cdev指针static struct cdev *mtk_disp_mgr_cdev)。如果定义的是结构体  static struct cdev mtk_disp_mgr_cdev,则使用 cdev_init 函数。这2个函数的区别在于,cdev_alloc会调用kzalloc来分配内存,所有只定义了一个cdev指针时使用该函数。cdev_init() 多赋了一个 cdev->ops 的值。*/mtk_disp_mgr_cdev->owner = THIS_MODULE;mtk_disp_mgr_cdev->ops = &mtk_disp_mgr_fops;if (cdev_add(mtk_disp_mgr_cdev, mtk_disp_mgr_devno, 1)) /* 添加cdev结构 */{cdev_del(mtk_disp_mgr_cdev);unregister_chrdev_region(mtk_disp_mgr_devno, 1);return -EFAULT;}mtk_disp_mgr_class = class_create(THIS_MODULE, DISP_SESSION_DEVICE);/* class_create 会在 /sysfs 下创建一个 class ,名称为 DISP_SESSION_DEVICE*/class_dev = (struct class_device *)device_create(mtk_disp_mgr_class, NULL, mtk_disp_mgr_devno, NULL, DISP_SESSION_DEVICE);/* class_dev 会在 /dev 目录下创建一个名为 DISP_SESSION_DEVICE的设备节点。在早期的内核版本中,使用的是class_device_create函数。还可以使用device_create_file来设置属性,可以在/sys/class/目录下实现控制*/return 0;}

二. 以上就是一个典型的字符设备cdev驱动的注册过程



原创粉丝点击