




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、项目四、嵌入式系统设备驱动程序开发项目四、嵌入式系统设备驱动程序开发一、项目概况一、项目概况o 项目说明:项目说明: o 本项目利用ARM嵌入式微处理器与接口知识,在嵌入式系统的集成开发环境中采用基于Linux的应用程序设计基础上设计程序并在ARM板内烧写开发的可执行文件实现仿真月球车的测温测距避障控制。二、知识储备知识储备o 2.1 设备驱动o 设备驱动程序将复杂的硬件抽象成一个结构良好的设备,并通过提供统一的程序接口为系统的其它部分提供使用设备的能力和方法。o 设备驱动程序(应该只是)为系统的其它部分提供各种使用设备的能力,使用设备的方法应该由应用程序决定。二、知识储备知识储备o 2.1
2、设备驱动o Linux下对外设的访问只能通过驱动程序o Linux对于驱动程序有统一的接口,以文件的形式定义系统的驱动程序:o Open、Release、read、write、ioctlo驱动程序是内核的一部分,可以使用中断、DMA等操作o驱动程序需要在用户态和内核态之间传递数据二、知识储备知识储备o 2.1 设备驱动o 驱动程序与应用程序的区别驱动程序与应用程序的区别o 应用程序以main函数开始,驱动程序则没用main函数。它以特殊的模块初始化函数为入口。o 应用程序从头至尾执行一个任务,驱动程序在完成初始化后,等待系统调用。o 应用程序可以使用GLIBC等标准C函数库,驱动程序不能使用标
3、准C函数库。二、知识储备知识储备o 2.1 设备驱动o 设备驱动程序的分类设备驱动程序的分类o字符设备驱动程序字符设备驱动程序,如各种串行接口,并行接口等。o块设备驱动程序块设备驱动程序,如磁盘设备等o网络设备驱动程序网络设备驱动程序,如网卡等。o杂项设备驱动程序杂项设备驱动程序o不属于上述三种设备之外的一些设备,如SCSI,时钟等。二、知识储备知识储备o2.1 设备驱动o 驱动程序在操作系统中的位置驱动程序在操作系统中的位置o 设备驱动程序是内核代码的一部分。o驱动程序的地址空间是内核的地址空间。o驱动程序的代码直接对设备硬件(实际是设备的各种寄存器)进行控制(实际就是读写操作)。o应用程序
4、通过操作系统的系统调用执行相应的驱动程序函数。中断则直接执行相应的中断程序代码。o设备驱动程序的file_operations结构体的地址被注册到内核中的设备链表中。o块设备和字符设备以设备文件的方式建立在文件系统中的/dev目录下,而且每个设备都有一个主设备号和一个次设备号。二、知识储备知识储备o 2.1 设备驱动o 主设备号和次设备号主设备号和次设备号o 主设备号标识设备对应的驱动程序o一个驱动程序可以控制若干个设备,次设备号提供了一种区分它们的方法o系统增加一个驱动程序就要赋予它一个主设备号。这一赋值过程在驱动程序的初始化过程中o int register_chrdev(unsigned
5、 int major, const char*name,struct file_operations *fops);二、知识储备知识储备o 2.1 设备驱动o 创建设备节点o 设备已经注册到内核表中,对于设备的访问通过设备文件(设备文件与设备驱动程序的主设备号匹配),内核会调用驱动程序中的正确函数o给程序一个它们可以请求设备驱动程序的名字。这个名字必须插入到/dev目录中,并与驱动程序的主设备号和次设备号相连o使用mknod在文件系统上创建一个设备节点二、知识储备知识储备o 2.1 设备驱动o 设备驱动程序的接口设备驱动程序的接口o file_operations结构体o 主要包括:open,
6、close(或者release),read,write,ioctl,poll,mmap等o结构体spioc_fops将作为一个参数在注册一个设备驱动程序时传递给内核。o内核使用设备链表维护各种注册的设备。不同类型的设备使用不同的链表。二、知识储备知识储备2.1 设备驱动struct file_operations demo_fops = o完成了将驱动函数映射为标准接口。o例如:ostatic struct file_operations demo_fops = oowner:THIS_MODULE,owrite:demo_write,oread:demo_read,oioctl:demo_i
7、octl,oopen:demo_open,orelease:demo_release,o;o二、知识储备知识储备o 2.1 设备驱动o 设备驱动程序的使用方法设备驱动程序的使用方法o 应用层使用open、close、read、write系统调用需要编写应用程序二、知识储备知识储备o 2.2 设备驱动案例分析(LED驱动)oLED 电路原理图如下所示,由此我们可以看到5 个LED 灯分别连接到6410 处理器的GPQ26 管脚上,通过输出低电平可使LED 灯亮,高电平LED 灯灭。二、知识储备知识储备o 2.2 设备驱动案例分析(LED驱动)二、知识储备知识储备o 2.2 设备驱动案例分析(LE
8、D驱动)o 驱动程序分析:驱动程序分析:o#include /*Dynamic loading of modules into the kernel */o#include /*与printk()等函数有关的头文件*/o#include /* 与文件系统有关的头文件,如file_operations */o#include /*初始化相关头文件*/o#include o#include /*与延时相关*/o#include /*与cdev 结构相关*/二、知识储备知识储备o 2.2 设备驱动案例分析(LED驱动)o 驱动程序分析:驱动程序分析:o#include /*与自动创建设备文件相关*/
9、o#include /*与中断相关*/o#include /*与寄存器相关*/o#include /*与IO 配置相关*/o#include /*与IO 相关*/o#include o#include /*_copy_from_user*/oMODULE_LICENSE(GPL); /*表式开放源码,在linux/module.h 中定义*/o#define DEVICE_NAME leds /*该驱动的设备名*/o#define DEVICE_MAJOR 231 /*该驱动的主设备号*/o#define DEVICE_MINOR 0 /*该驱动的从设备号*/o/* IOCTL command
10、s */o#define LED_IOC_MAGIC二、知识储备知识储备o 2.2 设备驱动案例分析(LED驱动)o 驱动程序分析:驱动程序分析:o#define LED_IOC_WR_ON _IOW(LED_IOC_MAGIC, 0 x80, unsigned int)/LED ioctl 命令命令o#define LED_IOC_WR_OFF _IOW(LED_IOC_MAGIC, 0 x81, unsigned int) /LED ioctl 命令命令ostruct cdev *mycdev; /*定义字符设备结构体定义字符设备结构体*/ostruct class *myclass; /
11、*定义定义class*/odev_t devno; /*定义设备号定义设备号*/ostatic unsigned long led_table = /io 列表列表oS3C64XX_GPQ(2),oS3C64XX_GPQ(3),oS3C64XX_GPQ(4),oS3C64XX_GPQ(5),oS3C64XX_GPQ(6),o;二、知识储备知识储备o 2.2 设备驱动案例分析(LED驱动)o 驱动程序分析:驱动程序分析:ostatic long uptech_leds_ioctl(ostruct file *file,ounsigned int cmd,ounsigned long arg)oo
12、int ret;ounsigned long *buf;o/* Check type and command number */oif (_IOC_TYPE(cmd) != LED_IOC_MAGIC)/判断是不是针对此驱动的命令判断是不是针对此驱动的命令oreturn -ENOTTY;oif (arg 4) oreturn -EINVAL;oobuf = (unsigned long *)kmalloc(sizeof(*buf), GFP_KERNEL); /申请内存申请内存二、知识储备知识储备o2.2 设备驱动案例分析(LED驱动)o驱动程序分析:驱动程序分析:oif (buf = NUL
13、L)oreturn -ENOMEM;oret = _copy_from_user(buf, &arg, sizeof(unsigned long);/从用户空间将参数拷贝到从用户空间将参数拷贝到o系统空间系统空间o/printk(ret = %xn, ret);oif(ret != 0)okfree(buf);oreturn -EFAULT;ooswitch(cmd) ocase LED_IOC_WR_ON:o/printk(kernel: set led on cmd num:%lxn, buf0);ogpio_set_value(led_table*buf, 0);/设置设置IO
14、输出低电平输出低电平obreak;ocase LED_IOC_WR_OFF:o/printk(kernel: set led off cmd num:%lxn, buf0);ogpio_set_value(led_table*buf, 1); /设置设置IO 输出高电平输出高电平obreak;odefault:oreturn -EINVAL;ooreturn 0;o二、知识储备知识储备o2.2 设备驱动案例分析(LED驱动)o驱动程序分析:驱动程序分析:ostatic struct file_operations uptech_leds_fops = o.owner = THIS_MODULE
15、,o.unlocked_ioctl = uptech_leds_ioctl,o;ostatic int _init uptech_leds_init(void)ooint i;oint err;odevno = MKDEV(DEVICE_MAJOR, DEVICE_MINOR);/获得获得dev_t 类型的设备类型的设备o号号oregister_chrdev_region(devno,1, DEVICE_NAME);/申请设备号申请设备号devnoomycdev = cdev_alloc();/动态申请动态申请cdev 内存内存omycdev-ops = &uptech_leds_fo
16、ps;/ops 初始化初始化omycdev-owner = THIS_MODULE;/ owner 初始化初始化oerr = cdev_add(mycdev, devno, 1);/注册字符设备注册字符设备oif (err != 0)oprintk(s3c6410 leds device register failed!n);omyclass = class_create(THIS_MODULE, DEVICE_NAME);/创建一个创建一个classoif(IS_ERR(myclass) oprintk(Err: failed in creating class.n);oreturn -1;
17、o二、知识储备知识储备o2.2 设备驱动案例分析(LED驱动)o驱动程序分析:驱动程序分析:odevice_create(myclass,NULL,MKDEV(DEVICE_MAJOR,DEVICE_MINOR),NULL,DEVICE_NAME); /创建设备文件创建设备文件ofor (i = 0; i 5; i+) os3c_gpio_cfgpin(led_tablei, S3C_GPIO_SFN(1);/初始化设置管脚为输出方初始化设置管脚为输出方o式式ogpio_set_value(led_tablei, 1);/设置输出高电平设置输出高电平ooprintk(DEVICE_NAME i
18、nitializedn);oreturn 0;oostatic void _exit uptech_leds_exit(void)oocdev_del(mycdev); /删除字符设备删除字符设备odevice_destroy(myclass,devno);/删除设备文件删除设备文件oclass_destroy(myclass);/删除删除classounregister_chrdev_region(devno,1);/释放申请的设备号释放申请的设备号o二、知识储备知识储备o 2.2 设备驱动案例分析(LED驱动)o 应用程序分析:应用程序分析:o#include o#include o#in
19、clude o#include /*ioctl 函数头文件函数头文件*/o/* IOCTL commands */o#define LED_IOC_MAGIC lo#define LED_IOC_WR_ON _IOW(LED_IOC_MAGIC, 0 x80, unsigned int)/ioctl 的命令的命令o#define LED_IOC_WR_OFF _IOW(LED_IOC_MAGIC, 0 x81, unsigned int) /ioctl 的命令的命令oint main(int argc, char *argv)ooint i;oint on;oint led_number;oi
20、nt fd;二、知识储备知识储备o 2.2 设备驱动案例分析(LED驱动)o 应用程序分析:应用程序分析:oif (argc != 3 | sscanf(argv1, %d, &led_number) != 1 | sscanf(argv2,%d,o&on) != 1 |on 1 | led_number 5) ofprintf(stderr, Usage:n);ofprintf(stderr, t ./led led_number on|offn);ofprintf(stderr, Options:n);ofprintf(stderr, t led_number from 0
21、 to 4n);ofprintf(stderr, t on: 1 off: 0n);oexit(1);oofd = open(/dev/leds, 0);/打开/dev/led 设备文件oif (fd 0) operror(open device /dev/leds);oexit(1);o二、知识储备知识储备o 2.2 设备驱动案例分析(LED驱动)o 应用程序分析:应用程序分析:oif(on = 0 x01)oioctl(fd, LED_IOC_WR_ON, led_number);/开灯操作ooelse if(on = 0 x00)oioctl(fd, LED_IOC_WR_OFF, le
22、d_number);/关灯操作oofor(i=0;i100;i+)ousleep(1000);oclose(fd);oreturn 0;o二、知识储备知识储备o 2.3 红外测温技术o温度测量分为接触式和非接触式两大类。o 接触式测温接触式测温o 测温元件直接与被测对象相接触,两者之间进行充分的热交换达到热平衡,这时感温元件的某一物理参数的量值就代表了被测对象的温度值。o 优点:直观可靠。o 缺点: 感温元件影响被测温度场的分布;o 接触不良等带来测量误差;o 高温和腐蚀性介质影响感温元件的性能和寿命。o 非接触式测温非接触式测温 o感温元件不与被测对象相接触,而通过热辐射进行热交换;o具有较
23、高的测温上限;o热惯性小,可达千分之一秒,故便于测量运动物体的温度和快速变化的温度。二、知识储备知识储备o 2.3 红外测温技术o 1800 年,赫胥尔首先发现了红外辐射,经过几代科学家100 多年的探索、实验与研究,总结出了正确的辐射定律,为成功地研制红外辐射测温仪奠定了理论基础。20 世纪60 年代以后,由于各种高灵敏度红外探测器、干涉滤光片以及数字信号处理技术的发展,大大促进了红外技术应用的进程。近几十年来,比色测温仪、光纤测温仪、扫描测温仪等满足各种需要的红外测温仪相继出现和不断改进,使红外技术的研究与应用有了新的飞跃。虽然红外测温技术问世的时间并不很长,但是它安全、可靠、非接触、快速
24、、准确、方便、寿命长等不可替代的优势,已被越来越多的企业与厂家所认识和接受,在冶金、石化、电力、交通、水泥、橡胶等行业得到了广泛的应用,成为企业故障检测、产品质量控制和提高经济效益的重要手段。二、知识储备知识储备o 2.3 红外测温技术o 红外线传感器是利用红外线的物理性质来进行测量的传感器。红外线又称红外光,它具有反射、折射、散射、干涉、吸收等性质。任何物质,只要它本身具有一定的温度(高于绝对零度),都能辐射红外线。红外线传感器测量时不与被测物体直接接触,因而不存在摩擦,并且有灵敏度高,响应快等优点。 红外线传感器包括光学系统、检测元件和转换电路。光学系统按结构不同可分为透射式和反射式两类。
25、检测元件按工作原理可分为热敏检测元件和光电检测元件。热敏元件应用最多的是热敏电阻。热敏电阻受到红外线辐射时温度升高,电阻发生变化,通过转换电路变成电信号输出。光电检测元件常用的是光敏元件,通常由硫化铅、硒化铅、砷化铟、砷化锑、碲镉汞三元合金、锗及硅掺杂等材料制成。 二、知识储备知识储备o 2.3 红外测温技术o 红外线传感器常用于无接触温度测量,气体成分分析和无损探伤,在医学、军事、空间技术和环境工程等领域得到广泛应用。例如采用红外线传感器远距离测量人体表面温度的热像图,可以发现温度异常的部位,及时对疾病进行诊断治疗(见热像仪);利用人造卫星上的红外线传感器对地球云层进行监视,可实现大范围的天
26、气预报;采用红外线传感器可检测飞机上正在运行的发动机 的过热情况等。 二、知识储备知识储备o2.3 红外测温技术o红外温度传感器:二、知识储备知识储备o 2.4 红外测距技术o 利用的是红外线传播时的不扩散原理,因为红外线在穿越其它物质时折射率很小,所以长距离的测距仪都会考虑红外线,而红外线的传播是需要时间的,当红外线从测距仪发出碰到反射物被反射回来被测距仪接受到,再根据红外线从发出到被接受到的时间及红外线的传播速度就可以算出距离。o 利用高频调制的红外线在待测距离上往返产生的相位移推算出光束度越时间t,从而根据D=Ct/2得到距离D。二、知识储备知识储备o 2.4 红外测距技术o 集成红外测
27、距传感器三、 项目实现项目实现3.1硬件原理图 红外测温原理图三、 项目实现项目实现o 3.2 程序流程图开始初始化设置等待启动命令小车避障寻迹测温测距 判断有要避障?停车,关闭设备是否结束三、 项目实现项目实现o3.3 源程序分析源程序分析o#defineNUM_EXTRAIO 4o#defineS3C2440_GPIO_OUTPUT 1o#defineS3C2410_GPIO_INPUT 0o/ 扩展接口上的数字口文件描述符oint extraio_fd = 0;oenum EXTRAIOPUTooEINT11=0,oEINT13,oEINT6,oEINT3,o;ostatic unsig
28、ned char extraio_table = oEINT11 ,/ EINT11oEINT13,/ EINT13oEINT6,/ EINT6oEINT3,/ EINT3o;三、 项目实现项目实现o3.3 源程序分析源程序分析ostatic unsigned int extraio_cfg_table = oS3C2440_GPIO_OUTPUT,oS3C2440_GPIO_OUTPUT,oS3C2440_GPIO_OUTPUT,oS3C2440_GPIO_OUTPUT,o;o/ 读取扩展板上的数字口ounsigned char extraioRead()ooif(extraio_fd =
29、0)ooextraio_fd = open(/dev/extraio, O_RDWR);oif (extraio_fd 0)ooprintf(cannot open extraio device, line:%dn, _LINE_);oreturn -1;ooounsigned char but=0;oread(extraio_fd, &but, sizeof(but);oreturn but;o三、 项目实现项目实现o 3.3 源程序分析源程序分析o/ 对扩展板上的数字口进行写操作ovoid extraioWrite(unsigned char but)ooif(extraio_fd
30、 = 0)ooextraio_fd = open(/dev/extraio, O_RDWR);oif (extraio_fd 0)ooprintf(cannot open extraio device, line:%dn, _LINE_);oreturn;ooowrite(extraio_fd, &but, sizeof(but);o三、 项目实现项目实现o3.3 源程序分析源程序分析o/ 配置扩展板上的数字口ovoid extraioConfig()ooif(extraio_fd = 0)ooextraio_fd = open(/dev/extraio, O_RDWR);oif (extraio_fd 0)ooprintf(cannot open extraio device, line:%dn, _LINE_);oreturn;oooint i, cfg=0;ofor(i=0; iNUM_EXTRAIO; i+)ocfg += (extraio_cfg_table
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 综合科技类博物馆在线平台企业制定与实施新质生产力战略研究报告
- 农村黄酒销售合同标准文本
- 会员代销合同标准文本
- 共同运营合同标准文本
- 石油焦制针状焦企业制定与实施新质生产力战略研究报告
- 仓储项目合作合同标准文本
- 入聘合同标准文本
- ktv装修有合同标准文本
- 农村发展产业合同标准文本
- 高血压脑小血管病患者抑郁、淡漠与影像学标志物及认知功能相关性研究
- 英语-安徽省安庆市2024-2025学年高三下学期第二次模拟考试试卷(安庆二模)试题和答案
- 2025届江苏省七市高三第二次调研测试物理+答案
- 2025年第六届(中小学组)国家版图知识竞赛测试题库及答案
- T∕ZZB 2708-2022 化妆品包装用玻璃瓶
- 古色古香的平遥古城 课件(共23张ppt)
- 美能达bizhub presc8000快速操作指南
- 某煤矿万吨矿井初步设计设计
- 不随行父母同意函(父母双方不随行)
- 案例——温泉度假村ppt课件
- 中医诊所备案信息表
- 网格本模板(A4) (2)
评论
0/150
提交评论