坑多多之AC8257 i2c1 rtc-pcf8563

news2025/2/20 5:33:53

pcf85163

ordering information

Ordering information

Package

Description

Version

Marking code

PCF85163T/1

SO8

SOT96-1

PF85163

PCF85163TS/1

TSSOP8

SOT505-1

85163

①plastic small outline package; 8 leads;body width 3.9 mm

②plastic thin shrink small outline package;8 leads; body width 3 mm

register

HYM8563 vs PCF85163

regHYM8563PCF85163
0x00CTL1
0x01CTL2
0x02SEC
0x03MIN
0x04HOUR
0x05DAY
0x06WEEKDAY
0x07MONTH
0x08YEAR
0x09ALM_MIN
0x0aALM_HOUR
0x0bALM_DAY
0x0cALM_WEEK
0x0dCLKOUT
0x0eTMR_CTL
0x0fTMR_CNT

detail 

Bit positions labeled as x are not relevant. Bit positions labeled with N should always be written with logic 0; if read, they couldbe either logic 0 or logic 1. 

76543210
TESTNSTOPNTESTCNNN
NNNTI_TPAFTFAIETIE
VL
x
xx
xx
xxxxx
CENTURYxx
AE_M
AE_Hx
AE_Dx
AE_Wxxxx
FExxxxx
TExxxxx

clkout_ops

clkout_opsfunction
pcf8563_clkout_preparepcf8563_clkout_controlRW
pcf8563_clkout_unpreparepcf8563_clkout_controlRW
pcf8563_clkout_is_preparedR
pcf8563_clkout_recalc_rateR
pcf8563_clkout_round_rate
pcf8563_clkout_set_rateRW

问题

佰维BWMECX32H2A-08Gb停产,内存颗粒换成BWMZFX32H2A-8G-X,linux内核启动时间与之前的内存颗粒比提前100ms左右,rtc芯片驱动访问i2c1与MTK sensor hub协处理器访问i2c1冲突导致i2c读写失败,最终probe失败,rtc设备不存在,厂测失败,厂线停产。rtc驱动初始化时增加100毫秒延时可以避开冲突。

日志

异常

<3>[    0.523511] (2)[1:swapper/0]rtc-pcf8563 1-0051: pcf8563_read_block_data: read error
<3>[    0.523516] (2)[1:swapper/0]rtc-pcf8563 1-0051: pcf8563_probe: read error

       996        : preloader
       813        : lk

<3>[    0.520859] (3)[1:swapper/0]rtc-pcf8563 1-0051: pcf8563_write_block_data: err=-121 addr=0e, data=03
<3>[    0.520867] (3)[1:swapper/0]rtc-pcf8563 1-0051: pcf8563_probe: write error
<4>[    0.520892] (3)[1:swapper/0]rtc-pcf8563: probe of 1-0051 failed with error -5

<3>[    0.524627] (3)[1:swapper/0]rtc-pcf8563 1-0051: low voltage detected, date/time is not reliable.
<6>[    0.524737] (3)[1:swapper/0]rtc-pcf8563 1-0051: rtc core: registered rtc-pcf8563 as rtc1
<3>[    0.525180] (3)[1:swapper/0]rtc-pcf8563 1-0051: pcf8563_write_block_data: err=-121 addr=0d, data=00
<6>[    0.739091] (3)[1:swapper/0]rtc-pcf8563 1-0051: setting system clock to 2009-01-01 00:01:11 UTC (1230768071)

正常

       991        : preloader
       977        : lk
<6>[    0.574644] (2)[1:swapper/0]rtc-pcf8563 1-0051: rtc core: registered rtc-pcf8563 as rtc1
<6>[    0.782513] (3)[1:swapper/0]rtc-pcf8563 1-0051: setting system clock to 2009-01-01 23:38:17 UTC (1230853097)

0121 i2c1 rtc-pcf8563

设备上电3.18秒左右访问0xee,9次,1ms后2个9次,3ms后访问0x18,3个9次。对应的kernel时间0.841042左右。lk里boot_linux_fdt不启动linux kernel,不会有0xee 0x18访问。

delayed work

--- a/drivers/rtc/rtc-pcf8563.c
+++ b/drivers/rtc/rtc-pcf8563.c
@@ -650,7 +650,39 @@ static struct i2c_driver pcf8563_driver = {
    .id_table   = pcf8563_id,
 };

+#ifdef MODULE
 module_i2c_driver(pcf8563_driver);
+#else
+static struct delayed_work rtc_init_work;
+
+static void rtc_init_work_callback(struct work_struct *work)
+{
+   i2c_add_driver(&pcf8563_driver);
+   return;
+}
+
+static int __init pcf8563_init(void)
+{
+   int rval = 0;
+
+   INIT_DELAYED_WORK(&rtc_init_work, rtc_init_work_callback);
+   rval = schedule_delayed_work(&rtc_init_work, HZ * 2);
+   if (rval < 0) {
+       pr_info("pcf8563 init fail %d\n", rval);
+   }
+
+   return rval;
+}
+
+static void __exit pcf8563_exit(void)
+{
+   i2c_del_driver(&pcf8563_driver);
+   return;
+}
+
+module_init(pcf8563_init)
+module_exit(pcf8563_exit)
+#endif

 MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>");
 MODULE_DESCRIPTION("Philips PCF8563/Epson RTC8564 RTC driver");

dts

--- a/arch/arm/boot/dts/ac8257_demo_1g_32.dts
+++ b/arch/arm/boot/dts/ac8257_demo_1g_32.dts
@@ -993,7 +993,7 @@
                compatible = "autochips,lcm_bridge_ic";
                reg = <0x0c>;
                lcm_id = <0>;
-               status = "okay";
+               status = "disabled";
         };
 };

@@ -1007,7 +1007,7 @@
                compatible = "autochips,lcm_bridge_ic";
                reg = <0x0c>;
                lcm_id = <1>;
-               status = "okay";
+               status = "disabled";
        };

        /* 720P demo board */
@@ -1038,7 +1038,7 @@
                interrupt-parent = <&pio>;
                interrupts = <12 IRQ_TYPE_EDGE_FALLING 12 0>;

-               status = "okay";
+               status = "disabled";
        };

        /* 720P Main  */

delay 100ms

--- a/drivers/rtc/rtc-pcf8563.c
+++ b/drivers/rtc/rtc-pcf8563.c
@@ -22,6 +22,7 @@
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/err.h>
+#include <linux/delay.h>

 #define PCF8563_REG_ST1                0x00 /* status */
 #define PCF8563_REG_ST2                0x01
@@ -650,7 +651,31 @@ static struct i2c_driver pcf8563_driver = {
        .id_table       = pcf8563_id,
 };

+#ifdef MODULE
 module_i2c_driver(pcf8563_driver);
+#else
+static int __init pcf8563_init(void)
+{
+       int rval = 0;
+
+       msleep(100);
+       rval = i2c_add_driver(&pcf8563_driver);
+       if (rval < 0) {
+               pr_info("pcf8563 init fail %d\n", rval);
+       }
+
+       return rval;
+}
+
+static void __exit pcf8563_exit(void)
+{
+       i2c_del_driver(&pcf8563_driver);
+       return;
+}
+
+module_init(pcf8563_init)
+module_exit(pcf8563_exit)
+#endif

 MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>");
 MODULE_DESCRIPTION("Philips PCF8563/Epson RTC8564 RTC driver");

0122 debug

i2c1接pcf8563(写地址0xa2,读地址0xa3),2ms后访问0xee,9次,1ms后2个9次,3ms后访问0x18,3个9次。

kernel设备树中禁用pcf8563,示波器已经量不到pcf8563驱动的i2c操作;在此基础上,把i2c1上的rtc芯片pcf8563断开,示波器抓到的i2c信号变成,访问0xa2 3个9次,访问0xee 3个9次,访问0x18 3个9次。

dts

--- a/arch/arm/boot/dts/ac8257_demo_1g_32.dts
+++ b/arch/arm/boot/dts/ac8257_demo_1g_32.dts
@@ -1106,7 +1106,7 @@
    };

    rtc: pcf8563@51 {
-       status = "okay";
+       status = "disabled";
        compatible = "nxp,pcf8563";
        reg = <0x51>;
    };

i2c-mtk.c

--- a/drivers/i2c/busses/i2c-mtk.c
+++ b/drivers/i2c/busses/i2c-mtk.c
@@ -1428,6 +1428,9 @@ static int mt_i2c_transfer(struct i2c_adapter *adap,
    int ret;
    struct mt_i2c *i2c = i2c_get_adapdata(adap);

+   if (1 == i2c->adap.nr) {
+       pr_info("zzz i2c bus %d, client 0x%02x\n", i2c->adap.nr, msgs->addr);
+   }
    if (i2c->multiplexing) {
        /* Once AP use i2c to transfer, It means bus belong AP.*/
        i2c->multiplexing = 0;

 rtc-pcf8563.c

--- a/drivers/rtc/rtc-pcf8563.c
+++ b/drivers/rtc/rtc-pcf8563.c
@@ -13,6 +13,7 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
+#define DEBUG

 #include <linux/clk-provider.h>
 #include <linux/i2c.h>
@@ -245,6 +246,8 @@ static int pcf8563_get_datetime(struct i2c_client *client, struct rtc_time *tm)
        tm->tm_sec, tm->tm_min, tm->tm_hour,
        tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);

+   dump_stack();
+
    return 0;
 }

@@ -357,6 +360,7 @@ static int pcf8563_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *tm)
        tm->time.tm_hour, tm->time.tm_mday, tm->time.tm_wday,
        tm->enabled, tm->pending);

+   dump_stack();
    return 0;
 }

main.c

--- a/init/main.c
+++ b/init/main.c
@@ -979,6 +979,7 @@ static int __ref kernel_init(void *unused)
 {
    int ret;

+   msleep(5000);
    kernel_init_freeable();
    /* need to finish all async __init code before freeing the memory */
    async_synchronize_full();

0123 /proc/interrupts

proc.c

--- a/kernel/irq/proc.c
+++ b/kernel/irq/proc.c
@@ -441,6 +441,12 @@ int show_interrupts(struct seq_file *p, void *v)
    int i = *(loff_t *) v, j;
    struct irqaction *action;
    struct irq_desc *desc;
+   const char *trigger_type_sz[IRQ_TYPE_PROBE] = {
+       "", "rising", "falling", "both",
+       "high", "", "", "",
+       "low", "", "", "",
+       "high|low", "", "", "",
+   };

    if (i > ACTUAL_NR_IRQS)
        return 0;
@@ -489,6 +495,7 @@ int show_interrupts(struct seq_file *p, void *v)
        seq_printf(p, " %*d", prec, (int) desc->irq_data.hwirq);
 #ifdef CONFIG_GENERIC_IRQ_SHOW_LEVEL
    seq_printf(p, " %-8s", irqd_is_level_type(&desc->irq_data) ? "Level" : "Edge");
+   seq_printf(p, "(%-8s)", trigger_type_sz[irqd_get_trigger_type(&desc->irq_data)]);
 #endif
    if (desc->name)
        seq_printf(p, "-%-8s", desc->name);

0213 MTK TINYSYS SCP

defconfig中禁用SCP后,i2c总线上不再有写地址0xee 0x18的访问。

defconfg

-CONFIG_MTK_TINYSYS_SCP_SUPPORT=y
+CONFIG_MTK_TINYSYS_SCP_SUPPORT=n

0214 i2c1

禁用SCP后i2c总线上只有rtc芯片相关的数据访问,示波器解码出来的i2c数据,与rtc-pcf8563驱动代码一致。

i2c1数据分析

functioni2c
pcf8563_probea2 0e 03Set timer to lowest frequency to save power
pcf8563_get_alarm_modea2 01 A3 00
pcf8563_rtc_read_timea2 00 a3 08 00 38 08 02 14 3d 22 25__rtc_read_alarm
pcf8563_rtc_read_alarma2 09 a3 80 81 80__rtc_read_alarm
  pcf8563_get_alarm_modea2 01 a3 00
pcf8563_rtc_read_timea2 00 a3 08 00 38 08 02 14 3d 22 25__rtc_read_alarm
pcf8563_rtc_read_timea2 00 a3 08 00 38 08 02 14 3d 22 25rtc_initialize_alarm
pcf8563_clkout_register_clka2 0d 00disable the clkout output
a2 0d a3 38pcf8563_clkout_recalc_rate
200ms
pcf8563_rtc_read_timea2 00 a3 08 00 38 08 02 14 3d 22 25rtc_hctosys

 usleep

可能出现返回值小于0,实际休眠时间可能比想要的时间短的情况,接触到的大部分人没有判断函数返回值、man命令查看帮助的习惯,量产后程序时不时出现莫名其妙的情况。

bionic/libc/upstream-freebsd/lib/libc/gen/usleep.c

sleep

bionic/libc/upstream-freebsd/lib/libc/gen/sleep.c

 43 unsigned int
 44 __sleep(unsigned int seconds)
 45 {
 46     struct timespec time_to_sleep;
 47     struct timespec time_remaining;
 48
 49     /*
 50      * Avoid overflow when `seconds' is huge.  This assumes that
 51      * the maximum value for a time_t is >= INT_MAX.
 52      */
 53     if (seconds > INT_MAX)
 54         return (seconds - INT_MAX + __sleep(INT_MAX));
 55
 56     time_to_sleep.tv_sec = seconds;
 57     time_to_sleep.tv_nsec = 0;
 58     if (_nanosleep(&time_to_sleep, &time_remaining) != -1)
 59         return (0);
 60     if (errno != EINTR)
 61         return (seconds);       /* best guess */
 62     return (time_remaining.tv_sec +
 63         (time_remaining.tv_nsec != 0)); /* round up */
 64 }
 65
 66 __weak_reference(__sleep, sleep);
 67 __weak_reference(__sleep, _sleep);

nanosleep

kernel/time/hrtimer.c

1666 SYSCALL_DEFINE2(nanosleep, struct timespec __user *, rqtp,
1667         struct timespec __user *, rmtp)
1668 {
1669     struct timespec tu;
1670
1671     if (copy_from_user(&tu, rqtp, sizeof(tu)))
1672         return -EFAULT;
1673
1674     if (!timespec_valid(&tu))
1675         return -EINVAL;
1676
1677     return hrtimer_nanosleep(&tu, rmtp, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
1678 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2299516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE求职Demo开发日志#32 优化#1 交互逻辑实现接口、提取Bag和Warehouse的父类

1 定义并实现交互接口 接口定义&#xff1a; // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "UObject/Interface.h" #include "MyInterActInterface.generated.h…

如何在 Mac 上解决 Qt Creator 安装后应用程序无法找到的问题

在安装Qt时&#xff0c;遇到了一些问题&#xff0c;尤其是在Mac上安装Qt后&#xff0c;发现Qt Creator没有出现在应用程序中。通过一些搜索和操作&#xff0c;最终解决了问题。以下是详细的记录和解决方法。 1. 安装Qt后未显示Qt Creator 安装完成Qt后&#xff0c;启动应用程…

多线程基础面试题剖析

一、线程的创建方式有几种 创建线程的方式有两种&#xff0c;一种是继承Thread&#xff0c;一种是实现Runable 在这里推荐使用实现Runable接口&#xff0c;因为java是单继承的&#xff0c;一个类继承了Thread将无法继承其他的类&#xff0c;而java可以实现多个接口&#xff0…

Android设备 网络安全检测

八、网络与安全机制 6.1 网络框架对比 volley&#xff1a; 功能 基于HttpUrlConnection;封装了UIL图片加载框架&#xff0c;支持图片加载;网络请求的排序、优先级处理缓存;多级别取消请求;Activity和生命周期的联动&#xff08;Activity结束生命周期同时取消所有网络请求 …

神经网络的学习 求梯度

import sys, ossys.path.append(os.pardir) import numpy as npfrom common.functions import softmax, cross_entropy_error from common.gradient import numerical_gradient# simpleNet类 class simpleNet:def __init__(self):self.W np.random.rand(2, 3) # 随机形状为2*…

AI向量数据库之LanceDB快速介绍

LanceDB LanceDB 是一个开源的向量搜索数据库&#xff0c;具备持久化存储功能&#xff0c;极大地简化了嵌入向量的检索、过滤和管理。 LanceDB的主要特点 LanceDB 的主要特点包括&#xff1a; 生产级向量搜索&#xff1a;无需管理服务器。 存储、查询和过滤向量、元数据以…

CentOS7 安装配置FTP服务

CentOS7 安装配置FTP服务 CentOS7 安装配置FTP服务1. FTP简介2. 先行准备2.1 关闭防火墙2.2 关闭 SELinux 3.安装FTP软件包4. 创建 FTP 用户及目录4.1 创建 FTP 目录并设置权限4.2 防止 FTP 用户登录 Linux 终端4.3 创建 FTP 用户组及用户4.4 创建 FTP 可写目录 5. 配置ftp服务…

【设计模式】03-理解常见设计模式-行为型模式(专栏完结)

前言 前面我们介绍完创建型模式和创建型模式&#xff0c;这篇介绍最后的行为型模式&#xff0c;也是【设计模式】专栏的最后一篇。 一、概述 行为型模式主要用于处理对象之间的交互和职责分配&#xff0c;以实现更灵活的行为和更好的协作。 二、常见的行为型模式 1、观察者模…

编程题-最大子数组和(中等-重点【贪心、动态规划、分治思想的应用】)

题目&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组是数组中的一个连续部分。 解法一&#xff08;枚举法-时间复杂度超限&#xff09;&#xff1a; …

本地通过隧道连接服务器的mysql

前言 服务器上部署了 mysql&#xff0c;本地希望能访问该 mysql&#xff0c;但是又不希望 mysql 直接暴露在公网上 那么可以通过隧道连接 ssh 端口的方式进行连接 从外网看&#xff0c;服务器只开放了一个 ssh 端口&#xff0c;并没有开放 3306 监听端口 设置本地免密登录 …

2. grafana插件安装并接入zabbix

一、在线安装 如果不指定安装位置&#xff0c;则默认安装位置为/var/lib/grafana/plugins 插件安装完成之后需要重启grafana 命令在上一篇讲到过 //查看相关帮助 [rootlocalhost ~]# grafana-cli plugins --help //从列举中的插件过滤zabbix插件 [rootlocalhost ~]# grafana…

Linux第107步_Linux之PCF8563实验

使用PCF8563代替内核的RTC&#xff0c;可以降低功耗&#xff0c;提高时间的精度。同时有助于进一步熟悉I2C驱动的编写。 1、了解rtc_time64_to_tm()和rtc_tm_to_time64() 打开“drivers/rtc/lib.c” /* * rtc_time64_to_tm - Converts time64_t to rtc_time. * Convert seco…

功能说明并准备静态结构

功能说明并准备静态结构 <template><div class"card-container"><!-- 搜索区域 --><div class"search-container"><span class"search-label">车牌号码&#xff1a;</span><el-input clearable placeho…

[免费]SpringBoot公益众筹爱心捐赠系统【论文+源码+SQL脚本】

大家好&#xff0c;我是老师&#xff0c;看到一个不错的SpringBoot公益众筹爱心捐赠系统&#xff0c;分享下哈。 项目介绍 公益捐助平台的发展背景可以追溯到几十年前&#xff0c;当时人们已经开始通过各种渠道进行公益捐助。随着互联网的普及&#xff0c;本文旨在探讨公益事业…

ML.Net二元分类

ML.Net二元分类 文章目录 ML.Net二元分类前言项目的创建机器学习模型的创建添加模型选择方案训练环境的选择训练数据的添加训练数据的选择训练数据的格式要预测列的选择模型评估模型的使用总结前言 ‌ML.NET‌是由Microsoft为.NET开发者平台创建的免费、开源、跨平台的机器学习…

visutal studio 2022使用qcustomplot基础教程

编译 下载&#xff0c;2.1.1版支持到Qt6.4 。 拷贝qcustomplot.h和qcustomplot.cpp到项目源目录&#xff08;Qt project&#xff09;。 在msvc中将它俩加入项目中。 使用Qt6.8&#xff0c;需要修改两处代码&#xff1a; L6779 # if QT_VERSION > QT_VERSION_CHECK(5, 2, …

本地搭建自己的专属客服之OneApi关联Ollama部署的大模型并创建令牌《下》

这里写目录标题 OneApi1、渠道设置2、令牌创建 配置文件修改修改配置文件docker-compose.yml修改config.json到此结束 上文讲了如何本地docker部署fastGtp&#xff0c;相信大家也都已经部署成功了&#xff01;&#xff01;&#xff01; 今天就说说怎么让他们连接在一起 创建你的…

【C】初阶数据结构4 -- 双向循环链表

之前学习的单链表相比于顺序表来说&#xff0c;就是其头插和头删的时间复杂度很低&#xff0c;仅为O(1) 且无需扩容&#xff1b;但是对于尾插和尾删来说&#xff0c;由于其需要从首节点开始遍历找到尾节点&#xff0c;所以其复杂度为O(n)。那么有没有一种结构是能使得头插和头删…

小爱音箱控制手机和电视听歌的尝试

最近买了小爱音箱pro&#xff0c;老婆让我扔了&#xff0c;吃灰多年的旧音箱。当然舍不得&#xff0c;比小爱还贵&#xff0c;刚好还有一台红米手机&#xff0c;能插音箱&#xff0c;为了让音箱更加灵活&#xff0c;买了个2元的蓝牙接收模块Type-c供电3.5接口。这就是本次尝试起…

Kotlin Lambda

Kotlin Lambda 在探索Kotlin Lambda之前&#xff0c;我们先回顾下Java中的Lambda表达式&#xff0c;Java 的 Lambda 表达式是 Java 8 引入的一项强大的功能&#xff0c;它使得函数式编程风格的代码更加简洁和易于理解。Lambda 表达式允许你以一种更简洁的方式表示实现接口&…