Linux驱动分析之RTC驱动

简介: 前面《Linux驱动分析之RTC框架》分析了RTC的基本框架,接下来拿个RTC驱动实例来分析一下。

前言

前面《Linux驱动分析之RTC框架》分析了RTC的基本框架,接下来拿个RTC驱动实例来分析一下。



RTC驱动分析

Linux版本:5.11

RTC设备: DS1302


(1) 加载和卸载函数

//DTS匹配staticconststructof_device_idds1302_dt_ids[] = {
  { .compatible="maxim,ds1302", },
  { /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, ds1302_dt_ids);
staticstructspi_driverds1302_driver= {
  .driver.name="rtc-ds1302",
  .driver.of_match_table=of_match_ptr(ds1302_dt_ids),
  .probe=ds1302_probe,
  .remove=ds1302_remove,
};
//封住了module_init()和module_exit()module_spi_driver(ds1302_driver);

ds1302是一个SPI接口的RTC芯片。所以它的module_init是按照SPI接口框架实现的。


(2) probe()函数

staticintds1302_probe(structspi_device*spi)
{
structrtc_device*rtc;
u8addr;
u8buf[4];
u8*bp;
intstatus;
//检查SPI参数设置if (spi->bits_per_word&& (spi->bits_per_word!=8)) {
dev_err(&spi->dev, "bad word length\n");
return-EINVAL;
  } elseif (spi->max_speed_hz>2000000) {
dev_err(&spi->dev, "speed is too high\n");
return-EINVAL;
  } elseif (spi->mode&SPI_CPHA) {
dev_err(&spi->dev, "bad mode\n");
return-EINVAL;
  }
//省略ds1302的初始化spi_set_drvdata(spi, spi);
//注册RTC设备rtc=devm_rtc_device_register(&spi->dev, "ds1302",
&ds1302_rtc_ops, THIS_MODULE);
//.....return0;
}

probe()主要就是ds1302的初始化,我们省略掉这部分,它其实就是通过spi接口去设置ds1302的寄存器。

初始化完成之后就是调用  devm_rtc_device_register   进行rtc设备的注册,这个我们在前面的RTC框架中讲过。注册的函数中有一个 ds1302_rtc_ops 参数,它包含了操作RTC的接口函数。


(3)RTC操作函数

staticconststructrtc_class_opsds1302_rtc_ops= {
  .read_time=ds1302_rtc_get_time, //获取时间  .set_time=ds1302_rtc_set_time,  //设置时间};
  • ds1302_rtc_set_time
staticintds1302_rtc_set_time(structdevice*dev, structrtc_time*time)
{
structspi_device*spi=dev_get_drvdata(dev);
u8buf[1+RTC_CLCK_LEN];
u8*bp;
intstatus;
/* 使能写 */bp=buf;
*bp++=RTC_ADDR_CTRL<<1|RTC_CMD_WRITE;
*bp++=RTC_CMD_WRITE_ENABLE;
status=spi_write_then_read(spi, buf, 2,
NULL, 0);
if (status)
returnstatus;
/*设置寄存器地址和写入的数据 */bp=buf;
*bp++=RTC_CLCK_BURST<<1|RTC_CMD_WRITE;
*bp++=bin2bcd(time->tm_sec);
*bp++=bin2bcd(time->tm_min);
*bp++=bin2bcd(time->tm_hour);
*bp++=bin2bcd(time->tm_mday);
*bp++=bin2bcd(time->tm_mon+1);
*bp++=time->tm_wday+1;
*bp++=bin2bcd(time->tm_year%100);
*bp++=RTC_CMD_WRITE_DISABLE;
//使用SPI写入时间数据returnspi_write_then_read(spi, buf, sizeof(buf),
NULL, 0);
}
  • ds1302_rtc_get_time
staticintds1302_rtc_get_time(structdevice*dev, structrtc_time*time)
{
structspi_device*spi=dev_get_drvdata(dev);
u8addr=RTC_CLCK_BURST<<1|RTC_CMD_READ;
u8buf[RTC_CLCK_LEN-1];
intstatus;
//从寄存器中读取时间值status=spi_write_then_read(spi, &addr, sizeof(addr),
buf, sizeof(buf));
if (status<0)
returnstatus;
//转成结构体保存time->tm_sec=bcd2bin(buf[RTC_ADDR_SEC]);
time->tm_min=bcd2bin(buf[RTC_ADDR_MIN]);
time->tm_hour=bcd2bin(buf[RTC_ADDR_HOUR]);
time->tm_wday=buf[RTC_ADDR_DAY] -1;
time->tm_mday=bcd2bin(buf[RTC_ADDR_DATE]);
time->tm_mon=bcd2bin(buf[RTC_ADDR_MON]) -1;
time->tm_year=bcd2bin(buf[RTC_ADDR_YEAR]) +100;
return0;
}

读写函数都比较简单,就是操作寄存器即可。



总结

RTC的驱动其实很简单,就是总线(I2C, SPI等)加上RTC驱动框架,其他的就是芯片寄存器的操作了,这部分只需要根据芯片手册来实现即可。

相关文章
|
7月前
|
安全 Linux iOS开发
Binary Ninja 5.1.8104 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
Binary Ninja 5.1.8104 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
725 53
Binary Ninja 5.1.8104 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
|
7月前
|
Linux API iOS开发
Binary Ninja 4.2.6455 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
Binary Ninja 4.2.6455 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
609 14
Binary Ninja 4.2.6455 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
|
8月前
|
数据管理 Linux iOS开发
Splunk Enterprise 9.4.5 (macOS, Linux, Windows) - 机器数据管理和分析
Splunk Enterprise 9.4.5 (macOS, Linux, Windows) - 机器数据管理和分析
299 0
|
Unix Linux iOS开发
Splunk Enterprise 10.0.0 (macOS, Linux, Windows) - 搜索、分析和可视化,数据全面洞察平台
Splunk Enterprise 10.0.0 (macOS, Linux, Windows) - 搜索、分析和可视化,数据全面洞察平台
276 0
|
10月前
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
553 0
|
监控 Linux
Linux基础:文件和目录类命令分析。
总的来说,这些基础命令,像是Linux中藏匿的小矮人,每一次我们使用他们,他们就把我们的指令准确的传递给Linux,让我们的指令变为现实。所以,现在就开始你的Linux之旅,挥动你的命令之剑,探索这个充满神秘而又奇妙的世界吧!
256 19
|
缓存 网络协议 Linux
PCIe 以太网芯片 RTL8125B 的 spec 和 Linux driver 分析备忘
本文详细介绍了 Realtek RTL8125B PCIe 以太网芯片的规格以及在 Linux 中的驱动安装和配置方法。通过深入分析驱动源码,可以更好地理解其工作原理和优化方法。在实际应用中,合理配置和优化驱动程序可以显著提升网络性能和稳定性。希望本文能帮助您更好地使用和管理 RTL8125B,以满足各种网络应用需求。
1880 33
|
数据管理 Linux iOS开发
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
365 0
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
429 7
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
583 1