linux open函数_「正点原子Linux连载」第六十章Linux RTC驱动实验

论坛 期权论坛     
选择匿名的用户   2021-5-23 01:40   252   0
<div style="font-size:16px;">
<p>1)实验平台:正点原子Linux开发板<br>2)<strong>摘自《正点原子</strong>I.MX6U嵌入式Linux驱动开发指南<strong>》</strong><br>关注官方微信号公众号,获取更多资料:正点原子</p>
<div class="pgc-img">
  <img alt="47d7fbdc3ea56c2aa323c01602125242.png" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-6d3c8dfac42b5321898c82e9007cb24f.png">
</div>
<h1 class="pgc-h-arrow-right"><strong>第六十章Linux RTC驱动实验</strong></h1>
<p>RTC也就是实时时钟,用于记录当前系统时间,对于Linux系统而言时间是非常重要的,就和我们使用Windows电脑或手机查看时间一样,我们在使用Linux设备的时候也需要查看时间。本章我们就来学习一下如何编写Linux下的RTC驱动程序。</p>
<h2 class="pgc-h-arrow-right"><strong>60.1 Linux内核RTC驱动简介</strong></h2>
<p>RTC设备驱动是一个标准的字符设备驱动,应用程序通过open、release、read、write和ioctl等函数完成对RTC设备的操作,关于RTC硬件原理部分我们已经在裸机篇中的第二十五章进行了详细的讲解,这里就不再废话了。</p>
<p>Linux内核将RTC设备抽象为rtc_device结构体,因此RTC设备驱动就是申请并初始化rtc_device,最后将rtc_device注册到Linux内核里面,这样Linux内核就有一个RTC设备的。至于RTC设备的操作肯定是用一个操作集合(结构体)来表示的,我们先来看一下rtc_device结构体,此结构体定义在include/linux/rtc.h文件中,结构体内容如下(删除条件编译):</p>
<p>示例代码60.1.1 rtc_device结构体</p>
<p>104struct rtc_device</p>
<p>105<strong>{<!-- --></strong></p>
<p>106struct device dev<strong>;</strong> /* 设备 */</p>
<p>107struct module <strong>*</strong>owner<strong>;</strong></p>
<p>108</p>
<p>109int id<strong>;</strong> /* ID */</p>
<p>110char name<strong>[</strong>RTC_DEVICE_NAME_SIZE<strong>];</strong>/* 名字 */</p>
<p>111</p>
<p>112conststruct rtc_class_ops <strong>*</strong>ops<strong>;</strong> /* RTC设备底层操作函数 */</p>
<p>113struct mutex ops_lock<strong>;</strong></p>
<p>114</p>
<p>115struct cdev char_dev<strong>;</strong> /* 字符设备 */</p>
<p>116unsignedlong flags<strong>;</strong></p>
<p>117</p>
<p>118unsignedlong irq_data<strong>;</strong></p>
<p>119 spinlock_t irq_lock<strong>;</strong></p>
<p>120 wait_queue_head_t irq_queue<strong>;</strong></p>
<p>121struct fasync_struct <strong>*</strong>async_queue<strong>;</strong></p>
<p>122</p>
<p>123struct rtc_task <strong>*</strong>irq_task<strong>;</strong></p>
<p>124 spinlock_t irq_task_lock<strong>;</strong></p>
<p>125int irq_freq<strong>;</strong></p>
<p>126int max_user_freq<strong>;</strong></p>
<p>127</p>
<p>128struct timerqueue_head timerqueue<strong>;</strong></p>
<p>129struct rtc_timer aie_timer<strong>;</strong></p>
<p>130struct rtc_timer uie_rtctimer<strong>;</strong></p>
<p>131struct hrtimer pie_timer<strong>;</strong>/* sub second exp, so needs hrtimer */</p>
<p>132int pie_enabled<strong>;</strong></p>
<p>133struct work_struct irqwork<strong>;</strong></p>
<p>134/* Some hardware can&#39;t support UIE mode */</p>
<p>135int uie_unsupported<strong>;</strong></p>
<p><strong>......</strong></p>
<p>147<strong>};</strong></p>
<p>我们需要重点关注的是ops成员变量,这是一个rtc_class_ops类型的指针变量,rtc_class_ops为RTC设备的最底层操作函数集合,包括从RTC设备中读取时间、向RTC设备写入新的时间值等。因此,rtc_class_ops是需要用户根据所使用的RTC设备编写的,此结构体定义在include/linux/rtc.h文件中,内容如下:</p>
<p>示例代码60.1.2 rtc_class_ops结构体</p>
<p>71struct rtc_class_ops <strong>{<!-- --></strong></p>
<p>72int<strong>(*</strong>open<strong>)(</strong>struct device <strong>*);</strong></p>
<p>73void<strong>(*</strong>release<strong>)(</strong>struct device <strong>*);</strong></p>
<p>74int<strong>(*</strong>ioctl<strong>)(</strong>struct device <strong>*,</strong>unsignedint<strong>,</strong>unsignedlong<strong>);</strong></p>
<p>75int<strong>(*</strong>read_time<strong>)(</strong>struct device <strong>*,</strong>struct rtc_time <strong>*);</strong></p>
<p>76int<strong>(*</strong>set_time<strong>)(</strong>struct device <strong>*,</strong>struct rtc_time <strong>*);</strong></p>
<p>77int<strong>(*</strong>read_alarm<strong>)(</strong>struct device <strong>*,</strong>struct rtc_wkalrm <strong>*);</strong></p>
<p>78int<strong>(*</strong>set_alarm<strong>)(</strong>struct device <strong>*,</strong>struct rtc_wkalrm <strong>*);</strong></p>
<p>79int<strong>(*</strong>proc<strong>)(</strong>struct device <strong>*,</strong>struct seq_file <strong>*);</strong></p>
<p>80int<strong>(*</strong>set_mmss64<strong>)(</strong>struct device <strong>*,</strong> time64_t secs<strong>);</strong></p>
<p>81int<strong>(*</strong>set_mmss<strong>)(</strong>struct device <strong>*,</strong>unsignedlong secs<strong>);</strong></p>
<p>82int<strong>(*</strong>read_callback<strong>)(</strong>struct device <strong>*,</strong>int data<strong>);</strong></p>
<p>83int<strong>(*</strong>a
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP