基于Linux操作系统下RTC驱动开发

上传人:痛*** 文档编号:41562263 上传时间:2021-11-21 格式:DOC 页数:52 大小:448.50KB
收藏 版权申诉 举报 下载
基于Linux操作系统下RTC驱动开发_第1页
第1页 / 共52页
基于Linux操作系统下RTC驱动开发_第2页
第2页 / 共52页
基于Linux操作系统下RTC驱动开发_第3页
第3页 / 共52页
资源描述:

《基于Linux操作系统下RTC驱动开发》由会员分享,可在线阅读,更多相关《基于Linux操作系统下RTC驱动开发(52页珍藏版)》请在装配图网上搜索。

1、目 录中文摘要1ABSTRACT2第1章 Linux概述31.1 Linux操作系统的诞生和发行版31.1.1 Linux系统的诞生31.1.2 Linux 发行版31.2 Linux应用和特性41.2.1 linux 的应用41.2.2 linux 的特性4第2章 Tiny210开发板62.1 Tiny210 简介62.2 Tiny210硬件配置62.3 软件支持7第3章 移植前准备83.1软件平台的搭建83.1.1 虚拟机的安装83.1.2 Red Hat linux 的安装83.1.3 软件包和源码包的准备和下载8第4章 Linux 内核9第5章 RTC芯片105.1 RTC芯片简述10

2、5.2 I2C总线简介10第6章 字符设备驱动相关知识116.1 模块机制116.2 字符设备开发基本步骤126.3 主设备号和次设备号126.4 实现字符驱动程序13第7章 RTC驱动实现167.1 设计思路167.2 RTC程序实现167.2.1 RTC基本数据结构167.2.2注册字符设备167.2.3 定义操作函数177.2.4 函数声明187.3 编译生成.ko文件187.4 实际运行及结果18第8章 结论20谢 辞21参 考 文 献22附录A RTC驱动程序23附录B Makefile文件41附录C 应用层测试程序41-21-基于Linux操作系统下RTC驱动开发摘 要:论文主要研

3、究了Linux系统下的RTC芯片驱动架构,并设计了一个基于Tiny210开发板的RTC字符设备驱动。首先对Linux体系进行了简单介绍,分析了Linux系统的应用和特性,并对现有平台Tiny210开发板进行了简单分析。在对实际项目RTC驱动开发的分析设计的基础上,采用了以动态模块加载方式的字符设备驱动模型。在对RTC芯片各个模块的简单介绍中快速构建和开发了一个该芯片的驱动模型,实现了对硬件时间的读写、闹钟的设置功能。减少了开发的复杂性,缩短了开发时间,且具有很强的可扩展、可移植性。关键词:Linux操作系统;Tiny210开发板;字符设备驱动;RTC芯片蚌埠学院本科毕业设计(论文)Driver

4、 Development of Real Timer Clock(RTC) Based on LinuxAbstract:In this thesis, the RTC chip driver under Linux system architecture and design of a development board based Tiny210 RTC character device drivers. First, a brief introduction Linux system to analyze the application and features of Linux sys

5、tems, and existing platforms Tiny210 development board for a simple analysis. On the basis of the actual project RTC-driven development of analysis and design, using a dynamic module loading character device driver model. Quickly build in RTC chip for each module in a brief and develop a model of th

6、e chip driver, the realization of hardware time to read and write, alarm setting function. Reducing the complexity of development and shorten the development time, and has a strong scalability, portability.Keywords: Linux operating system;Tiny210 development board;Character device driver;RTC chip第1章

7、 Linux概述1.1 Linux操作系统的诞生和发行版 1.1.1 Linux系统的诞生 1981年IBM推出了微型计算机IBM PC。在它推出的前10年内,MS-DOS操作系统主宰了整个计算机操作系统界。而在当时,计算机硬件的价格在不断下跌,但软件仍处于高位。苹果的操作系统MacOS的是无疑是最好的性能,但价格高,没有人可以轻易接近。到1991年,随着GNU计划开发出来了一些工具,以及GNU C编译器的发布。甚至MINIX也因为版权开始需要购买才能获得源代码。在GNU HURD操作系统的开发工作却不是能在几年内完成的。对于莱纳斯来说,已经等不及了。起初,他只是为了学习386架构的编程技术,

8、但随后的Linux开发过程已经彻底改变了他的主意。在1991年初,莱纳斯在学习MINIX的操作系统的时候产生了开发一个新的属于自己的理想中的操作系统的想法。最早与Linux(当然此时还不叫Linux 这个名称)相关的新闻是莱纳斯在1991年7月3号的comp.os.minix上发布的消息。而在莱纳斯8 月25 日发布的消息中,他第一次向外界透露出有开发免费的操作系统的意向,可是它并不会象GNU 那种现在已经在行业中成型的系统那样专业,而代码量不会很大1。直到1991 年的10 月5 日,莱纳斯在comp.os.minix 新闻组上发布消息,正式向外宣布Linux 内核系统的诞生(Free mi

9、nix-like kernel sources for 386-AT)。这段消息就是直到今日都广为流传的被称为Linux的诞生宣言。因此对Linux 社区,及其所用用户来说,10月5日都是一个特殊的日子。直到今天,包括现在的Red Hat公司在内的很多公司都会在发布许多Linux 的新版本时选择了这个日子。 Linux是一种源于UNIX的操作系统,虽然从严格意义上讲,Linux这个词实际上是指Linux内核,但实际上人们已经习惯了把整个基于Linux内核以及在此基础上的各种工具的操作系统统称为Linux。 1.1.2 Linux 发行版 通常来讲,一个Linux的发行版不仅仅是指Linux内核

10、,还包括了使用Linux的软件的安装工具,以及各种工具软件,而在一些特定的版本中中也有一些特定软件,只不过现在都习惯于把它们统称为Linux发行版。每一种发行版的开发都是针对着不同的目标,像是支持不同计算机结构,更强调实时应用,和专门面向嵌入式系统等。主流的Linux发型版有Ubuntu,Red Hat等等。1.2 Linux应用和特性 1.2.1 Linux 的应用Linux的基本思想就是万物皆文件,因此它拥有极高的灵活性和可移植性,再加上它的UNIX背景,使它Linux在服务器的操作系统方面具有广泛运用。直到现在,Linux还是提供网站服务供应商最常使用的平台。虽然因为新的编程语言的兴起,

11、它的市场份额在不断减少,但在嵌入式行业,Linux基于其低廉成本与小体积依然是不可动摇的霸主,像在机顶盒、手机及移动装置等硬件平台上,Linux已经是不可或缺的3。 1.2.2 Linux 的特性 完全兼容 因为Linux兼容了POSIX1.0标准,所以一些常见的Windows的程序完全可以在Linux上无障碍运行,这也为用户从Windows转到Linux提供了方便。因为现在Windows的巨大影响力,许多用户在使用Linux前,都会因为以前Windows的使用习惯而担心能否适应新的环境,而这一点就使他们不在顾虑。 完全免费,发展迅速 Linux是一款完全免费的操作系统。因为Linux社区的存

12、在,所有的Linux用户都可以轻易的得到当前任意版本的Linux的源代码,并按照自己的意愿来修改它。正是由于这一点,每时每刻,每一次的技术进步,每一种新平台面世,都有来自世界各地的精英都参与了Linux的更新和实现,无数的灵感跟不断进步的技术与编程思想,让Linux有了无穷的可能性,并在无数程序员的努力下不断壮大。 多用户、多任务 正如当今世界发展的主流那样,Linux也支持多用户。这保证了各用户的相对独立,之间互不影响,都对于自己的文件设备有自己的权利。而多任务则是现在各种智能设备的主要特点,为了节省运行时间和解放更多的系统资源,实现了多进程的并行执行,Linux操作系统就是其中的典范。 良

13、好的界面 因为现在Windows系统的强烈影响,Linux同时具有可以通过键盘输入相应的指令来进行操作的字符界面和类似Windows图形界面的X-Window系统提供的图形界面。后者使用户可以类似于Windows操作系统使用鼠标对其进行操作,而不会因为转换了操作系统感到不适应。 丰富的网络功能 Unix最大的优势就是其强大的网络功能,而从Unix衍生出来的Linux系统也继承了它在网络功能上的优势。Linux的网络功能和其内核紧密相连,在这方面它要比其他操作系统更有优势。 可靠的安全、稳定性能 Linux采取了许多安全技术措施为内部信息安全提供了保障。而且Linux的极高的稳定性使它在对要应用

14、到网络服务器这类有较高稳定性要求的服务上有非常高的适应性。 支持多种平台 Linux作为一种嵌入式操作系统,在各种移动装置上应用广泛。Linux因为其开源的特性使它基本可以在市场上绝大部分的硬件平台上运行,这也使它精简体积小的内核可以方便地移植多种嵌入式处理器上。 第2章 Tiny210开发板2.1 Tiny210 简介Tiny210是一款高性能的Cortex A8核心板,它由广州友善之臂设计、生产和发行销售。它采用三星S5PV210作为主处理器,运行主频可高达1GHz。S5PV210内部集成了PowerVR SGX540高性能图形引擎,支持3D图形流畅运行,并可流畅播放1080P大尺寸视频4

15、。Tiny210主要采用了2.0mm间距的双排针,引出CPU大部分常用功能引脚,并力求和Tiny6410核心板三排引脚兼容(P1,P2,CON2) 5。2.2 Tiny210硬件配置如图2-1: 2.3 软件支持 Superboot-210 Android 2.3 + Linux-3.0.8 Android 4.0 WindowsCE6第3章 移植前准备3.1软件平台的搭建 3.1.1 虚拟机的安装在有了硬件平台的支持下(Tiny210开发板)开始进行软件平台的搭建。在pc机上安装一个虚拟机,本文选用的虚拟机是VMware Workstation 。虚拟机其实就是在主机中占用一块内存在主机的硬

16、件平台上搭建一个类似主机的运行环境,在 VMware中,你可以在一个以主机的分割的内存为基础的窗口中加载一台虚拟机,运行自己的操作系统和应用程序,而不影响主机任何操作。 3.1.2 Red Hat Linux 的安装在安装了Vmware Workstation 的条件下,创建一个虚拟机给它分配20G的磁盘大小。512M的内存空间。然后从网上下载Red Hat Linux 操作系统安装包iso文件,我下载的是Red Hat Linux-5的iso文件,该版本的Linux内核时3.0的,相对来说是版本比较高的内核。在获得Red Hat的iso文件后,在创建的虚拟机中安装该Linux操作系统。 3.

17、1.3 软件包和源码包的准备和下载需要的软件有交叉编译器arm-Linux-gcc ,我选用的交叉编译器为Tiny210的开发自带的交叉编译器,该编译器是4.0版本以上的,正是由于我即将下载内核源码版本比较高,因此我们选用的交叉编译器的版本也是相对来说比较高的。从www.kernel.org网站下载Linux的内核源代码linux-3.0.8.tar.gzRTC 。Boot Loader 是在硬件平台运行之前完成对硬件的初始化病唤醒操作系统的程序。就是通过Boot Loader来实现初始化硬件设备,从而给操作系统提供了一个合适的软硬件环境,并为调用它做好准备。我选择的Boot Loader是U

18、_boot6。第4章 Linux 内核现在自己的当前目录,即目录下,解压自己的内核源代码: tar xvzf linux-3.0.8.tgz解压Linux内核源码包,在当前目录下生成一相应的文件夹linux-3.0.8,这就是该内核的所有实现代码。Linux的内核的目录包含很多个文件夹,分别用于实现不同的功能(如图4-1)7。(假设相对于Linux-3.0.8):图4-1 Linux根目录 其中有几个比较重要的需要着重了解: /drivers 驱动目录,该目录是所有被加载到内核的设备驱动的程序。其中又把设备驱动进一步划分成几类,如字符设备驱动,块设备驱动等。 /include 该目录包括编译核

19、心所需要的大部分头文件,也是Linux下程序编译的查找默认路径。 /net 该目录里不用说就是核心的网络层代码。 /init 该目录中包含内核的所有硬件初始化代码,这是内核所有工作的起点,像是main.c和Version.c这两个C语言程序的编译入口文件就在其中,同时也是是所有进程的最初父进程。 /kernel 该内核管理的核心代码放在这里,也就是通常所说的内核的具体实现,一般除了内核裁剪都不需要对它进行操作。 /documentation 该目录下是对每个目录作用的具体说明的文档以及一些功能的实例,就相当于产品说明书。 /ipc 该目录包含了核心进程间的通信代码,是Linux多任务特性具体实

20、现。 /lib 该目录是编译默认路径,包含了内核绝大部分的库文件与代码。 /modules 该目录存放了已建好的、可动态加载的模块,裁剪内核的主要工作目标。第5章 RTC芯片5.1 RTC芯片简述 RTC(real time clock)实时时钟,顾名思义,拥有真实时间的时钟,其实它的主要作用就是在操作系统没有工作的时候自主维护时间表,并在需要的时候给操作系统提供系统时间。开发板的时间系统可以分成两种,分别是系统时间和硬件时间。硬件时间指的就是RTC芯片自主维护的时间,因为RTC芯片是电池供电的,所以在硬件平台掉电后时间表不会丢失。Linux内核就把RTC芯片当作“离线”的时间与日期维护器。当

21、Linux内核启动时,都要通过RTC来进行初始化,从RTC中读取时间保存到系统中,得到系统时间。而在运行期间,内核以软件的形式维护系统的当前时间与日期,并在关机或必要的时候将时间回写RTC芯片,由它自主维护。另外如果RTC拥有了IRQ中断并且可以定时,那么RTC还可以作为一个闹钟用来在内核睡眠时唤醒内核。Linux有两种RTC驱动的接口,一个是老的接口,专门用在PC机上的。另外一钟新接口是基于Linux设备驱动程序的。而后者创建了一个RTC驱动模型,并注册到RTC核心中,把所有工作交由RTC芯片完成。5.2 I2C总线简介I2C总线是一种由Philips公司开发的两线式串行总线标准,用于链接微

22、控制器及其外围设备。I2C有100K和400K两种工作速率,它支持多机通讯和多主控模块设计,并且每个电路模块都有唯一的地址,还允许每个在I2C总线上的期间都可以使用独立的电源。本文就是介绍基于I2C总线的Linux字符设备驱动。I2C由数据线(SDA)和时钟线(SCL)构成的同步串行总线,可发送和接受数据,在处理器与控制芯片之间、芯片与芯片之间进行双向传送8。I2C总线在传送数据过程中共有三种类型信号,它们分别是开始信号、结束信号和应答信号9。第6章 字符设备驱动相关知识6.1模块机制 Linux提供了一种被称为模块(Module)的机制提供了对许多模块支持,设备驱动每个模块由不同代码组成,实

23、现不同功能10(所有的模块在一起才是一个可执行程序)。insmod 将模块动态加载到正在运行内核;rmmod 程序移除模块;Linux内核模块的程序结构: module_init()加载模块函数(必须) 使用insmod命令加载模块时,内核就会执行该模块的加载函数,也就是说这就是整个模块函数的入口,就是通过它来完成模块的初始化相关工作。 module_exit()卸载模块函数(必须) 当使用rmmod命令卸载某模块时,内核就会执行该这段函数,完成对模块的删除和空间的释放。 MODULE_LICENSE()模块许可证声明(必须) 这一段函数就是描述内核将要加载的模块的工作权限,如果在加载模块时不

24、声明LICENSE,内核就会报警:kernel tainted,意思就是内核被污染。 module_param()模块参数(可选) 这个函数括号内放置着模块内部声明的全局变量,对应着在加载模块时rommod命令后面跟着的参数,这些参数就会被传入模块内。 EXPORT_SYMBOL()模块导出符号(可选) 这个函数括号内也放置着数量不等参数,也就是符号(可以是函数或变量),而在这个模块结束之后,其他模块就可以通过这个符号使用本模块中这些到处的参数,变量或函数。 其他一些声明MODULE_XXXXX()模块声明(可选)不同的声明对应着不同的功能选项,视实际情况而定。 模块加载函数:static i

25、nt _init initialization_rtc(void) /* 初始化代码 */module_init(initialization_rtc); 模块卸载函数static void _exit cleanup_rtc(void) /* 释放资源 */module_exit(cleanup_rtc); 6.2字符设备开发基本步骤 向内核确定主该设备的主次设备号 实现字符驱动程序: 填充file_operations结构体 实现模块加载函数用以注册字符设备 实现模块卸载函数完成模块的释放和删除 创建设备文件节点6.3主、次设备号11 主设备号是内核识别一个设备的标识。整数(占12bits

26、),范围从0到4095,通常使用1到255。 次设备号由内核使用,用于正确确定设备文件所指的设备。整数(占20bits),范围从0到1048575,一般使用0到255。 设备编号的内部表达 dev_t类型(32位,其中主设备号12位,次设备号20位): 是属于Linux内核编程的专有类型,用来保存设备编号。 从dev_t类型变量中获得主设备号和次设备号:这是两个封装好的函数MAJOR(dev_t rtc);/获得主设备号MINOR(dev_t rtc);/获得次设备号 将主设备号和次设备号转换成dev_t类型:这也是一个封装好的函数dev_t =MKDEV(int ,int ); 分配主设备号

27、 手工分配主设备号的函数:#include /这是Linux内核中有关设备号的头文件int register_chrdev_region( dev_t num, unsigned int , char *rtc );这是自己手动把num分配给rtc作为主设备号。 动态分配主设备号:#include /这是Linux内核中有关设备号的头文件int alloc_chrdev_resion(dev_t *,unsigned int ,unsigned int ,char *rtc);这是内核自动分配一个设备好给rtc。 释放设备号void unregister_chrdev(dev_t, unsig

28、ned int );在该设备号不再使用之后,释放并删除它,以节约内核资源。6.4实现字符驱动程序实现字符设备驱动,最重要的就是字符设备结构体cdev,以及驱动接口结构体-file_operations。 cdev 结构体struct cdev struct kobject xxx; /* 内核内嵌的对象 */ struct module *xxx; /*所属模块*/ struct file_operations *xxx; /*文件操作结构体*/ struct list_head xxx; /*不常用*/ dev_t xxx; /*设备号*/ unsigned int xxx; /*不常用*/

29、 ; file_operations 结构体字符驱动和内核的接口:在内核代码中,./include/linux/fs.h下的代码实现,定义了字符驱动程序只要填充一个file_operations结构体并把它注册到内核中,内核就有了通过它操作这个字符设备的能力。 file_operations的主要成员:struct module *xxx: 指向模块本身open: 提供打开设备的函数接口;release:提供关闭设备的函数接口;read: 实现从设备上读取数据的函数接口;write: 实现向设备上写入数据的函数接口;ioctl: I/O控制函数;llseek: 定位读写指针位置并把他们输出出来

30、; ioctl函数为设备驱动程序执行用户空间的“命令”提供了一个特有的接口用来设置或者读取设备的具体信息。 cmd 参数的定义Linux内核对file_operations的ioctl()函数的cmd参数有特殊的定义:如图6-1。图6-1 cmd参数构造命令编号的宏:_IO() 给没有参数的命令;_IOR() 给从驱动中读数据的命令;_IOW() 给写入数据的命令;_IOWR() 用于双向传输。 Ioctl函数模板static long rtc_dev_ioctl(struct file *file,unsigned int cmd, unsigned long arg).switch (cm

31、d) case RTC_EPOCH_SET:.Break;case RTC_SET_TIME:.break;case RTC_IRQP_SET:.break;case RTC_PIE_ON:.break;.图6-2 字符设备驱动 第7章 RTC驱动实现7.1 设计思路Linux设备驱动属于内核的一部分,Linux内核的驱动模块可以用两种不同的方式加载和编译: 通过内核裁剪,随同Linux的启动直接加载编译进Linux内核; 把驱动程序编译成一个可加载和删除的动态模块,可以在需要时随时使用insmod命令加载,rmmod命令删除。这种方式更快,也节省了内核资源,控制了内核的大小,而模块一旦被插入

32、内核,就和其他被直接初始化到内核中的模块一样了。这次的RTC驱动就采用动态模块加载的方式,将程序主体分成3个部分。分别是注册字符设备的class.c,定义操作函数的dev.c和提供接口说明的ioctl.c。7.2 RTC程序实现 7.2.1 RTC基本数据结构struct rtc_time 结构体structrtc_timeintsec;intmin;inthour;intmday;intmon;intyear;intwday;intyday;intisdst;这个结构体代表了硬件时间与日期,从RTC芯片读取的时间和日期就分开保存在这个结构体中 7.2.2注册字符设备 模块初始化函数: ini

33、t_rtcstaticint_initinit_rtc(void) rtc_class=class_create(THIS_MODULE,rtc);int err;err = alloc_chrdev_region(&rtc_devt, 0, RTC_DEV_MAX, rtc); rtc_dev_init(); rtc_sysfs_init(rtc_class); if (err 0)printk(KERN_ERR %s: failed to allocate char dev regionn,_FILE_); return0; Init_rtc首先创建了一个类rtc12。类本身就是一个高度面

34、向对象的产物,而用户空间就可以在不知道如何实现的情况下直接得到结果,驱动程序也不用直接处理,只要调用就行了。 7.2.3 定义操作函数 dev.c 填充了file_operations结构rtc_foperations,以及这些操作函数的具体实现。rtc_foperations- rtc基本的文件操作:staticconststructfile_operations rtc_foperations=.owner =THIS_MODULE,.llseek =null,.read =read,.poll =poll,.unlocked_ioctl=ioctl,.open =openfile,.re

35、lease =release,.fasync =fasync,; 7.2.4 函数声明ioctl.c里的所有函数的实现都对应于dev.c 中rtc_ioctl相应的命令,其中RTC_RD_TIME与RTC_SET_TIME两个命令需要特别注意,这是RTC最基本的功能函数获取时间和设置时间。7.3 运行步骤通过编写的Makefile及arm-linux-gcc编译生成rtc.ko文件,如图7-1。图7-1 编译生成.ko文件编写用户层测试程序,并编译成可执行程序qq。7.4 实际运行及结果将生成的.ko模块和应用层测试程序qq下载的目标板,运行过程如图7-2:用insmod装载模板。创建设备节点

36、: mknod /dev/rtc c 250 0修改执行程序权限: chmod 777 qq执行测试程序。图7-2 运行过程结果如图7-3:图7-3 运行结果第8章 结论本论文中对Linux的发展跟现状进行了了解,还在对课题基于Linux操作系统下RTC驱动开发的基础上对Linux内核进行了大致的分析,并在课题最后进行了相对于RTC驱动模块的应用层测试软件的编写。在本文中嵌入式系统选择的是Linux系统,它具有占有内存小和运行速率高的优点。并采用了模块化的指导设计方法开发设备驱动,提高了程序的可读性和可移植性。本文将字符设备分为了设备注册、函数功能实现以及调用接口,并对程序进行了应用层的实例验

37、证。由于时间的原因,本文中RTC字符驱动的程序设计还是有些简单,在以后的学习工作中还需要进一步改善。在以后对驱动的学习中,希望能够不断完善RTC芯片的功能实现,并在在嵌入式Linux操作系统的建立中,以内核剪裁的方式将驱动程序移植到Linux内核中去,努力做出更为精简稳定的内核系统。谢 辞首先,向我的指导老师赵老师和刘老师表示感谢,感谢老师们一直以来对我的关怀和悉心指导,并在完成毕业设计的过程中让我体会到了也学到了很多。在整个毕业设计指导活动中,老师的丰富经验和对整个行业脉络的把握,都是年轻的我难以望其项背的,并在整个课题的完成过程中起到了至关重要的作用。赵老师教学作风的和刘老师的治学风格都让

38、我留下了很深的印象。 同时也要感谢培训班的所有同学,在临近毕业的培训过程中,对我的关心和帮助。感谢他们不厌其烦地指导我解决了不少项目上的难题,她们积极向上的学习态度也是我奋斗下去的动力。感谢我的亲人,在这四年里是他们给我无数的鼓励、支持和帮助,正因为有他们我才能高兴顺利的完成大学学业,并学到了很多专业,以及很多人生道路上的宝贵财富。 最后感谢各位评阅老师在百忙之中抽空评阅我的论文。参 考 文 献1 徐俊仕.基于嵌入式Linux的车载GPS导航系统设计与实现D西安:西北工业大学机械电子工程学院,2007.2 戴明华,李长云,曾志浩,崔海燕. 嵌入式Linux驱动程序框架研究综述J. 长沙大学学报

39、,2012,02:52-53.3 方先康.基于powerpc处理器MPC8541E的嵌入式Linux系统开发D北京:北京邮电大学计算机科学与技术学院,2011.4 张利平.基于MPC8536的雷达嵌入式数据处理平台设计D.成都:中国西南电子技术研究所,2012.5 罗泽勇.一种基于powerpc的嵌入式信号处理平台的设计D.西安:西安电子科技大学,2011.6 董文军. Linux驱动程序兼容性的相关问题J.单片机与嵌入式系统应用,2010,03:16-18.7 董闯.基于MPC85xx的U-boot启动流程分析和移植D,北京:北京邮电大学,2009.8 周立功,陈明计,陈渝ARM嵌入式Lin

40、ux系统构建与驱动开发范例M北京:北京航空航天大学出版社,2006.9 王淑贞U-Boot在S3C2410上的移植J.微计算机应用,2008,29(4):95-97.10 LTIB user manual Linux Target Image Builder,Freescale,2006.11 史胜辉.基于嵌入式Linux的频谱分析仪软件系统设计D.成都:电子科技大学,2011.12 MPC8536 datasheet MPC8536E PowerQUICC III tm Integrated Processor Product Brief ,2009.附录A RTC驱动程序Class.c#i

41、nclude #include #include #include #include #include #include rtc-core.hstatic DEFINE_IDR(rtc_idr);static DEFINE_MUTEX(idr_lock);struct class *rtc_class;static void rtc_device_release(struct device *dev)struct rtc_device *rtc = to_rtc_device(dev);mutex_lock(&idr_lock);idr_remove(&rtc_idr, rtc-id);mut

42、ex_unlock(&idr_lock);kfree(rtc);#if defined(CONFIG_PM) & defined(CONFIG_RTC_HCTOSYS_DEVICE)static struct timespec old_rtc, old_system, old_delta;static int rtc_suspend(struct device *dev, pm_message_t mesg)struct rtc_device*rtc = to_rtc_device(dev);struct rtc_timetm;struct timespecdelta, delta_delta

43、;if (strcmp(dev_name(&rtc-dev), CONFIG_RTC_HCTOSYS_DEVICE) != 0)return 0;delta = timespec_sub(old_system, old_rtc);delta_delta = timespec_sub(delta, old_delta);if (delta_delta.tv_sec = 2) old_delta = delta; else old_system = timespec_sub(old_system, delta_delta);return 0;static int rtc_resume(struct

44、 device *dev)struct rtc_device*rtc = to_rtc_device(dev);struct rtc_timetm;struct timespecnew_system, new_rtc;struct timespecsleep_time;if (strcmp(dev_name(&rtc-dev), CONFIG_RTC_HCTOSYS_DEVICE) != 0)return 0;getnstimeofday(&new_system);rtc_read_time(rtc, &tm);if (rtc_valid_tm(&tm) != 0) pr_debug(%s:

45、bogus resume timen, dev_name(&rtc-dev);return 0;rtc_tm_to_time(&tm, &new_rtc.tv_sec);new_rtc.tv_nsec = 0;if (new_rtc.tv_sec dev);return 0;sleep_time = timespec_sub(new_rtc, old_rtc);sleep_time = timespec_sub(sleep_time,timespec_sub(new_system, old_system);if (sleep_time.tv_sec = 0)timekeeping_inject

46、_sleeptime(&sleep_time);return 0;#else#define rtc_suspendNULL#define rtc_resumeNULL#endifstruct rtc_device *rtc_device_register(const char *name, struct device *dev,const struct rtc_class_ops *ops,struct module *owner)struct rtc_device *rtc;struct rtc_wkalrm alrm;int id, err;if (idr_pre_get(&rtc_idr

47、, GFP_KERNEL) = 0) err = -ENOMEM;goto exit;mutex_lock(&idr_lock);err = idr_get_new(&rtc_idr, NULL, &id);mutex_unlock(&idr_lock);if (err id = id;rtc-ops = ops;rtc-owner = owner;rtc-irq_freq = 1;rtc-max_user_freq = 64;rtc-dev.parent = dev;rtc-dev.class = rtc_class;rtc-dev.release = rtc_device_release;

48、mutex_init(&rtc-ops_lock);spin_lock_init(&rtc-irq_lock);spin_lock_init(&rtc-irq_task_lock);init_waitqueue_head(&rtc-irq_queue);timerqueue_init_head(&rtc-timerqueue);INIT_WORK(&rtc-irqwork, rtc_timer_do_work);rtc_timer_init(&rtc-aie_timer, rtc_aie_update_irq, (void *)rtc);rtc_timer_init(&rtc-uie_rtct

49、imer, rtc_uie_update_irq, (void *)rtc);hrtimer_init(&rtc-pie_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);rtc-pie_timer.function = rtc_pie_update_irq;rtc-pie_enabled = 0;err = _rtc_read_alarm(rtc, &alrm);if (!err & !rtc_valid_tm(&alrm.time)rtc_initialize_alarm(rtc, &alrm);strlcpy(rtc-name, name, RTC_DE

50、VICE_NAME_SIZE);dev_set_name(&rtc-dev, rtc%d, id);rtc_dev_prepare(rtc);err = device_register(&rtc-dev);if (err) put_device(&rtc-dev);goto exit_kfree;rtc_dev_add_device(rtc);rtc_sysfs_add_device(rtc);rtc_proc_add_device(rtc);dev_info(dev, rtc core: registered %s as %sn,rtc-name, dev_name(&rtc-dev);re

51、turn rtc;exit_kfree:kfree(rtc);exit_idr:mutex_lock(&idr_lock);idr_remove(&rtc_idr, id);mutex_unlock(&idr_lock);exit:dev_err(dev, rtc core: unable to register %s, err = %dn,name, err);return ERR_PTR(err);EXPORT_SYMBOL_GPL(rtc_device_register);void rtc_device_unregister(struct rtc_device *rtc)if (get_

52、device(&rtc-dev) != NULL) mutex_lock(&rtc-ops_lock);rtc_sysfs_del_device(rtc);rtc_dev_del_device(rtc);rtc_proc_del_device(rtc);device_unregister(&rtc-dev);rtc-ops = NULL;mutex_unlock(&rtc-ops_lock);put_device(&rtc-dev);EXPORT_SYMBOL_GPL(rtc_device_unregister);static int _init rtc_init(void)rtc_class

53、 = class_create(THIS_MODULE, rtc);if (IS_ERR(rtc_class) printk(KERN_ERR %s: couldnt create classn, _FILE_);return PTR_ERR(rtc_class);rtc_class-suspend = rtc_suspend;rtc_class-resume = rtc_resume;rtc_dev_init();rtc_sysfs_init(rtc_class);return 0;static void _exit rtc_exit(void)rtc_dev_exit();class_de

54、stroy(rtc_class);idr_destroy(&rtc_idr);subsys_initcall(rtc_init);module_exit(rtc_exit);MODULE_AUTHOR(Alessandro Zummo );MODULE_DESCRIPTION(RTC class support);MODULE_LICENSE(GPL);Dev.c#include #include #include #include rtc-core.hstatic dev_t rtc_devt;#define RTC_DEV_MAX 16 static int rtc_dev_open(st

55、ruct inode *inode, struct file *file)int err;struct rtc_device *rtc = container_of(inode-i_cdev,struct rtc_device, char_dev);const struct rtc_class_ops *ops = rtc-ops;if (test_and_set_bit_lock(RTC_DEV_BUSY, &rtc-flags)return -EBUSY;file-private_data = rtc;err = ops-open ? ops-open(rtc-dev.parent) :

56、0;if (err = 0) spin_lock_irq(&rtc-irq_lock);rtc-irq_data = 0;#ifdef CONFIG_RTC_INTF_DEV_UIE_EMULstatic void rtc_uie_task(struct work_struct *work)struct rtc_device *rtc = container_of(work, struct rtc_device, uie_task);struct rtc_time tm; spin_unlock_irq(&rtc-irq_lock);return 0;clear_bit_unlock(RTC_

57、DEV_BUSY, &rtc-flags);return err;int num = 0;int err;err = rtc_read_time(rtc, &tm);spin_lock_irq(&rtc-irq_lock);if (rtc-stop_uie_polling | err) rtc-uie_task_active = 0; else if (rtc-oldsecs != tm.tm_sec) num = (tm.tm_sec + 60 - rtc-oldsecs) % 60;rtc-oldsecs = tm.tm_sec;rtc-uie_timer.expires = jiffies + HZ - (HZ/10);rtc-uie_timer_active = 1;rtc-uie_task_active = 0;add_timer(&rtc-uie_timer); else if (schedule_work(&rtc-

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!