1、 毕业设计说明书基于ARM和QT的多路信号检测系统设计 摘 要 摘 要随着嵌入式越来越受到重视,嵌入式系统近年来的发展有目共睹,嵌入式系统的应用越来越广泛。无论是传统的工业监测、机械控制,还是新兴的移动通讯、数字娱乐,嵌入式系统正逐渐走进人们的生活生产的方方面面。在工业检测方面,传统的监控系统主要以单片机为硬件载体进行设计,功能相对单一,可视化及拓展性有限。随着Linux系统的不断升级换代,现在出现了以ARM芯片为载体,以Linux系统为软件平台设计出的新一代监控系统。除了能实现原有单片机的功能外,其可视化更强,具备网络通信功能,是一台具备功能拓展更丰富的微型计算机。本文将以北京博创兴业科技有
2、限公司提供的UP-NetARM2410-S 实验仪器为硬件载体,对监测系统的设计进行研究和应用。系统平台使用的是Linux2.4.18的内核,GUI首次以Qt为底层图形模块,用C+和Qt图形用户界面类库开发图形数据一体化监控平台。本文先从硬件平台设计入手,根据要求对硬件设备进行了解,设计了功能模块,在软件部分移植了Linux操作系统平台,构建了开发环境,就数模转换、触摸屏驱动程序进行编程,最后详述在了Qt下,如何使用C+语言设计监控系统图形界面。最后展现了系统运行效果,并提出了改进意见。运行效果表明,设计的监控系统是有效和实时的。关键词:嵌入式系统 Linux 驱动 QtIII Abstrac
3、t AbstractWith the increasing importance of embedded technology, the development of embedded systems for all to see in recent years, embedded system applications increasingly broad. Whether in traditional industrial monitoring, mechanical control, or the emerging mobile communications, digital enter
4、tainment, embedded systems are gradually moved into all aspects of production and lives of the people. In the industrial testing, the traditional embedded control systems primarily for the single-chip microcomputer hardware vector design function relatively single, visualization, and limited scalabi
5、lity. With the Linux system constantly upgrading and updating, and now appeared to ARM chip carrier and Linux systems software platform designed for a new generation of monitoring system. In addition to achieving the original microcontroller functions, visualizations stronger, equipped with the netw
6、ork communication function is a function of developing a more abundant micro-computer.This paper, based on UP-NetARM2410-S experiment instrument provided by the BeijingUniversalPioneeringTechnologyCo., LTD., designs a monitoring system to conduct research and application. System platform is Linux2.4
7、.18 kernel, GUI for the first time in the bottom Qt graphics module, using C+ and Qt graphical user interface library monitor the development of graphical data integration platform.This article first start with the hardware platform design, required to understand the hardware devices designed module
8、s, ported in the software part of the Linux operating system platform, build the development environment, how to build a development environment, and were on the A/D conversion, touch screen driver programming, the final details in Qt, how to use C+ language designed monitoring system graphical inte
9、rface. As an application of research papers, the paper mainly on the software design, while the diagnosis and monitoring technology provides a similar software design and development of the reference model.The study proved to be effective and real-time.Key words: Embedded system,Linux,Driver,Qt 目 录
10、目 录摘 要IAbstractII目 录III第一章 前言11.1课题研究背景和意义11.2嵌入式技术发展现状与未来11.3课题研究内容2第二章 基于ARM和QT的多路信号监测系统硬件设计32.1系统组成32.2 S3C2410介绍32.3设计方案72.4 ADC硬件设计82.4.1 ADC 转换器82.4.2 A/D转换器在扩展板的连接9第三章 嵌入式linux移植及驱动开发113.1 linux主要特征113.2 驱动程序开发123.2.1 嵌入式linux驱动程序开发方法123.2.2 ADC在ARM中的驱动开发123.2.3 触摸屏在ARM中的驱动开发21第四章 信号监测应用软件设计2
11、64.1 Qt 主要特性264.2 Qt 类库及其机制简介274.2.1 Qt类库274.2.2 Qt 对象间通讯机制284.3 信号监测UI 设计294.4信号监测UI和驱动连接30第五章 总结与展望375.1 全文总结375.2 展望37参考文献38致 谢39附录40 第一章 前言 第一章 前言1.1课题研究背景和意义在现在日益信息化的社会中,计算机和网络已经全面渗透到日常生活的每一个角落。对于我们每个人,需要的已经不再仅仅是那种放在桌上处理文档,进行工作管理和生产控制的计算机机器;各种各样的新型嵌入式系统设备在应用数量上已经远远超过通用计算机。而在工业和服务领域中,使用嵌入式技术的数字机
12、床,智能工具,工业机器人,服务机器人也将逐渐改变传统的工业和服务方式。目前嵌入式系统技术已经成为了最热门的技术之一,吸引了大批的优秀人才投入其中。嵌入式系统可以称为后PC时代和后网络时代的新秀。由于嵌入式系统采用的是微处理器,实现相对单一的功能,采用独立的操作系统,所以往往不需要大量的外围器件。因而在体积上,功耗上有其自身的优势。嵌入式在应用中拥有广阔的前景!1.2嵌入式技术发展现状与未来嵌入式系统是将计算机技术、半导体技术和电子技术与各个行业的具体应用相结合后的产物,是一门综合技术学科。由于空间和各种资源相对不足,嵌入式系统的硬件和软件都必须高效率地设计,量体裁衣、去除冗余,力争在同样的硅片
13、面积上实现更高的性能,这样才能在具体应用中对处理器的选择更具有竞争力。 作为软硬件高度结合的产物。为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存贮于磁盘等载体中。片上系统,板上系统的实现,使得以pda等为代表的这类产品拥有更加熟悉的操作界面和操作方式,比着传统的商务通等功能更加完善,实用。因为嵌入式系统往往和具体应用有机地结合在一起,它的升级换代也是和具体产品同步进行,因此嵌入式系统产品一旦进入市场,具有较长的生命周期。 从软件方面讲,软件功能趋向专一化。掌上设备的各种通讯,管理软件需求量极大,开发环境齐备,可以完全在PC机上进行,通过软件模拟调
14、试,等到模拟通过再下载入机器,而且因为可以使用大量的PC机的API函数,SDK,所以开发过程是在已有的成熟技术基础上进行,相对简单。硬件方面,不仅有各大公司的微处理器芯片,还有用于学习和研发的各种配套开发包。目前低层系统和硬件平台经过若干年的研究,已经相对比较成熟,实现各种功能的芯片应有尽有。而且巨大的市场需求给我们提供了学习研发的资金和技术力量。从软件方面讲,也有相当部分的成熟软件系统。国外商品化的嵌入式实时操作系统,已进入我国市场的有WindRiver、Microsoft、QNX和Nuclear等产品。我国自主开发的嵌入式系统软件产品如科银(CoreTek)公司的嵌入式软件开发平台Delt
15、aSystem,它不仅包括DeltaCore嵌入式实时操作系统,而且还包括LamdaTools交叉开发工具套件、测试工具、应用组件等;此外,中科院也推出了Hopen嵌入式操作系统(虽然还不够完善)。同时由于是研究热点,所以我们可以在网上找到各种各样的免费资源,从各大厂商的开发文档,到各种驱动,程序源代码,甚至很多厂商还提供微处理器的样片。这对于我们从事这方面的研发,无疑是个资源宝库。对于软件设计来说,不管是上手还是进一步开发,都相对来说比较容易。这就使得很多生手能够比较快的进入研究状态,利于发挥大家的积极创造性。6嵌入式系统是这个后PC时代的擎天之柱。我们有理由相信,未来的电子技术就是嵌入式系
16、统技术的天下。1.3课题研究内容嵌入式系统逐渐成为IT业界技术研究和产品开发的热点。其重要性随着手持设备的普及而越来越突出。本文通过对嵌入式linux和qt的分析与研究,在Qt和ADC自定义驱动的基础上,开发了基于S3C2410和ADC实现对多路模拟量信号的实时监测系统,利用QT和液晶实现图形化显示数据。一体化的图形界面非常方便用户观测,充分地体现了嵌入式系统的优势。此外Qt作为一个GUI解决方案,可用于对GUI大小要求苛刻的系统中。- 38 - 第二章 基于ARM和QT的多路信号监测系统硬件设计 第二章 基于ARM和QT的多路信号监测系统硬件设计2.1系统组成信号监测系统设计包括信号采集模块
17、、数据处理功能电路模块、以及液晶显示模块,如图2-1所示。这些模块使得该设备拥有强大的功能,集信号采集、数据处理、参数显示为一体,用户可方便的对多路信号进行实时监测。图2-1 系统概要框图2.2 S3C2410介绍S3C2410处理器是Samsung公司基于ARM公司的ARM920T处理器内核,采用0.18um制造工艺的32位微控制器。该处理器拥有:独立的16KB指令Cache和16KB数据Cache,MMU,支持TFT的LCD控制器, NAND闪存控制器,3路UART,4路DMA,4路带PWM的Timer ,I/O口,RTC,8路10位ADC,Touch Screen接口,IIC-BUS 接
18、口,IIS-BUS 接口,2个USB主机,1个USB设备,SD主机和MMC接口,2路SPI。S3C2410处理器最高可运行在203MHz。1,7,11图2-2 S3C2410资源结构图CPU:S3C2410X芯片是基于ARM920T内核,主频200M,提供如下功能: 1.8V内核电压/电源管理有Normal、Slow、Idle、Stop和Power-off模式3.3V内存电压、3.3V的处理器IO电压,处理器拥有16KB I-Cache, 16KB D-Cache, 和MMU外部SDRAM控制器 集成LCD控制器可以支持4K color STN and 64K color TFT,1个通道的专
19、用DMA用于显存刷新 有外部请求引脚的4通道DMA,3通道的UART,支持IrDA1.0 16-byteFIFO, 1个通道的SPI 1个多主IIC总线控制器,一个IIS总线控制器 SDHost支持1.1的多媒体协议 两个USB1.1控制器,可以配置成为host或device 4通道PWM和一通道的内部定时器 /8通道10bitADC和触摸屏控制器看门狗定时器 /117个外部通用IO、24个外部中断源其中本文主要显示应用ADC和LCD资源!UP-NetARM2410-S 实验仪器硬件配置如下表:表2-1UP-NetARM2410-S 实验仪器硬件配置配置名称型号说明CPUARM920T结构芯片
20、三星S3C2410X工作平率203MHzFLASHSAMSUNG K9F120864M NANDSDRAMHY57V561620AT-H32M*2=64MEtherNet网卡AX88796两片,10/100M自适应LCDLQ080V3DG018寸16bitTFT触摸屏SX-080-W4R-FBFM7843驱动LEDZLG7290四个共阴极LEDUSB接口4个HOST/1个DEVICE由AT43301构成USB HUBUART/IrDA2个RS232,1个RS485,1个IrDA从处理器的UART2引出AD由S3C2410芯片出3个电位器控制输入AUDIOIIS总线,UDA1341芯片44.1K
21、Hz音频拓展卡插槽168Pin EXPORT总线直接拓展GPS_GORS拓展板SIMCOM的SIM100-E模块支持双道语音通信IDE/CF卡插座笔记本硬盘,CF卡PCMCIA和SD卡插座PCMCIA型号为DWL-650PS2PC键盘和鼠标由ATMEGA8单片机控制IC卡座AT24CXX系列由ATMEGA8单片机控制DC/STEP电机DC由PWM控制,STEP由74HC573控制CAN BUS由MCP2510和TJA1050构成Double DAMAX504两个10位DAC端口调试接口JTAG14针、20针UP-NetARM2410-S试验箱图如下:图2-3 UP-NetARM2410-S试验
22、箱图2-4 UP-NetARM2410-S2.3设计方案图2-5 系统结构图如图2-5所示,电流电压信号经过电阻分压简单滤波后送入S3C2410 ADC模块,S3C2410接受电阻触摸屏输入和鼠标输入,并送显示。2.4 ADC硬件设计2.4.1 ADC 转换器A/D 转换器是模拟信号源和CPU 之间联系的接口,它的任务是将连续变化的模拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。在工业控制和数据采集及许多其他领域中,A/D 转换是不可缺少的。A/D 转换器有以下类型:逐位比较型、积分型、计数型、并行比较型、电压频率型,主要应根据使用场合的具体要求,按照转换速度、精度、价
23、格、功能以及接口条件等因素来决定选择何种类型。1常用的有以下两种: 双积分型的 A/D 转换器双积分式也称二重积分式,其实质是测量和比较两个积分的时间,一个是对模拟输入电压积分的时间T0,此时间往往是固定的;另一个是以充电后的电压为初值,对参考电源Vref反向积分,积分电容被放电至零所需的时间T1。模拟输入电压Vi 与参考电压VRef 之比,等于上述两个时间之比。由于VRef 、T0 固定,而放电时间T1 可以测出,因而可计算出模拟输入电压的大小(VRef 与Vi 符号相反)。由于T0、VRef 为已知的固定常数,因此反向积分时间T1 与输入模拟电压Vi 在T0 时间内的平均值成正比。输入电压
24、Vi 愈高,VA 愈大,T1 就愈长。在T1 开始时刻,控制逻辑同时打开计数器的控制门开始计数,直到积分器恢复到零电平时,计数停止。则计数器所计出的数字即正比于输入电压Vi 在T0 时间内的平均值,于是完成了一次A/D 转换。由于双积分型A/D 转换是测量输入电压Vi 在T0 时间内的平均值,所以对常态干扰(串摸干扰)有很强的抑制作用,尤其对正负波形对称的干扰信号,抑制效果更好。双积分型的A/D 转换器电路简单,抗干扰能力强,精度高,这是突出的优点。但转换速度比较慢,常用的A/D 转换芯片的转换时间为毫秒级。例如12 位的积分型A/D 芯片ADCETl2BC,其转换时间为lms。因此适用于模拟
25、信号变化缓慢,采样速率要求较低,而对精度要求较高,或现场干扰较严重的场合。例如在数字电压表中常被采用。逐次逼近型的 A/D 转换器逐次逼近型(也称逐位比较式)的 A/D 转换器, 主要由逐次逼近寄存器SAR、D/A 转换器、比较器以及时序和控制逻辑等部分组成。它的实质是逐次把设定的SAR 寄存器中的数字量经D/A 转换后得到电压Vc 与待转换模拟电压V。进行比较。比较时,先从SAR 的最高位开始,逐次确定各位的数码应是“1”还是“0”,其工作过程如下:转换前,先将SAR 寄存器各位清零。转换开始时,控制逻辑电路先设定SAR 寄存器的最高位为“1”,其余位为“0”,此试探值经D/A 转换成电压V
26、c,然后将Vc 与模拟输入电压Vx 比较。如果VxVc,说明SAR 最高位的“1”应予保留;如果VxVc,说明SAR 该位应予清零。然后再对SAR 寄存器的次高位置“1”,依上述方法进行D/A 转换和比较。如此重复上述过程,直至确定SAR 寄存器的最低位为止。过程结束后,状态线改变状态,表明已完成一次转换。最后,逐次逼近寄存器SAR 中的内容就是与输入模拟量V 相对应的二进制数字量。显然A/D转换器的位数N 决定于SAR 的位数和D/A 的位数。图2.4.1(b)表示四位A/D 转换器的逐次逼近过程。转换结果能否准确逼近模拟信号,主要取决于SAR 和D/A 的位数。位数越多,越能准确逼近模拟量
27、,但转换所需的时间也越长。逐次逼近式的 A/D 转换器的主要特点是:转换速度较快,在1100/s 以内,分辨率可以达18 位,特别适用于工业控制系统。转换时间固定,不随输入信号的变化而变化。抗干扰能力相对积分型的差。例如,对模拟输入信号采样过程中,若在采样时刻有一个干扰脉冲迭加在模拟信号上,则采样时,包括干扰信号在内,都被采样和转换为数字量,这就会造成较大的误差,所以有必要采取适当的滤波措施。本文所用为逐次逼近型的A/D转换器。2.4.2 A/D转换器在扩展板的连接A/D 转换器在扩展板的接法如图2-8所示,前三路通过电位器接到3.3v 电源上。图2-6 ADC电阻分压 第三章 嵌入式linu
28、x移植及驱动开发 第三章 嵌入式linux移植及驱动开发3.1 linux主要特征符合POSIX 1003.1标准POSIX 1003.1标准定义了一个最小的Unix操作系统接口,任何操作系统只有符合这一标准,才有可能运 行Unix程序。考虑到Unix具有丰富的应用程序,当今绝大多数操作系统都把满足POSIX 1003.1标准作为实现 目标,Linux也不例外,它完全支持POSIX 1003.1标准。另外,为了使Unix System V和BSD上的程序能直接在 Linux上运行, Linux还增加了部分System V和BSD的系统接口,使Linux成为一个完善的Unix程序开发系统。支持多
29、用户访问和多任务编程Linux是一个多用户操作系统,它允许多个用户同时访问系统而不会造成用户之间的相互干扰。另外, Linux还支持真正的多用户编程,一个用户可以创建多个进程,并使各个进程协同工作来完成用户的需求. 采用页式存储管理 页式存储管理使Linux能更有效地利用物理存储空间,页面的换入换出为用户提供了更大的存储空间。 支持动态链接用户程序的执行往往离不开标准库的支持,一般的系统往往采用静态链接方式-即在装配阶段就已将 用户程序和标准库链接好,这样,当多个进程运行时,可能会出现库代码在内存中有多个副本而浪费存储 空间的情况。Linux 支持动态链接方式,当运行时才进行库链接,如果所需要
30、的库已被其它进程装入内存, 则不必再装入,否则才从硬盘中将库调入。这样能保证内存中的库程序代码是唯一的。支持多种文件系统 Linux能支持多种文件系统。目前支持的文件系统有:EXT2、EXT、XIAFS、ISOFS、HPFS、MSDOS、UMSDOS、 PROC、NFS、SYSV、MINIX、SMB、UFS、NCP、VFAT、AFFS。Linux最常用的文件系统是EXT2,它的文件名长度可 达255字符,并且还有许多特有的功能,使它比常规的Unix文件系统更加安全。支持TCP/IP、SLIP和PPP在Linux中,用户可以使用所有的网络服务,如网络文件系统、远程登录等。SLIP和PPP能支持串
31、行线上的 TCP/IP协议的使用,这意味着用户可用一个高速Modem通过电话线连入Internet网中。10 3.2 驱动程序开发3.2.1 嵌入式linux驱动程序开发方法Linux 中的驱动设计是嵌入式Linux 开发中十分重要的部分,它要求开发者不仅要熟悉Linux 的内核机制、驱动程序与用户级应用程序的接口关系、考虑系统中对设备的并发操作等等,而且还要非常熟悉所开发硬件的工作原理。这对驱动开发者提出了比较高的要求,这个实验主要是给大家进入驱动设计提供一个简单入门的一个实例,并不需要提供太多与硬件相关的内容,这部分应该是通过仔细阅读芯片厂家提供的资料来解决。驱动程序的作用是应用程序与硬件
32、之间的一个中间软件层,驱动程序应该为应用程序展现硬件的所有功能,不应该强加其他的约束,对于硬件使用的权限和限制应该由应用程序层控制。但是有时驱动程序的设计是跟所开发的项目相关的,这时就可能在驱动层加入一些与应用相关的设计考虑,主要是因为在驱动层的效率比应用层高,同时为了项目的需要可能只强化或优化硬件的某个功能,而弱化或关闭其他一些功能;到底需要展现硬件的哪些功能全都由开发者根据需要而定。驱动程序有时会被多个进程同时使用,这时我们要考虑如何处理并发的问题,就需要调用一些内核的函数使用互斥量和锁等机制。驱动程序主要需要考虑下面三个方面:提供尽量多的选项给用户,提高驱动程序的速度和效率,尽量使驱动程
33、序简单,使之易于维护。23.2.2 ADC在ARM中的驱动开发一、开发环境主 机:redhat/linux2.4.2开发板:北京博创兴业科技有限公司开发的UP-NetARM2410-S 实验仪器编译器:arm-linux-gcc-4.3.2二、硬件原理分析图3-1所示S3C2410内部ADC结构图3-1 S3C2410内部ADC结构我们从上面的结构图和数据手册可以知道,该ADC模块总共有8个通道可以进行模拟信号的输入,分别是AIN0、AIN1、AIN2、AIN3、 YM、YP、XM、XP。那么ADC是怎么实现模拟信号到数字信号的转换呢?首先模拟信号从任一通道输入,然后设定寄存器中预分频器的值来
34、确定AD转换器 频率,最后ADC将模拟信号转换为数字信号保存到ADC数据寄存器0中(ADCDAT0),然后ADCDAT0中的数据可以通过中断或查询的方式来访问。 对于ADC的各寄存器的操作和注意事项请参阅数据手册。S3C2410的ADC及触摸屏控制寄存器以下有5种:(1)ADC控制寄存器:ADCCON。该寄存器各参数描述见表3-1。表3-1 ADC控制寄存器参数描述ENABLE_START置1:启动ADC转换 置0:无操作RESR_START置1:允许读操作启动ADC转换 置0:禁止读操作启动ADC转换STDBM置1:将ADC置为闲置状态(模式) 置0:将ADC置为正常操作状态SEL_MUX选
35、择需要进行转换的ADC信道PRSCVLADC转换时钟预分频参数PRSCENADC转换时钟使能ECFLGADC转换完成标志位(只读),为1:ADC转换结束 为0:ADC转换进行中(2)ADC触摸屏控制寄存器:ADCTSC。该寄存器主要是通过触摸屏的各个控制引脚来决定触摸屏转换状态,使其进行坐标轴转换,或者进入中断状态,等待触摸屏终端。各参数描述见表3-2。表3-3 ADC触摸屏控制寄存器参数描述XY_PST对X/Y轴手动测量模式进行选择AUTO_PSTX/Y轴的自动转换模式使能位PULL_UPXP端的上拉电阻使能位XP_SEN设置nXPON输出状态XM_SEN设置XMON输出状态YP_SEN设置
36、nYPON输出状态YM_SEN设置YMON输出状态保留这一位必须被设置为0(3)ADC延时寄存器:ADCDLY。该寄存器是只读的,其中控制位都是标志位和结果位。各参数描述见表3-3。表3-3 ADC延时寄存器参数描述DEDLY在普通转换模式,独立X/Y坐标转换模式,自动坐标转换模式下,X/Y坐标转换的延时时间。在等待中断模式下,当触摸屏发生触摸中断时,该寄存器在数ms间隔内产生INT_TC中断。(4)ADC数据寄存器0:ADCDATA0。该寄存器是只读的,其中控制位都是标志位和结果位。该寄存器各参数描述见表3-4。表3-4 ADC数据寄存器0参数描述XPDATAX轴转换资料寄存器XY_PST选
37、择X/Y轴自动转换模式AUTO_PSTX/Y轴自动转换使能位UPDOWN选择中断等待模式的类型 为0:按下产生中断 为1:释放产生中断保留保留位(5)ADC数据寄存器1:ADCDATA1。该寄存器是只读的,其中控制位都是标志位和结果位。该寄存器各参数描述见表3-5。表3-5 ADC数据寄存器1参数描述XPDATAX轴转换资料寄存器XY_PST选择X/Y轴自动转换模式AUTO_PSTX/Y轴自动转换使能位UPDOWN选择中断等待模式的类型 为0:按下产生中断 为1:释放产生中断保留保留位图3-2 ADC接口电路图上图是UP-NetARM2410-S上的ADC应用实例,开发板通过一个10K的电位器
38、(可变电阻)来产生电压模拟信号,然后通过第一个通道(即:AIN0)将 模拟信号输入ADC。1,8三、实现方法ADC设备在Linux中可以看做是简单的字符设备,也可以当做是一混杂设备(misc设备),这里我们作为misc设备来实现ADC的驱动。注意:这里我们获取AD转换后的数据将采用中断的方式,即当AD转换完成后产生AD中断,在中断服务程序中来读取ADCDAT0的第0-9位的值(即AD 转换后的值)。1、建立驱动程序文件s3c2410-adc.c,实现驱动的打开、读、写和退出static int s3c2410_adc_open(struct inode *inode, struct file
39、*filp)/adc打开句柄 init_MUTEX(&adcdev.lock); init_waitqueue_head(&(adcdev.wait); adcdev.channel=0; adcdev.prescale=0xff; MOD_INC_USE_COUNT; DPRINTK( adc openedn); return 0;static ssize_t s3c2410_adc_write(struct file *file, const char *buffer, size_t count, loff_t * ppos)int data; /用来保存应用程序传来的数据if(count
40、!=sizeof(data)printk(the size of input data must be %dn, sizeof(data); /应用程序传来的数据和data长度不同,报错return 0;static ssize_t s3c2410_adc_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)int ret = 0;if (down_interruptible(&adcdev.lock) /先获得互斥锁return -ERESTARTSYS;START_ADC_AIN(adcdev.channel,
41、adcdev.prescale); /开始转换#ifdef USE_IRQ_WAITQUEUEinterruptible_sleep_on(&adcdev.wait); /休眠进程,让CPU做其他的事情#endifprintk(in read channel=%dn,adcdev.channel);printk(ADCDAT0=%xn,ADCDAT0);while(!(ADCCON & 0x8000) /查看AD是否转换完成udelay(100);ret = ADCDAT0;ret &= 0x3ff; /10位AD转换,所以取低十位copy_to_user(buffer, (char *)&r
42、et, sizeof(ret); /把得到的值传回应用程序up(&adcdev.lock); /释放信号量return sizeof(ret);static int s3c2410_adc_release(struct inode *inode, struct file *filp) /关闭adc MOD_DEC_USE_COUNT; DPRINTK( adc closedn); return 0;由于编译开发板内核时直接把ad驱动加入到内核里面,对用户的只是下面的一个文件结构。在用户程序里只需要用到open、read、write、release等内核函数即可。static struct fi
43、le_operations s3c2410_fops = owner: THIS_MODULE,open: s3c2410_adc_open,read: s3c2410_adc_read,write:s3c2410_adc_write,release: s3c2410_adc_release,;2、编写用户应用程序测试my2410_adc驱动。建立应用程序adc_test.c#include s3c2410-adc.h#define ADC_DEV /dev/adc/0rawstatic int adc_fd = -1;static int init_ADdevice(void) /初始化设备
44、if(adc_fd=open(ADC_DEV, O_RDWR)0)printf(Error opening %s adc devicen, ADC_DEV);return -1;static int GetADresult(int channel) /获取AD值int PRESCALE=0XFF;int data=ADC_WRITE(channel, PRESCALE);write(adc_fd, &data, sizeof(data);read(adc_fd, &data, sizeof(data);return data;int main(void)int i;float d;pthread_t th_com;void * retval;/set s3c44b0 AD register and start ADif(init_ADdevice()0)return -1;/* Create the threads 创建线程 */pthread_create(&th_com, NULL, comMonitor, 0);printf(nPress Enter key exit!n);while( stop=0 )for(i