添加简单的字符设备教程.docx_第1页
添加简单的字符设备教程.docx_第2页
添加简单的字符设备教程.docx_第3页
添加简单的字符设备教程.docx_第4页
全文预览已结束

下载本文档

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

文档简介

编写简单的字符设备的驱动由于用户进程是通过设备文件同硬件打交道,对设备文件的操作方式不外乎就 是一些系统调用,如 open,read,write,close.而这些系统调用通过定义struct file_operations结构体和设备驱动程序相关联。所以,编写 设备驱动程序的主要工作就是编写子函数,并填充file_operations的各个域。具体步骤如下:1 随便在一个目录下,新建一个目录叫 mydev ,再在此目录下新建三个文件分别叫 Makefile mydev.c main.c。其中Makefile是编译文件,mydev.c是我们编写的字符设备驱动程序,main.c则是用于测试字符设备驱动的测试程序。三个文件的源程序代码详见附录2.2 打开终端 使用 su 命令,切换到 super user 身份,然后写位到 mydev 目录下。3 输入 make 命令,编译 驱动程序 chardev.c。4 输入 gcc main.c 命令,编译 测试程序。5 输入 insmod mydev.ko 加载驱动模块。6 输入 gedit /proc/devices 查看 mydev 驱动模块的主设备号。7 输入 mknod /dev/mydev c 250 0 在/dev/目录下,创建设备 mydev。其中,c代码字符驱动,250是驱动主设备号,0是次设备号。次设备号一般都为0。8 输入 ./a.out 运行测试程序。9 测试程序退出后,输入 rmmod mydev 卸载 驱动模块,并输入 rm -rf /dev/mydev 删除 /dev/目录下的 mydev 设备。其安装过程和运行结果如图3-1图3-3所示。 图3-1 查看驱动模块主设备号 图3-2 创建mydev源代码:Makefileobj-m:=mydev.oKDIR:=/lib/modules/$(shell uname -r)/buildSRCPWD:=$(shell pwd)all:make -C $(KDIR) M=$(SRCPWD) modulesclean:rm -rf chardev.omydev.c#include #include #include #include #include static int mydevread(struct file *filp,char _user *buffer,size_t,loff_t *); static int mydevopen(struct inode *,struct file *); static int mydevwrite(struct file *filp,const char _user *buffer,size_t ,loff_t*);static int mydevrelease(struct inode *,struct file *); static int major;static char buf100=Mydev is working!;static const struct file_operations file_ops = .read = mydevread,.write = mydevwrite,.open = mydevopen,.release = mydevrelease;static int _init mydev_init(void) int result;major = 0;result = register_chrdev(major, mydev, &file_ops);if (result 0) printk(register mydev failed!n);return result;if (major = 0) major = result;return 0;static int mydevopen(struct inode *inode,struct file *file) try_module_get(THIS_MODULE); printk(mydev open called!n); return 0;static int mydevrelease(struct inode *inode,struct file *file) module_put(THIS_MODULE); printk(mydev clean called!n); return 0;static int mydevread(struct file *filp,char _user *buffer,size_t length,loff_t *offset) int rd; rd=copy_to_user(buffer,&buf,length); if(rd) return length; return -1;static int mydevwrite(struct file *filp,const char _user *buffer,size_t length,loff_t *offset) int wt; wt=copy_from_user(&buf,buffer,length); if(wt) return length; return -1; s

温馨提示

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

评论

0/150

提交评论