编程技术分享

分享编程知识,探讨技术创新

0%

简介:基于VL822实现的超高速USB扩展坞**

关注微信公众号,提前获取相关推文

本项目旨在开发一款基于VIA Labs VL822芯片的超高速USB扩展坞。VL822是一款高性能的USB 3.2 Gen 2集线器控制器,能够提供多个高速USB端口,满足现代电子设备对高速数据传输和扩展的需求。此扩展坞将从一个USB-C上行端口扩展出多个USB-A下行端口,为用户提供便捷的连接方案。

嵌入式系统开发流程

一个完整的嵌入式系统开发流程通常包括以下几个阶段:

  1. 需求分析阶段

    • 功能需求:
      • 实现USB-C上行端口到多个USB-A下行端口的扩展。
      • 支持USB 3.2 Gen 2超高速数据传输速率 (10Gbps)。
      • 每个下行端口应支持BC 1.2充电协议,为移动设备充电。
      • 提供过流保护和短路保护机制,确保系统和连接设备的安全性。
      • 具备良好的兼容性,支持各种USB设备。
      • 低功耗设计,优化能效。
    • 性能需求:
      • 高速数据传输性能,接近理论带宽上限。
      • 低延迟,快速响应USB设备的连接和断开事件。
      • 稳定的工作状态,长时间运行无故障。
    • 可靠性需求:
      • 系统稳定可靠,能够长时间稳定运行。
      • 具备完善的错误处理机制,能够应对异常情况。
      • 硬件和软件设计需要经过严格的测试验证。
    • 可扩展性需求:
      • 软件架构应易于扩展,方便后续添加新功能或支持新的硬件。
      • 硬件设计应考虑预留一定的扩展空间,方便未来升级。
    • 维护升级需求:
      • 支持固件在线升级,方便修复bug和添加新功能。
      • 提供详细的日志和监控功能,方便维护和故障排查。
    • 成本和功耗需求:
      • 在满足性能和功能的前提下,尽量降低硬件成本。
      • 优化功耗设计,降低系统发热量,延长使用寿命。
  2. 系统设计阶段

    • 硬件设计:
      • 选择VL822芯片作为核心控制器。
      • 设计PCB电路板,包括电源电路、时钟电路、USB接口电路、保护电路等。
      • 选择合适的USB连接器和外围器件。
      • 考虑散热设计,确保系统在高负载下稳定运行。
    • 软件架构设计:
      • 选择合适的嵌入式系统架构,如分层架构、模块化架构等。
      • 确定软件模块划分,包括HAL层、驱动层、应用层等。
      • 设计数据结构和算法,实现USB协议栈和设备管理功能。
      • 考虑实时性、并发性和资源管理等问题。
      • 制定详细的软件接口规范和编程标准。
  3. 系统实现阶段

    • 硬件实现:
      • PCB Layout设计和制造。
      • 元器件采购和焊接。
      • 硬件调试和验证。
    • 软件实现:
      • 编写底层硬件驱动程序 (HAL层)。
      • 开发VL822芯片的驱动程序 (驱动层)。
      • 实现USB集线器逻辑和应用功能 (应用层)。
      • 编写测试代码,进行单元测试和集成测试。
      • 进行代码审查,确保代码质量。
  4. 测试验证阶段

    • 单元测试: 对每个软件模块进行独立测试,验证其功能和性能。
    • 集成测试: 将各个模块组合起来进行测试,验证模块之间的协同工作。
    • 系统测试: 对整个系统进行全面测试,包括功能测试、性能测试、可靠性测试、兼容性测试、压力测试等。
    • 用户验收测试: 邀请用户进行测试,收集用户反馈,进一步完善系统。
  5. 维护升级阶段

    • Bug修复: 及时修复测试阶段和用户使用过程中发现的bug。
    • 功能升级: 根据用户需求和市场变化,添加新的功能。
    • 性能优化: 持续优化系统性能,提升用户体验。
    • 固件升级: 提供固件在线升级功能,方便用户获取最新的软件版本。
    • 版本管理: 建立完善的版本管理机制,跟踪和管理软件版本。

最适合的代码设计架构:分层模块化架构

对于基于VL822的超高速USB扩展坞项目,最适合的代码设计架构是分层模块化架构。这种架构将系统划分为多个层次和模块,每个层次和模块负责特定的功能,层次之间通过清晰定义的接口进行交互。这种架构具有以下优点:

  • 高内聚低耦合: 每个模块内部功能紧密相关,模块之间依赖性低,易于维护和修改。
  • 模块化开发: 可以并行开发不同的模块,提高开发效率。
  • 代码复用: 通用模块可以在不同的项目或系统中复用,减少重复开发。
  • 易于测试和调试: 模块化结构使得单元测试和集成测试更加方便。
  • 可扩展性强: 易于添加新的模块或替换现有模块,方便系统升级和功能扩展。
  • 层次清晰,易于理解: 分层结构使得代码逻辑清晰,易于理解和维护。

分层模块化架构具体划分

在本项目中,我们可以将软件架构划分为以下几个层次和模块:

  1. 硬件抽象层 (HAL - Hardware Abstraction Layer)

    • 功能: HAL层是软件与硬件之间的桥梁,它封装了底层硬件的细节,向上层软件提供统一的硬件访问接口。
    • 模块:
      • 时钟管理模块 (Clock Management): 负责系统时钟的初始化、配置和管理。
      • GPIO控制模块 (GPIO Control): 负责GPIO端口的配置和控制,例如控制LED指示灯、检测按键输入等。
      • 中断管理模块 (Interrupt Management): 负责中断的初始化、注册和处理,例如USB中断、定时器中断等。
      • 存储器接口模块 (Memory Interface): 负责访问外部存储器,例如Flash、RAM等。
      • 电源管理模块 (Power Management): 负责电源的初始化、配置和管理,例如控制芯片的供电、实现低功耗模式等。
      • UART/串口模块 (UART/Serial): 负责串口的初始化、配置和数据收发,用于调试和日志输出。
      • SPI/I2C模块 (SPI/I2C): 负责SPI/I2C总线的初始化、配置和数据通信,用于与外围传感器或芯片通信。
  2. 驱动层 (Driver Layer)

    • 功能: 驱动层构建在HAL层之上,负责特定硬件设备的驱动和控制。对于本项目,核心驱动是VL822 USB集线器控制器的驱动。
    • 模块:
      • VL822驱动模块 (VL822 Driver):
        • 初始化 (Initialization): 负责VL822芯片的初始化,包括配置寄存器、设置时钟、使能中断等。
        • 寄存器访问 (Register Access): 提供API函数,方便上层软件读写VL822的寄存器。
        • 中断处理 (Interrupt Handling): 处理VL822产生的中断,例如USB事件中断、错误中断等。
        • 端口管理 (Port Management): 管理USB下行端口,包括端口使能、端口状态检测、端口电源控制等。
        • USB协议处理 (USB Protocol Handling): 处理USB协议相关的操作,例如设备枚举、配置、数据传输等 (部分功能可能在更底层的USB协议栈中实现)。
        • 电源管理 (Power Management): 控制VL822的电源管理功能,例如进入低功耗模式、控制端口供电等。
        • 错误处理 (Error Handling): 处理VL822驱动过程中出现的错误,例如寄存器访问错误、协议错误等。
      • USB协议栈模块 (USB Protocol Stack):
        • USB主机控制器驱动 (USB Host Controller Driver): 如果VL822支持USB主机功能,则需要主机控制器驱动。
        • USB设备控制器驱动 (USB Device Controller Driver): 如果VL822支持USB设备功能,则需要设备控制器驱动。
        • USB集线器驱动 (USB Hub Driver): 实现USB集线器协议,处理USB端口的连接、断开、枚举等事件。
        • USB类驱动 (USB Class Drivers): 例如USB存储设备驱动、USB HID驱动等 (本项目可能不需要复杂的类驱动,但需要考虑兼容性)。
  3. 应用层 (Application Layer)

    • 功能: 应用层是最高层,负责实现系统的具体应用逻辑和用户接口。对于USB扩展坞项目,应用层主要负责扩展坞的管理和控制,以及一些附加功能。
    • 模块:
      • 主应用程序模块 (Main Application): 系统的主入口,负责初始化各个模块、启动任务调度、处理用户命令等。
      • 配置管理模块 (Configuration Management): 负责系统配置的读取、存储和管理,例如读取配置文件、保存用户设置等。
      • 状态监控模块 (Status Monitoring): 监控系统的运行状态,例如USB端口状态、电源状态、错误状态等,并提供状态显示或日志输出。
      • 错误处理模块 (Error Handling): 处理应用层出现的错误,例如配置错误、资源错误等。
      • 用户界面模块 (User Interface): 如果需要用户界面 (例如通过串口命令行或Web界面),则需要用户界面模块。
      • 固件升级模块 (Firmware Update): 实现固件在线升级功能。
      • 电源管理模块 (Power Management): 实现更高级的电源管理策略,例如根据设备连接状态动态调整功耗。
      • BC 1.2充电协议管理模块 (BC 1.2 Charging Management): 实现BC 1.2充电协议的支持,控制USB端口的充电功能。
      • 过流/短路保护管理模块 (Overcurrent/Short Circuit Protection): 监控和处理过流和短路事件,保护系统和连接设备。

C代码实现 (部分示例代码,总代码量超过3000行)

为了演示分层模块化架构和关键功能的实现,以下提供部分C代码示例。由于代码量巨大,这里只展示关键模块的框架和核心功能代码,实际项目中需要根据具体硬件和需求进行详细实现。

1. HAL层代码示例 (hal_vl822.h, hal_vl822.c)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// hal_vl822.h - HAL层头文件

#ifndef HAL_VL822_H
#define HAL_VL822_H

#include <stdint.h>
#include <stdbool.h>

// 定义VL822寄存器地址 (示例,实际地址需要查阅VL822数据手册)
#define VL822_REG_BASE 0xABCD0000
#define VL822_REG_CHIP_ID (VL822_REG_BASE + 0x00)
#define VL822_REG_PORT_STATUS (VL822_REG_BASE + 0x10)
#define VL822_REG_PORT_POWER (VL822_REG_BASE + 0x20)
// ... 更多寄存器定义 ...

// 函数声明

// 初始化HAL层
void hal_vl822_init(void);

// 读取VL822寄存器
uint32_t hal_vl822_read_reg(uint32_t reg_addr);

// 写入VL822寄存器
void hal_vl822_write_reg(uint32_t reg_addr, uint32_t value);

// 使能VL822端口电源
void hal_vl822_enable_port_power(uint8_t port_num);

// 禁用VL822端口电源
void hal_vl822_disable_port_power(uint8_t port_num);

// 获取VL822端口状态
uint32_t hal_vl822_get_port_status(uint8_t port_num);

// ... 更多HAL层函数声明 ...

#endif // HAL_VL822_H
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// hal_vl822.c - HAL层实现文件

#include "hal_vl822.h"

// 硬件寄存器访问函数 (示例,实际需要根据硬件平台实现)
static volatile uint32_t *vl822_reg_base_ptr = (volatile uint32_t *)VL822_REG_BASE;

void hal_vl822_init(void)
{
// 初始化HAL层,例如配置GPIO、时钟等
// ... 初始化代码 ...

// 示例:检测VL822芯片ID
uint32_t chip_id = hal_vl822_read_reg(VL822_REG_CHIP_ID);
// ... 检查chip_id是否为预期值 ...

// 初始化完成日志
// ... 日志输出 ...
}

uint32_t hal_vl822_read_reg(uint32_t reg_addr)
{
// 读取寄存器值
return *(vl822_reg_base_ptr + (reg_addr - VL822_REG_BASE) / 4); // 假设寄存器地址是32位对齐的
}

void hal_vl822_write_reg(uint32_t reg_addr, uint32_t value)
{
// 写入寄存器值
*(vl822_reg_base_ptr + (reg_addr - VL822_REG_BASE) / 4) = value;
}

void hal_vl822_enable_port_power(uint8_t port_num)
{
// 使能端口电源 (示例,具体实现需要根据硬件电路设计)
// ... GPIO控制代码 ...
(void)port_num; // 避免编译器警告,实际实现中需要使用port_num
// ... 寄存器操作 ...
}

void hal_vl822_disable_port_power(uint8_t port_num)
{
// 禁用端口电源 (示例,具体实现需要根据硬件电路设计)
// ... GPIO控制代码 ...
(void)port_num; // 避免编译器警告,实际实现中需要使用port_num
// ... 寄存器操作 ...
}

uint32_t hal_vl822_get_port_status(uint8_t port_num)
{
// 获取端口状态 (示例,具体实现需要根据VL822寄存器定义)
uint32_t status_reg = hal_vl822_read_reg(VL822_REG_PORT_STATUS);
uint32_t port_status = (status_reg >> (port_num * 2)) & 0x03; // 假设每个端口状态占用2位
return port_status;
}

// ... 更多HAL层函数实现 ...

2. 驱动层代码示例 (driver_vl822.h, driver_vl822.c)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// driver_vl822.h - VL822驱动层头文件

#ifndef DRIVER_VL822_H
#define DRIVER_VL822_H

#include <stdint.h>
#include <stdbool.h>

// 定义VL822端口数量 (根据实际硬件配置)
#define VL822_PORT_COUNT 4

// 定义VL822端口状态
typedef enum {
VL822_PORT_STATUS_DISCONNECTED = 0,
VL822_PORT_STATUS_CONNECTED = 1,
VL822_PORT_STATUS_SPEED_LOW = 2,
VL822_PORT_STATUS_SPEED_HIGH = 3,
// ... 更多端口状态 ...
} vl822_port_status_t;

// 函数声明

// 初始化VL822驱动
bool driver_vl822_init(void);

// 获取VL822芯片ID
uint32_t driver_vl822_get_chip_id(void);

// 使能VL822端口
bool driver_vl822_enable_port(uint8_t port_num);

// 禁用VL822端口
bool driver_vl822_disable_port(uint8_t port_num);

// 获取VL822端口状态
vl822_port_status_t driver_vl822_get_port_status(uint8_t port_num);

// 处理VL822中断 (例如USB事件中断)
void driver_vl822_handle_interrupt(void);

// ... 更多驱动层函数声明 ...

#endif // DRIVER_VL822_H
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// driver_vl822.c - VL822驱动层实现文件

#include "driver_vl822.h"
#include "hal_vl822.h"
#include "log.h" // 假设有日志模块

// 初始化VL822驱动
bool driver_vl822_init(void)
{
LOG_INFO("Initializing VL822 driver...");

// 初始化HAL层
hal_vl822_init();

// 检测VL822芯片ID
uint32_t chip_id = driver_vl822_get_chip_id();
LOG_INFO("VL822 Chip ID: 0x%X", chip_id);
if (chip_id != 0x12345678) { // 假设预期的芯片ID是 0x12345678,实际需要查阅数据手册
LOG_ERROR("VL822 Chip ID verification failed!");
return false;
}

// 初始化VL822芯片寄存器 (根据VL822数据手册配置)
// ... 寄存器配置代码 ...
// 示例:使能所有端口
for (uint8_t i = 0; i < VL822_PORT_COUNT; i++) {
driver_vl822_enable_port(i);
}

LOG_INFO("VL822 driver initialized successfully.");
return true;
}

uint32_t driver_vl822_get_chip_id(void)
{
// 读取VL822芯片ID寄存器
return hal_vl822_read_reg(VL822_REG_CHIP_ID);
}

bool driver_vl822_enable_port(uint8_t port_num)
{
if (port_num >= VL822_PORT_COUNT) {
LOG_ERROR("Invalid port number: %d", port_num);
return false;
}
LOG_DEBUG("Enabling VL822 port %d...", port_num);
hal_vl822_enable_port_power(port_num);
// ... 其他端口使能操作 ...
return true;
}

bool driver_vl822_disable_port(uint8_t port_num)
{
if (port_num >= VL822_PORT_COUNT) {
LOG_ERROR("Invalid port number: %d", port_num);
return false;
}
LOG_DEBUG("Disabling VL822 port %d...", port_num);
hal_vl822_disable_port_power(port_num);
// ... 其他端口禁用操作 ...
return true;
}

vl822_port_status_t driver_vl822_get_port_status(uint8_t port_num)
{
if (port_num >= VL822_PORT_COUNT) {
LOG_ERROR("Invalid port number: %d", port_num);
return VL822_PORT_STATUS_DISCONNECTED; // 返回默认状态
}
uint32_t status = hal_vl822_get_port_status(port_num);
// 将HAL层返回的原始状态值转换为驱动层定义的枚举类型
switch (status) {
case 0: return VL822_PORT_STATUS_DISCONNECTED;
case 1: return VL822_PORT_STATUS_CONNECTED;
case 2: return VL822_PORT_STATUS_SPEED_LOW;
case 3: return VL822_PORT_STATUS_SPEED_HIGH;
default: return VL822_PORT_STATUS_DISCONNECTED; // 默认状态
}
}

void driver_vl822_handle_interrupt(void)
{
// 处理VL822中断 (示例,需要根据VL822中断机制实现)
// ... 读取中断状态寄存器 ...
// ... 判断中断类型 ...
// ... 清除中断标志 ...
// ... 执行相应的中断处理逻辑 ...
LOG_DEBUG("VL822 interrupt handled.");
}

// ... 更多驱动层函数实现 ...

3. 应用层代码示例 (usb_hub_app.c)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// usb_hub_app.c - USB集线器应用层代码

#include "driver_vl822.h"
#include "log.h"
#include "delay.h" // 假设有延时函数

int main()
{
// 初始化日志模块
log_init();
LOG_INFO("USB Hub Application started.");

// 初始化VL822驱动
if (!driver_vl822_init()) {
LOG_ERROR("VL822 driver initialization failed!");
while (1); // 错误处理,可以根据实际情况进行更完善的处理
}

LOG_INFO("USB Hub initialized successfully.");

// 主循环
while (1) {
// 轮询检测端口状态 (示例,实际项目中可以使用中断驱动的方式)
for (uint8_t i = 0; i < VL822_PORT_COUNT; i++) {
vl822_port_status_t status = driver_vl822_get_port_status(i);
switch (status) {
case VL822_PORT_STATUS_DISCONNECTED:
LOG_DEBUG("Port %d: Disconnected", i);
break;
case VL822_PORT_STATUS_CONNECTED:
LOG_DEBUG("Port %d: Connected (Speed unknown)", i);
break;
case VL822_PORT_STATUS_SPEED_LOW:
LOG_DEBUG("Port %d: Connected (Low Speed)", i);
break;
case VL822_PORT_STATUS_SPEED_HIGH:
LOG_DEBUG("Port %d: Connected (High Speed)", i);
break;
default:
LOG_DEBUG("Port %d: Unknown status", i);
break;
}
}

// 延时一段时间,降低轮询频率
delay_ms(1000); // 1秒延时
}

return 0;
}

4. 其他模块 (简要说明)

  • log.h, log.c: 日志模块,用于输出调试信息和系统运行日志,方便开发和维护。可以使用串口或外部存储器记录日志。
  • delay.h, delay.c: 延时模块,提供精确的毫秒级和微秒级延时函数,用于程序控制和时序管理。
  • config.h, config.c: 配置管理模块,用于读取和管理系统配置参数,例如USB端口配置、电源管理配置等。
  • interrupt_handler.c: 中断处理函数,用于注册和分发各种中断事件,例如VL822中断、定时器中断等。
  • power_management.c: 电源管理模块,实现系统的电源管理策略,例如低功耗模式、动态功耗调整等。
  • bc12_charging.c: BC 1.2充电协议管理模块,实现USB端口的BC 1.2充电功能。
  • overcurrent_protection.c: 过流/短路保护管理模块,监控和处理过流和短路事件。

代码结构组织

为了更好地组织代码,建议采用以下目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
usb_hub_project/
├── inc/ // 头文件目录
│ ├── hal/ // HAL层头文件
│ │ ├── hal_vl822.h
│ │ └── ...
│ ├── driver/ // 驱动层头文件
│ │ ├── driver_vl822.h
│ │ └── ...
│ ├── app/ // 应用层头文件
│ │ ├── usb_hub_app.h
│ │ └── ...
│ ├── common/ // 通用模块头文件
│ │ ├── log.h
│ │ ├── delay.h
│ │ ├── config.h
│ │ └── ...
│ └── platform/ // 平台相关头文件 (例如中断定义、内存映射等)
│ └── ...
├── src/ // 源文件目录
│ ├── hal/ // HAL层源文件
│ │ ├── hal_vl822.c
│ │ └── ...
│ ├── driver/ // 驱动层源文件
│ │ ├── driver_vl822.c
│ │ └── ...
│ ├── app/ // 应用层源文件
│ │ ├── usb_hub_app.c
│ │ └── ...
│ ├── common/ // 通用模块源文件
│ │ ├── log.c
│ │ ├── delay.c
│ │ ├── config.c
│ │ └── ...
│ ├── platform/ // 平台相关源文件
│ │ └── ...
│ └── startup/ // 启动代码和链接脚本
│ └── ...
├── doc/ // 文档目录
│ ├── design/ // 设计文档
│ ├── test/ // 测试文档
│ └── ...
├── tools/ // 工具目录
│ ├── compiler/ // 编译器配置
│ ├── debugger/ // 调试器配置
│ └── ...
├── Makefile // 构建脚本
└── README.md // 项目说明

项目中采用的各种技术和方法

本项目中采用的技术和方法都经过实践验证,旨在构建可靠、高效、可扩展的嵌入式系统:

  • C语言编程: C语言是嵌入式系统开发的首选语言,具有高效、灵活、可移植性强等优点。
  • 分层模块化架构: 提高代码的可维护性、可复用性和可扩展性。
  • 硬件抽象层 (HAL): 隔离硬件差异,方便代码移植和维护。
  • 设备驱动程序: 实现对VL822芯片的控制和管理。
  • USB协议栈: 实现USB集线器协议,处理USB通信和设备管理。
  • 中断驱动: 提高系统实时性和响应速度,例如使用中断处理USB事件。
  • 事件驱动编程: 基于事件处理机制,提高系统效率和可扩展性。
  • 状态机: 用于管理复杂的状态 transitions 和逻辑流程,例如USB端口状态管理。
  • 错误处理机制: 完善的错误检测和处理机制,提高系统鲁棒性。
  • 日志系统: 方便调试和故障排查,记录系统运行状态。
  • 版本控制系统 (Git): 管理代码版本,方便团队协作和代码维护。
  • 单元测试和集成测试: 保证代码质量,提高系统可靠性。
  • 代码审查: 提高代码质量,减少bug。
  • 静态代码分析: 提前发现潜在的代码缺陷。
  • 性能分析和优化: 提高系统性能和效率。
  • 低功耗设计: 优化系统功耗,延长电池寿命。
  • 固件在线升级 (OTA): 方便维护和功能升级。

总结

基于VL822实现的超高速USB扩展坞项目,采用分层模块化架构进行软件设计,能够有效地组织代码,提高开发效率和代码质量。通过HAL层隔离硬件差异,驱动层实现VL822芯片的控制,应用层实现USB集线器逻辑和附加功能。项目中使用的C语言编程、中断驱动、事件驱动、状态机、错误处理、日志系统等技术和方法,都是经过实践验证的成熟技术,能够构建一个可靠、高效、可扩展的嵌入式系统平台。

以上代码示例和架构说明只是一个框架,实际项目中需要根据具体的硬件平台、VL822芯片数据手册以及项目需求进行详细设计和实现。 整个代码库的完整实现将会远超3000行,包含更多的模块和功能实现细节,例如更完善的USB协议栈、BC 1.2充电协议的具体实现、过流/短路保护的硬件检测和软件处理、详细的配置管理、用户界面等等。 希望以上详细的说明和示例代码能够帮助您理解基于VL822的超高速USB扩展坞嵌入式系统开发的关键技术和方法。
Error executing command: Traceback (most recent call last):
File “/home/tong/bin/desc_img3.py”, line 73, in
for chunk in client.models.generate_content_stream(
File “/home/tong/.local/lib/python3.10/site-packages/google/genai/models.py”, line 3722, in generate_content_stream
for response_dict in self.api_client.request_streamed(
File “/home/tong/.local/lib/python3.10/site-packages/google/genai/_api_client.py”, line 344, in request_streamed
for chunk in session_response.segments():
File “/home/tong/.local/lib/python3.10/site-packages/google/genai/_api_client.py”, line 133, in segments
yield json.loads(str(chunk, ‘utf-8’))
File “/usr/lib/python3.10/json/init.py”, line 346, in loads
return _default_decoder.decode(s)
File “/usr/lib/python3.10/json/decoder.py”, line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File “/usr/lib/python3.10/json/decoder.py”, line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Error executing command: Traceback (most recent call last):
File “/home/tong/.local/lib/python3.10/site-packages/requests/models.py”, line 820, in generate
yield from self.raw.stream(chunk_size, decode_content=True)
File “/home/tong/.local/lib/python3.10/site-packages/urllib3/response.py”, line 1057, in stream
yield from self.read_chunked(amt, decode_content=decode_content)
File “/home/tong/.local/lib/python3.10/site-packages/urllib3/response.py”, line 1206, in read_chunked
self._update_chunk_length()
File “/home/tong/.local/lib/python3.10/site-packages/urllib3/response.py”, line 1136, in _update_chunk_length
raise ProtocolError(“Response ended prematurely”) from None
urllib3.exceptions.ProtocolError: Response ended prematurely

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “/home/tong/bin/desc_img3.py”, line 73, in
for chunk in client.models.generate_content_stream(
File “/home/tong/.local/lib/python3.10/site-packages/google/genai/models.py”, line 3722, in generate_content_stream
for response_dict in self.api_client.request_streamed(
File “/home/tong/.local/lib/python3.10/site-packages/google/genai/_api_client.py”, line 344, in request_streamed
for chunk in session_response.segments():
File “/home/tong/.local/lib/python3.10/site-packages/google/genai/_api_client.py”, line 127, in segments
for chunk in self.response_stream.iter_lines():
File “/home/tong/.local/lib/python3.10/site-packages/requests/models.py”, line 869, in iter_lines
for chunk in self.iter_content(
File “/home/tong/.local/lib/python3.10/site-packages/requests/models.py”, line 822, in generate
raise ChunkedEncodingError(e)
requests.exceptions.ChunkedEncodingError: Response ended prematurely

欢迎关注我的其它发布渠道