当前位置:网站首页>register_ Chrdev and CDEV_ init cdev_ Add usage differences
register_ Chrdev and CDEV_ init cdev_ Add usage differences
2022-06-30 16:40:00 【Glass clear orange brilliant】
register_chrdev
shortcoming :
A kernel can only have 255 Character driver
2.6 After the kernel, it is recommended to register_chrdev an .
Previously, I wanted to take the main equipment number as the subscript , stay chrdevs Find the previously registered file_operations, Now find the structure with the main equipment number and the secondary equipment number .
Begin to 1.register_chrdev_region Registration area
/alloc_chrdev_region region Area means a certain ( Lord , Time ) To a certain ( Lord , Time +n) The device number corresponds to this driver . It used to be ( Lord ,0) To ( Lord ,255) All corresponding to this structure all at once , After expansion, you can narrow the range from the primary equipment number to a secondary equipment number
2.cdev_init
3.cdev_add
/** * __register_chrdev() - create and register a cdev occupying a range of minors * @major: major device number or 0 for dynamic allocation * @baseminor: first of the requested range of minor numbers * @count: the number of minor numbers required * @name: name of this range of devices * @fops: file operations associated with this devices * * If @major == 0 this functions will dynamically allocate a major and return * its number. * * If @major > 0 this function will attempt to reserve a device with the given * major number and will return zero on success. * * Returns a -ve errno on failure. * * The name of this device has nothing to do with the name of the device in * /dev. It only helps to keep track of the different owners of devices. If * your module name has only one type of devices it's ok to use e.g. the name * of the module here. */
int __register_chrdev(unsigned int major, unsigned int baseminor,
unsigned int count, const char *name,
const struct file_operations *fops)
{
struct char_device_struct *cd;
struct cdev *cdev;
int err = -ENOMEM;
cd = __register_chrdev_region(major, baseminor, count, name);
if (IS_ERR(cd))
return PTR_ERR(cd);
cdev = cdev_alloc();
if (!cdev)
goto out2;
cdev->owner = fops->owner;
cdev->ops = fops;
kobject_set_name(&cdev->kobj, "%s", name);
err = cdev_add(cdev, MKDEV(cd->major, baseminor), count);
if (err)
goto out;
cd->cdev = cdev;
return major ? 0 : cd->major;
out:
kobject_put(&cdev->kobj);
out2:
kfree(__unregister_chrdev_region(cd->major, baseminor, count));
return err;
}
cdev_init
/** * cdev_init() - initialize a cdev structure * @cdev: the structure to initialize * @fops: the file_operations for this device * * Initializes @cdev, remembering @fops, making it ready to add to the * system with cdev_add(). */
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
{
memset(cdev, 0, sizeof *cdev);
INIT_LIST_HEAD(&cdev->list);
kobject_init(&cdev->kobj, &ktype_cdev_default);
cdev->ops = fops;
}
---------------------- Use --------------------------
/* nsc_gpio uses dev_dbg(), so needs this */
scx200_gpio_ops.dev = &pdev->dev;
if (major) {
devid = MKDEV(major, 0);
rc = register_chrdev_region(devid, MAX_PINS, "scx200_gpio");// If the master device number is specified, use this function devid For where to start ((major, 0) Corresponding ops,(major, 1-255) Other mismatches
} else {
rc = alloc_chrdev_region(&devid, 0, MAX_PINS, "scx200_gpio");// The second parameter is the base address of the secondary device number ,MAX_PINS Number of
major = MAJOR(devid);
}
if (rc < 0) {
dev_err(&pdev->dev, "SCx200 chrdev_region err: %d\n", rc);
goto undo_platform_device_add;
}
cdev_init(&scx200_gpio_cdev, &scx200_gpio_fileops);
cdev_add(&scx200_gpio_cdev, devid, MAX_PINS);
class_create
device_create// If you let the system automatically create an equipment node , You need to create classes and device
return 0; /* succeed */
边栏推荐
- 大学生研究生毕业找工作,该选择哪个方向?
- POJ Project Summer
- flinkcdc如果监控的数据库为mongo就必须是集群版吗
- How the edge computing platform helps the development of the Internet of things
- MySQL proxy middleware atlas installation and configuration
- BC1.2 PD协议
- 实时渲染和预渲染有什么区别
- Open source STM32 USB-CAN project
- MySQL8.0开启远程连接权限的方法步骤
- What is XR extended reality and what are the XR cloud streaming platforms
猜你喜欢

构建适合组织的云原生可观测性能力

Under the pressure of technology, you can quickly get started with eth smart contract development, which will take you into the ETH world

The image variables in the Halcon variable window are not displayed, and it is useless to restart the software and the computer

【活动报名】探秘元宇宙,就差你了!7月2号我在深圳现场等你!

Compulsory national standard for electronic cigarette GB 41700-2022 issued and implemented on October 1, 2022

中航无人机科创板上市:市值385亿 拳头产品是翼龙无人机

【Verilog基础】关于Clock信号的一些概念总结(clock setup/hold、clock tree、clock skew、clock latency、clock transition..)

猎头5万挖我去VC

15年做糊21款硬件,谷歌到底栽在哪儿?

Build cloud native observability capability suitable for organizations
随机推荐
MySQL transaction / lock / log summary
居家办公浅谈远程协助快速提效心得 | 社区征文
The new tea drinks are "dead and alive", but the suppliers are "full of pots and bowls"?
In depth analysis of the core code of the gadgetinspector
CVPR 2022丨特斯联AI提出:基于图采样深度度量学习的可泛化行人重识别
Tencent two sides: @bean and @component are used on the same class. What happens?
牛客网:最小花费爬楼梯
I 用c I 实现“栈”
Oracle 导出视图的创建语句
I implement "stack" with C I
云技能提升好伙伴,亚马逊云师兄今天正式营业
Unsupported major. minor version 52.0
Siyuan notes: can you provide shortcut keys for folding all titles on the page?
深入分析GadgetInspector核心代码
What are the reasons for the errors reported by the Flink SQL CDC synchronization sqlserver
GaussDB创新特性解读:Partial Result Cache,通过缓存中间结果对算子进行加速
What role does "low code" play in enterprise digital transformation?
Dart: string replace related methods to solve replacement characters
边缘计算平台如何助力物联网发展
There are so many kinds of coupons. First distinguish them clearly and then collect the wool!