当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

2024-04-24

我正在调试我正在创建的复合设备的问题,并在新生成的仅 CubeMX 代码中重新创建了该问题,以使其更容易解决。

我添加了少量代码main()让我发送 USB HID 鼠标点击,并在按下蓝色按钮时使 LED 闪烁。

...
uint8_t click_report[CLICK_REPORT_SIZE] = {0};
extern USBD_HandleTypeDef hUsbDeviceFS;
...
int main(void)
{
  ...
  while (1)
  {
      /* USER CODE END WHILE */

      /* USER CODE BEGIN 3 */
      if(HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin) == GPIO_PIN_SET){
          HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_SET);

          click_report[0] = 1; // send button press
          USBD_HID_SendReport(&hUsbDeviceFS, click_report, CLICK_REPORT_SIZE);
          HAL_Delay(50);

          click_report[0] = 0; // send button release
          USBD_HID_SendReport(&hUsbDeviceFS, click_report, CLICK_REPORT_SIZE);

          HAL_Delay(200);

          HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_RESET);
      }
  }

我正在使用 Wireshark 和 usbmon(在 Ubuntu 16.04 上)查看我的 STM32F3DISCOVERY 板发送的数据包。

通过这个新生成的代码,我可以看到URB_INTERRUPT从 3.23.1 发送的数据包。 (只有该地址的最后一部分,即端点,是相关的。)

数据包内容为:

01 00 00 00
00
00 00 00 00
00

正如预期的那样。

(5 字节click_reports 被分段为 4 字节和 1 字节消息,因为 HID 的最大数据包大小为 4 字节。)

然后我就改变了HID_EPIN_ADDR in usdb_hid.h from 0x81 to 0x83,使设备使用端点 3 来发送 HID 消息,而不是端点 1。

//#define HID_EPIN_ADDR                 0x81U
#define HID_EPIN_ADDR                 0x83U

通过此更改,一切都继续正常工作,预期的更改是数据包从 x.x.3 发送。数据包仍然包含:

01 00 00 00
00
00 00 00 00
00

据我所知,这应该not工作,因为我还没有为端点 3 分配地址(0x83)在PMA(数据包存储区)中。

我通过编辑 usb_conf.c 来做到这一点:

  /* USER CODE BEGIN EndPoint_Configuration */
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x18);
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58);
  /* USER CODE END EndPoint_Configuration */
  /* USER CODE BEGIN EndPoint_Configuration_HID */
  //HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0x100);
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x83 , PCD_SNG_BUF, 0x180);
  /* USER CODE END EndPoint_Configuration_HID */
  return USBD_OK;
}

现在,当我发送相同的01 00 00 00 00 and 00 00 00 00 00 click_reports我看到数据包内容:

58 00 2c 00
58
58 00 2c 00
58

我已经追踪到非 PMA 缓冲区的内容USB_WritePMA in stm32f3xx_ll_usb.

发送代码(在stm32f3xx_ll_usb) is:

  /* IN endpoint */
  if (ep->is_in == 1U)
  {
    /*Multi packet transfer*/
    if (ep->xfer_len > ep->maxpacket)
    {
      len = ep->maxpacket;
      ep->xfer_len -= len;
    }
    else
    {
      len = ep->xfer_len;
      ep->xfer_len = 0U;
    }

    /* configure and validate Tx endpoint */
    if (ep->doublebuffer == 0U)
    {
      USB_WritePMA(USBx, ep->xfer_buff, ep->pmaadress, (uint16_t)len);
      PCD_SET_EP_TX_CNT(USBx, ep->num, len);
    }
    else
    {

为什么线路上的数据不是我给出的数据USB_WritePMA,一旦我添加了HAL_PCDEx_PMAConfig(...对于端点地址0x83?


Update:

如果我改变usb_conf.c让端点地址0x83使用通常使用的 PMA 地址0x81:

  /* USER CODE BEGIN EndPoint_Configuration */
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x18);
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58);
  /* USER CODE END EndPoint_Configuration */
  /* USER CODE BEGIN EndPoint_Configuration_HID */
  //HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0x100);
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x83 , PCD_SNG_BUF, 0x100);
  /* USER CODE END EndPoint_Configuration_HID */

线路上的数据包仍然损坏:

58 00 2c 00
58
58 00 2c 00
58

如果我回来usb_conf.c到其初始、生成、状态(其中0x83没有 PMA 地址,并且0x81 uses 0x100):

  /* USER CODE BEGIN EndPoint_Configuration */
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x18);
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58);
  /* USER CODE END EndPoint_Configuration */
  /* USER CODE BEGIN EndPoint_Configuration_HID */
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0x100);
  //HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x83 , PCD_SNG_BUF, 0x100);
  /* USER CODE END EndPoint_Configuration_HID */

输出按预期工作:

01 00 00 00
00
00 00 00 00
00

更新2:

我添加了一个断点USB_ActivateEndpoint() in stm32f3xx_ll_usb.c.

令人惊讶的是,这只针对端点 0 进行调用。

因此,ep->pmaadress(原文如此)永远不会“写入硬件”,而仅在更高级别的代码中使用。

这必然意味着pmaadress因为端点设置为某个默认值,但我不知道端点的默认值0x83所以无法设置它。

当我周五返回工作时,我将添加调试以读出默认值。如果它们不存在,我会很困惑。


更新3:

我添加了以下调试:

uint16_t *tx_addr_ptr(USB_TypeDef *USBx, uint8_t ep_num) {
  register uint16_t *_wRegValPtr;
  register uint32_t _wRegBase = (uint32_t)USBx;
  _wRegBase += (uint32_t)(USBx)->BTABLE;
  _wRegValPtr = (uint16_t *)(_wRegBase + 0x400U + (((uint32_t)(ep_num) * 8U) * 2U));
  return _wRegValPtr;
}

uint16_t *rx_addr_ptr(USB_TypeDef *USBx, uint8_t ep_num) {
  register uint16_t *_wRegValPtr;
  register uint32_t _wRegBase = (uint32_t)USBx;
  _wRegBase += (uint32_t)(USBx)->BTABLE;
  _wRegValPtr = (uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(ep_num) * 8U) + 4U) * 2U));
  return _wRegValPtr;
}
...
HAL_StatusTypeDef USB_ActivateEndpoint(USB_TypeDef *USBx, USB_EPTypeDef *ep)
{
  ...
  int txaddrs[8] = {0};
  int rxaddrs[8] = {0};
  for (int i = 0; i < 8; ++i) {
    txaddrs[i] = *tx_addr_ptr(USBx, i);
    rxaddrs[i] = *rx_addr_ptr(USBx, i);
  }

这向我显示了以下值(在调试器中):

txaddrs:
  0: 0x58
  1: 0xf5c4
  2: 0xc1c2
  3: 0x100

rxaddrs:
  0: 0x18
  1: 0xfa9b
  2: 0xcb56
  3: 0x0

出乎意料的是,这些看起来是正确的。

0x100是端点 3 的 txaddr,即使USB_ActivateEndpoint()刚刚被第一次调用。

通过大量的 grepping,我发现PCD_SET_EP_TX_ADDRESS (in stm32f3xx_hal_pcd.h) 不仅直接用于USB_ActivateEndpoint(),而且还在PCD_SET_EP_DBUF0_ADDR来自“stm32f3xx_hal_pcd.h”的宏。

PCD_SET_EP_DBUF0_ADDR似乎没有被使用,所以我不知道 usbd_conf.c 中的(更改的)值是如何的:

USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev)
{
  ...
  /* USER CODE BEGIN EndPoint_Configuration */
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x18);
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58);
  /* USER CODE END EndPoint_Configuration */
  /* USER CODE BEGIN EndPoint_Configuration_HID */
  //HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0x100);
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x83 , PCD_SNG_BUF, 0x100);
  /* USER CODE END EndPoint_Configuration_HID */

进入内存映射的 USB 寄存器。

我可以推断,从存在0x00 in rxaddr[3](端点 3)它们成对发生(因为没有调用HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x3 , PCD_SNG_BUF, 0x0);).


更新4:

再次将设备更改为使用端点 1 后,0x100txaddrs[3] 中仍然存在。它只是上次运行时就存在的,这消除了一些混乱。


更新5:

这是一个 BTABLE 问题。 BTABLE 寄存器的值为 0x00,将 btable 放在 PMA 的开头。

The PMA looks like this: BTABLE and the start of the PMA is the btable.

我发现:

PMAAddr + BASEADDR_BTABLE + 0x00000000 : EP0_TX_ADDR
PMAAddr + BASEADDR_BTABLE + 0x00000002 : EP0_TX_COUNT
PMAAddr + BASEADDR_BTABLE + 0x00000004 : EP0_RX_ADDR
PMAAddr + BASEADDR_BTABLE + 0x00000006 : EP0_RX_COUNT
PMAAddr + BASEADDR_BTABLE + 0x00000008 : EP1_TX_ADDR
PMAAddr + BASEADDR_BTABLE + 0x0000000A : EP1_TX_COUNT
PMAAddr + BASEADDR_BTABLE + 0x0000000C : EP1_RX_ADDR
PMAAddr + BASEADDR_BTABLE + 0x0000000E : EP1_RX_COUNT
PMAAddr + BASEADDR_BTABLE + 0x00000010 : EP2_TX_ADDR
PMAAddr + BASEADDR_BTABLE + 0x00000012 : EP2_TX_COUNT
PMAAddr + BASEADDR_BTABLE + 0x00000014 : EP2_RX_ADDR
PMAAddr + BASEADDR_BTABLE + 0x00000016 : EP2_RX_COUNT

on https://community.st.com/s/question/0D50X00009XkaUASAZ/stm32-usb-endpoint-configuration-clarification-questions https://community.st.com/s/question/0D50X00009XkaUASAZ/stm32-usb-endpoint-configuration-clarification-questions

这表明端点0x81 and 0x82工作,因为两者pma[4] and pma[8]被设置为0x100.

端点0x83不起作用,因为pma[12]被设定为0x0.

这与具有以下值的损坏数据一致58 00 2c 00- USB 硬件正在读取pma[12]因此发送 uint16_tpma[0], 哪个是0x0058 0x002c,由于小端顺序而反向发送。 (注意:PMA只有16位宽,因此这里每个地址只有两个字节。)

致电给HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x82, PCD_SNG_BUF, 0x100); does not将 btable 指针设置为pma[12],它只是指出要复制到的 PMA 地址。

现在我只需要找到 btable 的内容被写入的位置......


EP3 的 TX 地址被传入的 USB 数据包覆盖,因为它在 PMA 中的偏移量与控制 EP0 的 RX 缓冲区的偏移量相同。原始代码工作正常,因为它只使用 EP1。

这些偏移量的具体设置方式取决于 STMCube 各层中的内容,我的副本似乎有所不同,但这出现在 OP 代码中设置 EP0 中 RX 和 TX 缓冲区偏移量的位置:

HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x18);
HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58);

这些常量需要更改为 0x40 和 0x80(例如)。

在我的版本中,这些偏移量是在头文件中定义的,并且还有 EP_NUM 常量,但它的使用方式尚不清楚。

其他一切似乎都只是干扰。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据 的相关文章

  • USB 控制传输能否保证交付?

    USB 2 0 指定 http www usb org developers docs usb20 docs 4 种传输类型 第 5 4 节传输类型 控制转移 同步传输 中断传输 批量转账 第 5 8 节规定批量转账提供 在带宽可用的基础上
  • 关闭 USB 端口的电源

    我正在寻找扭转的方法power关闭 然后重新打开 USB 端口 解决方案可以是 C bash 等 我使用运行 32 位 Ubuntu 16 04 的 BeagleBone for armhf gt uname srvm Linux 4 4
  • 如何检查 Android 上是否启用 USB 连接模式?

    我在 Android 市场上有一个应用程序 用户经常将他们的设备连接到计算机以将音乐添加到应用程序文件夹中 我在说明中特别指出 当启用 USB 连接模式时 Android 应用程序无法与 SD 卡通信 显然这还不够愚蠢的证据 有没有办法在j
  • 在c#中读取PVOID,我应该读取多少位?

    我正在读取 URB 类型的 USB 数据包 URB 标头定义于http msdn microsoft com en us library windows hardware ff540409 v vs 85 aspx http msdn mi
  • 通过 USB 模拟 UART

    有谁知道是否可以通过 USB 模拟 UART 简单串行发送和接收 这将如何实现 我在 Microchip 网站上找到了这个链接 但不是很容易找到 http www microchip com forums m522571 print asp
  • 使用 C# 向 USB 连接的 GPRS 调制解调器发送 AT 命令

    任何人都可以给我一个关于如何访问连接到 USB 端口的 GPRS 调制解调器的良好指示或指南 我应该为我的程序制作一个 USB 驱动程序以将 AT 命令发送到调制解调器吗 或者就像一个路由器 我可以使用IP地址访问它 谢谢 如果 Windo
  • adb 未检测到 micromax a111

    最近我购买了 micromax a111 Android 设备 我是安卓开发者 因此尝试使用该设备进行调试选项 但 adb 无法检测到该设备 我也更改了设置 但没有成功 如果有人有解决方案 请帮助我解决这个问题 micromax没有官方的P
  • 在 Mac 上通过 USB 访问 iOS 设备

    我有一个移动应用程序需要将文件传输到数据库 然而 其规范之一是 如果用户没有设置无线网络 则应该能够将其插入 Mac 并将文件传输到数据库 然而 我遇到的问题是如何将上述文件从 iPad 上通过 USB 传输到计算机上 上周我研究了各种解决
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • Ubuntu 10.1下如何识别多个USB串口适配器

    我正在 Ubuntu 10 1 下从多个相同的 USB 串行适配器读取数据 有时 它们的 dev tty 路径会发生变化 例如 如果在启动时连接了其他 USB 设备 我需要一种通过任何此类更改重复引用同一适配器的方法 据 udevadm 称
  • 如何在 DriverKit 中将我的 dex 与 USB 设备匹配?

    我正在编写一个驱动程序包扩展 其目标是阻止 USB 设备 例如闪存驱动器 作为起点 我选择了示例项目https developer apple com documentation driverkit communicating Betwee
  • 在 Python 中将 USB 视频捕获设备友好名称与 OpenCV 端口号相关联

    我想在 Windows 平台上使用 Python 获取外部 USB 视频捕获设备的友好名称和 USB 端口号 我正在使用 OpenCV 从 USB 捕获设备捕获视频 OpenCV 将 USB 端口称为 1 找到的第一个工作摄像头 0 对我来
  • Android:如何以编程方式连接/断开 OTG

    我想在我的 Android 设备中以编程方式连接和断开 USB OTG 笔式驱动器 硬盘驱动器等 对于USB 我使用以下路径在连接到PC时绑定 取消绑定USB sys bus usb drivers usb bind or unbind 我
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 如何查找USB盘符?

    我正在编写一个安装程序来将应用程序安装到 USB 驱动器 该应用程序只能从 USB 驱动器使用 因此它可以通过自动选择要安装的 USB 驱动器来为用户节省额外的步骤 我可能会尝试使用 Nullsoft 或 MSI 进行安装 但由于我最熟悉
  • USBInterfaceOpen总是报kIOReturnExclusiveAccess错误

    最近我遇到了这个问题 很头疼 我已经在这个问题上花了一个星期了 但仍然失败 希望您能帮我把这块石头踢开 非常感谢 我的问题 我们公司为iPhone生产USB存储设备 实际上这个存储设备中有一个SDCard 现在 我们想要开发一个 Mac 应
  • c#.NET USB设备持久标识符

    我正在寻找一种在 C 中为 USB 插槽 更具体地说是 SD 卡读卡器 提供持久标识符 在最终用户拔下集线器 重新启动计算机时 的方法 驱动器号并不总是分配给同一个插槽 但我需要一种方法来物理识别插槽 A 一旦我能够识别它 我就可以连接到驱
  • USB 端口速度 Linux [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何以编程方式确定运行 Linux 内核的嵌入式设备中的 USB 端口速度 你可以阅读 sys bus usb devices usb s
  • 获取已连接 USB 设备的端口名称

    当USB设备连接到计算机时 如何使用C 代码获取它所连接的端口名称 我找到了很多方法来查找 USB 何时连接 断开 驱动器号 路径 设备 ID 等 但没有找到任何明确的示例来说明如何知道它连接到哪个端口 我看到了一种可能的解释 但这涉及很多
  • Linux 源代码中的哪个位置会识别特定的 USB 设备?

    我有一个特定的 USB 设备 我想检查其 Linux 驱动程序源代码 我的理解是 USB 驱动程序执行的第一步是注册自己能够处理具有特定供应商 ID 和产品 ID 的设备 就我而言 供应商 ID 是0BDA产品 ID 是8187 有了这些信

随机推荐

  • 如何从 SDK 插件数据文件夹加载 dll?

    我们使用 Web IDE 来创建插件 我的 test dll 位于数据文件夹中 如何通过js ctypes加载它 使用像 c test dll 这样的绝对路径没有问题 但我无法使用此路径来分发它 var lib ctypes open c
  • Linux 中的机器人框架

    如何借助Robot框架获取Linux中执行的命令的状态 例如如果使用这个 SSHLibrary open Connection server SSHLibrary login xxxxx xxxxx 1111 Write command 2
  • 最近有关于 JVM 的书吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何重命名 iOS 8 Today Widget?

    我刚刚开始尝试将 iOS 8 Today Widget 添加到我的应用程序中 到目前为止一切顺利 但我遵循原始模板并使用 TodayWidget 作为名称创建了我的小部件 在 Xcode 中我的应用程序文件的上下文中 目标 产品名称很好 但
  • Java反射性能——替代方案

    各种问题中讨论的主题 参考文献1 https stackoverflow com questions 19557829 faster alternatives to javas reflection 19563000 19563000 参考
  • boost::shared_mutex 多读取器/单写入器互斥体

    我正在尝试使用 boost shared mutex 来实现多读取器 单写入器互斥体 我的问题相当简单 当另一个线程尝试锁定共享互斥体进行写入时 线程是否有可能获得对共享互斥体的读取器访问权限 例如 我有10个线程 只有其中一个可以写 线程
  • 如何通过脚本使Texture2D可读

    我想让用户能够解码从图库加载的 QR 图像 我找到了一个插件来探索图像并将其加载为texture2D 但是要解码该 QR 代码 Texture2D 必须是可读 可写的 我检查了该插件 对于 Android 它使用 jar 进行探索和加载内容
  • 从 PhoneGap 重新启动设备

    有没有办法用phonegap cordova重启设备 我该怎么做呢 我认为这在 iPad iPhone 上可能不可能 但在 Android 上可以 首先 除非您的设备已root 越狱 否则基本上无法完成 取决于我们谈论的是Android o
  • Visual Studio 2010:如何在解决方案中强制执行项目的构建顺序?

    我在 Visual Studio 2008 中没有遇到任何问题 但 VS 2010 似乎有问题 我敢打赌这可能是我的问题 我有一个包含 ASP NET 网站项目和一些 C 项目 BLL DAL NUnit 中的测试 的解决方案 我已将测试项
  • Java:如何复制一个对象,使其来自同一个子类?

    我尝试使用一个简单的例子来更好地理解 我有一堂课Tool以及正在延伸班级的子班Tool Hammer Saw 两者都定义了一些字段 例如weight两者都是重写方法getCost有自己的实现 Tool first tool new Hamm
  • 如何以及何时在 MySQL 中正确使用 SLEEP()?

    和 关联我的另一个问题 https stackoverflow com questions 4284162 calling stored procedure sequentially from sql file and php fails
  • Java节流机制

    Update 我使用的是 Java 1 6 34 没有机会升级到 Java 7 我有一个场景 每分钟只允许调用一个方法 80 次 它实际上是由第 3 方编写的服务 API 如果调用次数过多 它会 关闭 忽略调用 其 API public c
  • 多种形式的异常处理

    当我调试时与运行编译的 exe 时 我看到不同的行为 异常被捕获或未被捕获 我有两个表格 Form1 和 Form2 Form1 上有一个按钮 用于实例化并调用 Form2 上的 ShowDialog Form2 上有一个按钮 故意产生除以
  • 使用布隆过滤器有什么好处?

    我正在阅读布隆过滤器 它们看起来很愚蠢 使用布隆过滤器可以完成的任何事情 都可以使用单个哈希函数而不是多个哈希函数在更少的空间内更有效地完成 或者看起来就是这样 为什么要使用布隆过滤器以及它有何用处 亚历克斯已经解释得很好了 对于那些还没有
  • Laravel 5.4:如何保护 api 路由

    我有一个 React 应用程序 它从 laravel api 中获取数据 定义如下 routes api php this is default route provided by laravel out of the box Route
  • Swift 崩溃日志中的“Arg = Exploded”是什么意思? [复制]

    这个问题在这里已经有答案了 我从 Crashlytics Fabric 收到崩溃日志 内容如下 function signature specialization
  • 是否可以在新的密钥库中安装现有的私钥和 ssl 证书?

    我们在服务器故障期间丢失了用于生成 CSR 的原始密钥库 我们有私钥 key 文件 和原始 CSR csr 文件 的备份 是否可以用这些重建密钥库 由于创建证书链的所有说明都需要原始密钥库 这适用于 Tomcat 7 0 27 Thanks
  • 切换分支时发生致命 Git 错误

    错误信息 致命 git checkout 更新路径与切换分支 强制不兼容 如何解决这个 Git 签出错误 通过明确指定 git checkout HEAD blah 而不是仅仅说 git checkout blah 假设您确实想查看文件 然
  • Android 创建 JSON 对象的 JSON 数组

    您好 有谁知道如何创建一个包含对象的数组 每个对象中都包含多个对象 我似乎无法理解它 结构应该是这样的 Array object subobject subobject object subobject subobject 这是我到目前为止
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re