专题10-字符设备驱动模型

一.编译安装字符设备驱动模块
1.要有Makefile
obj-m := memdev.o
KDIR := /ok6410/linux-3.10
all:
     make -C $(KDIR)M=(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
clean:
    rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.bak *.order
2.要有合适的驱动文件
3.insmod lsmod rmmod命令使用。
二.安装字符设备(节点)文件
1.应用程序通过文件名找到设备文件
2.设备文件通过主设备号找到与之匹配的驱动程序。(设备文件和驱动程序都有主设备号,相同则匹配)
3.可以通过cat  /proc/devices打印驱动程序信息(主要是主设备号,次设备号0-255都可以)
4.创建方法
mknod /dev/设备文件名  c   主设备号   次设备号(主设备号和驱动程序要一致)
5.这里的字符设备是虚拟的设备,用一段内存(比如说一个数组)模拟硬件的几个寄存器
6.遇到not found有可能是依赖关系不满足,利用arm-linux-readelf -d 文件名来查看该程序所需要的动态链接库。从而进一步解决问题。
三.写数据程序

四.读数据应用程序

五.开发板操作

六.字符设备描述结构
1.在任何一种驱动模型中,设备都会采用内核中的一种结构来描述。
2.字符设备的描述采用的是

3.通过主设备号匹配设备文件和设备驱动。区分同类型的设备用次设备号。在内核中用dev_t定义设备号,实质就是unsigned int类型。高12位主设备号,低20位次设备号。
4.将主设备号和次设备号组合成结构体中的设备号成员,用MKDEV(注设备号,次设备号)。如果要从设备号分离出主设备号和次设备号,用MAJOR(dev_t  设备号)。MINOR(dev_t  设备号)。
5.分配主设备号:
(1)静态申请--register_chrdev_region。但是有可能失败以及不能正常使用,因为有可能设备号冲突。
(2)动态分配--alloc_chrdev_region。这样不会冲突。
(3)设备号注销--unregister_chrdev_region,再不用设备以后要释放。
6.操作函数集
(1)起到映射作用,将应用空间的函数和驱动的函数通过fileoperations操作函数集对应起来
(2)不需要的设置成空指针NULL即可
七.字符设备驱动模型
1.驱动初始化:(一般在module_init中完成)
(1)分配cdev。可以静态分配(直接定义),也可以动态分配(struct cdev *pdev = cdev_alloc())。
(2)初始化cdev。cdev_init(struct cdev * pdev ,const struct file_operations *fops);
(3)注册cdev。cdev_add(struct cdev * pdev ,dev_t dev,unsigned count dev_number);
(4)硬件初始化
2.实现设备操作
(1)关于struct file
在linux系统中,每打开一个文件(要打开才会有),在内核中都会关联一个struct file文件,这是由Linux内核在打开文件的时候创建的。在文件关闭后会释放这个struct  file结构体。
其中重要的成员有:
loff_t f_pos---文件读写指针
struct  file_operations* f_ops----该文件所对应的操作。
(2)关于struct inod
每一个存在于文件系统的文件都会有一个inod结构体和它对应。主要是用来记录文件的物理信息。不管文件是否打开,都会关联。
重要成员
dev_t  t_rdev---设备号
(3)open设备方法
为以后的工作做准备,完成初始化工作。主要是标明次设备号,启动设备
(4)release:有时候也叫做close。就是关闭设备。
(5)read:从设备中读取数据到驱动程序(内核空间),然后将读取到的数据返回给用户空间。原型如下

注意:buff参数是来源于用户空间的指针,这类指针不能被内核空间的代码直接使用,必须使用专门的函数
int copy_from_user(void* to ,const void _user *from,int n);
int copy_to_user(void _user* to,const void * from,int n );

(6)write
-->从应用程序提供的地址中读取数据
-->将数据写入设备(硬件类操作)
参数类似于read。
(7)llseek:重定位读写指针,相应系统调用。
3.驱动注销
从内核卸载驱动程序的时候,使用cdev_del函数来完成。而且要最后释放掉设备号。

八.关于应用程序使用系统调用,最终调用内核空间的驱动函数(设备方法):
1.在应用程序汇编的时候,将要调用的系统调用编号存入r7,
2.执行svc指令完成从应用空间到内核空间的跳转
3.取出系统调用编号
4.查表得到对应内核空间的实际的代码(函数)
5.通过vfs_read函数实际调用驱动函





时间: 2024-10-10 15:15:28

专题10-字符设备驱动模型的相关文章

字符设备驱动模型

1.设备描述结构cdev驱动模型种类繁多,这就需要我从众多的模型中提取出他们的一些共性:a.驱动初始化a.1 分配设备描述结构a.2 初始化设备描述结构a.3 注册设备描述结构a.4 硬件初始化b.实现设备操作c.驱动注销 ------------------------------------------------------------------ 设备描述结构:在任何一种驱动模型中,设备都会用的内核中的一种结构来描述,我们的字符设备在内核中使用struct cdev 来来描述.struc

第四季-专题13-总线设备驱动模型

专题2-总线设备驱动模型 第1课-总线设备驱动模型 总线模型概述 随着技术的不断进步,系统的拓扑结构也越来越复杂,对热插拔,跨平台移植性的 要求也越来越高,2.4内核已经难以满足这些需求.为适应这种形势的需要,从Linux 2.6内核开始提供了全新的设备模型. 总线 (1)     描述结构 在Linux 内核中, 总线由bus_type 结构表示, 定义在<linux/device.h> struct bus_type { const char *name; /*总线名称*/ const c

linux设备驱动之字符设备驱动模型(2)

在上一篇中我们已经了解了字符设备驱动的原理,也了解了应用层调用内核函数的机制,但是我们每次操作设备,都必须首先通过mknod命令创建一个设备文件名,比如说我们要打开u盘,硬盘等这些设备,难道我们还要自己创建,就如同刘老师常说的一句话,这也太山寨了吧,所以我们今天我们来点比较专业的,让函数帮我们自动创建: 在Linux 下,设备和驱动通常都需要挂接在一种总线上,总线有PCI.USB.I2C.SPI 等等,总线是处理器和设备之间的通道,在设备模型中,所有的设备都通过总线相连,一总线来管理设备和驱动函

linux字符设备驱动

一.字符设备.字符设备驱动与用户空间访问该设备的程序三者之间的关系. 如图,在Linux内核中使用cdev结构体来描述字符设备,通过其成员dev_t来定义设备号(分为主.次设备号)以确定字符设备的唯一性.通过其成员file_operations来定义字符设备驱动提供给VFS的接口函数,如常见的open().read().write()等. 在Linux字符设备驱动中,模块加载函数通过register_chrdev_region( ) 或alloc_chrdev_region( )来静态或者动态获

深入浅出~Linux设备驱动之字符设备驱动

一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等. 块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等. 每一个字符设备或块设备都在/dev目录下对应一个设备文件.linux用户程序通过设备文件(或称设备节点)来使用驱动程序操作字符设备和块设备

Linux内核分析(五)----字符设备驱动实现

原文:Linux内核分析(五)----字符设备驱动实现 Linux内核分析(五) 昨天我们对linux内核的子系统进行简单的认识,今天我们正式进入驱动的开发,我们今后的学习为了避免大家没有硬件的缺陷,我们都会以虚拟的设备为例进行学习,所以大家不必害怕没有硬件的问题. 今天我们会分析到以下内容: 1.      字符设备驱动基础 2.      简单字符设备驱动实现 3.      驱动测试 l  字符设备基础 1.       字符设备描述结构 在linux2.6内核中,使用cdev结构体描述一

【转】深入浅出:Linux设备驱动之字符设备驱动

深入浅出:Linux设备驱动之字符设备驱动 一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等. 块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等. 每一个字符设备或块设备都在/dev目录下对应一个设备文件.linux用户程序通过设备文件(或称

(57)Linux驱动开发之三Linux字符设备驱动

1.一般情况下,对每一种设备驱动都会定义一个软件模块,这个工程模块包含.h和.c文件,前者定义该设备驱动的数据结构并声明外部函数,后者进行设备驱动的具体实现. 2.典型的无操作系统下的逻辑开发程序是:这种三层的裸机驱动模型是足够满足低耦合.高内聚的特点的. 3.当有操作系统存在时,设备驱动成为了连接硬件和内核的桥梁,这时候的设备驱动对外表现为操作系统的API,与直接裸机开发不同,裸机开发时的设备驱动是应用工程师的API.如果设备驱动都按照操作系统给出的独立于设备的接口而设计,应用程序将可以使用统

Linux字符设备驱动注册流程

其中一部分从伯乐在线和网络上摘抄的内容,不用于商业用途. 一.linux系统将设备分为3类:字符设备.块设备.网络设备. 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等. 块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等. 每一个字符设备或块设备都在/d ev目录下对应一个设备文件.linux用户程序通过设备文件(或