تصحيح أخطاء نقل التحكم وحزمة الإعداد في USB: قراءة bmRequestType وbRequest وwValue وwIndex
إصلاح أخطاء توقف USB وتشغيل نقل التحكم. تشخيص مشكلات حزمة الإعداد باستخدام bmRequestType وbRequest وwValue وwIndex وأدلة طلب الواصف لتصحيح أخطاء البرامج الثابتة.
عمليات نقل التحكم في USB هي المحادثة الجادة الأولى بين المضيف والجهاز. التعداد يعتمد عليها. إعداد الفئة يعتمد عليها. التهيئة الخاصة بالبائع غالبًا تعتمد عليها. عندما تفشل عمليات نقل التحكم، قد يرى المستخدم فقط "الجهاز غير معروف" أو "فشل برنامج التشغيل"، لكن الدليل عادة في حزمة الإعداد.
بالنسبة لمهندسي البرامج الثابتة، فإن تعلم قراءة bmRequestType وbRequest وwValue وwIndex وwLength هي واحدة من أسرع الطرق للانتقال من التخمين إلى إصلاح دقيق.
حزمة الإعداد هي عقد الطلب
تخبر حزمة إعداد USB الجهاز بـ:
- اتجاه النقل
- نوع الطلب: قياسي، فئة، بائع، أو محجوز
- المستلم: جهاز، واجهة، نقطة نهاية، أو آخر
- رمز الطلب
- حقل القيمة
- حقل الفهرس
- طول البيانات المتوقع
إذا فككت البرامج الثابتة هذه الحقول بشكل غير صحيح، فقد تُرجع واصفًا خاطئًا، أو توقف طلبًا صالحًا، أو تقبل أمرًا غير صالح. إذا أرسل المضيف طلبًا غير متوقع، فإن الالتقاط يُظهر ذلك أيضًا.
GET_DESCRIPTOR هو أول مكان للنظر
أثناء التعداد، يرسل المضيف طلبات واصف قياسية. النمط الشائع يتضمن:
- طلب واصف الجهاز
- طلب واصف التهيئة
- طلب واصف السلسلة
- طلب واصف تقرير HID لأجهزة HID
- طلب واصف BOS على المضيفين الأحدث
في حزمة الإعداد، يحدد bRequest GET_DESCRIPTOR، بينما يتضمن wValue نوع الواصف وفهرس الواصف. قد يحدد wIndex معرّف اللغة للواصفات السلسلة أو الواجهة للواصفات الخاصة بالفئة. يخبر wLength بعدد البايتات التي يتوقعها المضيف.
عندما يكون طول استجابة الواصف خاطئًا، أو عندما تُرجع البرامج الثابتة بايتات أقل مما يحتاجه المضيف، يمكن أن يفشل التعداد لاحقًا بطريقة تبدو غير ذات صلة.
أخطاء الاتجاه مكلفة
عمليات نقل التحكم لها اتجاه. طلبات الجهاز إلى المضيف تُرجع بيانات. طلبات المضيف إلى الجهاز تحمل بيانات أو تكوّن الحالة. إذا عالجت البرامج الثابتة طلب قراءة ككتابة، أو أعادت بيانات أثناء طلب كتابة، فلن يخمن المضيف القصد بأدب.
راقب:
- اتجاه IN لكن لا توجد مرحلة بيانات
- اتجاه OUT لكن البرامج الثابتة تنتظر لإرسال البيانات
- مرحلة حالة ذات طول صفري مفقودة
- توقف على طلب قياسي صالح
- طلب فئة معالج بواسطة الواجهة الخاطئة
يجب أن يُظهر الالتقاط الطلب ومرحلة البيانات ومرحلة الحالة.
طلبات الفئة والبائع تحتاج سياق الواجهة
بعد التعداد، يرسل برامج تشغيل الفئة طلبات خاصة بالفئة. قد يرسل CDC طلبات ترميز الخط. قد يطلب HID واصفات التقرير أو تقارير الميزات. قد ترسل أدوات البائع أوامر التهيئة. يمكن أن تعني نفس قيمة bRequest أشياء مختلفة حسب نوع الطلب والمستلم.
افحص:
- نوع الطلب
- المستلم
- رقم الواجهة في
wIndex - رقم نقطة النهاية عندما يكون المستلم نقطة نهاية
- بايتات الحمولة
- الاستجابة أو التوقف
إذا كان للجهاز المركب واجهات متعددة، فإن توجيه الطلب إلى الواجهة الخاطئة هو خطأ شائع.
كيف يجب أن يساعد Bus Scope
تم بناء Bus Scope لأدلة USB. يحتاج تصحيح أخطاء نقل التحكم إلى حقول الإعداد المفكوكة والبايتات الخام معًا. أفضل عرض يسمح لمهندسي البرامج الثابتة بقراءة الحقول الدلالية مع التحقق من بايتات الحزمة الدقيقة.
يجب أن تجيب جلسة Bus Scope المفيدة لتصحيح أخطاء نقل التحكم:
- أي حزمة إعداد فشلت؟
- هل كانت قياسية أم فئة أم بائع؟
- ما الواصف أو الواجهة المطلوبة؟
- هل أعاد الجهاز الطول المتوقع؟
- هل أوقفت البرامج الثابتة عن قصد أم عن غير قصد؟
- هل اعتمدت خطوة التعداد التالية على هذه الاستجابة؟
قد توصف المشكلة بأنها "فشل نقل التحكم USB"، لكن الإصلاح عادة يعيش في حزمة إعداد من خمسة حقول.