Linux字符设备驱动_第1页
免费预览已结束,剩余2页可下载查看

下载本文档

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

文档简介

1、linux字符设备驱动/*linux字符设备驱动源代码sd.c*/ ilude linux/init.h /*模块头文件*/ include linux/mole.h include linux/types.h /*dev_t头文件*/ include linux/kdev_t.h /*major和minor宏头文件*/ include linux/fs.h /*register_ch_region等函数 _operations结构体*/ include linux/cdev.h /*suct cdev结构体*/ include asm/uaccess.h /*copy_to_user函数*/

2、 define device_name sc /*定义设备名*/ define device_major 250 struct cdev my_cdev; int scdd_open(struct inode *inode,structfile *filp) return0; int scdd_close(struct inode *inode,structfile *filp) return0; ssize_t scdd_read(struct file *filp,char_user *buff,size_t size,loff_t *offp) intleft; chardata=1;

3、for(left=size;left left-) /*拷贝数据到用户空间*/ copy_to_user(buff, data,1); buff returnsize; ssize_t scdd_(struct file *filp,char_user *buff,size_t size,loff_t *offp) return0; /*file_operations结构体*/ struct file_operations scdd_fops= .owner=this_module, .read=scdd_read, .write=scdd_write, .open=scdd_open, .r

4、elease=scdd_close, ; ic int _init scdd_init(vo) /*模块初始化函数*/ intsmajor; smajor=device_major; dev_tdev_n=mkdev(smajor,0); /*申请设备号*/ if(!register_chrdev_region(dev_n,1,device_name) /*静态申请*/ printk( registerccessn ee gotoregister_error; /*else /*动态申请*/ /*alloc_chrdev_region( dev_n,0,1,device_name); smaj

5、or=major(dev_n); */ /*初始化cdev结构体*/ cdev_init( my_cdev, scdd_fops); my_cdev.owner=this_module; my_cdev.ops= scdd_fops; /*注册字符设备*/ cdev_add( my_cdev,dev_n,1); return0; register_error: unregister_chrdev_region(mkdev(device_major,0),1); return0; static void _it scdd_exit(void) /*模块卸载函数*/ cdev_del( my_cd

6、ev); unregister_chrdev_region(mkdev(device_major,0),1); module_init(scdd_init); module_exit(scdd_exit); module_license( dual bsd/gpl 这个程序只是容易演示字符注册的一个完整过程,并不带有复杂的操作,调用read时向用户空间写全1 要点: 1.设备号,主设备号用来标识设备所对应的驱动程序,同一个驱动程序可以对应多个设备,次设备号就是用来区别采纳同一个驱动程序的不同设备文件。 内核中采纳dev_t来描述设备号,其实dev_t实质为unsign int类型,其中高12位

7、为主设备号,低20位为次设备号,其定义在linux/types.h中 从dev_t中分解出主设备号和次设备号 major(dev_t dev) minor(dev_t dev) 将主设备号和次设备号转换成dev_t类型 mkdev(intmajor,int minor) 2.申请设备号 静态申请,函数定义在linux/fs.h中 int register_chrdev_region(dev_t from,unsigned count,const char *name) from是申请设备号起始 ,from次设备号常常被置成0,count是所哀求延续设备号个数,name是该设备号范围关联的名称,

8、它将浮现在/proc/device和sysfs中。 分配胜利返回0,错误状况下,将返回一个负的错误码,并且不能用法所哀求的设备号。 动态申请 int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name) 申请的设备号将保存在dev中,baseminor为所申请的第一个次设备号 无论哪种方式申请设备号,不用法时要释放设备号 void unregister_chrdev_region(dev_t first,unsigned int count) 3.三个重要的结构 struct

9、file_operations struct file struct inode struct file_operations一个函数指针集合,定义能在设备上举行的操作,常用的有: int (*open)(structinode *inode,stuuct file *filep) void (*release)(structinode *inode,struct file *filep) ssize_t(*read)(struct file *filep,char _user *buff,size_t size,loff_t *offp) ssize_t(*write)(struct fil

10、e *filep,char _user *buff,size_t seze,loff_t * offp) int(*ioctl)(struct inode *inode,struct file *filep,unsigned int cmd,unsigned longarg) off_t(*llseek)(struct file *filp,loff_t,int) struct file表示一个打开的文件,一个文件被打开十次,则有10个structfile结构 struct file结构成员有: mode_t f_mode 文件模式,例如:可读可写 lofft_t f_pos 当前读/写位置

11、struct file_operations *f_op 与文件相关操作,执行open操作时对这个指针赋 void *private_data在open时置为null,用于跨系统调用时保存十分实用的资源 struct inode用来记录文件的物理上的信息,一个文件被打开10次,但惟独一个structinode结构,struct inode结构成员如下: dev_t i_rdev 用来保存设备号 struct cdev*i_cdev 指向字符设备结构struct cdev的指针 4.字符设备的注册 内核用法struct cdev结构表示字符设备,定义在linux/cdev.h中。 初始化cdev

12、结构体有两种方式 静态: struct cdev my_cdev; cdev_init( my_cdev, fops); my_cdev.owner = this_module; 动态(就是通过kmalloc去申请cdev结构): struct cdev *my_cdev = cdev_alloc(); my_cdev- ops= my_fops; my_cdev.owner= this_module; 注册 int cdev_add(struct cdev *dev,dev_t num,unsigned int count) num是设备号,count常常取1 注销 void cdev_del(struct cd

温馨提示

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

评论

0/150

提交评论