rk3588s 定制版 USB adb , USB2.0与USB3.0 区别,adb 由typeC 转换到USB3.0(第二部分)

news2024/9/23 3:29:16

硬件资源: rk3588s 核心板+定制的地板

软件资源: 网盘上的 android12 源码

1 硬件上

客户只想使用 type c 接口中的 usb2.0 OTG 。在硬件上,甚至连 CC芯片都没有连接。

关于一些前置的知识。

1 USB2.0 与 USB3.0 的区别。

usb3.0 兼容2.0  不就是相当于 无脑 include 吗。

2 adb 如何转换到 USB3.0 的接口。

这个资源网上已经有人发了,是3399 的,但是我们有验证过,不知道真的假的,假设是正确的。

我就完全 粘贴过来,方便以后参考。

这里 他的 typec0 与 typec1 使用的都是 2lane 的usb3.0 ,不知道,座子是typec的还是USB3.0 的。

互换了 otg 与 host.

然后就 涉及到了, 修改源码,这些我就看不懂了。

直接粘贴过来。

------------------------------------------------------------------------------------------------------------------------

 diff --git a/kernel/include/linux/phy/phy.h b/kernel/include/linux/phy/phy.h
 index a3965c3..c0daa66 100644
 --- a/kernel/include/linux/phy/phy.h
 +++ b/kernel/include/linux/phy/phy.h
 @@ -36,6 +36,7 @@ enum phy_mode {
   * @power_on: powering on the phy
   * @power_off: powering off the phy
   * @set_mode: set the mode of the phy
 + * @set_vbusdet: usb disconnect of the phy
   * @reset: resetting the phy
   * @cp_test: prepare for the phy compliance test
   * @owner: the module owner containing the ops
 @@ -46,6 +47,7 @@ struct phy_ops {
         int     (*power_on)(struct phy *phy);
         int     (*power_off)(struct phy *phy);
         int     (*set_mode)(struct phy *phy, enum phy_mode mode);
 +    int (*set_vbusdet)(struct phy *phy, bool level);
         int     (*reset)(struct phy *phy);
         int     (*cp_test)(struct phy *phy);
         struct module *owner;
 @@ -133,6 +135,7 @@ int phy_exit(struct phy *phy);
  int phy_power_on(struct phy *phy);
  int phy_power_off(struct phy *phy);
  int phy_set_mode(struct phy *phy, enum phy_mode mode);
 +int phy_set_vbusdet(struct phy *phy, bool level);
  int phy_reset(struct phy *phy);
  int phy_cp_test(struct phy *phy);
  static inline int phy_get_bus_width(struct phy *phy)
 @@ -247,6 +250,13 @@ static inline int phy_set_mode(struct phy *phy, enum phy_mode mode)
         return -ENOSYS;
  }

 +static inline int phy_set_vbusdet(struct phy *phy, bool level)
 +{
 +    if (!phy)
 +        return 0;
 +    return -ENOSYS;
 +}
 +
  static inline int phy_reset(struct phy *phy)
  {
         if (!phy)

---------------------------------------------------------------------------------------------------------------------------------

 diff --git a/kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
 index 66fb407..1f11ae1 100644
 --- a/kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
 +++ b/kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
 @@ -37,6 +37,8 @@
  #include <linux/usb/of.h>
  #include <linux/usb/otg.h>
  #include <linux/wakelock.h>
 +#include <linux/gpio.h>
 +#include <linux/of_gpio.h>
 
  #define BIT_WRITEABLE_SHIFT    16
  #define SCHEDULE_DELAY        (60 * HZ)
 @@ -250,6 +252,7 @@ struct rockchip_usb2phy_port {
      struct        delayed_work chg_work;
      struct        delayed_work otg_sm_work;
      struct        delayed_work sm_work;
 +    struct      delayed_work peripheral_work;
      struct        regulator *vbus;
      const struct    rockchip_usb2phy_port_cfg *port_cfg;
      struct notifier_block    event_nb;
 @@ -816,12 +819,37 @@ static int rockchip_usb2phy_set_mode(struct phy *phy, enum phy_mode mode)
      return ret;
  }
 
 +static int rockchip_usb2phy_set_vbusdet(struct phy *phy, bool level)
 +{
 +    struct rockchip_usb2phy_port *rport = phy_get_drvdata(phy);
 +    struct rockchip_usb2phy *rphy = dev_get_drvdata(phy->dev.parent);
 +    int ret = 0;
 +
 +    if (rport->port_id != USB2PHY_PORT_OTG)
 +        return ret;
 +
 +    if (rphy->phy_cfg->reg == 0xe460) {
 +        if (level)
 +        {
 +                ret = regmap_write(rphy->grf, 0x4518, GENMASK(20, 20) | 0x10);
 +        }
 +        else
 +        {
 +                ret = regmap_write(rphy->grf, 0x4518, GENMASK(20, 20) | 0x00);
 +        }
 +    }
 +
 +    return ret;
 +}
 +
 +
  static const struct phy_ops rockchip_usb2phy_ops = {
      .init        = rockchip_usb2phy_init,
      .exit        = rockchip_usb2phy_exit,
      .power_on    = rockchip_usb2phy_power_on,
      .power_off    = rockchip_usb2phy_power_off,
      .set_mode    = rockchip_usb2phy_set_mode,
 +    .set_vbusdet = rockchip_usb2phy_set_vbusdet,
      .owner        = THIS_MODULE,
  };
 
 @@ -1530,13 +1558,24 @@ static int rockchip_otg_event(struct notifier_block *nb,
      return NOTIFY_DONE;
  }
 
 +static void rockchip_usb2phy_peripheral_work(struct work_struct *work)
 +{
 +       struct rockchip_usb2phy_port *rport =
 +               container_of(work, struct rockchip_usb2phy_port, peripheral_work.work);
 +       struct rockchip_usb2phy *rphy = dev_get_drvdata(rport->phy->dev.parent);
 +       extcon_set_state(rphy->edev, EXTCON_USB, true);
 +       extcon_sync(rphy->edev, EXTCON_USB);
 +       schedule_delayed_work(&rport->peripheral_work, 3 * HZ);
 +
 +}
 +
  static int rockchip_usb2phy_otg_port_init(struct rockchip_usb2phy *rphy,
                        struct rockchip_usb2phy_port *rport,
                        struct device_node *child_np)
  {
      int ret;
      int iddig;
 -
 +    int gpio_vbus_5v;
      rport->port_id = USB2PHY_PORT_OTG;
      rport->port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_OTG];
      rport->state = OTG_STATE_UNDEFINED;
 @@ -1584,6 +1623,32 @@ static int rockchip_usb2phy_otg_port_init(struct rockchip_usb2phy *rphy,
          rport->vbus = NULL;
      }
 
 +
 +
 +    rport->vbus_always_on =
 +        of_property_read_bool(child_np, "rockchip,vbus-always-on");
 +    if (rport->vbus_always_on)
 +    {
 +        ret = of_get_named_gpio_flags(child_np, "vbus-5v-gpios", 0, NULL);
 +        if (ret < 0) {
 +            printk("%s() Can not read property vbus-5v-gpio\n", __FUNCTION__);
 +        } else {
 +            gpio_vbus_5v = ret;
 +            ret = devm_gpio_request(rphy->dev, gpio_vbus_5v, "vbus-gpio");
 +            if(ret < 0)
 +                printk("%s() devm_gpio_request vbus-gpio request ERROR\n", __FUNCTION__);
 +            ret = gpio_direction_output(gpio_vbus_5v,1);
 +            if(ret < 0)
 +            printk("%s() gpio_direction_output vbus-gpio set ERROR\n", __FUNCTION__);
 +        }
 +
 +        INIT_DELAYED_WORK(&rport->peripheral_work, rockchip_usb2phy_peripheral_work);
 +        schedule_delayed_work(&rport->peripheral_work, 3 * HZ);
 +
 +        goto out;
 +    }
 +
 +
      rport->mode = of_usb_get_dr_mode_by_phy(child_np, -1);
      if (rport->mode == USB_DR_MODE_HOST ||
          rport->mode == USB_DR_MODE_UNKNOWN) {
 @@ -1600,9 +1665,6 @@ static int rockchip_usb2phy_otg_port_init(struct rockchip_usb2phy *rphy,
          goto out;
      }
 
 -    if (rport->vbus_always_on)
 -        goto out;
 -
      wake_lock_init(&rport->wakelock, WAKE_LOCK_SUSPEND, "rockchip_otg");
      INIT_DELAYED_WORK(&rport->bypass_uart_work,
                rockchip_usb_bypass_uart_work);

------------------------------------------------------------------------------------------------------------------------

 diff --git a/kernel/drivers/phy/phy-core.c b/kernel/drivers/phy/phy-core.c
 index 0587933..8dd548b 100644
 --- a/kernel/drivers/phy/phy-core.c
 +++ b/kernel/drivers/phy/phy-core.c
 @@ -387,6 +387,21 @@ int phy_cp_test(struct phy *phy)
  }
  EXPORT_SYMBOL_GPL(phy_cp_test);
 
 +int phy_set_vbusdet(struct phy *phy, bool level)
 +{
 +    int ret;
 +
 +    if (!phy || !phy->ops->set_vbusdet)
 +        return 0;
 +
 +    mutex_lock(&phy->mutex);
 +    ret = phy->ops->set_vbusdet(phy, level);
 +    mutex_unlock(&phy->mutex);
 +
 +    return ret;
 +}
 +EXPORT_SYMBOL_GPL(phy_set_vbusdet);
 +
  /**
   * _of_phy_get() - lookup and obtain a reference to a phy by phandle
   * @np: device_node for which to get the phy

------------------------------------------------------------------------------------------------------------------------------

 diff --git a/kernel/drivers/usb/dwc3/dwc3-rockchip.c b/kernel/drivers/usb/dwc3/dwc3-rockchip.c
 index 539b89a..7cf9675 100644
 --- a/kernel/drivers/usb/dwc3/dwc3-rockchip.c
 +++ b/kernel/drivers/usb/dwc3/dwc3-rockchip.c
 @@ -24,6 +24,7 @@
  #include <linux/dma-mapping.h>
  #include <linux/clk.h>
  #include <linux/clk-provider.h>
 +#include <linux/debugfs.h>
  #include <linux/of.h>
  #include <linux/of_platform.h>
  #include <linux/pm_runtime.h>
 @@ -31,6 +32,7 @@
  #include <linux/freezer.h>
  #include <linux/iopoll.h>
  #include <linux/reset.h>
 +#include <linux/uaccess.h>
  #include <linux/usb.h>
  #include <linux/usb/hcd.h>
  #include <linux/usb/ch9.h>
 @@ -47,6 +49,7 @@
  struct dwc3_rockchip {
      int            num_clocks;
      bool            connected;
 +    bool            disconnect;
      bool            skip_suspend;
      bool            suspended;
      bool            force_mode;
 @@ -56,6 +59,7 @@ struct dwc3_rockchip {
      struct device        *dev;
      struct clk        **clks;
      struct dwc3        *dwc;
 +    struct dentry        *root;
      struct reset_control    *otg_rst;
      struct extcon_dev    *edev;
      struct usb_hcd        *hcd;
 @@ -96,6 +100,7 @@ static ssize_t dwc3_mode_store(struct device *device,
      struct dwc3_rockchip    *rockchip = dev_get_drvdata(device);
      struct dwc3        *dwc = rockchip->dwc;
      enum usb_dr_mode    new_dr_mode;
 +    //char            buf[32];
 
      if (!rockchip->original_dr_mode)
          rockchip->original_dr_mode = dwc->dr_mode;
 @@ -107,15 +112,21 @@ static ssize_t dwc3_mode_store(struct device *device,
 
      if (!strncmp(buf, "0", 1) || !strncmp(buf, "otg", 3)) {
          new_dr_mode = USB_DR_MODE_OTG;
 +        phy_set_vbusdet(dwc->usb2_generic_phy, 0);
      } else if (!strncmp(buf, "1", 1) || !strncmp(buf, "host", 4)) {
          new_dr_mode = USB_DR_MODE_HOST;
 +        phy_set_vbusdet(dwc->usb2_generic_phy, 0);
      } else if (!strncmp(buf, "2", 1) || !strncmp(buf, "peripheral", 10)) {
          new_dr_mode = USB_DR_MODE_PERIPHERAL;
 +        phy_set_vbusdet(dwc->usb2_generic_phy, 1);
      } else {
          dev_info(rockchip->dev, "illegal dr_mode\n");
 +        phy_set_vbusdet(dwc->usb2_generic_phy, 0);
          return count;
      }
 
 +    msleep(200);
 +
      if (dwc->dr_mode == new_dr_mode) {
          dev_info(rockchip->dev, "Same with current dr_mode\n");
          return count;
 @@ -378,6 +389,17 @@ static void dwc3_rockchip_otg_extcon_evt_work(struct work_struct *work)
 
      mutex_lock(&rockchip->lock);
 
 +    if (extcon_get_cable_state_(edev, EXTCON_USB)) {
 +        if ((dwc->link_state == DWC3_LINK_STATE_U3) && !rockchip->disconnect) {
 +            phy_set_vbusdet(dwc->usb2_generic_phy, 0);
 +            msleep(3000);
 +            phy_set_vbusdet(dwc->usb2_generic_phy, 1);
 +            rockchip->disconnect = true;
 +        } else if(dwc->link_state == DWC3_LINK_STATE_U0) {
 +            rockchip->disconnect = false;
 +        }
 +    }
 +
      if (rockchip->force_mode ? dwc->dr_mode == USB_DR_MODE_PERIPHERAL :
          extcon_get_cable_state_(edev, EXTCON_USB)) {
          if (rockchip->connected)
 @@ -624,6 +646,7 @@ out:
 
  static int dwc3_rockchip_get_extcon_dev(struct dwc3_rockchip *rockchip)
  {
 +    //int            ret;
      struct device        *dev = rockchip->dev;
      struct extcon_dev    *edev;
 
 @@ -743,6 +766,7 @@ static int dwc3_rockchip_probe(struct platform_device *pdev)
      struct device        *dev = &pdev->dev;
      struct device_node    *np = dev->of_node, *child;
      struct platform_device    *child_pdev;
 +    //struct usb_hcd        *hcd = NULL;
 
      unsigned int        count;
      int            ret;

----------------------------------------------------------------------------------------------------------------------------

那么是不是说,我自己在3588s上, 我改过了 typec0 之后 还需要在 android 系统启动之后,再做些设置呢。

感觉很像,我改过 typec 0 之后, android得打印信息可能与这个有关。

3 adb 的时候,是主设备还是从设备。

是做为从设备。

4 adb 使用的是 usb3.0 还是usb2.0

这是不是说,在adb 的时候,既可以使用 3.0 , 也可以使用 2.0 ,是自动适应的。

2 软件上的修改。

我参考的是 3588的 地板的设计, 在3588上 USB3.0 有这种设计。

3588底板原理图如下:

3588 核心板的原理图如下。

我参考一下typeC0 的引脚。

然后来看一下 TYPEC 1 的引脚。


所以 我觉得 3588 在软件上应该也是 有相应的设置的。

题外话,这里看一个 关于 typec 与 dp的关系的配置。

3588 核心板上的这几个图说的很明白了。

我去参考一下。

对于 typec1 的配置,就有这些,因为在硬件上 把它作为一个 USB3.0+USB2.0 使用了。只是 HOSt。

但是 type c 0 的配置就有很多。

所以 在软件上 我只要 在3588S的设备数中 ,去掉 typec0 的CC芯片的配置+dwc3_0 中,配置成 HOSt模式,应该在客户的底板上也是可以接上 USB的。

接下来就是我对 3588s的设备数的配置。

编译 + 烧写,之后测试。

发现 接上 USB+鼠标都是正常的。

但是有一些不必要的打印信息:

这些个报错的原因难道说还要 在android 文件系统上做些适配吗?

当然这些报错是不影响使用的。

但是看着不好看。

目前还是可以进一步去调试的,目前 typeC 的usb2.0 作为主设备是没有问题了,但是能不能 作为一个OTG设备呢?

3 我自己的实际的测试。

-------------------------------------------------------------------------------------------------------------------------

问题: 我现在 发现 在 3588S的设备数中有一个  gpio 我控制不了。

最原始的状态。

但是实际测试 这个GPIO 是可以 用的。

总结: 也最是, 他们只配置了 gpio 子系统,没有配置 pinctrl 子系统,但是是可以用的。

我自己的问题:

如果我把  GPIO4_A5 ,换成 GPIO4_A7 的话,然后在设备数中 改了 gpio+pinctrl 的话,烧写+编译测量发现, 这个脚是没有点评的。

然后又把设备数改回去,发现一个现象。

就是,板卡只有 在插上 typec 的时候,这个脚才会有 到电平,如果不插 type c 的话, 这个脚 , 是没有高电平的。

这就是说, 这个脚 只有在检测到 插拔之后,才会由驱动 去配置 高低电平。

我知道 3588  usb3.0 是通过 typec 转换过来的, 我去对比一下 两者的设备树的区别。

电源节点是这样的。

typec 的节点是这样的。

cc芯片引用了, typec 的电源节点。

电源节点是这样的。

总结一下:  在3588 中, usb3.0 与typec 的电源节点是两个节点。并且是单独引用的。

再来看看 我的 3588S的设备数的逻辑。

可以看到也是 在CC芯片中 引用了这个电源节点,所以我之前一直配置的 gpio的配置会失效。

那么我需要在 phy 的配置中重新引入这个节点。

我的疑问: usb 适配器的驱动是如何控制 电源驱动的呢,按理说,调用了驱动就应该自动把gpio拉高的。,先不管这个问题。

资源 : 在瑞芯微的文档里 , 是有关于这个问题的说明的。

接下来我 继续去修改设备树。

首先就是去掉 关于 CC芯片的内容。

        

然后是 添加相关的内容。

首先是 GPIO的添加。

这里我先不改。

然后是 phy 节点的更改。

然后是关于 dwc节点的更改。

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

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

相关文章

USUART代码例程和库函数

USUART代码例程和库函数 一、USUART中重要的寄存器二、USART中发送数据。三、接收数据四、USART发送数据示例代码&#xff08;print重定向&#xff09;五、USART接收数据示例代码六、USART常用的库函数usart_deinit&#xff08;&#xff09;&#xff1a;复位外设USARTusart_bau…

什么是大型语言模型 (LLM)

本章探讨下&#xff0c;人工智能如何彻底改变我们理解和与语言互动的方式 大型语言模型 (LLM) 代表了人工智能的突破&#xff0c;它采用具有广泛参数的神经网络技术进行高级语言处理。 本文探讨了 LLM 的演变、架构、应用和挑战&#xff0c;重点关注其在自然语言处理 (NLP) 领…

【ARM】MDK-STM32g0xx.h文件与Define规则记录

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 记录问题STM32g0xx.h等有关ST的可读文件&#xff0c;尽量勿修改文件格式及对其代码进行添加和删减&#xff0c;记录查找问题的过程中的疑惑&#xff0c;并如何给予客户正确的回复&#xff0c;帮助销售完成验收&…

VBA实例-从Excel整理数据到Word

实现目录 功能需求数据结构复制数据到新sheet并分类数据添加序号、日期、时间三列数据添加序号列添加时间列 将名称和类别复制到word文件中将参数5和参数9中的一个复制到word文件中 实例 功能需求 1、将原始数据中不要的数据剔除 2、原始数据中增加序号、日期和时间三列数据&a…

富唯智能转运机器人:高效、智能、未来的选择

在现代工业中&#xff0c;高效的物流和物料处理是提升生产效率的关键。富唯智能转运机器人&#xff0c;以其卓越的技术和智能化的设计&#xff0c;为各行业提供了完美的解决方案。 产品概述 富唯智能转运机器人搭载ICD系列核心控制器&#xff0c;拥有多种移载平台&#xff0c…

【目标检测】Yolo5基本使用

前言 默认安装好所有配置&#xff0c;只是基于Yolo5项目文件开始介绍的。基于配置好的PyCharm进行讲解配置。写下的只是些基本内容&#xff0c;方便以后回忆用。避免配置好Yolo5的环境&#xff0c;拉取好Yolo5项目后&#xff0c;不知道该如何下手。如果有时间&#xff0c;我还是…

我在Vscode学Java集合类

Java集合类 一、集合1.1 集合和数组之间的对比1.2 集合框架的核心接口1.3 集合框架中的实现类单列集合双列集合 1.4 集合框架的特点 二、 Collection集合与Iterator迭代器2.1 Collection的概述2.1.1 常用方法增加元素的方法修改元素的方法删除元素的方法查询元素的方法遍历集合…

Delphi5实现鱼C屏幕保护程序

效果图 鱼C屏幕保护程序 添加背景图片 在additional添加image组件&#xff0c;修改picture属性上传图片。 这个图片可以截屏桌面&#xff0c;方便后面满屏不留白操作。实现无边框 即上面的“- □ ”不显示 将Form1的borderstyle属性改为bsnone实现最大化&#xff0c;满屏 将…

mac OS matplotlib missing from font(s) DejaVu Sans

如果能搜索到这篇文章&#xff0c;我猜你遇到了和我一样的问题&#xff1a;matplotlib绘图中文乱码。如下&#xff1a; 出现这个问题的原因是&#xff1a;matplotlib使用的字体列表中默认没有中文字体。 这里说一种解决方案&#xff1a;我们可以在文件中手动指定matplotlib使用…

springcloud接入skywalking作为应用监控

下载安装包 需要下载SkyWalking APM 和 Java Agent 链接: skywalking 安装 下载JDK17&#xff08;可不配置环境变量&#xff09; 目前skywalking 9.0及以上版本基本都不支持JDK8&#xff0c;需要JDK11-21&#xff0c;具体版本要求在官网查看。 我这里使用的是skywalking9.…

开发桌面程序-Electron入门

Electron是什么 来自官网的介绍 Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。 总…

Audio Mixer Examples

简介 Audio Mixer 是在 Unity 5.0 版本中首次引入的音频混合器工具&#xff0c;它可以帮我们处理声音的分组管理、音效模拟、情景再现等重要业务。 功能入口 在资产视口单击鼠标右键 选择 Create 选项 选择 Audio 选项 点击 Audio Mixer Audio Mixer Assets 的属性面板 …

第一讲:NJ本地配置

本地配置:就是和CPU本地放在一起的系统配置,不是通过网络通信等方式配置的。 NJ本地系统配置 一、CPU机架(即CPU所在的机架) 如图所示最右边数量是有限制的,每个机架最多可放置10个扩展IO单元 二、扩展机架(1个本地的NJ扩展系统中,最多可以扩展3个机架,且每个机架最多…

从数据时代到智能时代,星环科技信雅达联合发布金融全栈解决方案

近年来&#xff0c;星环科技与信雅达在金融行业的多个关键领域展开了广泛而深入的合作&#xff0c;推出了一系列面向金融科技领域的联合解决方案。此次合作基于星环科技在大数据、人工智能和云计算领域的先进技术&#xff0c;以及信雅达在金融领域的深厚积累&#xff0c;围绕数…

数据科学统计面试问题 -40问

前 40 名数据科学统计面试问题 一、介绍 正如 Josh Wills 曾经说过的那样&#xff0c;“数据科学家是一个比任何程序员都更擅长统计、比任何统计学家都更擅长编程的人”。统计学是数据科学中处理数据及其分析的基本工具。它提供了工具和方法&#xff0c;可帮助数据科学家获得…

【数据挖掘】关系网络可视化

目录 1. Pyvis 介绍 2. 关系网络可视化 1. Pyvis 介绍 Pyvis 是一个 Python 库&#xff0c;用于创建和可视化网络图。它基于 Vis.js 库&#xff0c;可以生成交互式的 HTML 文件&#xff0c;让用户在网页上直观地查看和操作网络图。以下是 Pyvis 的主要功能和特点&#xff1a…

12.直接交换机-direct exchange

直接交换机与上一篇介绍的扇出类型交换机的区别就在于&#xff1a; 扇出交换机的routingKey都是空串&#xff0c;也就是一样的。而直接类型交换机的routingKey都是不一样的。还有就是交换机的类型不一样。 直接类型交换机&#xff0c;也叫做路由模式。通过routingKey可以做到区…

ESP32-S3-DevKitC-1开发记录帖——与MPU6050进行姿态检测

目录 MPU6050传感器——姿态检测 1.姿态检测 1.1 基本认识 1&#xff09;坐标系 2&#xff09;姿态角的关系 3&#xff09;陀螺仪检测的缺陷 4&#xff09;利用加速度计检测角度 5&#xff09;利用磁场检测角度 1.2 姿态融合与四元数 1.3传感器工作原理 1.4 MPU6050模…

k8s集群可视化工具安装(dashboard)

可视化安装 2.1、下载相关的yaml文件 wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml Vim recommended.yaml 2.2、部署 kubectl apply -f recommended.yaml 查看那kubernetes-dashboard命令空间下的资源 kubectl get …

Edge浏览器加载ActiveX控件

背景介绍 新版Edge浏览器也是采用Chromium内核&#xff0c;虽然没有谷歌浏览器市场占有率高&#xff0c;但是依托微软操作系统的优势&#xff0c;Edge浏览器还是发展很强劲&#xff0c;占据着市场第二的位置。随着微软停止服务IE浏览器&#xff0c;曾经风光无限的IE浏览器页退出…