Linux驱动杂项_第1页
Linux驱动杂项_第2页
Linux驱动杂项_第3页
Linux驱动杂项_第4页
Linux驱动杂项_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux驱动学习杂项:fschar_dev.c字符驱动为一个字符设备注册主设备号,Major:主设备号,0-255/* * register_chrdev() - Register a major number for character devices. * major: major device number or 0 for dynamic allocation * name: name of this range of devices * fops: associated with this devices * * If major = 0 this functions will d

2、ynamically 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 * /d

3、ev. 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. * * This function registers a range of 256 minor numbers. The first minor number * is 0. */int register_chrdev(unsigned int ma

4、jor, const char *name, const struct *fops)struct char_device_struct *cd;struct cdev *cdev;char *s;int err = -ENOMEM;cd = _register_chrdev_region(major, 0, 256, name);if (IS_ERR(cd)return PTR_ERR(cd);cdev = cdev_alloc();if (!cdev)goto out2;cdev->owner = fops->owner;cdev->ops = fops;kobject_s

5、et_name(&cdev->kobj, "%s", name);for (s = strchr(kobject_name(&cdev->kobj),'/'); s; s = strchr(s, '/')*s = '!'err = cdev_add(cdev, MKDEV(cd->major, 0), 256);if (err)goto out;cd->cdev = cdev;return major ? 0 : cd->major;out:kobject_put(&cde

6、v->kobj);out2:kfree(_unregister_chrdev_region(cd->major, 0, 256);return err;MKDEV构造设备号:includelinuxkdev_t.h#define MINORBITS20#define MKDEV(ma,mi)(ma) << MINORBITS) | (mi)MKDEV构造设备号,高12位为主设备号major,低20位为次设备号minor在这里设置了一些主设备号:includelinuxmajor.h#define UNNAMED_MAJOR0#define MEM_MAJOR1#defi

7、ne RAMDISK_MAJOR1#define FLOPPY_MAJOR2#define PTY_MASTER_MAJOR2#define IDE0_MAJOR3#define HD_MAJORIDE0_MAJOR#define PTY_SLAVE_MAJOR3#define TTY_MAJOR4#define TTYAUX_MAJOR5#define LP_MAJOR6#define VCS_MAJOR7#define LOOP_MAJOR7#define SCSI_DISK0_MAJOR8#define SCSI_TAPE_MAJOR9#define MD_MAJOR9#define M

8、ISC_MAJOR10#define SCSI_CDROM_MAJOR11#define MUX_MAJOR11/* PA-RISC only */#define XT_DISK_MAJOR13#define INPUT_MAJOR13#define SOUND_MAJOR14Misc.c是杂项设备,是char设备的一种,只不过是主设备号major是10的char设备。includelinuxmiscdevice.h这是头文件,要使用MISC设备,包含这个头文件,函数有注册与否。#define PSMOUSE_MINOR1#define MS_BUSMOUSE_MINOR2#define PC

9、110PAD_MINOR9#define WATCHDOG_MINOR130/* Watchdog timer */#define TEMP_MINOR131/* Temperature Sensor */#define RTC_MINOR135#define I2O_MINOR166#define MICROCODE_MINOR184#define FUSE_MINOR229#define KVM_MINOR232#define MISC_DYNAMIC_MINOR255struct device;struct miscdevice int minor;const char *name;co

10、nst struct *fops;struct list_head list;struct device *parent;struct device *this_device;extern int misc_register(struct miscdevice * misc);extern int misc_deregister(struct miscdevice *misc);可以看出许多设备都是MISC设备,主要是次设备号不同,像TEMP,I2C,RTC等。driverscharMisc.c/* *misc_register-register a miscellaneous device

11、*misc: device structure * *Register a miscellaneous device with the kernel. If the minor *number is set to %MISC_DYNAMIC_MINOR a minor number is assigned *and placed in the minor field of the structure. For other cases *the minor number requested is used. * *The structure passed is linked into the k

12、ernel and may not be *destroyed until it has been unregistered. * *A zero is returned on success and a negative errno code for *failure. */ int misc_register(struct miscdevice * misc)struct miscdevice *c;dev_t dev;int err = 0;INIT_LIST_HEAD(&misc->list);mutex_lock(&misc_mtx);list_for_each

13、_entry(c, &misc_list, list) if (c->minor = misc->minor) mutex_unlock(&misc_mtx);return -EBUSY;if (misc->minor = MISC_DYNAMIC_MINOR) int i = DYNAMIC_MINORS;while (-i >= 0)if ( (misc_minorsi>>3 & (1 << (i&7) = 0)break;if (i<0) mutex_unlock(&misc_mtx);retu

14、rn -EBUSY;misc->minor = i;if (misc->minor < DYNAMIC_MINORS)misc_minorsmisc->minor >> 3 |= 1 << (misc->minor & 7);dev = MKDEV(MISC_MAJOR, misc->minor);misc->this_device = device_create(misc_class, misc->parent, dev, NULL, "%s", misc->name);if (IS_ERR(misc->this_device) err = PTR_ERR(misc-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论