0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux驱动分析之RTC框架

jf_78858299 来源:嵌入式软件开发交流 作者:young 2023-05-26 15:12 次阅读

前言

图片

Linux内核启动时,它会从RTC中读取时间与日期,作为基准值。然后通过软件来维护系统时间和日期。Linux系统中提供了RTC核心层,对于驱动开发者而言,操作起来就变得很简单了。我们来看看整体框架。

驱动框架

图片

下面是整体框架图

图片

与RTC核心有关的文件有:

文件 描述
/drivers/rtc/class.c 这个文件向linux设备模型核心注册了一个类RTC,然后向驱动程序提供了注册/注销接口
/drivers/rtc/rtc-dev.c 这个文件定义了基本的设备文件操作函数,如:open,read
/drivers/rtc/interface.c 这个文件主要提供了用户程序与RTC驱动的接口函数,用户程序一般通过ioctl与RTC驱动交互,这里定义了每个ioctl命令需要调用的函数
/drivers/rtc/rtc-sysfs.c 与sysfs有关
/drivers/rtc/rtc-proc.c 与proc文件系统有关
/include/linux/rtc.h 定义了与RTC有关的数据结构

重要结构体

图片

  • rtc_device
//RTC设备
struct rtc_device {
  struct device dev;
  struct module *owner;


  int id;


  const struct rtc_class_ops *ops; //rtc操作函数
  struct mutex ops_lock;


  struct cdev char_dev;
  unsigned long flags;


  unsigned long irq_data;
  spinlock_t irq_lock;
  wait_queue_head_t irq_queue;
  struct fasync_struct *async_queue;


  int irq_freq;
  int max_user_freq;


  struct timerqueue_head timerqueue;
  struct rtc_timer aie_timer; 
  struct rtc_timer uie_rtctimer;
  struct hrtimer pie_timer; /* sub second exp, so needs hrtimer */
  int pie_enabled;
  struct work_struct irqwork;
  /* Some hardware can't support UIE mode */
  int uie_unsupported;


  long set_offset_nsec;


  bool registered;


  struct nvmem_device *nvmem;
  /* Old ABI support */
  bool nvram_old_abi;
  struct bin_attribute *nvram;


  time64_t range_min;
  timeu64_t range_max;
  time64_t start_secs;
  time64_t offset_secs;
  bool set_start_time;


#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
  struct work_struct uie_task;
  struct timer_list uie_timer;
  /* Those fields are protected by rtc->irq_lock */
  unsigned int oldsecs;
  unsigned int uie_irq_active:1;
  unsigned int stop_uie_polling:1;
  unsigned int uie_task_active:1;
  unsigned int uie_timer_active:1;
#endif
};

上面的结构体表示一个RTC设备,比较简单,主要就是中断信息,字符设备对象,操作函数等。

  • rtc_class_ops
//RTC操作函数
struct rtc_class_ops {
  int (*ioctl)(struct device *, unsigned int, unsigned long);
  int (*read_time)(struct device *, struct rtc_time *);
  int (*set_time)(struct device *, struct rtc_time *);
  int (*read_alarm)(struct device *, struct rtc_wkalrm *);
  int (*set_alarm)(struct device *, struct rtc_wkalrm *);
  int (*proc)(struct device *, struct seq_file *);
  int (*set_mmss64)(struct device *, time64_t secs);
  int (*set_mmss)(struct device *, unsigned long secs);
  int (*read_callback)(struct device *, int data);
  int (*alarm_irq_enable)(struct device *, unsigned int enabled);
  int (*read_offset)(struct device *, long *offset);
  int (*set_offset)(struct device *, long offset);
};

就是一些设置时间和读取时间,以及闹钟等接口函数。

  • rtc_time
//时间结构体
struct rtc_time {
  int tm_sec;
  int tm_min;
  int tm_hour;
  int tm_mday;
  int tm_mon;
  int tm_year;
  int tm_wday;
  int tm_yday;
  int tm_isdst;
};

API函数

图片

// 注册RTC class
static struct rtc_device *rtc_device_register(const char *name,
                struct device *dev,
                const struct rtc_class_ops *ops,
                struct module *owner)

struct rtc_device *devm_rtc_device_register(struct device *dev,
          const char *name,
          const struct rtc_class_ops *ops,
          struct module *owner)
//注销RTC      
static void rtc_device_unregister(struct rtc_device *rtc)     
void devm_rtc_device_unregister(struct device *dev, struct rtc_device *rtc)

总结

图片

RTC也是字符设备驱动,只是进行了封装,封装完之后我们调用起来其实就很简单了。只要实现好接口函数,填充好结构体,然后进行注册即可。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11225

    浏览量

    208912
  • RTC
    RTC
    +关注

    关注

    2

    文章

    527

    浏览量

    66308
  • 驱动开发
    +关注

    关注

    0

    文章

    130

    浏览量

    12062
收藏 人收藏

    评论

    相关推荐

    Linux RTC开发指南

    介绍Linux 内核中RTC 驱动的适配和DEBUG 方法,为RTC 设备的使用者和维护者提供参考。
    的头像 发表于 03-06 10:22 1305次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>RTC</b>开发指南

    Linux平台设备框架驱动

      平台设备框架(platform)是将一个驱动分为设备层和驱动层两个部分,通过总线模型将设备和驱动进行绑定。在系统中每注册一个设备,都会与
    的头像 发表于 09-25 08:59 1759次阅读
    <b class='flag-5'>Linux</b>平台设备<b class='flag-5'>框架</b><b class='flag-5'>驱动</b>

    LinuxPWM驱动

    本文主要讲述了Linux的PWM驱动框架、实现方法、驱动添加方法和调试方法。
    发表于 05-25 09:19 650次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>之</b>PWM<b class='flag-5'>驱动</b>

    linux驱动框架是什么

    编写linux驱动先看一下驱动框架是什么样子的。驱动编写和应用层编写有什么区别呢?
    发表于 07-26 08:14

    RTC芯片的驱动框架是由哪些部分组成的

    如何对RTC芯片进行调试呢?RTC芯片的驱动框架是由哪些部分组成的?
    发表于 03-04 07:35

    Linux下基于I2C协议的RTC驱动开发

    首先研究了Linux环境下字符设备驱动程序框架,然后介绍12C协议,在此基础上开发基于12C协议的RTC字符设备驱动程序。砷于
    发表于 03-02 16:15 48次下载
    <b class='flag-5'>Linux</b>下基于I2C协议的<b class='flag-5'>RTC</b><b class='flag-5'>驱动</b>开发

    想要驾驭Linux驱动开发,必须深刻理解Linux总线设备驱动框架

    想要驾驭Linux驱动开发,必须深刻理解Linux总线设备驱动框架。之所以会形成这样的框架,主要
    的头像 发表于 03-22 11:08 1.1w次阅读
    想要驾驭<b class='flag-5'>Linux</b><b class='flag-5'>驱动</b>开发,必须深刻理解<b class='flag-5'>Linux</b>总线设备<b class='flag-5'>驱动</b><b class='flag-5'>框架</b>

    Linux RTC驱动模型分析rtc-sysfs.c

    rtc-sysfs文件主要的操作就是在sys下创建rtc的属性节点,可以方便用户方便快捷的访问,查找问题。下来大概看看sys下的rtc节点,有个直观的认识。
    发表于 04-27 19:43 2461次阅读

    你了解linux RTC 驱动模型?

    RTC(real time clock)实时时钟,主要作用是给Linux系统提供时间。RTC因为是电池供电的,所以掉电后时间不丢失。Linux内核把
    发表于 04-26 15:50 1954次阅读
    你了解<b class='flag-5'>linux</b> <b class='flag-5'>RTC</b> <b class='flag-5'>驱动</b>模型?

    你对Linux总线设备驱动框架是否了解

    Linux的设备驱动模型,或者说,Linux的设备驱动框架,都是同一个意思。应该这样理解,(Linux
    发表于 05-05 15:13 728次阅读

    如何使用Linux内核实现USB驱动程序框架

    Linux内核提供了完整的USB驱动程序框架。USB总线采用树形结构,在一条总线上只能有唯一的主机设备。 Linux内核从主机和设备两个角度观察USB总线结构。本节介绍
    发表于 11-06 17:59 20次下载
    如何使用<b class='flag-5'>Linux</b>内核实现USB<b class='flag-5'>驱动</b>程序<b class='flag-5'>框架</b>

    看看Linux为相机提供的驱动框架

      V4L2 (Video Linux Two),是为支持Linux内核设计的驱动框架驱动框架
    的头像 发表于 08-07 16:03 3235次阅读
    看看<b class='flag-5'>Linux</b>为相机提供的<b class='flag-5'>驱动</b><b class='flag-5'>框架</b>

    浅析Linux RTC实时时钟

    内核将 RTC 设备抽象为 rtc_device 结构体,RTC设备驱动就是申请并初始化rtc_device,最后将
    的头像 发表于 11-25 15:07 1504次阅读

    Linux的PWM驱动框架及实现方法

    本文主要讲述了Linux的PWM驱动框架、实现方法、驱动添加方法和调试方法。
    的头像 发表于 05-14 15:24 1399次阅读
    <b class='flag-5'>Linux</b>的PWM<b class='flag-5'>驱动</b><b class='flag-5'>框架</b>及实现方法

    Linux Regmap 驱动框架

    1、regmap 框架结构 regmap 驱动框架如下图所示: regmap 框架分为三层: ①、底层物理总线:regmap 就是对不同的物理总线进行封装,目前 regmap 支持的物
    的头像 发表于 07-06 17:29 1082次阅读
    <b class='flag-5'>Linux</b> Regmap <b class='flag-5'>驱动</b><b class='flag-5'>框架</b>