硬件情况

使用的是DS1338这款RTC时钟芯片,I2C总线对应到PS端的I2C1。

配置

内核

添加有关的驱动:

因为DS1338用的驱动与DS13307相似,一找发现是同一个配置。

CONFIG_RTC_DRV_DS1307
Device Drivers --->
[*] Real Time Clock --->
<*> Dallas/Maxim DS1307/37/38/39/40/41, ST M41T00, EPSON RX-8025, ISL12057
[ ] HWMON support for rtc-ds130
[ ] Century bit support for rtc-ds1307

设备树

修改system-user.dtsi,添加有关的设备树:

编译内核以后发现rtc时钟还是不能用。

查阅文档时,根据其他人的问题描述,才想起来发现需要使用设备树。

&i2c1 {                          // 根据 zynq-7000.dtsi,选择了i2c1
status = "okay"; // 开启
#address-cells = <1>;
#size-cells = <0>; // 添加 RTC 设备节点, @68 代表设备地址
rtc0:rtc-ds1338@68 {
// 根据 drivers/rtc/rtc-ds1307.c 中的 compatible 表 找到的。
compatible = "dallas,ds1338"; // 设备地址
reg = <0x68>; // PDF P13 : 1101 000 R/nW , 0x68+ R/nW
};
};

附录:RTC配置调试记录

寻找ds1338驱动

$ cd drivers/rtc
$ alias ft="grep -nR 2>/dev/null"
$ ft 1338 Kconfig:234: should handle DS1307, DS1337, DS1338, DS1339, DS1340, DS1341,
Binary file rtc-ds1307.o matches
rtc-ds1307.c:39: ds_1338,
rtc-ds1307.c:78:#define DS1307_REG_CONTROL 0x07 /* or ds1338 */
rtc-ds1307.c:80:# define DS1338_BIT_OSF 0x20
rtc-ds1307.c:189: [ds_1338] = {
rtc-ds1307.c:244: { "ds1338", ds_1338 },
rtc-ds1307.c:277: .compatible = "dallas,ds1338",
rtc-ds1307.c:278: .data = (void *)ds_1338
rtc-ds1307.c:338: { .id = "DS1338", .driver_data = ds_1338 },
rtc-ds1307.c:1563: case ds_1338:
rtc-ds1307.c:1569: if (regs[DS1307_REG_CONTROL] & DS1338_BIT_OSF) {
rtc-ds1307.c:1572: ~DS1338_BIT_OSF);

drivers/rtc/rtc-ds1307.c发现了对应的设备树适配接口:

static const struct of_device_id ds1307_of_match[] = {
{
.compatible = "dallas,ds1307",
.data = (void *)ds_1307
},
{
.compatible = "dallas,ds1308",
.data = (void *)ds_1308
},
{
.compatible = "dallas,ds1337",
.data = (void *)ds_1337
},
{
.compatible = "dallas,ds1338", // 我所需要的设备树节点属性
.data = (void *)ds_1338
},
{
.compatible = "dallas,ds1339",
.data = (void *)ds_1339
},
{
.compatible = "dallas,ds1388",
.data = (void *)ds_1388
},

知道后面应该会使用到compatible = "dallas,ds1338",复制了下来。

配置i2c总线

本文地址:https://www.cnblogs.com/schips/p/xilinx_zynq_linux_config_rtc_with_dts.html

之前配置好了I2C总线以后,能够找到2个i2c总线驱动:

# ls /dev/i2c-*
/dev/i2c-0 /dev/i2c-1

但是发现一直不行。

# dmsg
... hwclock: can't open '/dev/misc/rtc': No such file or directory
...

一度怀疑过是不是要手动创建设备节点(例如alsa),试过几次以后放弃了这个方向。

rtc从设备地址的确定

下载并翻阅了DS1338Z的手册,找到了读写地址有关描述:

设备地址(7位):1101000 = 0x68

设备读地址(BIT[0] = 1, R):11010001 = 0xD1

设备读地址(BIT[0] = 0, W):11010000 = 0xD0

移植使用i2c-tools

根据文档采用了i2c-tools这个工具。

因为整个系统的源码是通过PetaLinux构建以后提取出来的,因此使用i2c-tools也是需要事先移植。

移植很简单,见《arm linux 移植 i2c-tools 与 简单使用

通过这个工具快速确定了总线、以及设备地址:

/mnt/i2c_tools/sbin# ./i2cdetect -l
i2c-1 i2c Cadence I2C at e0005000 I2C adapter
i2c-0 i2c Cadence I2C at e0004000 I2C adapter /mnt/i2c_tools/sbin# ./i2cdump -f -y 1 0x68
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 28 52 23 02 02 01 00 b3 40 20 71 04 96 28 48 03 (R#???.?@ q??(H?
10: 80 00 42 c8 05 02 40 30 20 00 20 08 00 55 44 22 ?.B???@0 . ?.UD"
20: 49 a9 24 28 48 10 44 20 21 f1 2d a2 04 00 43 8c I?$(H?D !?-??.C?
30: 50 24 00 24 20 2c 14 20 01 a0 01 89 02 00 21 88 P$.$ ,? ?????.!?
40: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
50: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
70: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
80: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX

更正设备树

根据这个情况,对设备树进行了改正。

其实是因为自己记错了总线,总以为是i2c-0

此后,rtc功能正常:

# dmsg
...
i2c /dev entries driver
cdns-i2c e0004000.i2c: 400 kHz mmio e0004000 irq 23
rtc-ds1307 1-0068: SET TIME!
rtc-ds1307 1-0068: registered as rtc0
cdns-i2c e0005000.i2c: 400 kHz mmio e0005000 irq 24
...

也能够通过hwclock 进行读写。

ZYNQ:Linux添加I2C-RTC驱动的更多相关文章

  1. linux下i2c的驱动架构分析和应用

    i2c在linux下的代码在/driver/i2c下面,总体代码如下所示: i2c-core.c 这个文件实现了I2C核心的功能以及/proc/bus/i2c*接口.    i2c-dev.c  实现 ...

  2. linux之I2C裸机驱动解析(转)

    1      硬件特性 1.1 概述 I2C总线是由Philips公司开发的两线式串行总线,这两根线为时钟线(SCL)和双向数据线(SDA).由于I2C总线仅需要两根线,因此在电路板上占用的空间更少, ...

  3. linux之i2c子系统架构---总线驱动

    编写i2c设备驱动(从设备)一般有两种方式: 1.用户自己编写独立的从设备驱动,应用程序直接使用即可. 2.linux内核内部已经实现了一个通用的设备驱动,利用通用设备驱动编写一个应用程序(用户态驱动 ...

  4. linux RTC 驱动模型分析【转】

    转自:http://blog.csdn.net/yaozhenguo2006/article/details/6824970 RTC(real time clock)实时时钟,主要作用是给Linux系 ...

  5. linux下i2c驱动笔记 转

    1. 几个基本概念 1.1. 设备模型 由 总线(bus_type) + 设备(device) + 驱动(device_driver) 组成,在该模型下,所有的设备通过总线连接起来,即使有些设备没有连 ...

  6. Linux I2C设备驱动编写(二)

    在(一)中简述了Linux I2C子系统的三个主要成员i2c_adapter.i2c_driver.i2c_client.三者的关系也在上一节进行了描述.应该已经算是对Linux I2C子系统有了初步 ...

  7. 【转】Linux I2C设备驱动编写(二)

    原文网址:http://www.cnblogs.com/biglucky/p/4059582.html 在(一)中简述了Linux I2C子系统的三个主要成员i2c_adapter.i2c_drive ...

  8. 【转】 linux内核移植和驱动添加(三)

    原文网址:http://blog.chinaunix.net/uid-29589379-id-4708909.html 原文地址:linux内核移植和驱动添加(三) 作者:genehang 四,LED ...

  9. Linux RTC驱动模型分析之rtc-sysfs.c【转】

    转自:https://blog.csdn.net/longwang155069/article/details/52353408 版权声明:本文为博主原创文章,未经博主允许不得转载. https:// ...

  10. zynq linux驱动之PL-PS中断【转】

    转自:https://blog.csdn.net/h244259402/article/details/83993524 PC:Windows 10 虚拟机:ubuntu 16.04 vivado:2 ...

随机推荐

  1. js实现打字机效果(完整实例)

    在上篇css高斯模糊的效果基础上用js实现一个打字机效果: 上图: 代码: <!DOCTYPE HTML> <html lang="en-US"> < ...

  2. 异构数据源同步之表结构同步 → 通过 jdbc 实现,没那么简单

    开心一刻 今天坐沙发上看电视,旁边的老婆拿着手机贴了过来 老婆:老公,这次出门旅游,机票我准备买了哈 我:嗯 老婆:你.我.你爸妈.我爸妈,一共六张票 老婆:这上面还有意外保险,要不要买? 我:都特么 ...

  3. 《最新出炉》系列入门篇-Python+Playwright自动化测试-43-分页测试

    1.简介 分页测试,这种一般都是公共的方法系统中都写好了,这种一般出现是数据展示比较多的时候,会采取分页的方法,而且比较固定,一般是没有问题的,因此它非常适合自动化测试,但是如何使用playwrigh ...

  4. 几种常见Ruby on Rails内置方法介绍

    Ruby on Rails是一个功能强大的WEB开发框架,在这里我们将会学到一些经常用到的Ruby on Rails内置方法,帮助大家熟练掌握其应用技巧. Ruby on Rails自动生成文档技巧大 ...

  5. postgresql数据库清理

    大量update或者delete后 磁盘空间会猛增.原理是postgresql并没有真正的删除 只是将删除数据的状态置为已删除,该空间不能记录被从新使用.若是删除的记录位于表的末端,其所占用的空间将会 ...

  6. 我发现了字节OpenApi接口的bug!

    本文记录我在对接字节旗下产品火山云旗下云游戏产品 OpenApi 接口文档时遇到的坑,希望能帮助大家(火山云旗下云游戏产品的文档坑很多,我算是从零到一都踩了一遍,特此记录,希望大家引以为鉴). 1. ...

  7. OpenOCD + DAP-LINK调试ESP32的失败经历

    目的 手里有调试STM32的DAP-LINK,想试试通过JTAG调试ESP32 OpenOCD支持CMSIS-DAP DAP-LINK支持的芯片,我手上这款描述如下,应该JTAG协议的都支持 平台 w ...

  8. objectarx 之让用户自定义插件命令

    #include <iostream> #include <fstream> virtual AcRx::AppRetCode On_kInitAppMsg (void *pk ...

  9. 数据驱动ddt安装3种方式_unittest_Python

    命令行安装   pip install ddt -i  管理员运行命令提示符 pycharm设置里安装 pycharm Python Packages里安装

  10. NOIP模拟75

    前言 先吐槽一下出题人,T2 牛马数据连棵树都不是.. T3 描述不清楚.. T1 如何优雅的送分 解题思路 我考场上还真以为是个送分题,然而... 莫比乌斯反演... 对于一个数字 n 有 \(2^ ...