RK3399 探索之旅 / Audio 驱动层速读

一口Linux 2021-03-03 00:00


目的:

  • 从驱动开发的角度大致了解一下 RK3399 Audio 功能。

环境:

  • NanoPC-T4 / Ubuntu-18.04 / Linux-4.4

目录:

1. 测试功能
2. 浏览硬件信息
3. 查看 driver 层
4. 应用层查看声卡信息


1. 测试功能

播放:

# 查看 playback 设备
$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: realtekrt5651co [realtek,rt5651-codec], device 0: ff880000.i2s-rt5651-aif1 rt5651-aif1-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0

# 在 card 0, device 0 上播放 wav 文件
$ aplay -D hw:0,0 /root/Music/test.wav

录音:

# 查看 record 设备
$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: realtekrt5651co [realtek,rt5651-codec], device 0: ff880000.i2s-rt5651-aif1 rt5651-aif1-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0

# 从 card0, device 0 上录音
$ arecord -D hw:0,0 -f dat filename.wav


2. 浏览硬件信息

1) 查看原理图

点击查看大图

关键点:

  • Audio Codec的型号:Realtek-ALC5651
  • 控制:I2C1
  • 数据:I2S0
  • 耳机插拔检测:PHONE_DET -> HP_DET_H -> GPIO4_D3_d
  • 录音:MIC_IN2P / MIC_IN2N

2) 查看 RK3399 的 datasheet

关键点:

点击查看大图

3) 查看 RK3399 的 TRM

关键点:(Chapter 22 I2S/PCM Controller):

  • 概述 / Overview
    • I2S/PCM controllers 的 features
  • 框图 / Block Diagram
  • 点击查看大图
  • 功能描述 / Function description
    • master / slave
    • i2s 的3种 mode
    • pcm 的4种 mode
  • 寄存器描述 / Register Description,最重点的章节,深度定制时需完整阅读。
  • 引脚配置 / Interface description
  • 应用说明 / Application Notes
  • 点击查看大图

4) 查看 Audio Codec/Realtek-ALC5651 的 datasheet

关键点:

  • 2.Features
  • 4.Function Block and Mixer Path
  • 点击查看大图
    • Audio Mixer Path
    • Digital Mixer Path
  • 6.Pin Descriptions
    • Digital I/O Pins
    • Analog I/O Pins
  • 7.Function Description,最重点的章节,深度定制时需完整阅读。
  • 8.Registers List


3. 查看 driver 层

阅读下面的内容需要有 audio driver 相关的开发经验,不过我也会尽量给出必要的概念说明。

Soc Audio 简化模型

点击查看大图

DAI 是什么?

Digital Audio Interface.

Provides audio data to the codec. Formats are usually AC97, I2S, PCM

ASoc 是什么?

ALSA System on Chip.

A Linux kernel subsystem created to provide better ALSA support for system-on-chip and portable audio codecs. It allows to reuse codec drivers across multiple architectures and provides an API to integrate them with the SoC audio interface.

ASoc 包括什么?

  • Platform drivers,提供了配置/使能 SoC audio interface (或称 CPU DAI) 的能力;

  • Codec drivers,提供了配置/使能 Codec 的能力;

  • Machine drivers,描述了应该如何控制 CPU DAI 和 Codec,使他们互相配合在一起工作;

3.1 查看 Machine driver

DT bindings:

arch/arm64/boot/dts/rockchip/rk3399-nanopi4-common.dtsi:

rt5651_card: rt5651-sound {
status = "okay";
compatible = "simple-audio-card";
pinctrl-names = "default";
pinctrl-0 = <&hp_det>;

simple-audio-card,name = "realtek,rt5651-codec";
simple-audio-card,format = "i2s";
simple-audio-card,mclk-fs = <256>;
simple-audio-card,hp-det-gpio = <&gpio4 28 GPIO_ACTIVE_HIGH>;

simple-audio-card,widgets =
"Microphone", "Mic Jack",
"Headphone", "Headphone Jack";
simple-audio-card,routing =
"Mic Jack", "MICBIAS1",
"IN1P", "Mic Jack",
"Headphone Jack", "HPOL",
"Headphone Jack", "HPOR";

simple-audio-card,cpu {
sound-dai = <&i2s0>;
};
simple-audio-card,codec {
sound-dai = <&rt5651>;
};
};

这里没有选择自己编写 Machine driver,而是采用了 simple-audio-card 这个通用的 Machine driver。

在 simple-audio-card 已经够用的情况下,建议优先使用 simple-audio-card 框架,代码会更加简洁一些。

相关文档和代码:

  • Documentation/devicetree/bindings/sound/simple-card.txt
  • Documentation/devicetree/bindings/sound/widgets.txt
  • Documentation/sound/alsa/soc/machine.txt
  • sound/soc/generic/simple-card.c

simple-card.c 做了什么?

虽然 simple-card.c 不是单板相关的东西,但还是有必要简单说明一下它的内容。

既然 simple-audio-card 是一个 Machine driver,Machine driver 最重要的事情是:构造并注册 struct snd_soc_card,可以认为一个 snd_soc_card 就代表着一个 soc 声卡:

static int asoc_simple_card_probe() {
    struct snd_soc_dai_link *dai_link;

    [...]
    
    /* Init snd_soc_card */
    priv->snd_card.owner = THIS_MODULE;
 priv->snd_card.dev = dev;
 dai_link = priv->dai_link;
 priv->snd_card.dai_link = dai_link;
 priv->snd_card.num_links = num_links;

    [...]

    /* 根据设备树的配置进一步初始化 snd_soc_card,
     * 包括 struct snd_soc_dai_link。
     */

    asoc_simple_card_parse_of(np, priv);

    /* Register snd_soc_card */
    devm_snd_soc_register_card(&pdev->dev, &priv->snd_card);
}

snd_soc_card 里有一个比较重要的成员变量 struct snd_soc_dai_link,snd_soc_dai_link 建立了 CPU DAI 和 Codec DAI 的连接 (link)。simple-card.c 会根据设备树里的配置对 snd_soc_dai_link 进行初始化。

后面就不再展开继续分析了,将关注点放在单板相关的部分。

分析设备树

1) 指定 platform & codec

simple-audio-card,cpu {
sound-dai = <&i2s0>;
};
simple-audio-card,codec {
sound-dai = <&rt5651>;
};

指明了:

  • platform driver 是 i2s0;
  • codec driver 是 rt5651;

2) 定义单板相关的 Widget

simple-audio-card,widgets =
"Microphone", "Mic Jack",
"Headphone", "Headphone Jack";

什么是 Widget?

  • 在 Asoc 驱动中,用 Widget 来描述一个声卡的功能部件
  • 参考文档:Documentation/sound/alsa/soc/dapm.txt

这里定义了 2 个 Widget:

  • Mic Jack,代表麦克风
  • Headphone Jack,代表 3.5 mm 耳机座

3) 设置单板相关的 Routing

simple-audio-card,routing =
"Mic Jack", "MICBIAS1",
"IN1P", "Mic Jack",
"Headphone Jack", "HPOL",
"Headphone Jack", "HPOR";

将 CPU DAI 和 Codec DAI 连接起来后,还需要设置 Codec 的 input 和 output 路径,对应的术语就是 Routing。

simple-audio-card,routing 的作用:

A list of the connections between audio components.

Each entry is a pair of strings, the first being the connection's sink, the second being the connection's source.

不过我认为设备树里的这些 Widget 和 Routing 都是没必要的,在 Codec drvier/rt5651.c 已经定义了足够让声卡正常工作的 Widget 和 Routing,有待考证。

3.2 查看 Platform driver

DT bindings:

arch/arm64/boot/dts/rockchip/rk3399.dtsi

i2s0: i2s@ff880000 {
compatible = "rockchip,rk3399-i2s", "rockchip,rk3066-i2s";
reg = <0x0 0xff880000 0x0 0x1000>;
rockchip,grf = <&grf>;
interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH 0>;
dmas = <&dmac_bus 0>, <&dmac_bus 1>;
dma-names = "tx", "rx";
clock-names = "i2s_clk", "i2s_hclk";
clocks = <&cru SCLK_I2S0_8CH>, <&cru HCLK_I2S0_8CH>;
resets = <&cru SRST_I2S0_8CH>, <&cru SRST_H_I2S0_8CH>;
reset-names = "reset-m", "reset-h";
pinctrl-names = "default";
pinctrl-0 = <&i2s0_8ch_bus>;
power-domains = <&power RK3399_PD_SDIOAUDIO>;
status = "disabled";
};

相关文档和代码:

  • Documentation/devicetree/bindings/sound/rockchip-i2s.txt
  • sound/soc/rockchip/rockchip_i2s.c

rockchip_i2s.c 做了什么?

Asoc 里的 Platform driver 一般由 CPU 厂商负责编写,但是了解其内部实现有有利于我们宏观把握整个 ASoc 驱动框架。

rockchip_i2s.c 核心工作就是对外提供配置和使能 i2s 接口的能力,它最核心的工作如下。

1) 定义 1个 CPU DAI

static struct snd_soc_dai_driver rockchip_i2s_dai = {
 .probe = rockchip_i2s_dai_probe,
 .playback = {
  .stream_name = "Playback",
  .channels_min = 2,
  .channels_max = 8,
  .rates = SNDRV_PCM_RATE_8000_192000,
  ...
 },
 .capture = {
  .stream_name = "Capture",
  .channels_min = 2,
  .channels_max = 2,
  .rates = SNDRV_PCM_RATE_8000_192000,
  ...
 },
 .ops = &rockchip_i2s_dai_ops,
};

一个 snd_soc_dai_driver 就代表着一个 CPU DAI,该结构体提供了这个 CPU DAI的所有能力。

2) 定义CPU DAI 的操作集

static const struct snd_soc_dai_ops rockchip_i2s_dai_ops = {
 .hw_params = rockchip_i2s_hw_params,
 .set_sysclk = rockchip_i2s_set_sysclk,
 .set_fmt = rockchip_i2s_set_fmt,
 .trigger = rockchip_i2s_trigger,
};

这部分基本就是 i2s 最底层的硬件配置接口了,基本就是围绕着 clocking / format / channel / master-slave 等需求来操作寄存器。这些接口会被 Machine driver 所使用,以和 Codec 端进行配合,一般我们最关心的就是 clock 是否匹配,简化模型如下:

点击查看大图

3) 注册 CPU DAI

static int rockchip_i2s_probe(struct platform_device *pdev)
{
    memcpy(soc_dai, &rockchip_i2s_dai, sizeof(*soc_dai));

    ret = devm_snd_soc_register_component(&pdev->dev,
              &rockchip_i2s_component,
              soc_dai, 1);
}

3.3 查看 Codec driver

DT bindings:

&i2c1 {
status = "okay";
i2c-scl-rising-time-ns = <150>;
i2c-scl-falling-time-ns = <30>;
clock-frequency = <200000>;

rt5651: rt5651@1a {
#sound-dai-cells = <0>;
compatible = "rockchip,rt5651";
reg = <0x1a>;
clocks = <&cru SCLK_I2S_8CH_OUT>;
clock-names = "mclk";
pinctrl-names = "default";
pinctrl-0 = <&i2s_8ch_mclk>;
status = "okay";
};
};

相关代码和文档:

  • sound/soc/codecs/rt5651.c
  • Documentation/sound/alsa/soc/dapm.txt

rt5651.c 里比较关键的点

Audio Codec 的驱动代码都是由 Codec 厂商提供的,了解其内部实现有利于我们根据自己的需求进行定制。一般 Audio Codec里会有如下的关键信息用于表征整个的 Codec 的内部构造。

1) 定义一堆的 snd_kcontrol_new

/* Digital Mixer */
static const struct snd_kcontrol_new rt5651_snd_controls[] = {
 /* Headphone Output Volume */
 SOC_DOUBLE_TLV("HP Playback Volume", RT5651_HP_VOL,
  RT5651_L_VOL_SFT, RT5651_R_VOL_SFT, 391, out_vol_tlv),
 /* OUTPUT Control */
 SOC_DOUBLE_TLV("OUT Playback Volume", RT5651_LOUT_CTRL1,
  RT5651_L_VOL_SFT, RT5651_R_VOL_SFT, 391, out_vol_tlv),
  ...
}

static const struct snd_kcontrol_new rt5616_sto1_adc_l_mix[] = {
 SOC_DAPM_SINGLE("ADC1 Switch", RT5616_STO1_ADC_MIXER,
   RT5616_M_STO1_ADC_L1_SFT, 11),
};
...

snd_kcontrol_new 是 构造 snd_kcontrol 的原材料。

snd_kcontrol(简称 kcontrol ) 是 Audio Codec 里的一个配置项,一般对应着寄存器里的某个字段。

2) 定义一堆的 Widget

static const struct snd_soc_dapm_widget rt5616_dapm_widgets[] = {
 SND_SOC_DAPM_SUPPLY("PLL1", RT5616_PWR_ANLG2,
       RT5616_PWR_PLL_BIT, 0NULL0),
  ...

 SND_SOC_DAPM_MIXER("Stereo1 ADC MIXL", SND_SOC_NOPM, 00,
      rt5616_sto1_adc_l_mix,
      ARRAY_SIZE(rt5616_sto1_adc_l_mix)),
  ...

Widget 是 Audio Codec 里的功能部件,看下面这个示意图会比较容易理解:

点击查看大图

Widget 的类型包括:

 o Mixer      - Mixes several analog signals into a single analog signal.
 o Mux        - An analog switch that outputs only one of many inputs.
 o PGA        - A programmable gain amplifier or attenuation widget.
 o ADC        - Analog to Digital Converter
 o DAC        - Digital to Analog Converter
 o Switch     - An analog switch
 o Input      - A codec input pin
 o Output     - A codec output pin
 o Headphone  - Headphone (and optional Jack)
 o Mic        - Mic (and optional Jack)
 o Line       - Line Input/Output (and optional Jack)
 o Speaker    - Speaker
 o Supply     - Power or clock supply widget used by other widgets.
 o Regulator  - External regulator that supplies power to audio components.
 o Clock      - External clock that supplies clock to audio components.
 o AIF IN     - Audio Interface Input (with TDM slot mask).
 o AIF OUT    - Audio Interface Output (with TDM slot mask).
 o Siggen     - Signal Generator.
 o DAI IN     - Digital Audio Interface Input.
 o DAI OUT    - Digital Audio Interface Output.
 o DAI Link   - DAI Link between two DAI structures */
 o Pre        - Special PRE widget (exec before all others)
 o Post       - Special POST widget (exec after all others)

Widget 可以和某个 kcontrol 绑定在一起,典型的就是 mixer/mux widget。

3) 定义一个描述 Audio Codec 内部 Routing 的结构体: snd_soc_dapm_route

static const struct snd_soc_dapm_route rt5616_dapm_routes[] = {
 {"IN1P"NULL"LDO"},
 {"IN2P"NULL"LDO"},
  ...
  {"LOUT L Playback""Switch""LOUT MIX"},
 {"LOUT R Playback""Switch""LOUT MIX"},

这里的 Route 有点类似网络中的路由表,路由表中的每一项定义了一段路径。将多个路由器里的某个路径都连接在一起后,就形成一个完整的音频播放 / 录制路径。

  • 第1个参数是目的地;
  • 第2个参数是会用到的 kcontrol,可以为 NULL;
  • 第3个成员是来源;

4) 用一个结构体来汇总上面的所有Codec 描述信息:snd_soc_codec_driver

static struct snd_soc_codec_driver soc_codec_dev_rt5651 = {
 .probe = rt5651_probe,
 .suspend = rt5651_suspend,
 .resume = rt5651_resume,
 .set_bias_level = rt5651_set_bias_level,
 .idle_bias_off = true,
 .controls = rt5651_snd_controls,
 .num_controls = ARRAY_SIZE(rt5651_snd_controls),
 .dapm_widgets = rt5651_dapm_widgets,
 .num_dapm_widgets = ARRAY_SIZE(rt5651_dapm_widgets),
 .dapm_routes = rt5651_dapm_routes,
 .num_dapm_routes = ARRAY_SIZE(rt5651_dapm_routes),
};

snd_soc_codec_driver 就代表了一个 Codec driver。

5) 注册 codec driver: snd_soc_register_codec()

static int rt5651_i2c_probe() {
  ...
  ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5651,
    rt5651_dai, ARRAY_SIZE(rt5651_dai));
}

将 codec driver 注册进系统后,系统就有能力动态地判断是否应该使能 Audio Codec 内部的就某个 Path,只有当 Path 上的各个 Route 是连接的并且有应用程序在使用声卡,才需要真正地给 Audio Codec 上电。

rt5651_dai 是 Codec 端的 DAI,它向 Machine driver 提供配置 Codec 的能力:

static const struct snd_soc_dai_ops rt5651_aif_dai_ops = {
 .hw_params = rt5651_hw_params,
 .set_fmt = rt5651_set_dai_fmt,
 .set_sysclk = rt5651_set_dai_sysclk,
 .set_pll = rt5651_set_dai_pll,
};

static struct snd_soc_dai_driver rt5651_dai[] = {
 {
  .name = "rt5651-aif1",
  .id = RT5651_AIF1,
  .playback = {
   .stream_name = "AIF1 Playback",
   ...
  },
  .capture = {
   .stream_name = "AIF1 Capture",
   ...
  },
  .ops = &rt5651_aif_dai_ops,
 },
  ...

到此 Machine driver 就有了协调控制 Platform 端和 Codec 端的能力了。


4. 应用层查看声卡信息

查看所有的 DAI:

$ cat /sys/kernel/debug/asoc/dais  
i2s-hifi
i2s-hifi
ff870000.spdif
ff8a0000.i2s
ff880000.i2s      // cpu dai
dit-hifi
rt5651-aif2
rt5651-aif1       // codec dai
snd-soc-dummy-dai

查看 Audio Codec 的寄存器:

$ cat /sys/kernel/debug/regmap/1-001a/registers 
000: 0000
002: 8888
003: c8c8
005: 0000
00d: 0200
...

查看 Widget 的状态:

$ cat /sys/devices/platform/rt5651-sound/ff880000.i2s-rt5651-aif1/dapm_widget
I2S1 ASRC: Off
I2S2 ASRC: Off
STO1 DAC ASRC: Off
STO2 DAC ASRC: Off
ADC ASRC: Off
...

查看和配置 Kcontrol:

$ tinymix --help
usage: tinymix [options] <command>
options:
 -h, --help        : prints this help message and exits
 -v, --version     : prints this version of tinymix and exits
 -D, --card NUMBER : specifies the card number of the mixer
commands:
 get NAME|ID       : prints the values of a control
 set NAME|ID VALUE : sets the value of a control
 controls          : lists controls of the mixer
 contents          : lists controls of the mixer and their contents


5. 参考

  • 韦东山视频教程/音频专题 https://www.100ask.net/index

  • Rockchip_RK3399TRM_V1.4_Part1-20170408.pdf

  • ALC5651 DataSheet_V0.92.pdf

  • https://wiki.st.com/stm32mpu/wiki/ALSA_overview


------------ END ------------


推荐阅读


【1】C语言实现MD5加密,竟如此简单!必读
【2】【粉丝问答11】如何在内网搭建TCP服务器并能被外网直接访问 必读
【3】手把手教Linux驱动10-platform总线详解必读
【4】基于Linux的tty架构及UART驱动详解必读
【5】1万字30张图说清TCP协议 必读
【6】 一键获取linux内存、cpu、磁盘IO等信息脚本编写,及其原理详解 必读
【7】 自己DIY一个mp3播放器
【8】 从Linux源码看Socket(TCP)的bind
【9】 【粉丝问答12】如何计算函数的执行时间? 必读
【10】 【粉丝问答13】11道嵌入式笔试题,看下你会几道? 必读
【11】 作为一个江苏人,我眼中的苏宁
【12】 Linux PCI驱动框架分析(万字长文)
【13】 如何字符串拷贝函数的几种方法,你猜哪个效率最高?
一口Linux 写点代码,写点人生!
评论
  • 在谐振器(无源晶振)S&A250B测试软件中,DLD1到DLD7主要用于分析晶体在不同驱动功率下的阻抗变化。此外,还有其他DLD参数用于反映晶振的磁滞现象,以及其频率和功率特性。这些参数可以帮助工程师全面了解KOAN晶振在不同功率条件下的动态特性,从而优化其应用和性能。磁滞现象晶振的磁滞现象(Hysteresis)是指在驱动功率变化时,晶体的阻抗或频率无法立即恢复至初始状态,而表现出滞后效应。1. DLDH: Hysteresis Ratio (MaxR/MinR)在不同驱动
    koan-xtal 2024-12-26 12:41 100浏览
  • 随着科技的飞速进步,智能家电已成为现代家庭生活中密不可分的一部分。不论是自行出动,清扫地板的扫地机器人、还是可提前准备食材清单的智能冰箱,或者是可自动调节洗衣程序的智能洗衣烘干机,这些智能家电装置正以前所未有的方式改变着我们的日常生活。除了上述提到的智能家电,还有更多你想象得到的便利装置,例如智能除湿机、空气清净机、净水器、智能风扇、语音助理及智能灯具等等。这些装置不仅为现代人的居家生活中带来了许多便利,让我们能够更轻松地管理家务,还可进一步提升生活质量,节省宝贵的时间和能源。正所谓「科技始终来
    百佳泰测试实验室 2024-12-26 16:37 26浏览
  • 发明阶段(20世纪80年代至90年代)起源:当时ASIC设计成本高,周期长,流片失败率高,业界需要一种通用的半导体器件进行流片前测试和验证,可编程逻辑器件就此产生。诞生:1980年,Xilinx公司成立。1985年,Ross Freeman制造了第一片PFGA芯片XC2064,采用4输入,1输出的LUT和FF结合的基本逻辑单元。发展阶段(1992年至1999年)容量提升:FPGA容量不断上涨,芯片面积逐渐增大,为架构穿心提供空间,复杂功能可以实现。布线问题凸显:缩着芯片复杂度增加,片上资源的互连
    Jeffreyzhang123 2024-12-27 10:26 32浏览
  • 本文介绍瑞芯微开发板/主板Android系统APK签名文件使用方法,触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,各类接口一应俱全,帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。系统签名文件生成APK系统签名文件,具体可参考此文章方法RK3588主板/开发板Android12系统APK签名文件生成方法,干货满满使用方法第一步,修改APK工程文件app/src/build.gradle,并添加以下内容: android {     na
    Industio_触觉智能 2024-12-26 09:20 81浏览
  • 据IDTechEx最新预计,到2034年,全球汽车舱内传感(In-Cabin Sensing,ICS)市场将超过85亿美元。若按照增长幅度来看,包含驾驶员监控系统(DMS)、乘员监控系统(OMS)、手势控制和生命体征监测等高级功能在内的舱内传感市场预计2020年到2034年将增长11倍。感光百科:ICS中的光源选择01、政策推动带来的“硬”增长作为其中的增长主力,舱内监控系统应用(包含DMS和OMS等)被推动增长的首要因素正是法规。据统计,中国、欧盟、美国、韩国、印度等主要汽车国家或地区已推出相
    艾迈斯欧司朗 2024-12-25 19:56 82浏览
  •       在科技日新月异的今天,智能手机已不再仅仅是通讯工具,它更成为了我们娱乐、学习、工作的核心设备。特别是在游戏体验方面,用户对于手机的性能要求愈发严苛,追求极致流畅与沉浸感。正是基于这样的市场需求,一加品牌于2024年12月26日正式推出了其最新的游戏性能旗舰——一加 Ace 5系列,包括一加 Ace 5与一加 Ace 5 Pro两款力作。这一系列深度聚焦于性能与游戏体验,旨在为用户带来前所未有的游戏盛宴。骁龙8系旗舰平台,性能跃升新高度
    科技财经汇 2024-12-26 22:31 34浏览
  • 今年AI技术的话题不断,随着相关应用服务的陆续推出,AI的趋势已经是一个明确的趋势及方向,这也连带使得AI服务器的出货量开始加速成长。AI服务器因为有着极高的运算效能,伴随而来的即是大量的热能产生,因此散热效能便成为一个格外重要的议题。其实不只AI服务器有着散热的问题,随着Intel及AMD 的CPU规格也不断地在提升,非AI应用的服务器的散热问题也是不容小觑的潜在问题。即便如此,由于目前的液冷技术仍有许多待克服的地方,例如像是建置成本昂贵,机壳、轨道、水路、数据中心等项目都得重新设计来过,维修
    百佳泰测试实验室 2024-12-26 16:33 94浏览
  • 施密特触发器光耦施密特触发器光耦(Schmitt Trigger Optocoupler)是一种将光耦和施密特触发器电路相结合的电子元件。它不仅具备光耦的电气隔离功能,还具备施密特触发器的噪声抑制和信号整形能力。施密特触发器光耦的详细结构LED部分:LED是由半导体材料制成的,通常封装在一个透明的塑料或玻璃外壳中。其主要功能是在输入端电流流过时产生光信号。光接收器部分:光接收器通常是一个光敏晶体管或光敏二极管,其基区(或PN结)对光信号敏感。当接收到来自LED的光信号时,光接收器产生一个与光强度
    晶台光耦 2024-12-26 17:19 22浏览
  • 近日,紫光展锐正式推出基于RTOS系统的旗舰产品W337,它拥有丰富特性和超低功耗,进一步壮大紫光展锐的智能穿戴产品组合,面向中高端和广阔的智能穿戴市场,提供先进的技术解决方案。  性能卓越,成就强悍RTOS穿戴芯 双核CPU架构:紫光展锐W337基于RTOS系统首创双核CPU架构,可根据系统的负载情况动态调整功耗,当系统负载较低时,降低一个或两个核心的频率和电压。由于有两个核心分担负载,每个核心的发热相对较低,进一步降低了系统整体的散热需求。双核架构更好地实现了负
    紫光展锐 2024-12-26 18:13 32浏览
  • 全球照明技术创新领航者艾迈斯欧司朗,于2024年广州国际照明展览会同期,举办【智慧之光】· 艾迈斯欧司朗-照明应用研讨会,以持续的技术创新,推动光+概念的全面落地。现场还演示了多款领先照明技术,且由资深工程师倾情解读,另有行业大咖深度洞察分享,助你开启“光的无限可能”探索之旅!精彩大咖分享引领未来照明无限遐想艾迈斯欧司朗精心准备了照明领域专业大咖的深度分享,无论是照明领域的资深从业者,还是对照明科技充满好奇的探索者,在这里,您都将大有所获。在艾迈斯欧司朗照明全球产品市场VP Geral
    艾迈斯欧司朗 2024-12-25 20:05 66浏览
  • 起源与基础20 世纪 60 年代:可编程逻辑设备(PLD)的概念出现,一种被称为 “重构能力” 的芯片的可编程性吸引了许多工程师和学者。20 世纪 70 年代:最早的可编程逻辑器件 PLD 诞生,其输出结构是可编程的逻辑宏单元,它的硬件结构设计可由软件完成,设计比纯硬件的数字电路更灵活,但结构简单,只能实现小规模电路。诞生与发展20 世纪 80 年代中期:为弥补 PLD 只能设计小规模电路的缺陷,复杂可编程逻辑器件 CPLD 被推出,它具有更复杂的结构,能够实现较大规模的电路设计。1988 年:
    Jeffreyzhang123 2024-12-27 10:41 26浏览
  • “金字招牌”的户外叙事。2024年的夏天似乎异常炙热,体育迷们的心跳也随之澎湃,全球瞩目的体育盛宴——巴黎奥运会在此刻上映。在这个充满荣耀与梦想的夏天,我们见证了无数激动人心的瞬间:男子4X100米混合泳接力决赛中,潘展乐的最后一棒,气壮山河,中国队的历史性夺冠,让整个泳池沸腾;射击10米气步枪混合团体决赛,黄雨婷和盛李豪的精准射击,为中国队射落首金,展现了年轻一代的力量;乒乓球男单四分之一比赛中,樊振东的惊天逆转令人难以忘怀,凭借坚韧不拔的意志和卓越的技术,成功挺进半决赛,并最终夺冠……在这一
    艾迈斯欧司朗 2024-12-25 19:30 84浏览
  • 本文介绍瑞芯微RK3588主板/开发板Android12系统下,APK签名文件生成方法。触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,该开发板是核心板加底板设计,音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。工具准备下载Keytool-ImportKeyPair工具在源码:build/target/product/security/系统初始签名文件目录中,将以下三个文件拷贝出来:platform.pem;platform.
    Industio_触觉智能 2024-12-26 09:19 112浏览
  • 新能源汽车市场潮起潮落,只有潮水退去,才能看清谁在裸泳。十年前,一批新能源汽车新势力带着创新的理念和先进的技术,如雨后春笋般涌入中国汽车市场,掀起一场新旧势力的角逐。经历市场的激烈洗礼与投资泡沫的挤压,蔚来、理想、小鹏等新势力车企脱颖而出,刷爆网络。不曾想,今年新势力车企杀出一匹“超级黑马”,爬上新势力车企销量榜前三,将蔚来、小鹏等昔日强者甩在了身后,它就是零跑汽车。公开数据显示,11月份,零跑汽车实现新车交付量约4.02万辆,同比增长117%,单月销量首次突破4万辆;小鹏汽车当月共交付新车约3
    刘旷 2024-12-26 10:53 149浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦