carplay逆向第一步:USB口OTG主从切换

本文详细阐述了如何通过修改USB描述符和配置,使车载系统支持CarPlay功能,包括设备描述符、配置描述符调整,以及苹果设备与中控的交互过程。关键步骤涉及主从切换请求,是carplay逆向工程的基础配置。

carplay逆向第一步:USB口OTG主从切换
USB的“主设备”变更为“从设备”,这个功能实现起来很简单。实现carplay功能的同学,原车中控需要先检测是否是苹果设备,应比较复杂了,涉及到驱动一系列的改动,具体如下:
1)USB描述符修改。
该功能最为复杂,涉及到USB的 设备描述符(Device Descriptor),配置描述符(Configuration Descriptor),接口描述符(Interface Descriptor)。
A)设备描述符(Device Descriptor)1个:
Get Device Descriptor
bLength: 18
bDescriptorType: 0x1
bcdUSB: 0x0200
bDeviceClass: 0
bDeviceSubClass: 0
bDeviceProtocol: 0
bMaxPacketSize0: 64
bytes idVendor: 0x05AC
idProduct: 0x12A8
bcdDevice: 0x1001
iManufacturer: 1
iProduct: 2
iSerialNumber: 3
bNumConfigurations: 4

B)配置描述符(Configuration Descriptor)4个:
Get Configuration Descriptor 
bLength: 9 
bDescriptorType: 0x2 
wTotalLength: 39 bytes 
bNumInterfaces: 1 
bConfigurationValue: 1 
iConfiguration: 5 
bmAttributes: 0xC0 
bMaxPower: 250 (500 mA)

Get Configuration Descriptor 
bLength: 9 
bDescriptorType: 0x2 
wTotalLength: 149 bytes 
bNumInterfaces: 3 
bConfigurationValue: 2 
iConfiguration: 6 
bmAttributes: 0xC0 
bMaxPower: 250 (500 mA)

Get Configuration Descriptor 
bLength: 9 
bDescriptorType: 0x2 
wTotalLength: 62 bytes 
bNumInterfaces: 2 
bConfigurationValue: 3 
iConfiguration: 7 
bmAttributes: 0xC0 
bMaxPower: 250 (500 mA)

Configuration Descriptor 
bLength: 9 
bDescriptorType: 0x2 
wTotalLength: 117 bytes 
bNumInterfaces: 3 
bConfigurationValue: 4 
iConfiguration: 8 
bmAttributes: 0xC0 
bMaxPower: 250 (500 mA)

C)接口描述符(Interface Descriptor)9个
因为个数太多,我这里就不一一列举了,各位同学可以将苹果手机通过USB直接插入ubuntu电脑,使用lsusb 命令,即可看到。

2)该设备是否支持carplay功能。
原车中控确定USB连接的设备是苹果设备以后,将会通过USB control通道发送请求,询问是否支持carplay功能,请求的内容如下:
0xC0, 0x53, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00
苹果设备需要回复,表示支持carplay功能。

3)请求主从切换。
原车中控确定USB连接的设备是苹果设备,而且支持carplay功能,将会请求主从切换,请求内容如下:
0x40, 0x51, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
苹果设备收到该信息以后,将会进行主从切换。

以上内容,需要在驱动层进行修改。修改完成以后,可以和苹果设备一样插入电脑,使用命令lsusb进行查看,如果确认和苹果手机描述符相同,我们就走完了万里长征第一步了。
### STM32 微控制器中的常见外设及其功能介绍 STM32 是一款基于 ARM Cortex-M 内核的高性能微控制器,广泛应用于嵌入式系统中。其丰富的外设模块使其能够满足多种应用场景的需求。以下是 STM32 中常见的外设模块及其主要功能的详细介绍: #### 1. GPIO(通用输入输出) GPIO 是最基础也是最重要的外设之一,用于实现与外部世界的简单交互。它可以被配置为输入模式、输出模式或复用功能模式。 - 输入模式下,GPIO 可以检测外部信号的状态。 - 输出模式下,GPIO 能够驱动 LED 或其他小型负载。 - 复用功能模式允许将特定引脚分配给其他外设使用,例如 USART 的 TX/RX 引脚。 此功能使得开发者可以通过简单的寄存器操作来控制硬件行为[^2]。 #### 2. ADC(模数转换器) ADC 将模拟电压信号转化为数字编码表示形式,以便 MCU 对真实世界中的连续变化量进行测量和处理。STM32 提供了高精度的逐次逼近型 ADC 单元,具有多个通道可供选择,并支持单端输入及差分输入两种采样方式。 这种能力对于需要监测温度、压力或其他物理参数的应用至关重要[^4]。 #### 3. DAC(数模转换器) 作为 ADC 的逆向过程,DAC 接受来自软件定义好的数值并将之转变为对应的直流电平输出至指定管脚上。这在音频播放或是生成精确参考电压等方面非常有用。 虽然并非所有型号都具备该特性,但对于那些确实拥有这一特性的产品来说,则极大地扩展了它们适用范围的可能性[^4]。 #### 4. UART/SPI/I²C(串行通信接) 这些协议提供了与其他 IC 或远程计算机之间交换信息的方法: - **UART** 使用两根导线分别负责发送(TXD) 和接收(RXD),适合低速率点对点连接; - **SPI** 利用了四条线路(MOSI/MISO/SCK/SS),可构建主从结构网络拓扑图; - **I²C** 凭借仅需一对总线即可挂载众多节点的优势成为紧凑布局场合下的首选方案。 每种都有各自独特的优缺点,在项目规划阶段应当仔细考量哪一种更适合当前情况[^2]。 #### 5. 定时器(Timer) 定时器是几乎所有实时控制系统不可或缺的一部分。STM32 不仅有基本的时间基准计数器,还包含了高级别的 PWM 泛生引擎以及捕获比较单元等功能块。利用它们不仅可以产生周期波形还能捕捉事件发生时刻从而计算频率或者占空比等指标。 此外,某些版本甚至还集成了看门狗(Watchdog Timer) 来保障系统的可靠性运行[^1]。 #### 6. DMA(直接内存访问) 为了减轻 CPU 在频繁数据搬运任务上的负担,引入了 DMA 控制器的概念。一旦启动传输请求之后便无需再次干预直到整个流程结束为止。这样一来既提升了效率也节省了宝贵的处理器资源可用于执行更加复杂的算法运算等工作负荷之上[^1]。 #### 7. USB/Ethernet(高速互联解决方案) 随着智能化程度不断提高,越来越多的产品倾向于接入互联网生态体系当中去。因此 STMicroelectronics 在部分高端系列里特别加入了原生支持 USB OTG 功能乃至千兆级别以太网 MAC 层面集成的服务选项。借助于此类先进设施,工程师们得以轻松打造出联网家电亦或者是工业自动化监控终端之类的创新作品出来[^3]。 --- ```c // 示例代码展示如何初始化一个简单的GPIO #include "stm32f4xx_hal.h" void GPIO_Init(void){ __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟 GPIO_InitTypeDef GPIO_InitStruct; /* 配置PA5为推挽输出 */ GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA,&GPIO_InitStruct); } int main(){ GPIO_Init(); while(1){ HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5); //切换PA5状态 HAL_Delay(500); //延时500ms } } ```
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值