苹果闪电

2020-07-02 04:11:31

这是我的一篇关于Apple Lightning及其相关技术的(几乎)所有我知道的小文章:三星、九头蛇、HiFive、SDQ、IDBUS等等。但首先要提一个小小的警告。

阅读这篇文章的风险自负!这篇文章中的信息是基于我以对角线方向阅读的大量AppleInternal材料(泄露的数据表、原理图、源代码)。当然,我自己的研究也是如此。我必须警告你,读者,我以前从来没有做过这样的研究。因此,这篇文章可能会使用不正确或奇怪的术语,结果可能部分或完全错误!

Lightning-自2012年末以来,大多数苹果iOS设备都使用了闪电数字接口。更换旧的30针连接器您可以在上图中看到母端口引脚,在下图中看到连接器引脚:请注意,在连接器中,连接器两侧的针脚没有按完全相同的顺序布线。因此,主机设备必须在执行任何其他操作之前检测电缆的方向,尽管这并不总是适用的。我玩过的许多闪电配件的连接器上都有镜像引脚。

三星(TriStar)-是嵌入闪电母端口的每个设备中的集成电路。基本上,它是一个多路复用器:在许多其他功能中,它的主要目的是在连接后与Lightning凸式连接器通信-检测方向并检测附件ID,并相应地路由USB、UART和SWD等内部接口-是自iPhone8/X以来使用的三星的新变种。最重大的变化似乎是支持无线充电,但这还有待验证:有没有。Re 5大三星/九头蛇型:恩智浦CBTL1610Ax-从iPhone5C/5S开始使用的第二代三星,以及几乎所有其他不支持无线充电的产品。此版本有多个世代(x-世代数)。

恩智浦CBTL1612Ax-自iPhone 8/X开始使用的Hydra,以及几乎所有支持无线充电的产品(x代)。

从现在开始,我将只使用三星这个词,但请记住,它也将意味着九头蛇,因为它们在大多数方面都非常相似,将在本文中涵盖。

HIFIVE-是闪电从属,即凸式连接器。它还包含一个逻辑元素-该芯片称为SN2025/BQ2025。

这两个术语通常被称为同义词。为了方便起见,我将从现在开始只使用IDBUS一词,因为我觉得它更正确(这也是这项技术在THS7383数据手册中的称呼),所以,IDBUS-是三星和HiFive之间谈判使用的数字协议。非常类似于OneWire协议

让我们来看看三星和HiFive之间的谈判吧。拿一个逻辑分析仪、一个Lightning凸式到母式直通分路板、一些附件(正常的Lightning转USB电缆就可以了),当然还有一些带Lightning端口的设备,首先将逻辑分析仪的通道连接到分路器的两条ID线(引脚4和8),然后将分路器连接到设备,但不要在开始采样后立即连接附件(2 MHz及以上的任何速率都应该可以)。你会看到类似这样的情况:正如你所看到的,三星轮流轮流轮询每个身份证行-一个接一个。但是因为我们没有连接任何附件,所以轮询显然失败了。在某一时刻,设备会对这种无休止的故障感到厌倦,并停止它。与此同时,让我们来看看轮询时到底发生了什么:首先,我们可以看到一个很长的间隔(约1.1毫秒),此时电平只是很高,其他事情都没有发生:显然,这段时间被用来给内部Hive的电容器充电-来自这段时间的能量将被用来给其内部逻辑芯片加电。接下来发生的事情要有趣得多:显然,这是一些数据流。但如何解读呢?怎么解码呢?让我们几乎把它分成几乎最不重要的部分--我称之为词:所以基本上一个词是下降-上升-下降:恢复阶段-时间间隔的组合,这显然是在接收端处理有意义的阶段和/或在发送阶段准备下一个词所必需的。

下面是我们上面讨论的两个阶段的已知字类型及其时间间隔的表格(所有单位均以微秒为单位):*-STOP用于字节中的最后一位使用上表我们现在可以构建一个简单的协议解码器:如您所见,主机发送的第一个字是Break-当Tristar想要发送新请求时,它总是以它开头。然后是数据阶段。请注意,字节的最后(8)位具有较长的恢复阶段。当一个数据阶段结束时,主机发送另一个中断。然后,从机必须发送回复(在至少2.5 us延迟之后-见下表)。三星将等待大约2.2毫秒的回复。如果在此时间间隔内没有发出,三星将尝试轮询另一个ID行,现在让它检查上面示例中的数据阶段-0x74 0x00 0x02 0x1f:0x74-请求/响应类型。请求始终为偶数,响应始终为奇数(请求类型+1)。

0x1f-请求类型字节和整个数据的CRC8(多项式-0x31,初始值-0xff)。

让我们将一些附件连接到我们的设置中,看看会发生什么。我将使用苹果原装的Lightning转USB数据线:这是IDBUS在收到0x74请求后出现的内容:HIFIVE回复了!如果您进一步滚动,您会看到许多其他请求/响应对:有些请求不需要响应:

最重要的IDBUS请求是0x74-它用于两个目的:告知HiFive启用全电流(如果附件支持),并询问电缆所支持的引脚配置,以及不太了解响应0x75;数据如何编码的其他一些元数据。但在某个旧的三星数据表中有一些位可用:使用上表解码我们的电缆ID(100C 00 00 00),同时记住ID0引脚上发现了ID线:因此,ACCx为00表示ID0引脚将仅与IDBUS结合使用,Dx为01表示DP1/DN1引脚将配置为USB0_DP/USB0_DN。(请注意,ACCx为00表示ID0引脚将仅与IDBUS配合使用,Dx为01表示DP1/DN1引脚将配置为USB0_DP/USB0_DN)。这正是我们对标准USB线的期待,现在让我们来闻一闻更有趣的东西:这里是一个完整的(?)。@spbdimka:提示#1提供的IDBUS请求列表:您可以使用accctl:That轻松获取附件的属性,包括其ID。accctl:That是Apple的内部实用程序,随NonUI/InternalUI版本一起提供。但是您可以很容易地在任何越狱设备上运行提示#2:您可以很容易地使用诊断程序获得电缆的引脚配置:请注意,此命令仅在iOS 7+Diags上可用提示#3:通过将debug env var设置为3,您可以轻松跟踪SWD-Probe生成的0x74/0x75请求/响应:然后,在Cable的虚拟COM上,您将看到类似这样的内容:在上面的一个表格中,您可以看到一种名为。它是0x74请求中携带的16位值。似乎这可能会影响HiFive将回复的回复。至少,如果您将其设置为无效值(是的,使用Diags是可能的),HiFive可能会停止使用它:尽管在KongSWD/KanziSWD/KanziSWD固件中有一个名为disableIdCheck的环境变量,您可以将其设置为使探头忽略无效的HOSTID重要说明:KONG和KANZI没有将HiFive作为专用的不可重编程芯片。取而代之的是t

三星本身由1.8V电源供电。根据我的示波器,用于IDBUS的线路是耐3.0V的:因此,最好不要尝试使用耐5V的设备与IDBUS交互,例如某些型号的Arduino没有电平移位器