كيف يعمل Apple Lightning





هذه مقالتي الصغيرة التي تصف (تقريبًا) كل ما أعرفه عن واجهة Apple Lightning والتقنيات ذات الصلة: Tristar و Hydra و HiFive و SDQ و IDBUS ، إلخ. ولكن أولاً ، تحذير صغير ...



اقرأ هذه المقالة على مسؤوليتك الخاصة! تعتمد المعلومات على الكثير من مواد Apple الداخلية (تسرب البيانات ، المخططات ، رموز المصدر) التي قرأتها قطريًا. وبالطبع ، على بحثي الخاص. يجب أن أحذرك من أنني لم أقم بمثل هذا البحث من قبل. وبالتالي ، قد تستخدم هذه المقالة مصطلحات غير صحيحة أو ببساطة غريبة وتكون خاطئة جزئيًا أو كليًا!



قبل التعمق أكثر ، دعنا نفهم باختصار المصطلحات:



ما هو البرق؟







Lightning هي الواجهة الرقمية المستخدمة في معظم أجهزة Apple iOS منذ أواخر عام 2012. تم استبدال الموصل القديم ذي 30 سنًا.



الصورة أعلاه هي مقبس الموصل ، والصورة أدناه هي دبوسها:







يرجى ملاحظة أنه في الموصل ، الدبابيس على جانبي الموصل غير متصلة بنفس الترتيب. وبالتالي ، يجب أن يحدد الجهاز المضيف اتجاه الكبل قبل القيام بأي شيء.



على الرغم من أن هذا ليس هو الحال دائما. العديد من ملحقات Lightning التي صادفتها لها نسخ متطابقة في الموصلات.



ما هي تريستار وهيدرا؟







Tristar هي دائرة متكاملة مدمجة في كل جهاز مع موصل Lightning. إنه في الأساس معدد إرسال: من







بين أمور أخرى ، الغرض الرئيسي منه هو الاتصال بموصل Lightning من الذكور بمجرد توصيله - لتحديد الاتجاه ومعرف الملحقات وتوجيه الواجهات الداخلية بشكل صحيح مثل USB و UART و SWD.



Hydra هو إصدار جديد من Tristar ، يستخدم منذ iPhone 8 / X. ربما يكون التغيير الأكثر أهمية هو دعم الشحن اللاسلكي ، ولكن لا يزال يتعين التحقق من هذا:







فأنا على علم بخمسة أنواع رئيسية من Tristar / Hydra:



  • TI THS7383  - الجيل الأول من Tristar في iPad mini 1 و iPad 4

  • NXP CBTL1608A1  - الجيل الأول من Tristar في iPhone 5 و iPod touch 5

  • NXP CBTL1609A1  - الجيل الأول الغامض Tristar في iPod nano 7 - المصدر

  • NXP CBTL1610Ax  - الجيل الثاني من TriStar ، يستخدم منذ iPhone 5C / 5S ويبدو أنه في كل شيء آخر لا يدعم الشحن اللاسلكي. توجد عدة أجيال (x هو رقم الجيل)

  • NXP CBTL1612Ax  - يستخدم Hydra مع iPhone 8 / X ويبدو أنه كل شيء آخر يدعم الشحن اللاسلكي. توجد عدة أجيال (x هو رقم الجيل)


من الآن فصاعدًا ، سأستخدم مصطلح TriStar فقط ، ولكن ضع في اعتبارك أنه يشير أيضًا إلى Hydra حيث أنها متشابهة جدًا في معظم الجوانب التي سيتم تغطيتها في هذا النص.



ما هو HiFive؟







HiFive هي طفل من Lightning ، أي موصل قابس. يحتوي أيضًا على بوابة منطقية - تُعرف هذه الشريحة باسم SN2025 / BQ2025.



ما هي SDQ و IDBUS؟







غالبًا ما يُعتبر المصطلحان مترادفا للأنواع. من أجل الراحة ، سأستخدم مصطلح IDBUS فقط ، لأنه يبدو أكثر صحة بالنسبة لي (وهذا هو ما يسمى التكنولوجيا في مواصفات THS7383).



لذا ، فإن IDBUS هو بروتوكول رقمي يستخدم للاتصال بين Tristar و HiFive. تشبه إلى حد كبير بروتوكول Onewire .



الآن يمكننا البدء



دعونا نستمع إلى اتصالات Tristar و HiFive. احصل على محلل منطقي ، ومنحدر Lightning مع مقبس وموصل ذكر ، وملحق (كابل Lightning إلى USB يعمل بشكل رائع) ، وبالطبع جهاز مزود بمنفذ Lightning.



أولاً ، قم بتوصيل قنوات المحلل المنطقي بكل من خطوط معرف الناهض (الدبابيس 4 و 8) وقم بتوصيل اللوحة بالجهاز ، ولكن لا تقم بتوصيل الملحق بعد:







مباشرة بعد ذلك ، ابدأ في أخذ العينات (أي تردد من 2 ميجاهرتز أو أعلى سيفعل). سترى شيئا مثل هذا:







كما ترى ، يقوم Tristar باستقصاء كل سطر معرف ، واحدًا تلو الآخر. ولكن نظرًا لأننا لم نقم بتوصيل أي ملحق ، فقد فشل الاستطلاع بشكل واضح. في مرحلة ما ، سوف يتعب الجهاز من هذا التدفق المستمر من الفشل ويوقفه. في الوقت الحالي ، دعنا نرى ما يحدث بالضبط أثناء الاستطلاع:







أولاً ، نرى فاصلًا طويلًا (حوالي 1.1 مللي ثانية) ، عندما يكون المستوى مرتفعًا فقط ، ولكن لا يحدث أي شيء آخر:







على ما يبدو ، يتم استخدام هذه المرة لشحن مكثف HiFive الداخلي - ثم سيتم استخدام الطاقة منه لتشغيل رقائق المنطق الداخلي.



ما هو أكثر إثارة للاهتمام هو ما يحدث بعد ذلك: من







الواضح أن هذا هو دفق من بعض البيانات. ولكن كيف نفسر ذلك؟ كيفية فك تشفير؟ دعونا نقسمها فعليًا إلى أجزاء مهمة قليلة - ما أسميه الكلمات :







في الواقع ، الكلمة هي مزيج من السقوط المتصاعد:







  • مرحلة المحتوى - الفاصل الزمني الذي يحدد معنى الكلمة

  • مرحلة الاسترداد - الفاصل الزمني المطلوب على ما يبدو لمعالجة مرحلة المحتوى من جانب المستقبل و / أو لتحضير الكلمة التالية في مرحلة الإرسال


فيما يلي جدول بالكلمات الشهيرة مع تباعدها لكلتا المرحلتين التي ناقشناها أعلاه (جميع الوحدات بالميكروثانية):



المحتوى التعافي
كلمة الحد الأدنى نوع ماكس الحد الأدنى نوع
استراحة 12 أربعة عشرة السادس عشر 2.5 4.5
استيقظ 22 24 27 1100؟
صفر 6 7 8 3
واحد 1 1.7 2.5 8.5
صفر وإيقاف * 6 7 8 السادس عشر
ONE و STOP * 1 1.7 2.5 21
* يتم استخدام STOP عندما يكون هذا هو البت الأخير في بايت



باستخدام الجدول أعلاه يمكننا الآن إنشاء وحدة فك ترميز بروتوكول بسيطة:







كما ترى ، يرسل المضيف BREAK أولاً - عندما يريد Tristar إرسال طلب جديد ، يبدأ المضيف دائمًا بهذه الكلمة. ثم تأتي مرحلة نقل البيانات. يرجى ملاحظة أن البت الأخير (الثامن) في البايت له مرحلة استرداد أطول. عندما تنتهي مرحلة نقل البيانات ، يرسل المضيف BREAK آخر. يجب على الطفل بعد ذلك إرسال استجابة (بعد تأخير لا يقل عن 2.5 ميكروثانية - انظر الجدول). ستنتظر تريستار حوالي 2.2 مللي ثانية للحصول على استجابة. إذا لم يتم تقديم أي رد خلال هذا الإطار الزمني ، فسيحاول Tristar استجواب خط معرف آخر.



الآن دعونا نلقي نظرة على مرحلة البيانات باستخدام المثال أعلاه - 0x74 0x00 0x02 0x1f:



  • 0x74 - نوع الطلب / الرد. دائمًا حتى عند الطلب وغريب للاستجابة (نوع الطلب +1)

  • 0x00 0x02 - بيانات واقعية. قد تكون فارغة

  • 0x1f - هذا هو CRC8 لكل من بايتة نوع الطلب وجميع البيانات (كثير الحدود - 0x31 ، القيمة الأولية - 0xff)


دعنا نربط بعض الملحقات بجهازنا ونرى ما سيحدث.







سأستخدم كابل Lightning-to-USB الأصلي من Apple: وإليك ما يظهر على IDBUS بعد طلب







0x74 : أجاب HiFive! وإذا قمت بالتمرير أكثر ، فسوف ترى العديد من أزواج







الطلبات / الاستجابة الأخرى: بعض الطلبات لا تحتاج إلى رد:







تفسير طلبات واستجابات IDBUS



أهم طلب IDBUS هو 0x74 ، يتم استخدامه لسببين: لإخبار HiFive بتشغيل الجهد الكامل والتيار (إذا كان مدعومًا بالملحق) ، للاستفسار عن تكوين الدبوس الذي يدعمه الكابل ، وبعض البيانات الوصفية الأخرى.



لا يُعرف الكثير عن كيفية ترميز بيانات استجابة 0x75. لكن بعض البتات متاحة في مواصفات Tristar القديمة:



بيانات الاستجابة الأولى بايت 0x75

7 6 خمسة 4 3 2 1 0
ACCx Dx البيانات [43:40]


تكوين ACCx عند العثور على معرف على ID0

ACCx [1: 0] ACC1 ACC2 HOST_RESET
00 مرحبا- Z (IDBUS) مرحبًا Z. مرحبًا Z.
01 UART1_RX UART1_TX مرحبًا Z.
عشرة JTAG_DIO JTAG_CLK مرحبًا Z.
أحد عشر مرحبًا Z. مرحبًا Z. عالي


تكوين ACCx عند العثور على معرف على ID1

ACCx [1: 0] ACC1 ACC2 HOST_RESET
00 مرحبًا Z. مرحبا- Z (IDBUS) مرحبًا Z.
01 UART1_RX UART1_TX مرحبًا Z.
عشرة JTAG_DIO JTAG_CLK مرحبًا Z.
أحد عشر مرحبًا Z. مرحبًا Z. عالي


تكوين Dx عند العثور على المعرف في ID0

Dx [1: 0] DP1 DN1 DP2 DN2
00 مرحبًا Z. مرحبًا Z. مرحبًا Z. مرحبًا Z.
01 USB0_DP USB0_DN مرحبًا Z. مرحبًا Z.
عشرة USB0_DP USB0_DN UART1_TX UART1_RX
أحد عشر مرحبًا Z. مرحبًا Z. مرحبًا Z. مرحبًا Z.


تكوين Dx عند العثور على معرف على ID1

Dx [1: 0] DP1 DN1 DP2 DN2
00 مرحبًا Z. مرحبًا Z. مرحبًا Z. مرحبًا Z.
01 مرحبًا Z. مرحبًا Z. USB0_DP USB0_DN
عشرة USB0_DP USB0_DN UART1_TX UART1_RX
أحد عشر مرحبًا Z. مرحبًا Z. مرحبًا Z. مرحبًا Z.


باستخدام هذه الجداول ، دعنا نفك شفرة معرف الكبل الخاص بنا ( 10 0C 00 00 00 00) ، مع الأخذ في الاعتبار حقيقة أن خط المعرف موجود على دبوس ID0:



البايت الأول لاستجابة الكبل 0x75

7 6 خمسة 4 3 2 1 0
ACCx Dx البيانات [43:40]
0 0 0 1 0 0 0 0


إذن ACCx تساوي 00 ، هذا يعني أن دبوس ID0 مرتبط ببساطة بـ IDBUS ، و Dx = 01 يعني أن دبابيس DP1 / DN1 قد تم تكوينها على أنها USB0_DP / USB0_DN. بالضبط ما كنا نتوقعه من كابل USB قياسي.



الآن دعنا نعترض شيئًا أكثر إثارة للاهتمام:



ملحق ID (HOSTID = 1)
DCSD 20 00 00 00 00 00
KongSWD (لا يوجد Astris قيد التشغيل) 20 02 00 00 00 00
KongSWD (مع تشغيل Astris) A0 00 00 00 00 00
KanziSWD (لا يوجد أستريس قيد التشغيل) 20 0E 00 00 00 00
KanziSWD (مع تشغيل Astris) A0 0C 00 00 00 00
هايواير (HDMI) 0 ب F0 00 00 00 00
شحن UART 20 00 10 00 00 00
البرق إلى 3.5 مم / EarPods مع البرق 04 F1 00 00 00 00


فيما يلي قائمة كاملة (؟) لطلبات IDBUS من spbdimka :







نصيحة رقم 1 : يمكنك بسهولة الحصول على خصائص أحد الملحقات بما في ذلك معرفه باستخدام accctl:





هذه أداة Apple داخلية تأتي مع تجميعات NonUI / InternalUI. ولكن يمكنك تشغيله بسهولة على أي جهاز بعد كسر الحماية.



نصيحة رقم 2 : يمكنك بسهولة الحصول على تكوين دبوس كابل باستخدام الأشكال:



tristar -p




يرجى ملاحظة أن هذا الأمر متاح فقط على iOS 7+.



نصيحة رقم 3 : يمكنك بسهولة تتبع طلبات / ردود 0x74 / 0x75 الناتجة عن تحقيقات SWD عن طريق تعيين debugenv var على 3:



astrisctl setenv debug 3


ثم على COM الظاهري من الكبل ، سترى شيئًا مثل هذا:





هوستيد



في أحد الجداول أعلاه ، يمكنك رؤية ذكر HOSTID معين. هذه هي قيمة 16 بت التي تم تمريرها في طلب 0x74. يبدو أنه يؤثر أيضًا على إجابة HiFive. على الأقل إذا قمت بتعيينها إلى قيمة غير صالحة (نعم ، فمن الممكن مع الأشكال) ، يتوقف HiFive عن العمل معها:





ومع ذلك ، فإن البرامج الثابتة KongSWD / KanziSWD تحتوي على متغير بيئة disIdCheck متغير ، والذي يمكنك تكوينه لتجاهل HOSTID غير صالح.



ملاحظة هامة: لا يوجد لدى كونغ وكانزي رقاقة HiFive كرقاقة مخصصة غير قابلة للبرمجة. هذه الملحقات تحاكيها باستخدام متحكم و / أو FPGA ، مما يسهل تحديثها / إعادة برمجتها.


استيقظ



في جدول معرّف الملحقات أعلاه ، يمكنك أن ترى أن Kong و Kanzi يرسلان ردودًا مختلفة بناءً على ما إذا كان Astris قيد التشغيل أم لا ، وهو برنامج Apple الداخلي لتصحيح الأخطاء باستخدام مجسات SWD (أو المجسات). إذا قمت بفك شفرة هذه الإجابات باستخدام الجداول أعلاه ، فستجد أنه عندما يفشل Astris في البدء ، سيعمل المسبار تمامًا مثل DCSD - USB على خطوط D1 وتصحيح UART على خطوط D2. ولكن عند تشغيل برنامج التصحيح ، تتحول خطوط ACCID إلى SWD.



ولكن ماذا لو أردنا تشغيل Astris بعد توصيل المسبار بالجهاز بالفعل؟ ماذا سيفعل الكابل؟ كيف سيتم التبديل بين ACC وخطوط SWD؟ هنا يأتي دور WAKE ! يمكن بدء HiFive (أو جهاز يحاكيها)WAKE  - وستبدأ عملية تعداد IDBUS مرة أخرى: سيرسل Tristar طلبًا 0x74 ، وسوف يستجيب Kong / Kanzi بمعرف جديد ، وسوف يؤكده Tristar ويرسل خطوط ACC إلى ملحقات SWD (يجب أن تدعم SoC هذا على المستوى المادي ، بالطبع).





مصافحة السلطة



آخر شيء سأنظر إليه هو المصافحة القوية. هذه خوارزمية طلب / استجابة IDBUS تستخدمها برامج تشغيل نواة Tristar قبل السماح بشحن الملحقات.



عندما يكون كبل Lightning موجودًا في مكان ما فقط ، متصلاً بالشاحن / الكمبيوتر ، ولكن غير متصل بالجهاز ، فإن HiFive يحد من التيار على PWR بقيمة صغيرة حقًا (حوالي 10-15 مللي أمبير وفقًا للقياسات الخاصة بي). لتمكين التيار الكامل ، يجب إصدار طلب 0x74 بواسطة Tristar ومعالجته بواسطة HiFive. بالنسبة لـ SecureROM / iBoot ، يعد هذا كافيًا ، ولكن يجب اتخاذ خطوات إضافية عند تحميل النواة:



  1. يصدر TriStar طلبين 0x70

  2. بمجرد معالجة الطلب الثاني بواسطة HiFive وإرسال استجابة ، يتم إيقاف تشغيل التيار تمامًا لمدة 20 مللي ثانية تقريبًا

  3. Tristar 0x70, 0x80 . HiFive

  4. , Tristar,


: , . , . ,



ESN Tristar I2C



ميزة أخرى في Tristar أود التحدث عنها هي ESN. هذه نقطة صغيرة تخزنها Tristar في EEPROM (على CBTL1610A2 والإصدارات الأحدث). يمكن الحصول عليه عبر IDBUS باستخدام كبل قارئ الرقم التسلسلي (أو Kanzi ، فهي في الأساس هي نفسها باستثناء USB-PID ومرفقات مختلفة قليلاً)



ببساطة ، عن طريق إرسال هذا النقطة إلى ttrs.apple.com ، يمكنك الحصول على الرقم التسلسلي للجهاز ... يتم استخدام هذه الآلية من قبل موظفي Apple Store / Apple Premium Reseller لاسترداد SN من الأجهزة الميتة (إذا كان Tristar لا يزال على قيد الحياة):







ماذا يحدث على IDBUS عند تلقي ESN ، تم توثيق spbdimka :





تدريب



دعا الإجراء ل "البرامج الثابتة» ESN على التدريب Tristar (التزويد). يتم ذلك مع التشخيص على جانب الجهاز ، عبر EzLink على جانب الاستقبال في ثلاث خطوات.



يمكنك التحقق من الحالة باستخدام الأشكال:



tristar --prov_stat




... واحصل أيضًا على ESN:



tristar --esn




بالمناسبة ، تحتوي المخططات بشكل عام على مجموعة غنية من أوامر Tristar (متوفرة منذ iOS 7):





Tristar I2C



Tristar متاح في ناقل I2C (العنوان 0x34 للكتابة ، 0x35 للقراءة). هذه هي الطريقة التي يتفاعل بها محركو diag و kernel معها. ليس كثيرا و علنا المعروف



عن السجلات . يمكن الحصول على الكثير من المعلومات حول خريطة التسجيل نفسها من كود مصدر iBoot المسرب (فقط لـ THS7383 - يبدو أنه متوافق مع الإصدارات السابقة مع CBTL1608 - و CBTL1610) ، ولكن ليس كثيرًا حول ما يجب كتابته هناك لتحقيق أي نتائج مثيرة للاهتمام. مصدر آخر للمعرفة هو وحدة Tristar من الأشكال (يمكن استردادها بسهولة من خلال موقع التخلص من النفايات الصلبة أثناء تشغيلها). على سبيل المثال ، تمكنت من عكس خوارزميات التزويد وقراءة ESN. ثم قمت بتطبيق هذا كإضافة إلى حملي لـ iBoot المسمى Lina :











حاولت أيضًا تغيير خوارزمية كتابة ESN لكنها فشلت - الآلية معقدة جدًا بالنسبة لي. ومع ذلك ، تتوفر مقتطفات الشفرة من Lina هنا .



الخصائص الكهربائية للتريستار



يعمل Tristar نفسه بإمداد 1.8 فولت ، وخطوط IDBUS متسامحة 3.0V ، وفقًا لمذبذب الذبذبات الخاص بي:







لذلك بدون دائرة تبديل المستوى ، من الأفضل عدم محاولة التواصل مع IDBUS باستخدام أجهزة 5V متسامحة مثل بعض موديلات Arduino ...



All Articles