Linux驱动|Linux内核RTC时间架构

原创 一口Linux 2022-10-08 11:50

点击左上方蓝色“一口Linux”,选择“设为星标

第一时间看干货文章 
【干货】嵌入式驱动工程师学习路线
【干货】Linux嵌入式知识点-思维导图



 1

上一篇文章我们给大家讲解了基于瑞芯微rk3568平台芯片hym8563驱动的移植,本文给大家详细讲解Linux内核的时间子系统。

《Linux驱动|rtc-hym8563移植笔记》

一、Linux 时间操作命令 :date、hwclock

Linux时间有两个: 系统时间(Wall Time), RTC时间

1)系统时间(WT):

由Linux系统软件维持的时间,通过Linux命令date查看:

rk3568_r:/ # date
Wed Sep 21 03:05:21 GMT 2022

获取到的就是系统时间。

2)RTC时间:

这个时间来自我们设备上的RTC芯片,通过Linux命令hwclock 可以读取:

rk3568_r:/ # hwclock
Wed Sep 21 03:05:24 2022  0.000000 seconds

我们通过man查看date和hwclock的介绍:

命令说明

1)date

DESCRIPTION
       Display the current time in the given FORMAT, or set the system date.

2)hwclock

DESCRIPTION
       hwclock  is  a tool for accessing the Hardware Clock.  It can: display the Hardware
       Clock time; set the Hardware Clock to a specified time; set the Hardware Clock from
       the  System  Clock;  set  the  System Clock from the Hardware Clock; compensate for
       Hardware Clock drift; correct the System Clock timescale; set  the  kernel's  time‐
       zone,  NTP  timescale,  and  epoch  (Alpha  only);  compare the System and Hardware
       Clocks; and predict future Hardware Clock values based on its drift rate.

       Since v2.26 important changes were made to the --hctosys function and the  --direc‐
       tisa  option,  and  a  new  option  --update-drift was added.  See their respective
       descriptions below.

接下来,通过代码看下两者的关系。

二、RTC时间框架

框架如图:

从该架构可得:

Hardware:提供时间信息(time&alarm),通过一定的接口(比如I2C)和RTC Driver进行交互
Driver:  完成硬件的访问功能,提供访问接口,以驱动的形式驻留在系统
class.c:驱动注册方式由class.c:文件提供。驱动注册成功后会构建rtc_device结构体表征的rtc设备,并把rtc芯片的操作方式存放到rtc设备的ops成员中
interface.c:文件屏蔽硬件相关的细节,向上提供统一的获取/设置时间或Alarm的接口
rtc-lib.c:文件提供通用的时间操作函数,如rtc_time_to_tm、rtc_valid_tm等
rtc-dev.c:文件在/dev/目录下创建设备节点供应用层访问,如open、read、ioctl等,访问方式填充到file_operations结构体中
hctosys.c/rtc-sys.c/rtc-proc.c:将硬件时钟写给 wall time

下面我们从底层往上层来一步步分析。

1、rtc_class_ops 填充

驱动主要工作是填充 rtc_class_ops结构体,结构体描述了RTC芯片能够提供的所有操作方式:

struct rtc_class_ops {
    int (*open)(struct device *);
    void (*release)(struct device *);
    int (*ioctl)(struct device *, unsigned intunsigned 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_mmss)(struct device *, unsigned long secs);
    int (*read_callback)(struct device *, int data);
    int (*alarm_irq_enable)(struct device *, unsigned int enabled);
};

实现:

static const struct rtc_class_ops hym8563_rtc_ops = {
 .read_time  = hym8563_rtc_read_time,
 .set_time  = hym8563_rtc_set_time,
 .alarm_irq_enable = hym8563_rtc_alarm_irq_enable,
 .read_alarm  = hym8563_rtc_read_alarm,
 .set_alarm  = hym8563_rtc_set_alarm,
};

注册:

 hym8563->rtc = devm_rtc_device_register(&client->dev, client->name,
      &hym8563_rtc_ops, THIS_MODULE);

成功的话log:

[    0.758774] hym8563_probe()---565----
[    0.760651] rtc-hym8563 5-0051: rtc information is invalid
[    0.761666] hym8563_rtc_read_time()---115----1--
[    0.761681] hym8563_rtc_set_time()---129----1--
[    0.764235] hym8563_rtc_read_time()---115----1--
[    0.766425] hym8563_rtc_read_time()---115----1--
[    0.767439] hym8563_rtc_read_time()---115----1--
[    0.767619] rtc-hym8563 5-0051: rtc core: registered hym8563 as rtc0
[    0.768634] hym8563_rtc_read_time()---115----1--
[    0.768661] rtc-hym8563 5-0051: setting system clock to 2021-01-01 12:00:00 UTC (1609502400)

从log可得 5-0051:   5表示I2C通道5,0051表示从设备地址 rtc0   :注册的rtc设备为rtc0

2、class.c和RTC驱动注册

class.c文件在RTC驱动注册之前开始得到运行:

static int __init rtc_init(void)
{
    rtc_class = class_create(THIS_MODULE, "rtc");
    rtc_class->suspend = rtc_suspend;
    rtc_class->resume = rtc_resume;
    rtc_dev_init();
    rtc_sysfs_init(rtc_class);
    return 0;
}
subsys_initcall(rtc_init);

函数功能:

  • 1、创建名为rtc的class
  • 2、提供PM相关接口suspend/resume
  • 3、rtc_dev_init():动态申请/dev/rtcN的设备号
  • 4、rtc_sysfs_init():rtc类具有的device_attribute属性

3、RTC驱动注册函数devm_rtc_device_register():

drivers/class.c
struct rtc_device *devm_rtc_device_register(struct device *dev,
     const char *name,
     const struct rtc_class_ops *ops,
     struct module *owner)
{

 struct rtc_device **ptr, *rtc;

 ptr = devres_alloc(devm_rtc_device_release, sizeof(*ptr), GFP_KERNEL);
 if (!ptr)
  return ERR_PTR(-ENOMEM);

 rtc = rtc_device_register(name, dev, ops, owner);
 if (!IS_ERR(rtc)) {
  *ptr = rtc;
  devres_add(dev, ptr);
 } else {
  devres_free(ptr);
 }

 return rtc;
}

rtc_device_register()定义如下

struct rtc_device *rtc_device_register(const char *name, struct device *dev,
                    const struct rtc_class_ops *ops,
                    struct module *owner)

{
    struct rtc_device *rtc;
    struct rtc_wkalrm alrm;
    int id, err;
    
    // 1、Linux支持多个RTC设备,所以需要为每一个设备分配一个ID
    // 对应与/dev/rtc0,/dev/rtc1,,,/dev/rtcN
    id = ida_simple_get(&rtc_ida, 00, GFP_KERNEL);
 
    // 2、创建rtc_device设备(对象)并执行初始化
    rtc = kzalloc(sizeof(struct rtc_device), GFP_KERNEL);
    rtc->id = id;
    rtc->ops = ops; // 2.1 对应RTC驱动填充的test_rtc_ops
    rtc->owner = owner;
    rtc->irq_freq = 1;
    rtc->max_user_freq = 64;
    rtc->dev.parent = dev;
    rtc->dev.class = rtc_class;// 2.2 rtc_init()创建的rtc_class
    rtc->dev.release = rtc_device_release;
 
    // 2.3 rtc设备中相关锁、等待队列的初始化
    mutex_init(&rtc->ops_lock);
    spin_lock_init(&rtc->irq_lock);
    spin_lock_init(&rtc->irq_task_lock);
    init_waitqueue_head(&rtc->irq_queue);
 
    // 2.4 Init timerqueue:我们都知道,手机等都是可以设置多个闹钟的
    timerqueue_init_head(&rtc->timerqueue);
    INIT_WORK(&rtc->irqwork, rtc_timer_do_work);
    // 2.5 Init aie timer:alarm interrupt enable,RTC闹钟中断
    rtc_timer_init(&rtc->aie_timer, rtc_aie_update_irq, (void *)rtc);
    // 2.6 Init uie timer:update interrupt,RTC更新中断
    rtc_timer_init(&rtc->uie_rtctimer, rtc_uie_update_irq, (void *)rtc);
    /* Init pie timer:periodic interrupt,RTC周期性中断 */
    hrtimer_init(&rtc->pie_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
    rtc->pie_timer.function = rtc_pie_update_irq;
    rtc->pie_enabled = 0;
 
    /* Check to see if there is an ALARM already set in hw */
    err = __rtc_read_alarm(rtc, &alrm);
 
    // 3、如果RTC芯片中设置了有效的Alarm,则初始化:加入到rtc->timerqueue队列中
    if (!err && !rtc_valid_tm(&alrm.time))
        rtc_initialize_alarm(rtc, &alrm);
 
    // 4、根据name参数设置rtc的name域
    strlcpy(rtc->name, name, RTC_DEVICE_NAME_SIZE);
    // 5、设置rtc的dev成员中的name域
    dev_set_name(&rtc->dev, "rtc%d", id);
 
    // 6、/dev/rtc0的rtc作为字符设备进行初始化
    // rtc_dev_prepare-->cdev_init(&rtc->char_dev, &rtc_dev_fops);
    rtc_dev_prepare(rtc);
 
    // 7、添加rtc设备到系统
    err = device_register(&rtc->dev);
 
    // 8、rtc设备作为字符设备添加到系统
    // rtc_dev_add_devicec-->dev_add(&rtc->char_dev, rtc->dev.devt, 1)
    // 然后就存在/dev/rtc0了
    rtc_dev_add_device(rtc);
    rtc_sysfs_add_device(rtc);
    // 9、/proc/rtc
    rtc_proc_add_device(rtc);
 
    dev_info(dev, "rtc core: registered %s as %s\n",
            rtc->name, dev_name(&rtc->dev));
 
    return rtc;
}

有了 /dev/rtc0后,应用层就可以通过 open/read/ioctl操作RTC设备了,对应与内核的file_operations:

static const struct file_operations rtc_dev_fops = {
    .owner        = THIS_MODULE,
    .llseek        = no_llseek,
    .read        = rtc_dev_read,
    .poll        = rtc_dev_poll,
    .unlocked_ioctl    = rtc_dev_ioctl,
    .open        = rtc_dev_open,
    .release    = rtc_dev_release,
    .fasync        = rtc_dev_fasync,
};

4、硬件抽象层interface.c

硬件抽象,即屏蔽具体的硬件细节,为上层用户提供统一的调用接口,使用者无需关心这些接口是怎么实现的。 以RTC访问为例,抽象的实现位于interface.c文件,其实现基于class.c中创建的rtc_device设备。 实现原理,以rtc_set_time为例:

drivers/interface.c
int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm)
{
    int err;
    // 1、参数检测
    err = rtc_valid_tm(tm);
 
    err = mutex_lock_interruptible(&rtc->ops_lock);
    if (err)
        return err;
 
    // 2、调用rtc_device中ops结构体的函数指针
    // ops结构体的函数指针已经在RTC驱动中被赋值
    if (!rtc->ops)
        err = -ENODEV;
    else if (rtc->ops->set_time)
        err = rtc->ops->set_time(rtc->dev.parent, tm);
    mutex_unlock(&rtc->ops_lock);
    /* A timer might have just expired */
    schedule_work(&rtc->irqwork);
    return err;
}

5、rtc在sysfs文件系统中的呈现

之前曾建立过名为rtc的class:

rtc_class = class_create(THIS_MODULE, "rtc");

查看之:

# ls /sys/class/rtc/                                    
rtc0
# ls -l /sys/class/rtc/                                 
lrwxrwxrwx 1 root root 0 2021-01-01 12:00 rtc0 -> ../../devices/platform/fe5e0000.i2c/i2c-5/5-0051/rtc/rtc0

我们系统中只有一个RTC,所以编号为rtc0。

同时发现rtc0文件为指向/sys/devices/platform/fe5e0000.i2c/i2c-5/5-0051/rtc/rtc0的符号链接,

RTC芯片是I2C接口,所以rtc0挂载在I2C的总线上,总线控制器地址fe5e0000,控制器编号为5,RTC芯片作为slave端地址为0x51。

rtc0 设备属性:

drivers/rtc-sysfs.c
void __init rtc_sysfs_init(struct class *rtc_class)
{
 rtc_class->dev_attrs = rtc_attrs;
}
static struct attribute *rtc_attrs[] = {
 &dev_attr_name.attr,
 &dev_attr_date.attr,
 &dev_attr_time.attr,
 &dev_attr_since_epoch.attr,
 &dev_attr_max_user_freq.attr,
 &dev_attr_hctosys.attr,
 NULL,
};

对应文件系统中的文件节点:

rk3568_r:/sys/class/rtc # cd rtc0/
rk3568_r:
/sys/class/rtc/rtc0 # ls -l
total 0
-r--r--r-- 1 root root 4096 2022-09-21 03:
56 date
-r--r--r-- 1 root root 4096 2022-09-21 03:56 dev
lrwxrwxrwx 1 root root    0 2022-09-21 03:56 device -> ../../../5-0051
-r--r--r-- 1 root root 4096 2021-01-01 12:00 hctosys
-rw-r--r-- 1 root root 4096 2022-09-21 03:56 max_user_freq
-r--r--r-- 1 root root 4096 2022-09-21 03:56 name
drwxr-xr-x 2 root root    0 2021-01-01 12:00 power
-r--r--r-- 1 root root 4096 2022-09-21 03:56 since_epoch
lrwxrwxrwx 1 root root    0 2022-09-21 03:56 subsystem -> ../../../../../../../class/rtc
-r--r--r-- 1 root root 4096 2022-09-21 03:
56 time
-rw-r--r-- 1 root root 4096 2021-01-01 12:00 uevent
-rw-r--r-- 1 root root 4096 2022-09-21 03:56 wakealarm
drwxr-xr-x 2 root root    0 2021-01-01 12:00 wakeup8

6、rtc在proc文件系统中的呈现

之前曾rtc0设备加入到了/proc

drivers/class.c
rtc_device_register()
{

 --->rtc_proc_add_device(rtc);
}
void rtc_proc_add_device(struct rtc_device *rtc)
{
 if (is_rtc_hctosys(rtc))
  proc_create_data("driver/rtc"0NULL, &rtc_proc_fops, rtc);
}

查看之:

# cat /proc/driver/rtc                                       
rtc_time        : 03:59:11
rtc_date        : 2022-09-21
alrm_time       : 12:00:00
alrm_date       : 2021-01-02
alarm_IRQ       : no
alrm_pending    : no
update IRQ enabled      : no
periodic IRQ enabled    : no
periodic IRQ frequency  : 1
max user IRQ frequency  : 64
24hr            : yes

信息来源:

rtc_proc_fops
 -->rtc_proc_open
  -->rtc_proc_show

三、WT时间和RTC时间同步问题

1)

WT时间来自于RTC时间,流程是:

上电-->RTC驱动加载-->从RTC同步时间到WT时间

对应驱动代码:

hctosys.c (drivers\rtc)
static int __init rtc_hctosys(void)
{
 ......
    struct timespec tv = {
        .tv_nsec = NSEC_PER_SEC >> 1,
    };
    
    err = rtc_read_time(rtc, &tm);
    err = do_settimeofday(&tv);
    dev_info(rtc->dev.parent,
        "setting system clock to "
        "%d-%02d-%02d %02d:%02d:%02d UTC (%u)\n",
        tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
        tm.tm_hour, tm.tm_min, tm.tm_sec,
        (unsigned int) tv.tv_sec);
    ......
}
late_initcall(rtc_hctosys);

late_initcall说明系统在启动流程的后面才会调用该函数去同步时间。

2)瑞芯微时间操作

在瑞芯微的系统中,安卓部分程序其实最终也是依赖**/sys/class/rtc/rtc0** 下的文件节点实现时间管理功能的。

安卓程序会通过AlarmImpl::getTime、AlarmImpl::setTime()方法来获得和设置RTC时间:

frameworks/base/services/core/jni/com_android_server_AlarmManagerService.cpp 
122 int AlarmImpl::getTime(int type, struct itimerspec *spec)
123 {
124     if (static_cast(type) > ANDROID_ALARM_TYPE_COUNT) {
125         errno = EINVAL;
126         return -1;
127     }
128 
129     return timerfd_gettime(fds[type], spec);
130 }
131 
132 int AlarmImpl::setTime(struct timeval *tv)
133 {
134     struct rtc_time rtc;
135     struct tm tm, *gmtime_res;
136     int fd;
137     int res;
138 
139     res = settimeofday(tv, NULL);
140     if (res < 0) {
141         ALOGV("settimeofday() failed: %s\n", strerror(errno));
142         return -1;
143     }
144 
145     if (rtc_id < 0) {
146         ALOGV("Not setting RTC because wall clock RTC was not found");
147         errno = ENODEV;
148         return -1;
149     }
150 
151     android::String8 rtc_dev = String8::format("/dev/rtc%d", rtc_id);
152     fd = open(rtc_dev.string(), O_RDWR);
153     if (fd < 0) {
154         ALOGV("Unable to open %s: %s\n", rtc_dev.string(), strerror(errno));
155         return res;
156     }
157 
158     gmtime_res = gmtime_r(&tv->tv_sec, &tm);
159     if (!gmtime_res) {
160         ALOGV("gmtime_r() failed: %s\n", strerror(errno));
161         res = -1;
162         goto done;
163     }
164 
165     memset(&rtc, 0, sizeof(rtc));
166     rtc.tm_sec = tm.tm_sec;
167     rtc.tm_min = tm.tm_min;
168     rtc.tm_hour = tm.tm_hour;
169     rtc.tm_mday = tm.tm_mday;
170     rtc.tm_mon = tm.tm_mon;
171     rtc.tm_year = tm.tm_year;
172     rtc.tm_wday = tm.tm_wday;
173     rtc.tm_yday = tm.tm_yday;
174     rtc.tm_isdst = tm.tm_isdst;
175     res = ioctl(fd, RTC_SET_TIME, &rtc);                                                                                                                                                                                                                  
176     if (res < 0)
177         ALOGV("RTC_SET_TIME ioctl failed: %s\n", strerror(errno));
178 done:
179     close(fd);
180     return res;
181 }

系统上电后,会先读取文件hctosys中的值,来决定是否将RTC时间写入到wall time:

255 static const char rtc_sysfs[] = "/sys/class/rtc";
256 
257 static bool rtc_is_hctosys(unsigned int rtc_id)
258 {
259     android::String8 hctosys_path = String8::format("%s/rtc%u/hctosys",
260             rtc_sysfs, rtc_id);
261     FILE *file = fopen(hctosys_path.string(), "re");
262     if (!file) {
263         ALOGE("failed to open %s: %s", hctosys_path.string(), strerror(errno));
264         return false;
265     }
266 
267     unsigned int hctosys;
268     bool ret = false;
269     int err = fscanf(file, "%u", &hctosys);
270     if (err == EOF)
271         ALOGE("failed to read from %s: %s", hctosys_path.string(),
272                 strerror(errno));
273     else if (err == 0)
274         ALOGE("%s did not have expected contents", hctosys_path.string());
275     else
276         ret = hctosys;
277 
278     fclose(file);
279     return ret;
280 }

269行,就是读取文件hctosys中的值,值为1则允许rtc时间写入到wall time,为0或者其他错误则不允许。

因为rtc只要有纽扣电池供电,就会有计时功能,

这是就是为什么,我们的设备关机并重启后,仍然能够显示正确的时间的原因。

【注意目录/sys/class/rtc/下文件是需要有访问权限的】

瑞芯微对文件权限的控制由以下文件提供:

device/rockchip/common/sepolicy/vendor/genfs_contexts

只需要按照对应的格式增加对应文件信息即可。

四、欢迎交流

一口君建立了瑞芯微的技术交流群,

大家工作中用到瑞芯微系列soc的,可以一起交流,

加群后台留言即可。

end


一口Linux 


关注,回复【1024】海量Linux资料赠送

精彩文章合集


文章推荐

【专辑】ARM
【专辑】粉丝问答
【专辑】所有原创
专辑linux入门
专辑计算机网络
专辑Linux驱动
【干货】嵌入式驱动工程师学习路线
【干货】Linux嵌入式所有知识点-思维导图
一口Linux 写点代码,写点人生!
评论 (0)
  • HDMI从2.1版本开始采用FRL传输模式,和2.0及之前的版本不同。两者在物理层信号上有所区别,这就需要在一些2.1版本的电路设计上增加匹配电路,使得2.1版本的电路能够向下兼容2.0及之前版本。2.1版本的信号特性下面截取自2.1版本规范定义,可以看到2.1版本支持直流耦合和交流耦合,其共模电压和AVCC相关,信号摆幅在400mV-1200mV2.0及之前版本的信号特性HDMI2.0及之前版本采用TMDS信号物理层,其结构和参数如下:兼容设计根据以上规范定义,可以看出TMDS信号的共模电压范
    durid 2025-04-08 19:01 138浏览
  •   卫星图像智能测绘系统:地理空间数据处理的创新引擎   卫星图像智能测绘系统作为融合卫星遥感、地理信息系统(GIS)、人工智能(AI)以及大数据分析等前沿技术的综合性平台,致力于达成高精度、高效率的地理空间数据采集、处理与应用目标。借助自动化、智能化的技术路径,该系统为国土资源管理、城市规划、灾害监测、环境保护等诸多领域输送关键数据支撑。   应用案例   目前,已有多个卫星图像智能测绘系统在实际应用中取得了显著成效。例如,北京华盛恒辉北京五木恒润卫星图像智能测绘系统。这些成功案例为卫星
    华盛恒辉l58ll334744 2025-04-08 16:19 69浏览
  •   工业自动化领域电磁兼容与接地系统深度剖析   一、电磁兼容(EMC)基础认知   定义及关键意义   电磁兼容性(EMC),指的是设备或者系统在既定的电磁环境里,不但能按预期功能正常运转,而且不会对周边其他设备或系统造成难以承受的电磁干扰。在工业自动化不断发展的当下,大功率电机、变频器等设备被大量应用,现场总线、工业网络等技术也日益普及,致使工业自动化系统所处的电磁环境变得愈发复杂,电磁兼容(EMC)问题也越发严峻。   ​电磁兼容三大核心要素   屏蔽:屏蔽旨在切断电磁波的传播路
    北京华盛恒辉软件开发 2025-04-07 22:55 216浏览
  •     在研究Corona现象时发现:临界电压与介电材料表面的清洁程度有关。表面越清洁的介电材料,临界电压越高;表面污染物越多的地方,越容易“爬电”。关于Corona现象,另见基础理论第007篇。    这里说的“污染物”,定义为——可能影响介电强度或表面电阻率的固体、液体或气体(电离气体)的任何情况。    IEC 60664-1 (对应GB/T 16935.1-2023) 定义了 Pollution Degree,中文术语是“污染等
    电子知识打边炉 2025-04-07 22:06 98浏览
  • 及时生产 JIT(Just In Time)的起源JIT 起源于 20 世纪 70 年代爆发的全球石油危机和由此引发的自然资源短缺,这对仰赖进口原物料发展经济的日本冲击最大。当时日本的生产企业为了增强竞争力、提高产品利润,在原物料成本难以降低的情况下,只能从生产和流通过程中寻找利润源,降低库存、库存和运输等方面的生产性费用。根据这种思想,日本丰田汽车公司创立的一种具有特色的现代化生产方式,即 JIT,并由此取得了意想不到的成果。由于它不断地用于汽车生产,随后被越来越多的许多行业和企业所采用,为日
    优思学院 2025-04-07 11:56 113浏览
  • 贞光科技作为三星电机车规电容代理商,针对电动汽车领域日益复杂的电容选型难题,提供全方位一站式解决方案。面对高温稳定性、高可靠性、高纹波电流和小型化等严苛要求,三星车规电容凭借完整产品矩阵和卓越技术优势,完美满足BMS、电机控制器和OBC等核心系统需求。无论技术选型、供应链保障、样品测试还是成本优化,贞光科技助力客户在电动汽车产业高速发展中占据技术先机。在电动汽车技术高速发展的今天,作为汽车电子系统中不可或缺的关键元器件,电容的选型已成为困扰许多工程师和采购人员的难题。如何在众多参数和型号中找到最
    贞光科技 2025-04-07 17:06 69浏览
  • 在万物互联时代,智能化安防需求持续升级,传统报警系统已难以满足实时性、可靠性与安全性并重的要求。WT2003H-16S低功耗语音芯片方案,以4G实时音频传输、超低功耗设计、端云加密交互为核心,重新定义智能报警设备的性能边界,为家庭、工业、公共安防等领域提供高效、稳定的安全守护。一、技术内核:五大核心突破,构建全场景安防基座1. 双模音频传输,灵活应对复杂场景实时音频流传输:内置高灵敏度MIC,支持环境音实时采集,通过4G模块直接上传至云端服务器,响应速度低至毫秒级,适用于火灾警报、紧急呼救等需即
    广州唯创电子 2025-04-08 08:59 141浏览
  • 在全球电子产业面临供应链波动、技术迭代和市场需求变化等多重挑战的背景下,安博电子始终秉持“让合作伙伴赢得更多一点”的核心理念,致力于打造稳健、高效、可持续的全球供应链体系。依托覆盖供应商管理、品质检测、智能交付的全链路品控体系,安博电子不仅能确保电子元器件的高可靠性与一致性,更以高透明的供应链管理模式,助力客户降低风险、提升运营效率,推动行业标准升级,与全球合作伙伴共同塑造更具前瞻性的产业生态。动态优选机制:构建纯净供应链生态安博电子将供应商管理视为供应链安全的根基。打造动态优选管控体系,以严格
    电子资讯报 2025-04-07 17:06 95浏览
  • 曾几何时,汽车之家可是汽车资讯平台领域响当当的“扛把子”。2005 年成立之初,它就像一位贴心的汽车小助手,一下子就抓住了大家的心。它不仅吸引了海量用户,更是成为汽车厂商和经销商眼中的“香饽饽”,广告投放、合作推广不断,营收和利润一路高歌猛进,2013年成功在纽交所上市,风光无限。2021年更是在香港二次上市,达到了发展的巅峰,当年3月15日上市首日,港股股价一度高达184.6港元,市值可观。然而,如今的汽车之家却陷入了困境,业务下滑明显。业务增长瓶颈从近年来汽车之家公布的财报数据来看,情况不容
    用户1742991715177 2025-04-07 21:48 113浏览
  • 在人工智能技术飞速发展的今天,语音交互正以颠覆性的方式重塑我们的生活体验。WTK6900系列语音识别芯片凭借其离线高性能、抗噪远场识别、毫秒级响应的核心优势,为智能家居领域注入全新活力。以智能风扇为起点,我们开启一场“解放双手”的科技革命,让每一缕凉风都随“声”而至。一、核心技术:精准识别,无惧环境挑战自适应降噪,听懂你的每一句话WTK6900系列芯片搭载前沿信号处理技术,通过自适应降噪算法,可智能过滤环境噪声干扰。无论是家中电视声、户外虫鸣声,还是厨房烹饪的嘈杂声,芯片均能精准提取有效指令,识
    广州唯创电子 2025-04-08 08:40 174浏览
  •     根据 IEC术语,瞬态过电压是指持续时间几个毫秒及以下的过高电压,通常是以高阻尼(快速衰减)形式出现,波形可以是振荡的,也可以是非振荡的。    瞬态过电压的成因和机理,IEC 60664-1给出了以下四种:    1. 自然放电,最典型的例子是雷击,感应到电力线路上,并通过电网配电系统传输,抵达用户端;        2. 电网中非特定感性负载通断。例如热处理工厂、机加工工厂对
    电子知识打边炉 2025-04-07 22:59 136浏览
  •   卫星图像智能测绘系统全面解析   一、系统概述   卫星图像智能测绘系统是基于卫星遥感技术、图像处理算法与人工智能(AI)技术的综合应用平台,旨在实现高精度、高效率的地理空间数据获取、处理与分析。该系统通过融合多源卫星数据(如光学、雷达、高光谱等),结合AI驱动的智能算法,实现自动化、智能化的测绘流程,广泛应用于城市规划、自然资源调查、灾害监测等领域。   应用案例   目前,已有多个卫星图像智能测绘系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润卫星图像智能测绘系统
    华盛恒辉l58ll334744 2025-04-08 15:04 72浏览
  • 文/Leon编辑/cc孙聪颖‍转手绢、跳舞、骑车、后空翻,就在宇树、智元等独角兽企业率领“机器人大军”入侵短视频时,却有资本和科技大佬向此产业泼了一盆冷水。金沙江创投管理合伙人朱啸虎近日突然对人形机器人发难,他表示“最近几个月正在批量退出人形机器人公司”。“只是买回去做研究的,或者买回去做展示的,这种都不是我们意义上的商业化,谁会花十几万买一个机器人去干这些活?”朱啸虎吐槽。不过,朱啸虎的观点很快就遭到驳斥,众擎机器人的创始人、董事长赵同阳回怼道:“(朱啸虎)甚至问出了人形机器人在这个阶段有什么
    华尔街科技眼 2025-04-07 19:24 150浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦