
هذا هو المقال الأول (التمهيدي) في السلسلة حول كيفية تحسين نظام وسائط السيارة. المشروع نفسه قيد التنفيذ ، ليس هناك وقت ، مثل أي شخص آخر ، لذلك ، أعزائي القراء ، يرجى التحلي بالصبر ، لأنني غالبًا لا أتعهد برشمة المقالات.
بدأ كل شيء مع حقيقة أن لديّ بريوس.
وأول ما لفت نظري هو مشاكل تحديث الملاحة. فيما يلي عدد قليل للغاية ، ولكن في بعض الأماكن الميزات الضرورية لجهاز يسمى "عرض متعدد الوظائف" (في عامة الناس - الرأس). وهذا على خلفية عدد كبير من أجهزة الراديو الصينية التي تعمل بنظام Android والعديد من وسائل الراحة. لكن تركيبها في مكان منتظم يعني الحرمان من هذه "الكعك" كمخطط لتوزيع الطاقة والتحكم في المناخ.
ولدت الفكرة لربط راديو Android بالسيارة بطريقة أو بأخرى أكثر مما يقترح الإخوة الصينيون. عن هذا والمقال.
الوضع الأولي
لذا يوجد على متن الطائرة حوالي 7 بوصة مع شاشة تعمل باللمس مقاوم ، متصلة بأجهزة إلكترونية أخرى مع خطوط TX + و TX-. ويوجد بالفعل 3 أزواج من الرأس في الدائرة ، تسمى هذه المعجزة AVC-LAN ، وتبدو على النحو التالي:

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

تأملات
كانت هناك فكرة لاستبدال وحدة الملاحة ببساطة بشيء android ، لكنها انتهت عندما فهمت بشكل أعمق كيف يتواصلون مع الرأس. بالإضافة إلى AVC-LAN ، ترتبط هذه الوحدات أيضًا بخط GVIF (Gigabit Video InterFace) ، وقد يتصدع هذا الوجه من الشركات المصنعة للمحول عن طريق الخطأ إذا اشتريت أيضًا محول إشارة فيديو في GVIF بأكثر من 100 دولار. "العيش بدون وجه هو أن تكون قد يكون الأمر صعبًا ، ولكن .. "- بدا في رأسي بدافع أغنية مشهورة ، ولم يعجبني القرار.
كانت هناك حلول على الشبكة بتثبيت راديو صيني بدلاً من جهاز استقبال راديو. لم يناسبني ذلك لأن الشاشتين هما تكرار غير معقول. IMHO.
الحل
ولد الحل التالي: استبدال الرأس بالكامل ، وإنهاء راديو android ، وتكوين صداقات مع Prius ، والتي:
- تصميم USB <-> محول أجهزة AVC-LAN
- قم بتطوير البرامج الثابتة الخاصة بها بحيث تتصل مثل USB-HID.
- اجعلها مركبة بحيث يتم الكشف عن إحدى الوظائف مثل لوحة مفاتيح الأجهزة العادية (من أجل استخدامها كعنصر تحكم أصلي من الأزرار الموجودة على اللوحة)
- قم بتطوير تطبيق Android بوظائف مشابهة (أو متفوقة على) Priusovsky الأصلي
- قم بمحاذاة الكاميرا الخلفية
- حل المشاكل في الجزء الميكانيكي (التثبيت في مكان عادي)
في هذه العملية ، سيكون من الضروري تطوير تطبيق آخر لنظام android - الشم العادي ، بحيث يكون أكثر ملاءمة لعكس الحزم على AVC-LAN. في نفس الوقت والممارسة.
يجب أن يبدو مثل هذا:

كأساس للأجهزة ، تقرر استخدام لوحة تدريب على SM32F103:

أمر مع AliExpress مقابل 2.05 دولار.
أو البحث - المفسدربما تم حذف القطعة بالفعل من قبل البائع ، لذلك أعطي السلسلة السحرية للبحث في علي:
STM32F103C8T6 ARM STM32 الحد الأدنى لوحدة تطوير النظام
ما يعجبني فيها:
- وحدة أجهزة USB (الجهاز) على متن المعالج
- مجموعة USB كافية من الشركة المصنعة (على عكس Freescale-ovsky ، لا تتذكر في الليل).
- منافذ GPIO مجانية يمكن استخدامها لتوصيل الأزرار العادية على جانبي الشاشة. ربما سيؤدي ذلك إلى إخفاء أزرار الأجهزة في الراديو أسفل اللوحة. لا اعرف ماذا ستكون
- وعليه يمكنك تعليق محول AVC-LAN إلى مستويات منطقية
سوف أصف بالتفصيل ترتيب التنفيذ ، الذي يرجع أولاً إلى معرفتي الشخصية. على سبيل المثال حاولت أن أدرك الأماكن التي لم يكونوا فيها في البداية ، وفي النهاية تركت ما يجب أن يحدث بالتأكيد.
على أي حال ، يتم التخطيط للعديد من المقالات في محاور مختلفة. يتحول المشروع إلى الكثير من FullStack - من اتصال الأجهزة إلى تطبيق Android.
الجزء 2: USB ، HID ، الواصفات ، وكل ذلك للحصول على نموذج تجريبي
الخطوة الأولى كنت أرغب في الحصول على مجموعة من الجهاز والهاتف ، بحيث يمكن للجهاز نقل الحزمة إلى الهاتف ، وذلك لعرضها في التطبيق.
كما قال غاغارين: دعنا نذهب!
جهاز USB HID المركب على STM32
ما قررت فعله هو تكييف مثال ST من مهامي والحصول على جهاز USB معترف به من قبل المضيف كجزء من لوحة المفاتيح و "شيء آخر" - جهاز RAW HID. الأول ، كما قلت بالفعل ، مخصص للتحكم الأصلي في Android ، والثاني - للتبادل المباشر لحزم AVC-LAN مع البرنامج على الجهاز.
استنادًا إلى CubeMX من STM ، وبعد قراءة الكثير من المقالات حول كيفية تنفيذ HID المخصص ، وجدت شيئًا مزعجًا على الشبكة: مسألة إنشاء أجهزة مركبة غير موجودة عمليًا أو نادرة جدًا.
ستكون رموز المصدر في وقت لاحقلا أحمّل رموز المصدر حتى الآن ، نظرًا لأن المشروع يتم تنفيذه الآن في وضع التدريب التجريبي. إذا تم إكمال المشروع بنجاح ، فتأكد من سحبهم إلى Github وتعديل المقالة برابط لهم.
في الشكل الذي هم فيه ، لا معنى للتحميل - هناك فوضى كافية على الإنترنت بدوني.
USB ، مركب ، HID
فقط بضع كلمات حول هذا الموضوع. من المفترض أنك على دراية أو أقل بمعيار USB. إذا لم يكن الأمر كذلك ، فمن الأفضل أن تتعرف أولاً على أمثلة من CubeMX وتجربتها.
لذلك لدينا:
مثال على تطبيق STM USB stack والماوس. هناك قمنا بتكوين بعض الواصفات ونقطة نهاية وظيفية. هذا بالإضافة إلى زوج من 0x00 و 0x80 للتحكم في الجهاز بأكمله.
لتنفيذ مشروعي ، أحتاج إلى أن تكون نقطة نهاية لوحة المفاتيح ثنائية الاتجاه (لا أعرف السبب - إنها مفيدة) ونقطتين أخريين ستستخدمان لتبادل البيانات مع الوظيفة الثانية - RAW -. أضفها.
نجعل النقطة ثنائية الاتجاه عن طريق إضافة نقطة OUT إلى الواصف:
واصف التكوين.عند تحرير الواصف ، راقب الفهارس والأحجام.
(2c5cf968121f0d8fa43a6755c09e15ef3a317791):
0x07, USB_DESC_TYPE_ENDPOINT, HID_EPOUT_ADDR, 0x03, HID_EPOUT_SIZE, 0x00, HID_FS_BINTERVAL,
وإضافة نقطتين إضافيتين:
واصف التكوين(bc2bd583c98715e106fcb3ab07b266bc9221be36):
0x07, USB_DESC_TYPE_ENDPOINT, HID_EPIN_ADDR2, 0x03, HID_EPIN_SIZE, 0x00, HID_FS_BINTERVAL, 0x07, USB_DESC_TYPE_ENDPOINT, HID_EPOUT_ADDR2, 0x03, HID_EPOUT_SIZE, 0x00, HID_FS_BINTERVAL,
كان واصف التكوين. الآن سيتأكد المضيف من أن لدينا نوعًا من جهاز HID المركب ، ويمكنك إرسال البيانات إلى جميع هذه النقاط. لكن الأمر ليس كذلك.
لتحقيق ذلك:
1. إن جهاز التحكم الخاص بنا لديه قطعة ذاكرة مخصصة بشكل خاص والتي يتم قطعها مع وحدات CAN و USB. بالنظر إلى أن وحدة USB تعمل بشكل مستقل في عملية استقبال / إرسال حزمة بيانات ، تحتاج إلى تعيين مخازن مؤقتة في هذه القطعة من الذاكرة لكل نقطة نهاية فردية:
USBD_LL_Init في ملف usbd_conf.c HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x18); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , HID_EPOUT_ADDR , PCD_SNG_BUF, 0x100); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , HID_EPIN_ADDR , PCD_SNG_BUF, 0x140); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , HID_EPOUT_ADDR2 , PCD_SNG_BUF, 0x180); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , HID_EPIN_ADDR2 , PCD_SNG_BUF, 0x1B0);
تكون العناوين العازلة عشوائية ، إذا لم تتداخل فقط.
لسبب ما ، يتم كتابة مكدس ST مع توقع ألا يكون للجهاز أكثر من نقطة نهاية ثنائية الاتجاه ، لذلك سنقوم بتعديل المكدس قليلاً:
نقل
إعادة تسمية إجراء USBD_HID_SendReport إلى USBD_HID_SendReportEP ، بإضافة معلمة أخرى - رقم نقطة النهاية. نترك الإجراء مع الاسم القديم للتوافق مع الإصدارات السابقة ، ولكن في الجسم نسمي USBD_HID_SendReportEP مع ثابت في شكل نقطة نهاية. لا يزال الحل ليس الأكثر جمالية ، ولكنه سينجح في التجربة ، وحتى إذا استمر ، فلن يتداخل مع مشروع معين.
usbd_hid.c uint8_t USBD_HID_SendReportEP (USBD_HandleTypeDef *pdev, uint8_t ep, uint8_t *report, uint16_t len) { ... , USBD_HID_SendReport } uint8_t USBD_HID_SendReport (USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len) { return USBD_HID_SendReportEP(pdev,HID_EPIN_ADDR,report,len); }
الآن كل شيء جاهز لإرسال البيانات ، يبقى فقط في الوقت المناسب لاستدعاء هذه الوظيفة.
إنهاء
من أجل الطلب ، نبحث عن المشروع ونستدعي USBD_LL_CloseEP مرة أخرى ، ولكن لنقاط النهاية التي تم إنشاؤها حديثًا.
الاستقبال
لكي يتم ضبط نقاط النهاية للعمل أخلاقيا ، تحتاج إلى استدعاء USBD_LL_PrepareReceive لها. أوصي القارئ بالبحث عن مشروع هذا الخط وتكييف هذه المكالمات مع احتياجاتك.
حصلت على هذا الحبار القبيح في الكود الخاص بي:
usbd_core.c USBD_LL_PrepareReceive(pdev, HID_EPOUT_ADDR+(epnum&0x7F)-1 , hhid->Report_buf, USBD_HID_OUTREPORT_BUF_SIZE);
على سبيل المثال انتقلت من حقيقة أن أعداد نقاط النهاية تسير على التوالي. هذا أمر سيء ، IMHO. لا تفعل ذلك. ومع ذلك ، لا تفعل مثل ST سواء.
كل ما تبقى هو الذهاب إلى ملف usbd_hid.c ، وتحديدا إلى وظيفة USBD_HID_DataOut ، والتأكد من أن استدعاء معالج البيانات المستلمة يطابق أفكارك الشخصية حول الجميلة. لم أنجح أيضًا ، لذا سيكون الرمز والوصف طويلًا وغير مفهوم. أسهل للقيام بذلك بنفسك.
تقرير
كل شيء ، في هذا المكان حصلنا على جهاز مركب قادر على تبادل البيانات من خلال نقطتين ثنائي الاتجاه. عند الضربة الأخيرة ، "قمنا بإغلاق" فضول محرك HID ، واصفًا واصف التقرير هذا:
__ALIGN_BEGIN static uint8_t HID_ReportDesc2[33] __ALIGN_END = { 0x06, 0x00, 0xff,
يخبر هذا التقرير برنامج تشغيل HID: سيكون هناك حوالي 31 بايت من البيانات. لا حاجة لمعرفة ما هي - فقط أعطهم للبرنامج الذي فتح هذا الجهاز. في تقرير مادي ، ستكون البايت الصفرية مساوية لفهرس التقرير (REPORT_ID (2)). وبناءً على ذلك ، سيأتي إجمالي 32 بايت.
وأدخل البيانات المتعلقة به في usbd-hid.c ، وظيفة USBD_HID_Setup.:
usbd-hid.c switch (req->bRequest) { case USB_REQ_GET_DESCRIPTOR: if( req->wValue >> 8 == HID_REPORT_DESC) {
كذلك في البرنامج:
- تجميع محول مستوى المنطق AVC-LAN ، والاتصال باللوحة. تحليل الطبقة المادية لشبكة AVC-LAN ، أشكال الموجة الحقيقية.
- معالجة الواجهة على مستوى جهاز التحكم وإرسال حزم التقارير
- واجهة نهاية إلى نهاية والهندسة العكسية بريوس. حزمة Sniffer (أو أول تطبيق Android)
ملاحظة
- قررت كتابة مقال لأنني اضطررت (تقريبًا) ، مقتنعة أنه يجب مشاركة هذا. حتى إذا لم أنهي المشروع ، يمكن لبعض المعلومات الأخيرة أن تساعد شخصًا ما حتى بطريقة "أولية".
- نقد المشروع مرحب به ، كما أنا نفسي لا أتخيل تمامًا أنه سينجح.
- نقد المقال والتصميم والعرض - خاصة لأنه هذه هي المقالة الأولى للمورد. مع استمرار العمل ، أود أن أعبر عن أفكاري بالشكل المعتاد والقابل للهضم للقراء