当前位置:网站首页>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 */
边栏推荐
- Tencent two sides: @bean and @component are used on the same class. What happens?
- [CVE-2019-0193] - Apache Solr DataImport 远程命令执行分析
- 中航无人机科创板上市:市值385亿 拳头产品是翼龙无人机
- 为了使远程工作不受影响,我写了一个内部的聊天室 | 社区征文
- 实时渲染和预渲染有什么区别
- 猎头5万挖我去VC
- After 15 years of working on 21 types of hardware, where is Google?
- 【Verilog基础】十进制负数的八进制、十六进制表示
- 药品管理系统加数据库,一夜做完,加报告
- Explain in detail the use of for loop, break and continue in go language
猜你喜欢

云化XR,如何助力产业升级

Headhunter 50, 000, I'll go to VC

云技能提升好伙伴,亚马逊云师兄今天正式营业

Cesium-1.72 learning (earth model creation online offline tile)

The new tea drinks are "dead and alive", but the suppliers are "full of pots and bowls"?

How cloudxr promotes the future development of XR

中国传奇教授李泽湘,正在批量制造独角兽

备战数学建模33-灰色预测模型2
mysql8报错:ERROR 1410 (42000): You are not allowed to create a user with GRANT解决办法

Distributed machine learning: model average Ma and elastic average easgd (pyspark)
随机推荐
Mysql8 error: error 1410 (42000): you are not allowed to create a user with grant solution
[CVE-2019-0193] - Apache Solr DataImport 远程命令执行分析
【机器学习】K-means聚类分析
Build cloud native observability capability suitable for organizations
2022蓝桥杯国赛B组-费用报销-(线性dp|状态dp)
The inspiration from infant cognitive learning may be the key to the next generation of unsupervised machine learning
MySQL transaction / lock / log summary
优惠券种类那么多,先区分清楚再薅羊毛!
Unsupported major. minor version 52.0
备战数学建模36-时间序列模型2
新茶饮“死去活来”,供应商却“盆满钵满”?
Policy Center > Deceptive Behavior
Mysql8.0 method and steps for enabling remote connection permission
flink sql cdc 同步sqlserver 报错什么原因啊
Bidding announcement: Tianjin housing provident fund management center database all-in-one machine and database software project (budget: 6.45 million)
Which direction should college students choose to find jobs after graduation?
Dart: string replace related methods to solve replacement characters
Go zero micro Service Practice Series (VIII. How to handle tens of thousands of order requests per second)
快照和备份
Cloud XR, how to help industrial upgrading