char device

 1 /**
 2 * alloc_chrdev_region() - register a range of char device numbers
 3 * @dev: output parameter for first assigned number
 4 * @baseminor: first of the requested range of minor numbers
 5 * @count: the number of minor numbers required
 6 * @name: the name of the associated device or driver
 7 *
 8 * Allocates a range of char device numbers. The major number will be
 9 * chosen dynamically, and returned (along with the first minor number)
10 * in @dev. Returns zero or a negative error code.
11 */
12 int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,
13 const char *name)
14 {//分配字符设备的次设备号范围,主设备号有系统动态分配,不需要主动指定
15 struct char_device_struct *cd;
16 cd = __register_chrdev_region(0, baseminor, count, name);
17 if (IS_ERR(cd))
18 return PTR_ERR(cd);
19 *dev = MKDEV(cd->major, cd->baseminor);
20 return 0;
21 }
 1 static struct char_device_struct *
 2 __register_chrdev_region(unsigned int major, unsigned int baseminor,
 3                int minorct, const char *name)
 4 {
 5     struct char_device_struct *cd, **cp;
 6     int ret = 0;
 7     int i;
 8
 9     cd = kzalloc(sizeof(struct char_device_struct), GFP_KERNEL);
10     if (cd == NULL)
11         return ERR_PTR(-ENOMEM);
12
13     mutex_lock(&chrdevs_lock);
14
15     /* temporary */
16     if (major == 0) {
17         for (i = ARRAY_SIZE(chrdevs)-1; i > 0; i--) {
18             if (chrdevs[i] == NULL)
19                 break;
20         }
21
22         if (i == 0) {
23             ret = -EBUSY;
24             goto out;
25         }
26         major = i;
27         ret = major;
28     }
29
30     cd->major = major;
31     cd->baseminor = baseminor;
32     cd->minorct = minorct;
33     strlcpy(cd->name, name, sizeof(cd->name));
34
35     i = major_to_index(major);
36
37     for (cp = &chrdevs[i]; *cp; cp = &(*cp)->next)
38         if ((*cp)->major > major ||
39             ((*cp)->major == major &&
40              (((*cp)->baseminor >= baseminor) ||
41               ((*cp)->baseminor + (*cp)->minorct > baseminor))))
42             break;
43
44     /* Check for overlapping minor ranges.  */
45     if (*cp && (*cp)->major == major) {
46         int old_min = (*cp)->baseminor;
47         int old_max = (*cp)->baseminor + (*cp)->minorct - 1;
48         int new_min = baseminor;
49         int new_max = baseminor + minorct - 1;
50
51         /* New driver overlaps from the left.  */
52         if (new_max >= old_min && new_max <= old_max) {
53             ret = -EBUSY;
54             goto out;
55         }
56
57         /* New driver overlaps from the right.  */
58         if (new_min <= old_max && new_min >= old_min) {
59             ret = -EBUSY;
60             goto out;
61         }
62     }
63
64     cd->next = *cp;
65     *cp = cd;
66     mutex_unlock(&chrdevs_lock);
67     return cd;
68 out:
69     mutex_unlock(&chrdevs_lock);
70     kfree(cd);
71     return ERR_PTR(ret);
72 }
时间: 2024-11-09 03:15:57

char device的相关文章

Linux MTD (Memory Technology Device) subsystem analysis -For Atheros char device

Linux MTD (Memory Technology Device) subsystem analysis For Atheros char device 读了Linux MTD 源代码分析 对这部分有了整体的认识,结合现有代码,分析一下Atheros的MTD是如何使用的. Linux kernel: 2.6.31. Atheros platform: QCA9890??? 参考Linux MTD 源代码分析,这里把MTD分为4层,从上到下依次是:字符设备节点.字符设备.MTD 核心.FLA

char device driver

概览:    第一步:注册设备号                                              信息#tail -f /var/log/message        注册函数:            register_chrdev_region() 或                             查看#lsmod            alloc_chrdev_region()    或                             查看#cat

Char device registration

The kernel uses structures of type struct cdev to represent char devices internally. Include <linux/cdev.h> so that you can use the following structures functions. 1 struct cdev *cdev_alloc(void); //allocate a cdev 2 void cdev_init(struct cdev *cdev

Class create, device create, device create file (转)

来自:http://www.hovercool.com/en/Class_create,_device_create,_device_create_file 开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点(包括ldd3中不少例子也是这样),实际上现在Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点. 内核中定义了struct class结构体,顾名思义,一个struct class结构体

Class create, device create, device create file【转】

来自:http://www.hovercool.com/en/Class_create,_device_create,_device_create_file 开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点(包括ldd3中不少例子也是这样),实际上现在Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点. 内核中定义了struct class结构体,顾名思义,一个struct class结构体

树莓派wiringPi库详解

wiringPi是一个很棒的树莓派控制API,使用C语言开发,提供了丰富的接口:GPIO控制,中断,多线程,等等.java 的pi4j项目也是基于wiringPi的,我最近也在看源代码,到时候整理好了会放出来的. 下面开始wiringPi之旅吧! 安装 进入  wiringPi的github (https://git.drogon.net/?p=wiringPi;a=summary)下载安装包.点击页面的第一个链接的右边的snapshot,下载安装压缩包. 然后进入安装包所在的目录执行以下命令:

FFmpeg学习3:播放音频

参考dranger tutorial,本文将介绍如何使用FFmpeg解码音频数据,并使用SDL将解码后的数据输出.本文主要包含以下几方面的内容: 关于播放音频的需要的一些基础知识介绍 使用SDL2播放音频 数据队列 音频格式的转换 dranger tutorial确实入门FFmpeg比较好的教程,虽然作者在2015年的时候根据新版本的FFmpeg更新了,但是其中还是有不少API过时了.特别是,教程中使用的是SDL1.0,和现在的SDL2的API也有很大的不同,并且不能兼容. 1. 关于音频的一些

虚拟网卡TUN/TAP 驱动程序设计原理

昨天韦哥写了<Linux下Tun/Tap设备通信原理>一文,只提到了两个使用Tun的用户进程之间的通信路径,并没有说明Tun虚拟网卡驱动是如何实现的,而正好看到了这里的一篇讲解这方面的文章,果断转载了,感谢作者,原文在这里:虚拟网卡TUN/TAP 驱动程序设计原理 简介 虚拟网卡Tun/tap驱动是一个开源项目,支持很多的类UNIX平台,OpenVPN和Vtun都是基于它实现隧道包封装.本文将介绍tun/tap驱动的使用并分析虚拟网卡tun/tap驱动程序在linux环境下的设计思路. tun

驱动实现led,pwm和中断基础知识

2015.4.8星期三 晴天 今天老师讲的内容是内核编写led和pwm驱动,实现花样灯和放歌的功能.理解应用和驱动的对接,最后自己实现了在放歌的时候根据歌曲的节奏亮灭一个小灯,应为两个独立的驱动都已经写好,想要组合其实很简单,只要在主调函数里面打开两个驱动的设备节点,分别进行操作并有机的组合在一起就行了.最后老师复习了中断的一些基础知识,总结一下: 异常处理:当异常发送时:nand flash 拷贝到sdram中运行,这是和nor flash 的区别之一 1.拷贝cpsr到spsr2.设置适当的