074.嵌入式linux驱动开发实例分析-rtc原理讲课模型_第1页
074.嵌入式linux驱动开发实例分析-rtc原理讲课模型_第2页
074.嵌入式linux驱动开发实例分析-rtc原理讲课模型_第3页
074.嵌入式linux驱动开发实例分析-rtc原理讲课模型_第4页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 Linux Linux内核启动时,它从RTC系统的当前时间与日期,并在需要时将时间回写 的 一. 与 等/drivers/rtc/ erface.c RTC驱动的 接口函数,用户程序一般通过ioctlRTCioctl命令需要调用sysfs PC机上的。另外一钟新接口是基于linuxlinuxRTC 驱动模型分 二. 1structrtc_device 这个结构是RTC二. 1structrtc_device 这个结构是RTC到 2structrtc_class_ops 1. structrtc_class_ops 1. structrtc_device 2. structdevicestru

2、ctmodule*owner; charnameRTC_DEVICE_NAME_SIZE; conststructrtc_class_opsstructmutexops_lock; structcdevunsignedlongflags; unsignedlongspinlock_twait_queue_head_tstructfasync_struct*async_queue; structrtc_taskspinlock_t#ifdefstructwork_structstructtimer_list/*Thosefieldsareprotected byrtc-irq_lock34.;这

3、个结构是RTC 驱动程序通过初始化这样一个结构,将自己实现的函数与RTC 这个结构是RTC 驱动程序通过初始化这样一个结构,将自己实现的函数与RTC 3structrtc_time 1. s initrtc_init(void) 2. rtc_class=class_create(THIS_MODULE,if(IS_ERR(rtc_class)k(KERN_ERR%s:couldntcreate, FILE return 三. 1. structrtc_time11.;(*open)(structdevicevoid(*release)(structdevice(*ioctl)(structd

4、evice*,unsigned(*read_time)(structdevice*,structrtc_time(*set_time)(structdevice*,structrtc_time(*read_alarm)(structdevice*,structrtc_wkalrm(*set_alarm)(structdevice*,structrtc_wkalrm(*proc)(structdevice*,structseq_file(*set_mmss)(structdevice*,unsignedlonge)(structdevice (*irq_set_freq)(structdevic

5、e(*read_callback)(structdevice(*alarm_irq_enable)(structdevice*,(*update_irq_enable)(struct device *, unsigned16.; class.c 中实现的。接下来调用rtc_dev_init(),这个函数为 class.c 中实现的。接下来调用rtc_dev_init(),这个函数为RTC 设备动态分配设备号,rtc_devt rtc_sysfs_init,初始化rtc_class 的属性。 2. structrtc_device*rtc_device_register(constchar*na

6、me,structdeviceconststructrtc_class_opsstructmodule*owner) 4. structrtc_deviceid,err; if(idr_pre_get(&rtc_idr,GFP_KERNEL)=0)err=-gotoerr=idr_get_new(&rtc_idr,NULL,16.if(errid=rtc-ops=rtc-owner= rtc_class-suspend=rtc_class-resume=return13.(1):处理一个idr的结构,idr(1):处理一个idr的结构,idrlinuxID rtc-max_user_freq=

7、rtc-dev.parent=rtc-dev.class=rtc-dev.release=rtc_device_release; strlcpy(rtc-name,name,dev_set_name(&rtc-dev,rtc%d,41.err=device_register(&rtc-ifgoto48.dev_info(dev, rtccore:registered%sasrtc-name, dev_name(&rtc-dev); 55./*returnrtc; idr_remove(&rtc_idr,dev_err(dev,rtccore:unabletoregister%s, err= n

8、ame,return68.idridrid相 , idridrid相 , (3):首先调用rtc_dev_prepare(rtc-dev.c中定义)RTC设备本质来讲还 就会自动创建设备文件rtc(n)(4):先后调用字符设备,rtc_sysfs_add_device只是为设备添加了 一个闹钟属性,rtc_proc_add_device 创建proc 文件系统接口。四. rtc- 1rtc_dev_fopsrtc 2. 函数的实现(以rtc_dev_read为例 1. rtc_dev_read(structfile*file,char user *buf,size_t count,loff_t

9、)2. structrtc_device*rtc=file-private_data; DECLARE_WAITQUEUE(wait,unsignedlongssize_tif(count!=)&countirq_queue,do set_current_sicconststructfile_operationsrtc_dev_fops=.unlocked_ioctl=10. 期性的完成一些工作。如果要使用这个功能,应用程序首先保证RTC 期性的完成一些工作。如果要使用这个功能,应用程序首先保证RTC 可以发现,这里的睡眠是ldd3, data=rtc-rtc-irq_data=if(data

10、!=0)ret= if(file-f_flags&O_NONBLOCK)ret=-if(signal_pending(current)ret=-whileremove_wait_queue(&rtc-irq_queue,&wait); if(ret=0) /*Checkfor anydataupdatesif(rtc-ops-data=rtc-ops-read_callback(rtc-if)!=sizeof(long)count=ret=put_user(data, user *)buf) ?:ret= put_user(data,(unsignedlong user*)buf) sizeo

11、f(unsignedreturn51.RTC里面的irq_data,如果不是零,那 五erface.c里的所有函数的实现都对应于rtc-dev.c 中ioctl相 RTC使RTC_UIE_OFF RTC_UIE_ONRTC更新中以上就是所有需 rtc_read_time(structrtc_device*rtc,structrtc_time*tm) 2. err =ifreturnerr; if(!rtc-err=-elseif(!rtc-ops-err=-elsememset(tm,0,sizeof(structerr=rtc-ops-read_time(rtc-dev.parent,rtc

12、_set_alarm与rtc_read_time1rtc_read_time 信号量后,调用rtc-opsread函数,这个函数是由具体的驱动程序实现的,操作底层 rtc_time 结构里面的。 信号量后,调用rtc-opsread函数,这个函数是由具体的驱动程序实现的,操作底层 rtc_time 结构里面的。 2rtc_set_time 六. rtc-sysfs.c 这个部分主要是有关sysfsrtc-sysfs.crtc_set_time(structrtc_device*rtc,structrtc_time*tm) 2. err =if(err!=returnerr; err =ifre

13、turnerr; if(!rtc-err=-elseif(rtc-ops-err=rtc-ops-set_time(rtc-dev.parent,elseif(rtc-ops-set_mmss)unsignedlongerr=rtc_tm_to_time(tm,if(err=err=rtc-ops-set_mmss(rtc-dev.parent,err=-EINVAL; return27.return20.七. rtc-这个文件提供RTC的proc文件系统接口。proc文件系统七. rtc-这个文件提供RTC的proc文件系统接口。proc文件系统 icconststructfile_oper

14、ationsrtc_proc_fops= 这个属性组是在class.c 的模块初始化函数中,由rtc_sysfs_init 函数赋值给 rtc_class-dev_attrs 的,以后属于这个类的设备都会有这些属性。但是设备结构拥有一种属性,必须调用device_create_file,这样才会使这个属性出现在sysfsdev_attrs域赋值了这个属性组指针,device_create_filertc_device_resgister 函数中,由 rtc_sysfs_add_device 完成这个工作,但是这个函数只是给设备添加了闹钟属性,并没有处device_register 来完成的。这

15、里的调用关系有点复device_register device_add device_adddevice_add_attrs name 文件,就会调用 rtc_sysfs_show_name 函数,这个函数也是在rtc-sysfs.c 中实现的,作用是icstructdevice_attributertc_attrs=ATTR(name,S_IRUGO,rtc_sysfs_show_name,ATTR(date,S_IRUGO,rtc_sysfs_show_date,ATTR(time,S_IRUGO,rtc_sysfs_show_time,ATTR(since_epoch,S_IRUGO,r

16、tc_sysfs_show_since_epoch,ATTR(max_user_freq,S_IRUGO|S_IWUSR,ATTR(hctosys, S_IRUGO, rtc_sysfs_show_hctosys, NULL), ,10. proc的文件必须与一个操作函数组成一个正常工作。这个函数最主要作用就是调用single_open,创建一个proc文 proc的文件必须与一个操作函数组成一个正常工作。这个函数最主要作用就是调用single_open,创建一个proc文1. srtc_proc_show(structseq_file*seq,void*offset) 2. structrt

17、c_device*rtc=seq-conststructrtc_class_ops*ops=rtc-structrtc_wkalrmstructrtc_timetm; err=rtc_read_time(rtc,if(err=0) rtc_timet:操作函数是rtc_proc_showseq_file接口。rtc_proc_show1. srtc_proc_open(structinode*inode,structfile*file) 2. structrtc_device*rtc=PDE(inode)-ifreturn-returnsingle_open(file,rtc_proc_sho

18、w,rtc); 7. 1. void rtc_proc_add_devitructrtc_device*rtc) 2. if(rtc-id=proc_create_data(driver/rtc,0,NULL,&rtc_proc_fops,rtc); 5. RTC驱动在向函数rtc_device_resgister调= = =rtc_proc_release, 6. ;rtc_datet:%04d-%02d-tm.tm_hour,tm.tm_min,tm.tm_year+1900, tm.tm_mon+1,err=rtc_read_alarm(rtc,if(err=0) f(seq,alrm_timet:if(unsigned if(unsigned if(unsigned )alrm.time.tm_hour=f(seq,%02d:,f(seq,)alrm.time.tm_min = 59) f(seq,%02d:,alrm.time.tm_min);f(seq,)alrm.time.tm_sec = 59) f(seq,%02dn,alrm.time.tm_sec);f(seq,f(seq,alrm_datet:if(unsigned if(unsigned )alrm.time.tm_year=f(seq

温馨提示

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

评论

0/150

提交评论