Linux 设备驱动程序 字符设备

已经无法再精简,适合入门。


 1 #include<linux/module.h>
2 #include<linux/init.h>
3
4 #include<asm/uaccess.h>
5 #include <linux/types.h>
6 #include<linux/fs.h>
7 #include<linux/cdev.h>
8 struct mengc_dev{
9 char data[64];
10 struct cdev cdev;
11 };
12 int mengmajor;
13 struct mengc_dev meng_device;
14
15 void exit_mengc_dev(void)
16 {
17 dev_t devno = MKDEV(mengmajor,1);
18 cdev_del(&meng_device.cdev);
19 unregister_chrdev_region(devno,1);
20 }
21 int meng_open(struct inode*inode,struct file *filep)
22 {
23 return 0;
24 }
25 int meng_release(struct inode*inode,struct file *filep)
26 {
27 return 0;
28 }
29
30 ssize_t meng_read(struct file*filep,char __user*buf,size_t count,loff_t*f_ops)
31 {
32 if(*f_ops>=strlen(meng_device.data))
33 return 0;
34 if(copy_to_user(buf,meng_device.data,strlen(meng_device.data)))
35 {
36 return -1;
37 }
38 *f_ops+=strlen(meng_device.data);
39 return strlen(meng_device.data);
40 }
41
42 ssize_t meng_write(struct file*filep,const char __user*buf,size_t count,loff_t*f_ops)
43 {
44 if(count>63)
45 count=63;
46 if(copy_from_user(meng_device.data,buf,count))
47 {
48 return -EFAULT;
49 }
50 return count;
51 }
52
53
54 struct file_operations meng_fops=
55 {
56 .read=meng_read,
57 .write=meng_write,
58 .open=meng_open,
59 .release=meng_release
60 };
61 int init_mengc_dev(void)
62 {
63 int re;
64 dev_t dev=0;
65 re=alloc_chrdev_region(&dev,1,1,"mengcdev");
66 if(re<0)
67 {
68 printk("meng_devc register failed.\n");
69 return re;
70 }
71 mengmajor=MAJOR(dev);
72 memset(&meng_device,0,sizeof(meng_device));
73 cdev_init(&meng_device.cdev,&meng_fops);
74 meng_device.cdev.owner=THIS_MODULE;
75 meng_device.cdev.ops=&meng_fops;
76 re=cdev_add(&meng_device.cdev,dev,1);
77 if(re)
78 {
79 printk("mengdevc add faild.\n");
80 }
81 return 0;
82 }
83 module_init(init_mengc_dev);
84 module_exit(exit_mengc_dev);

将上面的文件保存成mengcdev.c

然后在相同目录下建立一个Makefile文件,文件内容如下(只需这一行):

obj-m :=mengcdev.o

然后在此目录下执行 make -C /lib/modules/`uname
-r`/build/ M=`pwd` 这条命令执行成功的前天是安装了源代码包,具体可以参阅其他资料,Ubuntu只需apt-get install
几个包,Redhat系列只需yuminstall 几个。当然需要有开发环境了,即gcc之类的。

一旦编译完成即可生成mengcdev.ko 这个模块

用root插入这个模块
insmod mengcdev.ko

然后去/proc/device中找相应的设备号

cat /proc/devices |grep meng

如果输出如下:

248 mengcdev

则执行

mknod /dev/mengcdev c 248 1,注意把248换成实际输出的值

然后就可以进行测试了  echo hello >/dev/mengcdev

cat /dev/mengcdev

Linux 设备驱动程序 字符设备,布布扣,bubuko.com

时间: 2024-10-27 10:54:17

Linux 设备驱动程序 字符设备的相关文章

Linux杂项设备与字符设备

.1 杂项设备驱动的引入 字符设备指那些必须以串行顺序依次进行访问,且没有经过系统快速缓冲的设备,了解了Linux内核中驱动的框架和组成,以及编写的步骤等.但是,当我们写的驱动程序多了之后,就会发现:部分硬件并不符合预先定义的字符设备的范畴,而且普通字符设备的主设备号不管是静态分配还是动态分配,都会消耗一个主设备号(目前一个系统最多只能有255个字符设备),比较浪费主设备号资源.因此,而引入了杂项设备驱动. 杂项设备是一个典型的字符设备(与接下来要介绍的输入子系统一样,呵呵),其主设备号固定为1

Linux平台块设备到字符设备(裸设备)的三种映射方式(转载)

在Linux平台oracle rac的组建过程中,如果使用ASM+RAW的存储方式的话,由于asm不支持块设备,支持持字符访问设备,所以需要配置将Block Device Drive转变成Character Device Drive的访问方式.但是在Linux平台中,不像aix和HP-UX中,默认提供了块设备对应的字符设备文件,需要我们手工的将块设备映射为字符设备.在此,我们提供三种方式来讲块设备绑定到裸设备上,这三种方式创建裸设备的方式完全一样,区别在于对oracle用户的权限的处理方式不同,

linux驱动之字符设备

第一部分:字符设备工作过程1.系统调用和驱动程序的关联关键结构体:struct file_operation:file_operation结构体的每一个成员的名字都对应着一个系统调用.用户进程利用系统调用在对设备文件进行诸如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数.这是linux的设备驱动程序工作的基本原理.编写设备驱动程序的主要工作就是编写子函数,并填充file_operations的各个域.

Linux学习 :字符设备框架

一.系统功能框架: U-boot : 启动内核 linux kernel: 启动应用 应用: open,read,write 都是通过C库实现,汇编就相当于swi val,引发中断,通过系统调用接口在异常中断调用不同处理函数(VFS). 二.字符设备驱动框架: 1.编写驱动:open , read, write 等功能函数的实现: static int led_drv_open(struct inode *inode, struct file *file){ printk("led_drv_op

每天整理点Linux--块设备,字符设备

块设备(blockdevice)是一种具有一定结构的随机存取设备,对这种设备的读写是按块进行的,他使用缓冲区来存放暂时的数据,待条件成熟后,从缓存一次性写入设备或从设备中一次性读出放入到缓冲区,如磁盘和文件系统等 字符设备(Characterdevice):这是一个顺序的数据流设备,对这种设备的读写是按字符进行的,而且这些字符是连续地形成一个数据流.他不具备缓冲区,所以对这种设备的读写是实时的,如终端.磁带机等. 系统中能够随机(不需要按顺序)访问固定大小数据片(chunks)的设备被称作块设备

LINUX设备驱动程序笔记(三)字符设备驱动程序

      <一>.主设备号和次设备号        对字符设备的访问时通过文件系统内的设备名称进行的.那些设备名称简单称之为文件系统树的节点,它们通常位于/dev目录.字符设备驱动程序的设备文件可通过ls -l命令输出的第一列中的'c'来识别.块设备同样位于/dev下,由字符'b'标识 crw-rw----  1 root root    253,   0 2013-09-11 20:33 usbmon0 crw-rw----  1 root root    253,   1 2013-09

Linux 简单字符设备驱动程序 (自顶向下)

第零章:扯扯淡 特此总结一下写的一个简单字符设备驱动程序的过程,我要强调一下“自顶向下”这个介绍方法,因为我觉得这样更容易让没有接触过设备驱动程序的童鞋更容易理解,“自顶向下”最初从<计算机网络 自顶向下方法>这本书学到的,我觉得有时候这是一种很好的方式. 第一章:测试程序 咦?你怎么跟别人的思路不一样???自顶向下嘛,我就直接从测试程序来说啦,这样那个不是更熟悉吗?看看下面的测试程序的代码,是不是很熟悉? 1 #include <stdio.h> 2 #include <u

【转】linux设备驱动程序之简单字符设备驱动

原文网址:http://www.cnblogs.com/geneil/archive/2011/12/03/2272869.html 一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 1.字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等.2.块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等.

linux kernel 字符设备详解

有关Linux kernel 字符设备分析: 参考:http://blog.jobbole.com/86531/ 一.linux kernel 将设备分为3大类,字符设备,块设备,网络设备. 字符设备是指只能一个字节一个字节读写的设备, 常见的外设基本上都是字符设备. 块设备:常见的存储设备,硬盘,SD卡都归为块设备,块设备是按一块一块读取的. 网络设备:linux 将对外通信的一个机制抽象成一个设备, 通过套接字对其进行相关的操作. 每一个字符设备或块设备都在/dev目录下对应一个设备文件.l