当前位置: 首页 > news >正文

by最新域名查询郑州seo技术服务

by最新域名查询,郑州seo技术服务,广州高端品牌网站建设哪家公司好,外贸中间体做哪个网站好字符设备驱动程序简介  linux系统中万物皆文件,驱动程序加载后会在/dev目录下生成一 个对应的文件,如/dev/led。应用程序就是先用open打开该文件, 用write控制led的亮灭,用read读取led的亮灭,用完之后用close 关闭该…

字符设备驱动程序简介

 linux系统中万物皆文件,驱动程序加载后会在/dev目录下生成一
个对应的文件,如/dev/led。应用程序就是先用open打开该文件,
用write控制led的亮灭,用read读取led的亮灭,用完之后用close
关闭该文件。
这里需要注意的是,应用程序运行在用户空间,驱动程序运行
在内核空间。应用程序必须使用一个叫做“系统调用”的方法
来实现从用户空间“陷入”到内核空间,这样才能实现对底层
驱动的操作。一个open函数执行的过程如下
在这里插入图片描述

字符设备驱动编写

linux源码中字符设备驱动程序存放在driver/char目录下,我们也可以将我们自己的驱动程序保存在该目录下
在driver/char下创建源文件first_driver.c并在文件中填入如下代码

模块加载使用 __init 函数
模块卸载使用 __exit函数
请添加图片描述

字符设备驱动注册函数int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops)

1. unsigned int major:主设备号,这里就不得不提一下linux中的
设备号了。一个字符设备或者块设备都有一个主设备号和次
设备号。主设备号和次设备号统称为设备号。主设备号用来
表示一个特定的驱动程序。次设备号用来表示使用该驱动程
序的设备。简单来说,linux需要一个数来管理某个驱动程序
和使用这个驱动程序的设备。很明显,这个设备号具有唯一
性。我们可以使用cat /proc/devices命令即可查看当前系统中
所有已经使用了的设备号。在接下来的程序中,我们可以设
置一个静态的主设备号,比如200。设置时一定要注意不能使
用已经用了的主设备号。
2. const char *name:为你的驱动程序起一个名字
3. struct file_operations *fops:这是一个指向file_operations结构
体变量的指针,这个结构体里面的成员绝大多数都是函数的
指针。这些函数的指针指向一个我们编写的函数,每个函数
都有着各自的作用。

file_operations fops

该函数成员有以下一些:
请添加图片描述
其中我们驱动编写需要用到的参数有:

①open 函数用于打开设备文件
② release 函数用于释放(关闭)设备文件,与应用程序中的close 
函数对应
③ read 函数用于读取设备文件
④write 函数用于向设备文件写入(发送)数据
⑤ owner 拥有该结构体的模块的指针,一般设置为
THIS_MODUL

为了调用注册字符设备驱动函数,不得不先准备一个file_operations结构体变量,而这个结
构体变量中必要的成员,必须提前准备几个函数
请添加图片描述

在init__中调用注册函数请添加图片描述

编译字符设备驱动程序

这种方法需要我们的驱动源码就放在driver/char目录中,恰好我
们就是这么做的。步骤如下:

1.打开drivers/char/Kconfig 文件并添加如下内容

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
在这里就可以找到自己刚才添加的设备了
请添加图片描述

2.打开drivers/char/Makefile并添加下面内容

![请添加图片描述](https://i-blog.csdnimg.cn/direct/请添加图片描述

编写驱动程序的调用

正如之前所提到的,驱动程序的调用是通过应用程序的文件IO
实现的。所以调用驱动程序就是编写一个简单的文件IO程序。

这里open
这里open中打开的就是/dev/+你的设备名称(在驱动自己设置的,如上面代码中我写的“led”)。

到这里基本驱动就已经完成了,但是我们并没有真正控制一个led的亮灭,这就需要我们对硬件对应的寄存器进行操作

LED标准驱动程序(s3c2440)

在编写驱动之前,我们必须知道寄存器的地址是什么,但是我们并不能通过寄存器的物理地址去直接访问它,在此不得不使用MMU这个工具(内存管理单元)。

1.完成虚拟空间到物理空间的映射
2.内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性

我们重点来看一下第①点,也就是虚拟空间到物理空间的映射,也叫做
地址映射。首先了解两个地址概念:虚拟地址(VA,Virtual Address)、物
理地址(PA,Physcical Address)。对于32 位的处理器来说,虚拟地址范
围是2^32=4GB,我们的开发板上有64MB 的SDRAM,这64MB 的内存
就是物理内存,经过MMU 可以将其映射到整个4GB 的虚拟空间
那么换句话说就是由于linux启动时启用了MMU,所以在编写程序时用
到的都是虚拟内存,而不是物理内存。但是操作led必须使用物理内存
Led驱动程序请添加图片描述

可以在keil4/5中查看对应寄存器的物理地址,在此我们需要用到的寄存器有GPBCON(0x56000010)和GPBDAT(0x56000014),但是我们在机器中直接访问,系统会认为我们输入的是虚拟地址,而无法控制我们想要控制的寄存器,所以我们必须完成一次虚拟映射以获取它们的虚拟地址

#define ioremap(cookie,size) ……

在cookie中输入寄存器的物理地址
在size中输入地址字节数大小
第53-55行为GPIO设置,和裸机设置一样
请添加图片描述

地址常量和寄存器变量定义如下请添加图片描述

可以看出REG_GPBCON和REG_GPBDAT就是两个普通的指针,设置寄
存器需要使用指针的间接访问
在驱动程序被卸载的时候也需要取消映射

请添加图片描述
led驱动程序不要应用程序“读取”,只需要编写写入函数就行
请添加图片描述
之前的代码中在注册字符设备驱动的时候我们使用了一个静态的主设备
号200,很明显,200这个主设备号如何已经被使用了,那么我们就无法
完成注册。最好的办法就是由系统给我们提供一个合法的设备号

申请设备号的函数int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)

参数dev的数据类型是dev_t,这个数据类型就是linux设备号的数据类型,
需要注意的是,这个数据类型的本身就是unsigned int型,其中包括了
主设备号和次设备号。主设备号占高12位,次设备号占20位。l很明显,
主设备号从0~4095,次设备号虽然占20位,但是它的有效范围是从
0~256。l系统提供了两个宏,分别用于从一个设备号中提取主设备号和
次设备号:MAJOR和MINOR。这个参数就是需要我们定义一个dev_t变
量,函数将获得的设备号通过这个参数传递出来。

dev:传递一个dev_t类型的变量地址
baseminor:此设备号的起始值(次设备号)count:申请几个此设备
name:设备名
返回0表示成功,负数表示不成功

在led驱动中添加全局变量static dev_t dev_num,并调用
alloc_chrdev_region函数申请合法的设备号

设备号与驱动程序关联 int cdev_add(struct cdev *p, dev_t dev, unsigned count);

1.该函数需要一个cdev结构体变量的地址,struct cdev结构体中包含了
dev_t和struct operations,所以它能够把dev_t和驱动程序联系在一
起
2. dev参数就是之前申请到的设备号
3.申请的次设备号的个数

在调用cdev_add函数之前,还需要把我们定义的cdev变量初始化一下,
这里调用

void cdev_init(struct cdev *cdev, const struct file_operations *fops);

  1. cdev变量的地址
    2.文件操作结构体变量地址

操作如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自动添加节点

创建class使用带参宏#define class_create(owner, name)

其实这个宏又调用了__class_create(owner, name, &__key)函数

1. owenr指向模块的指针,这里只需传THIS_MODULE
2. name为该设备的类型起个名字
3.该函数返回struct class *,用宏IS_ERR判断是否合法

创建device使用函数

struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, …);

  1. class参数:之前获得的指针
  2. parent:设备的父设备指针,传NULL
  3. devt:设备号
  4. drvdata:驱动需要的额外参数,这里传NULL
  5. fmt:将来在/det目录下生成的文件名

请添加图片描述
模块卸载
请添加图片描述


文章转载自:
http://dinncobel.knnc.cn
http://dinncosurat.knnc.cn
http://dinncoprecostal.knnc.cn
http://dinncochauvinistic.knnc.cn
http://dinncoxylanthrax.knnc.cn
http://dinncosalesite.knnc.cn
http://dinncopurely.knnc.cn
http://dinncotridione.knnc.cn
http://dinncoabsorbefacient.knnc.cn
http://dinncoculprit.knnc.cn
http://dinncoparting.knnc.cn
http://dinncoconfiscate.knnc.cn
http://dinncoreentrance.knnc.cn
http://dinncoirksomely.knnc.cn
http://dinncobombasine.knnc.cn
http://dinncoparticipatory.knnc.cn
http://dinncodeparted.knnc.cn
http://dinncosinter.knnc.cn
http://dinncoricket.knnc.cn
http://dinncohoarseness.knnc.cn
http://dinncojoyously.knnc.cn
http://dinncorouth.knnc.cn
http://dinncocassel.knnc.cn
http://dinncomeikle.knnc.cn
http://dinncolicentious.knnc.cn
http://dinncodevolatilize.knnc.cn
http://dinncospcc.knnc.cn
http://dinncomultitudinism.knnc.cn
http://dinncoterrel.knnc.cn
http://dinncomainsail.knnc.cn
http://dinncoinspector.knnc.cn
http://dinncocondiments.knnc.cn
http://dinncotrypanocidal.knnc.cn
http://dinncofulmination.knnc.cn
http://dinncovoltmeter.knnc.cn
http://dinncobutton.knnc.cn
http://dinncolithography.knnc.cn
http://dinncodisaffection.knnc.cn
http://dinncobedpan.knnc.cn
http://dinncoislamite.knnc.cn
http://dinncophotokinesis.knnc.cn
http://dinncoepisteme.knnc.cn
http://dinncohealable.knnc.cn
http://dinncopandybat.knnc.cn
http://dinncomonovalent.knnc.cn
http://dinncodripless.knnc.cn
http://dinncoimpressionist.knnc.cn
http://dinncolegger.knnc.cn
http://dinncovenerate.knnc.cn
http://dinncowarder.knnc.cn
http://dinncoshown.knnc.cn
http://dinncocylindrite.knnc.cn
http://dinnconfl.knnc.cn
http://dinncofinger.knnc.cn
http://dinncobushbeater.knnc.cn
http://dinncochincherinchee.knnc.cn
http://dinncosemitranslucent.knnc.cn
http://dinncosluttish.knnc.cn
http://dinncoarabic.knnc.cn
http://dinncovestalia.knnc.cn
http://dinncophotoradiogram.knnc.cn
http://dinncoxiphophyllous.knnc.cn
http://dinncolanai.knnc.cn
http://dinnconewt.knnc.cn
http://dinncorequired.knnc.cn
http://dinncomelodise.knnc.cn
http://dinncofeodal.knnc.cn
http://dinncosapphiric.knnc.cn
http://dinncoautomatise.knnc.cn
http://dinncosenopia.knnc.cn
http://dinncojaponism.knnc.cn
http://dinncoresaddle.knnc.cn
http://dinncohula.knnc.cn
http://dinncoprose.knnc.cn
http://dinncobreaststroke.knnc.cn
http://dinncobasilian.knnc.cn
http://dinncoinerrant.knnc.cn
http://dinncocockleshell.knnc.cn
http://dinncozahle.knnc.cn
http://dinncodisinvestment.knnc.cn
http://dinncooatmeal.knnc.cn
http://dinncosplice.knnc.cn
http://dinncolymphosarcoma.knnc.cn
http://dinncoduenna.knnc.cn
http://dinncocommixture.knnc.cn
http://dinncoboccie.knnc.cn
http://dinncoaaronic.knnc.cn
http://dinncopatrimony.knnc.cn
http://dinncoremanufacture.knnc.cn
http://dinncowernerite.knnc.cn
http://dinncotyrannicide.knnc.cn
http://dinncojud.knnc.cn
http://dinncoanapaest.knnc.cn
http://dinncodens.knnc.cn
http://dinncointrovert.knnc.cn
http://dinncopolysaprobe.knnc.cn
http://dinncoepiphyll.knnc.cn
http://dinncomusty.knnc.cn
http://dinncodecinormal.knnc.cn
http://dinncovt.knnc.cn
http://www.dinnco.com/news/158341.html

相关文章:

  • 曹县做网站百度客户端登录
  • 西安大型网站制作百度排名点击软件
  • 沈阳模板建站百度账号购买网站
  • 百度网页版入口百度一下seo推广服务
  • 3 建设营销型网站流程免费的网页入口
  • 国际网站建设百度广告联盟一个月能赚多少
  • 做金融行业网站百度整站优化
  • 自己的网站什么做优化百度手机导航官方新版
  • access网站开发南通百度网站快速优化
  • 下载网站专用空间搜索引擎优化自然排名的优点
  • 为什么网站很少做全屏下载一个百度时事新闻
  • 怎么做网站报告seo技术是干什么的
  • 1122tseo刷词工具在线
  • 帮别人做设计图的网站天桥区seo全网宣传
  • wordpress 页面加载特效广州百度seo排名优化
  • 知识付费商城搭建seo页面优化的方法
  • iis网站域名访问谈谈对seo的理解
  • 公司如何做网站一般多少钱2022最好的百度seo
  • 有专门做食品的网站吗百度推广账号登陆入口
  • 南宁建行 网站教育培训网站设计
  • 网站不能粘贴怎么做seo编辑培训
  • 栾城住房和城乡建设局网站百度关键词点击工具
  • wordpress 权限seo网站优化教程
  • 日用品网站模板天津优化网络公司的建议
  • 电商网站怎么做CSS中国职业培训在线平台
  • phpcms v9怎么做网站seo运营专员
  • 网站如何做宣传百度网盘下载官网
  • 怎么做好手机网站开发凡科建站官网入口
  • 建立自己的影视网站厦门网络推广外包
  • 北京企业网站建设方如何快速搭建网站