ابدأ من هنا: طابق العَرَض مع السبب
العَرَض | السبب الأكثر ترجيحًا | انتقل إلى |
|---|---|---|
لا شيء يظهر عند العنوانين 0x5D أو 0x14 أثناء المسح على I2C | لا توجد تغذية للوحدة المتحكم، أو مقاومات الرفع (pull-ups) مفقودة، أو أن الشريحة محتجزة في حالة إعادة الضبط | الخطوة 1 |
تم العثور على الجهاز عند 0x14 بينما يتوقع التعريف (driver) العنوان 0x5D (أو العكس)، أو أن العنوان يتغير بين عمليات الإقلاع | مستوى طرف INT أثناء إعادة الضبط | الخطوة 2 |
تم اكتشاف الجهاز ويُقرأ معرّف المنتج بشكل صحيح، لكن لا تصل أي لمسات | سجل الحالة لم يُمسح، أو حافة المقاطعة خاطئة، أو أن طرف INT غير موصول | الخطوة 3 |
تصل اللمسات لكنها تظهر في مكان خاطئ، معكوسة أو مدوّرة | قيم الدقة في إعدادات GT911 لا تطابق الشاشة، أو تحتاج المحاور إلى التبديل | الخطوة 4 |
تفكر في كتابة كتلة إعدادات (config) جديدة | اقرأ هذا أولًا | الخطوة 5 |
اتبع الخطوات بالترتيب. عناوين السجلات والتوقيتات الواردة أدناه مأخوذة من التعريف goodix في Linux، ومكوّن esp_lcd_touch_gt911 من Espressif، ووثائق ESPHome؛ الروابط موجودة في قسم المصادر.
1. تأكد من تغذية GT911 واستجابته على ناقل I2C
التغذية ومقاومات الرفع
يحدّد ملف ربط شجرة الأجهزة (device-tree) في Linux لوحدات تحكم Goodix مصدّي تغذية: AVDD28 (تناظري) و VDDIO (خط الجهد الخاص بمنافذ المنطق). في الوحدات أو كابلات FPC عادةً ما يُغذّى كلاهما من موصل الجهاز المضيف، لذا قِسهما عند الموصل قبل الشك في البرامج الثابتة. كما يحتاج خطا SDA وSCL إلى مقاومات رفع في مكان ما على الناقل؛ وكثير من وحدات العرض لا تتضمنها.
امسح الناقل
شغّل برنامج مسح I2C أو الأمر i2cdetect. تجيب وحدة GT911 على أحد عنوانين بصيغة 7 بت:
عنوان 7 بت | بايتات الكتابة/القراءة بصيغة 8 بت (كما تورد بعض أوراق البيانات) |
|---|---|
| |
| |
تأتي أزواج الصيغة 8 بت من تعليق في كود إعادة الضبط بالتعريف في Linux. إذا ذكرت ورقة بيانات من المورّد "العنوان 0xBA"، فهو الجهاز نفسه المعنون بـ 7 بت على النحو 0x5D؛ أدخل 0x5D في Arduino وESP-IDF وLinux.
اقرأ معرّف المنتج
عناوين السجلات في GT911 تكون بصيغة 16 بت. يقرأ التعريف في Linux 6 بايتات من السجل 0x8140: أول 4 بايتات هي معرّف المنتج كنص ASCII، وآخر 2 بايت هما إصدار البرنامج الثابت (بترتيب little-endian). تُبلّغ وحدة GT911 عن السلسلة 911. إذا حصلت على 911، فالناقل والتغذية والعنوان سليمة جميعها، والمشكلة في نقطة لاحقة في هذه القائمة.
إذا لم يجب أي جهاز على أيٍّ من العنوانين، تحقق من أن خط إعادة الضبط غير محتجز على المستوى المنخفض. في كثير من الوحدات يكون الطرف RST مدخلًا إلى GT911 ويجب أن يقوده المضيف إلى المستوى العالي (أو أن يُرفع عبر مقاومة على اللوحة) قبل أن تبدأ وحدة التحكم بالعمل.
2. اضبط تسلسل إعادة الضبط واختيار العنوان بشكل صحيح
تختار وحدة GT911 عنوانها على I2C اعتمادًا على المستوى الموجود على طرف INT لحظة انتهاء إعادة الضبط. وبعبارة ملف الربط في Linux، يتم "أخذ عينة من خط INT بواسطة الجهاز عند انتهاء إشارة إعادة الضبط لاختيار عنوان العميل على I2C".
مستوى INT عندما يرتفع RST إلى المستوى العالي | عنوان I2C |
|---|---|
منخفض | |
مرتفع | |
التسلسل الذي يستخدمه مشغّل لينكس
- اجعل خط RST منخفضًا وانتظر أكثر من 10 مللي ثانية (المشغّل ينتظر 20 مللي ثانية).
- اجعل خط INT عند المستوى المقابل للعنوان المطلوب: مرتفعًا للعنوان
0x14، ومنخفضًا للعنوان0x5D. - انتظر أكثر من 100 ميكروثانية.
- اجعل خط RST مرتفعًا وانتظر أكثر من 5 مللي ثانية (المشغّل ينتظر 6–10 مللي ثانية).
- اجعل خط INT منخفضًا لمدة 50 مللي ثانية، ثم حوّل INT إلى وضع الإدخال.
إذا بقيت قيمة INT عائمة أثناء الخطوة 4، فقد يختلف العنوان من إقامة تشغيل إلى أخرى. هذه هي الحالة الكلاسيكية لتقرير "يعمل بعد الرفع (flashing) ويفشل بعد الإقلاع البارد".
ESP-IDF: esp_lcd_touch_gt911
يُعرّف مكوّن Espressif القيمة ESP_LCD_TOUCH_IO_I2C_GT911_ADDRESS بالعنوان 0x5D والقيمة ESP_LCD_TOUCH_IO_I2C_GT911_ADDRESS_BACKUP بالعنوان 0x14. ولا ينفّذ تسلسل اختيار العنوان إلا إذا تحققت الشروط الثلاثة التالية:
- أن يكون
rst_gpio_numمنفذ GPIO حقيقيًا (وليسGPIO_NUM_NC)، - أن يكون
int_gpio_numمنفذ GPIO حقيقيًا، - أن يشير
driver_dataإلى بنيةesp_lcd_touch_io_gt911_config_tتكون فيها قيمةdev_addrهي العنوان المطلوب.
وإلا فإنه يسجّل الرسالة I2C address initialization procedure skipped - using default GT9xx setup ويُجري إعادة ضبط عادية. في هذه الحالة يكون العنوان هو ما تفرضه موصيلة اللوحة، ويجب أن يتطابق عنوان I2C الخاص بواجهة panel-IO الذي تمرّره مع نتيجة الفحص (scan). الساعة الافتراضية لـ I2C في المكوّن ضمن ESP_LCD_TOUCH_IO_I2C_GT911_CONFIG() هي 100 kHz.
لوحات لا يتحكم فيها المضيف بخط INT
إذا لم يكن خط INT موصولًا بالمضيف، فلن يستطيع المضيف اختيار العنوان، لذا افحص العنوانين واستخدم العنوان الذي يستجيب. على سبيل المثال، في لوحة Sunton ESP32-8048S043C لا يكون مقاطع GT911 موصولًا بمنفذ GPIO افتراضيًا (راجع صفحة اللوحة لدينا). وتشير صفحة GT911 في ESPHome إلى أنه عندما يمر INT عبر موسّع إدخال/إخراج (IO expander)، يظل الرِجل (pin) مستخدمًا لضبط العنوان عند الإقلاع، ولكن يتم استطلاع اللمس (polling) بدلًا من الاعتماد على المقاطعات.
3. تم اكتشاف المتحكم لكن لا توجد أحداث لمس
قراءة سجل الحالة ومسحه
تبدأ بيانات اللمس عند العنوان 0x814E. البايت الأول هو بايت الحالة:
- البِت 7 (
0x80): جاهزية المخزن المؤقت. البيانات الجديدة صالحة فقط عندما تكون هذه الراية مرفوعة. - البِتات 0–3: عدد نقاط اللمس. يرفض مشغّل لينكس أي عدد يتجاوز الحد الأقصى المُعدّ.
- البِت 4: وجود مفتاح (زر) مضغوط.
كل نقطة لمس تالية تتكون من 8 بايتات: معرّف تتبّع (track ID)، ثم قيم X وY والحجم كقيم 16-بت بصيغة little-endian.
بعد القراءة، يقوم كلٌّ من مشغّل لينكس وesp_lcd_touch_gt911 بكتابة القيمة 0 إلى العنوان 0x814E. إذا كنت تكتب مشغّلك الخاص، فافعل الشيء نفسه؛ فإغفال هذه الكتابة هو سبب شائع لرؤية المشغّلات المكتوبة يدويًا لأول لمسة فقط.
مطابقة حدّ المقاطعة
نوع الزناد موجود في إعدادات GT911 نفسها: البِتات 0–1 من بايت الإعداد عند العنوان 0x804D (الإزاحة 6 من بداية الإعدادات عند 0x8047). ويربطه مشغّل لينكس على النحو التالي:
القيمة | نوع المقاطعة |
|---|---|
0 | الحدّ الصاعد |
1 | الحدّ الهابط |
2 | مستوى منخفض |
3 | مستوى مرتفع |
اضبط مقاطعة GPIO لديك بما يتناسب مع ذلك. في esp_lcd_touch_gt911، فإن levels.interrupt = 1 يحدد مقاطعة الحافة الصاعدة و0 حافة الهابطة.
لا يوجد خط INT؟ استخدم الاستقصاء
الاستقصاء (Polling) يعمل بشكل جيد تمامًا لتطبيقات واجهات HMI. يستقصي ESPHome كل 50 ms افتراضيًا (update_interval) عندما لا يُحدَّد interrupt_pin. أما تعريف Linux، عندما يتوفر لديه مقاطعة، فينتظر حتى 20 ms لتعيين بت الجهوزية قبل التخلي عن الإطار.
4. اللمس يظهر في مكان خاطئ
تحقق من الدقة المحفوظة في GT911
يُبلِّغ GT911 عن الإحداثيات وفق الدقة المكتوبة في إعداداته، وليس وفق دقة شاشة العرض لديك. وفقًا لتعريف Linux، الحد الأقصى لـ X هو القيمة 16-بت ذات الترتيب البايتي الصغير (little-endian) عند 0x8048، والحد الأقصى لـ Y عند 0x804A. اقرأ القيمتين. إذا كان المتحكم مضبوطًا على 1024×600 وشاشتك 800×480، فستظهر نقاط اللمس إلى يمين وأسفل إصبعك وتقع الحواف البعيدة خارج الشاشة. والحل هو إجراء تحجيم (أو ضبط حدود التعريف على قيم المتحكم).
من أين يأخذ كل هيكل برمجي قيم الحدود:
الهيكل البرمجي | مصدر الدقة | التبديل والانعكاس |
|---|---|---|
تعريف Linux | يقرأ من إعدادات GT911؛ ويعود إلى 4095 × 4095 عندما لا تحتوي الإعدادات على قيم | خصائص شجرة الجهاز |
ESP-IDF | القيمتان | |
ESPHome | معايرة شاشة اللمس | |
عاير انطلاقًا من القيم الخام
تقترح صفحة شاشات اللمس في ESPHome تسجيل touch.x_raw وtouch.y_raw داخل دالة lambda في on_touch، ثم لمس الزوايا عند وحدات البكسل الطرفية عدة مرات، وإدخال الحدَّين الأدنى والأقصى للقيم الخام كإعدادات معايرة. تنجح الطريقة نفسها على أي منصة: اطبع القيمتين الخامتين X وY، والمس الزوايا الأربع، ثم اربط النطاق بالشاشة.
صحّح الاتجاه بهذا الترتيب: أولًا ضع X وY على المحورين الصحيحين (swap_xy)، ثم اعكس المحور الذي يعمل بالاتجاه المعاكس (mirror_x / mirror_y). يجب أن تكون النقطة المنطقية (0, 0) للشاشة في أعلى الزاوية اليسرى.
5. إعادة كتابة إعدادات GT911: الملاذ الأخير
تبدأ كتلة الإعدادات عند 0x8047. بالنسبة إلى GT911، يتعامل معها تعريف Linux على أنها 186 بايت:
- البايت 0 (
0x8047): إصدار الإعدادات. - البايتات 1–4: دقة X وY (انظر الخطوة 4).
- البايت 5 (
0x804C): الحد الأقصى لنقاط اللمس، الأحرف الـ 4 السفلى. - البايت 6 (
0x804D): نوع إطلاق المقاطعة، البتّان السفليان. - البايت 184 (
0x80FF): المجموع الاختباري، وهو المتممة الثنائية 8-بت لمجموع البايتات 0–183. - البايت 185 (
0x8100):config_fresh، ويجب أن يكون1.
لا يكتب تعريف Linux الإعدادات بنفسه إلا إذا توفر لديه كل من GPIO الخاصين بـ INT وRST ووجد ملف firmware (الاسم الافتراضي goodix_911_cfg.bin، أو الاسم المذكور في الخاصية goodix,config-name). وبدون ذلك الملف، يستخدم الإعدادات المخزّنة أصلًا في الشريحة.
قبل أن تكتب أي شيء، اقرأ الـ 186 بايت كاملة واحفظها. صحّح الدقة والاتجاه في البرمجيات كلما استطعت. فكتلة إعدادات أُعدّت لشاشة لمس سعوية مختلفة قد توقف عمل اللمس على شاشتك، لذا احصل على الملف من مورّد الشاشة إذا كنت تحتاج فعلًا إلى تعديلها.
اختيار وحدة لمس سعوية
إذا كنت تختار شاشة CTP لتصميم جديد، فاسأل المورّد ثلاثة أسئلة قبل طلب العينات: أي متحكم لمس تستخدم، وعلى أي عنوان I2C تُشحن، وهل يصل خطا INT وRST إلى الموصل. أرسل مقاس الشاشة والواجهة والمعالج المضيف عبر «Ask an Engineer»، وسنضمّن إجابات هذه الأسئلة الثلاثة مع الوحدات التي نقترحها.
الأسئلة الشائعة
ما هو عنوان I2C الخاص بـ GT911؟
إما 0x5D أو 0x14 (7 بت). يفحص المتحكم (controller) طرف INT عند تحرير إشارة الإعادة الضبط (reset): إذا كان INT منخفضًا يتم اختيار 0x5D، وإذا كان مرتفعًا يتم اختيار 0x14. أما أوراق البيانات التي تذكر 0xBA/0xBB أو 0x28/0x29 فهي تعرض العناوين نفسها بصيغة بايتات الكتابة/القراءة ذات 8 بت.
لماذا يتغير عنوان GT911 بعد إعادة التشغيل؟
يكون طرف INT عائمًا (floating) أو يقوده مكوّن آخر عند تحرير الإعادة الضبط، فيقرأ المتحكم مستوى مختلفًا في كل مرة. اسحب INT إلى المستوى المنخفض (للحصول على 0x5D) أو المرتفع (للحصول على 0x14) قبل تحرير RST، وانتظر أكثر من 5 ms، ثم أبقِ INT منخفضًا لمدة 50 ms، وبعد ذلك اجعله دخلًا. إذا لم يتمكن المضيف (host) من التحكم في INT، فامسح العنوانين معًا ضوئيًا (scan).
لماذا أحصل على لمسة واحدة فقط من GT911؟
بعد قراءة بيانات اللمس من العنوان 0x814E، اكتب القيمة 0 إلى 0x814E. يقوم مشغل goodix في نظام Linux ومشغل esp_lcd_touch_gt911 من Espressif بذلك بعد كل عملية قراءة؛ والمشغل الذي يتجاهل هذه الخطوة يتوقف عادةً عن رصد اللمسات الجديدة.
لماذا تكون إحداثيات لمس GT911 مكبّرة أو مزاحة؟
يبلّغ GT911 عن الإحداثيات بدقة محفوظة في ملف التهيئة الخاص به (X في 0x8048 وY في 0x804A). إذا اختلفت هذه الدقة عن دقة لوحتك، فقم بتحجيم القيم أو اضبط x_max/y_max في المشغل لديك على دقة المتحكم، ثم استخدم swap_xy وmirror_x/mirror_y لضبط الاتجاه.
هل يعمل GT911 بدون طرف INT؟
نعم. استطلع (poll) سجل الحالة 0x814E بدلاً من استخدام المقاطعة (interrupt). يستطلع ESPHome كل 50 ms افتراضيًا عندما لا يتم ضبط interrupt_pin. وبدون INT لا يمكن للمضيف أيضًا اختيار العنوان، فاستخدم أيًّا من 0x5D أو 0x14 يستجيب.
هل ينبغي إعادة كتابة إعدادات GT911؟
كملاذ أخير فقط. اقرأ واحفظ أولًا كتلة التهيئة الحالية البالغة 186 بايت من العنوان 0x8047، وفضّل إصلاح الدقة والاتجاه برمجيًا، وإذا اضطررت إلى كتابة ملف تهيئة فاستخدم ملف التهيئة الخاص بمورّد لوحة اللمس. تنتهي الكتلة بمجموع تحقق (checksum) ذي 8 بت في 0x80FF وبايت config_fresh في 0x8100 يجب أن تكون قيمته 1.
المصادر
- نواة Linux: drivers/input/touchscreen/goodix.c
- نواة Linux: drivers/input/touchscreen/goodix.h (عناوين السجلات)
- نواة Linux: ربط شجرة الجهاز (device-tree) لشاشة اللمس Goodix (goodix.yaml)
- Espressif ESP-BSP: الكود المصدري لمشغل esp_lcd_touch_gt911
- Espressif ESP-BSP: ملف الترويسة (header) لـ esp_lcd_touch_gt911 (عناوين I2C)
- ESPHome: شاشة اللمس GT911
- ESPHome: مكوّنات شاشة اللمس (التحويل transform والمعايرة calibration)