Linux内核 -- RTC 驱动的注册方式

embedded/2025/1/11 16:14:52/

Linux 内核中 RTC 驱动的注册方式

在 Linux 内核中,RTC(Real-Time Clock)驱动的注册可以通过多种方式实现,以下整理了常见的注册方式及其注意事项。

1. 使用 devm_rtc_device_register

这是注册 RTC 驱动的最常用方法,基于设备资源管理(devm_)机制,能够自动管理资源释放。

示例代码

#include <linux/rtc.h>static int rtc_read_time(struct device *dev, struct rtc_time *tm) {// 模拟读取时间tm->tm_sec = 30;tm->tm_min = 15;tm->tm_hour = 10;tm->tm_mday = 25;tm->tm_mon = 5;tm->tm_year = 123; // 表示 2023 年return 0;
}static int rtc_set_time(struct device *dev, struct rtc_time *tm) {// 模拟设置时间pr_info("Setting time: %d:%d:%d\n", tm->tm_hour, tm->tm_min, tm->tm_sec);return 0;
}static const struct rtc_class_ops rtc_ops = {.read_time = rtc_read_time,.set_time = rtc_set_time,
};static int rtc_probe(struct platform_device *pdev) {struct rtc_device *rtc;rtc = devm_rtc_device_register(&pdev->dev, "rtc-name", &rtc_ops, THIS_MODULE);if (IS_ERR(rtc))return PTR_ERR(rtc);return 0;
}

适用场景

  • 驱动逻辑较简单。
  • 希望简化资源管理工作。

注意事项

  • 必须确保设备正确传递到 devm_ 机制中。
  • 如果需要手动释放资源,请使用 rtc_device_register

2. 使用 rtc_device_register

相比 devm_rtc_device_register,此方法需要手动管理资源,适用于需要更高资源控制的场景。

示例代码

#include <linux/rtc.h>static int rtc_read_time(struct device *dev, struct rtc_time *tm) {// 模拟读取时间tm->tm_sec = 30;tm->tm_min = 15;tm->tm_hour = 10;tm->tm_mday = 25;tm->tm_mon = 5;tm->tm_year = 123; // 表示 2023 年return 0;
}static int rtc_set_time(struct device *dev, struct rtc_time *tm) {// 模拟设置时间pr_info("Setting time: %d:%d:%d\n", tm->tm_hour, tm->tm_min, tm->tm_sec);return 0;
}static const struct rtc_class_ops rtc_ops = {.read_time = rtc_read_time,.set_time = rtc_set_time,
};struct rtc_device *rtc;rtc = rtc_device_register("rtc-name", dev, &rtc_ops, THIS_MODULE);
if (IS_ERR(rtc))return PTR_ERR(rtc);/* 在 remove 或出错路径中释放资源 */
rtc_device_unregister(rtc);

适用场景

  • 驱动需要复杂的初始化逻辑。
  • 不希望依赖 devm_ 机制。

注意事项

  • 在驱动卸载时需手动调用 rtc_device_unregister 释放资源。
  • 避免资源泄漏。

3. 通过设备树或 ACPI 自动绑定

当 RTC 设备通过设备树或 ACPI 描述时,可以自动绑定到对应的驱动。

示例设备树

rtc@10000000 {compatible = "vendor,rtc";reg = <0x10000000 0x100>;
};

示例驱动代码

static int rtc_read_time(struct device *dev, struct rtc_time *tm) {// 模拟读取时间tm->tm_sec = 30;tm->tm_min = 15;tm->tm_hour = 10;tm->tm_mday = 25;tm->tm_mon = 5;tm->tm_year = 123; // 表示 2023 年return 0;
}static int rtc_set_time(struct device *dev, struct rtc_time *tm) {// 模拟设置时间pr_info("Setting time: %d:%d:%d\n", tm->tm_hour, tm->tm_min, tm->tm_sec);return 0;
}static const struct rtc_class_ops rtc_ops = {.read_time = rtc_read_time,.set_time = rtc_set_time,
};static int rtc_probe(struct platform_device *pdev) {struct rtc_device *rtc;rtc = devm_rtc_device_register(&pdev->dev, "rtc-name", &rtc_ops, THIS_MODULE);if (IS_ERR(rtc))return PTR_ERR(rtc);return 0;
}

适用场景

  • 嵌入式系统中常见。
  • RTC 资源通过设备树或 ACPI 描述。

注意事项

  • 确保 compatible 字段与驱动匹配。
  • 驱动需正确处理资源获取和释放。

4. 使用 rtc_class

适用于创建自定义 RTC 类设备的场景。

示例代码

#include <linux/rtc.h>
#include <linux/device.h>struct class *rtc_class;
struct device *rtc_dev;rtc_class = class_create(THIS_MODULE, "rtc");
if (IS_ERR(rtc_class))return PTR_ERR(rtc_class);rtc_dev = device_create(rtc_class, NULL, MKDEV(0, 0), NULL, "rtc0");
if (IS_ERR(rtc_dev)) {class_destroy(rtc_class);return PTR_ERR(rtc_dev);
}/* 在退出时清理资源 */
device_destroy(rtc_class, MKDEV(0, 0));
class_destroy(rtc_class);

适用场景

  • 自定义 RTC 类设备。
  • 需要特殊行为的 RTC 设备。

注意事项

  • 必须手动管理资源,避免资源泄漏。
  • 需要显式调用 class_destroydevice_destroy

注意事项

  1. 选择合适的注册方式

    • 简单驱动可用 devm_rtc_device_register
    • 需要手动控制资源时选择 rtc_device_register
    • 测试或模拟设备时使用设备树或 ACPI 自动绑定。
  2. 设备树支持:确保设备树描述与驱动匹配。

  3. 资源管理

    • 使用 devm_ 接口时资源自动管理。
    • 手动注册时注意清理资源。
  4. 兼容性

    • 检查硬件是否支持 RTC。
    • 根据具体硬件接口(I2C、SPI、平台设备)选择正确的实现方式。
  5. 功能扩展:可根据需求增加闹钟功能、中断支持等。


http://www.ppmy.cn/embedded/153059.html

相关文章

通过 crontab 每天定时启动一个 Java JAR 包并调用特定的 `main` 方法

要通过 crontab 每天定时启动一个 Java JAR 包并调用特定的 main 方法&#xff0c;你需要创建一个 cron 作业。这个作业将会在每天的指定时间运行。以下是步骤&#xff1a; 1. **确保环境变量配置正确**&#xff1a;首先&#xff0c;确保你的系统上已经安装了 Java&#xff0c…

unity下载newtonsoft-json

Package Manager&#xff0c;输入com.unity.nuget.newtonsoft-json 右键Assets-Reinport All

Swift语言的网络编程

Swift语言的网络编程探秘 随着移动互联网的迅猛发展&#xff0c;网络编程已经成为开发者必备的核心技能之一。尤其在iOS开发领域&#xff0c;Swift语言作为Apple官方推荐的编程语言&#xff0c;以其简洁的语法和强大的功能受到了广泛的关注。本文将深入探讨Swift语言的网络编程…

各种特种无人机快速发展,无人机反制技术面临挑战

随着科技的飞速发展&#xff0c;各种特种无人机在军事、民用等领域得到了广泛应用&#xff0c;其性能不断提升&#xff0c;应用场景也日益丰富。然而&#xff0c;无人机反制技术的发展确实面临一定的挑战&#xff0c;难以完全跟上无人机技术的快速发展步伐。以下是对这一问题的…

车载软件架构 --- 关于ARXML文件那点事

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

Lambda expressions in C++ (C++ 中的 lambda 表达式)

Lambda expressions in C {C 中的 lambda 表达式} 1. Parts of a lambda expression (Lambda 表达式的各个部分)1.2. Parameter list (Optional) References lambda /ˈlm.də/&#xff1a;the 11th letter of the Greek alphabet (希腊语字母表的第 11 个字母)https://learn.m…

C#语言的数据结构

C#语言的数据结构探讨 数据结构是计算机科学中一种用于组织、存储和管理数据的方式。有效地使用数据结构能使算法更加高效&#xff0c;并提高程序的性能。在C#语言中&#xff0c;我们可以构建和使用多种数据结构&#xff0c;以满足不同的需求。本文将介绍C#中的常用数据结构&a…

网络安全测评技术与标准

网络安全测评概况 网络安全测评是网络信息系统和IT技术产品的安全质量保障。本节主要阐述网络安全测评的概念&#xff0c;给出网络安全测评的发展状况。 18.1.1 网络安全测评概念 网络安全测评是指参照一定的标准规范要求&#xff0c;通过一系列的技术和管理方法&#xff0c;获…