
في إطار التحضير لمنتدى تكنولوجيا المعلومات السنوي ، ظهرت الفكرة لإنشاء معالج بسيط يتم التحكم فيه بواسطة لوحة ألعاب لاسلكية لإثبات قدرات وحدات التحكم الدقيقة وأجهزة الكمبيوتر ذات اللوحة الواحدة. في متناول اليد كان هناك وحدة تحكم TRIC ، والعديد من المحركات المؤازرة ، ومنشئ حديد ، وقبل شهر من بدء المنتدى.
"كل شيء يسير حسب الخطة" ، ولكن ليس في هذه الحالة.
المرحلة الأولى
كان TRIC على متن لينكس بمثابة تمثال نصفي لمثل هذا التلاعب ، ولكن "الشيء هو سهولة الاستخدام المعتاد والصيانة" (اقتباس ClusterM حول Linux في اتصال داخلي ذكي ).
بعد قراءة المواصفات تم اكتشاف أنه يحتوي على بلوتوث. إذا كنت تعمل مع وحدة التحكم هذه ، فأنت تعلم أن نقل البرامج يتم عبر Wi-Fi ولا توجد طرق أخرى مناسبة للتواصل معها. لا يوجد ذكر بلوتوث في القائمة. لكن كيف ذلك؟
مسلحًا بـ SSH ، مفك البراغي والفضول ، بدأت أبحث عن Bluetooth. تضمن النظام hcitool و hciconfig و bluetoothd daemon. قال جميعهم إنه لم يكن هناك.
root@trik-7dda93:~
root@trik-7dda93:~
root@trik-7dda93:~
عند الاتصال بالأصدقاء بحثًا عن وحدة USB خارجية ، واصلت البحث.
بعد تفكيك وحدة التحكم ، تم العثور على وحدة Jorjin WG7311-0A. تنص المواصفات على وجود شبكة Wi-Fi وبلوتوث وحتى راديو FM. واجهة الاتصال بالبلوتوث هي UART ، ويتم تشغيلها عبر BT_EN.

بعد قراءة كيفية توصيل وحدة Bluetooth عبر UART عبر hcitool ، جربت حظي ولا شيء. صمت اثنان من منافذ UART الثلاثة المجانية.
ولكن لدينا اتصال BT_EN! من الممكن أن يتم إيقاف تشغيل الوحدة النمطية ببساطة ولا تستجيب للطلبات. بعد فحص جهاز Linux kernel لأجهزة ARM ، تم العثور على ملف يتم فيه تسجيل جميع جهات الاتصال التي تستخدمها SoC. من خلال فتح arch/arm/mach-davinci/board-da850-trik.c
في شفرة مصدر kernel ، تم العثور بالفعل على اتصال GPIO للبلوتوث. النصر! فكرت.
static const short da850_trik_bluetooth_pins[] __initconst = { DA850_GPIO6_11, DA850_GPIO6_10, -1 };
المرحلة 2. الهجومية
لتمكين جهة اتصال من خلال GPIO ، تحتاج إلى العثور على الرقم التسلسلي من طرف إلى طرف. نجد السطر التالي في رمز النواة مع طلب لتهيئة جهة الاتصال BT_EN_33 في arch/arm/mach-davinci/board-da850-trik.c
:
ret = gpio_request_one(GPIO_TO_PIN(6, 11), GPIOF_OUT_INIT_LOW, "BT_EN_33")
يستخدم الماكرو GPIO_TO_PIN. راجع وصف الماكرو في arch/arm/mach-davinci/include/mach/gpio-davinci.h
:
#define GPIO_TO_PIN(bank, gpio) (16 * (bank) + (gpio))
باستخدامه ، يمكنك العثور على رقم الاتصال من طرف إلى طرف. نحصل على 16 * 6 + 11 = 107. الآن ننتقل إلى إدراج جهة الاتصال.
echo 1 >> /sys/devices/virtual/gpio/gpio107/value
0 أو 1 في أمر echo هي حالة جهة الاتصال.
قم بتشغيل الأمر للاتصال و ...
root@trik-7dda93:~
رسائل غير مفهومة لنا (في الوقت الحالي). نحاول تكوين الجهاز من خلال hcitool:
root@trik-7dda93:~
لا توجد أجهزة ، على الرغم من أن التهيئة مرت بنجاح. نحاول الاتصال مرة ثانية ، ولكن باستخدام نوع مختلف من المحولات:
root@trik-7dda93:~
ومرة أخرى ، لا شيء. دعنا نعود إلى الخطأ الأول ونطبق معرفة اللغة الإنجليزية:
Warning: cannot find BTS file: /lib/firmware/TIInit_7.6.15.bts
نفتح المجلد / lib / البرامج الثابتة مع البرامج الثابتة ولا نجد الملف الذي نحتاجه. بعد بحث طويل على الإنترنت ، نجد الملف المطلوب في مستودع TI ونقوم بتنزيله. رفضت إصدارات أخرى من نفس الملف للعمل.
curl -k https://git.ti.com/wilink8-bt/ti-bt-firmware/blobs/raw/45897a170bc30afb841b1491642e774f0c89b584/TIInit_7.6.15.bts > TIInit_7.6.15.bts cp TIInit_7.6.15.bts /lib/firmware/TIInit_7.6.15.bts
نعيد تشغيل وحدة التحكم ونعيد الاتصال:
root@trik-7dda93:~
مرحى! تم تمهيد البرامج الثابتة. التحقق من hciconfig:
root@trik-7dda93:~
نبدأ خدمة bluetoothd ونبحث عن الأجهزة ونكتشف وحدتنا:
root@trik-7dda93:~
يعثر بحث الكمبيوتر على جهاز:

لتمكين Bluetooth ، يمكنك إنشاء برنامج نصي:
وإضافته إلى التشغيل التلقائي:
cp init-bluetooth /etc/init.d/init-bluetooth update-rc.d init-bluetooth enable 99
تتصرف إعادة التشغيل وإيقاف تشغيل الوحدة النمطية بشكل غير متوقع ، وبالتالي لا تحتوي خيارات الإيقاف وإعادة التشغيل على أوامر.
المرحلة 3. فحص الاتصالات
إن أسهل طريقة للتحقق من الاتصال في كلا الاتجاهين هي خدمة منفذ COM. مع بعض الأوامر ، قم بتشغيله:
root@trik-7dda93:~
نحن نتصل من الهاتف ونرى دعوة لدخول النظام:

لم يُسمح لأي من المحطات المختبرة بإدخال كلمة مرور فارغة للمستخدم ، لذلك كان عليّ إرسال معلومات تسجيل الدخول باستخدام إعادة توجيه مؤشر الترابط في جلسة SSH.
باتباع الإرشادات الخاصة بتوصيل لوحة الألعاب بنظام Linux ، نواجه المشكلات التالية:
- BlueZ في التوزيع قديم ولا يفهم الأوامر من برنامج sixad ، والذي ينشئ اتصالاً بلوحة الألعاب
- يرفض إصدار BlueZ الجديد من المصدر التجميع بسبب العديد من التبعيات
- يتطلب BlueZ لـ Debian الجديد udev و systemd ، وهي مفقودة من التوزيع الحالي
التبعية الوحيدة التي كانت قادرة على تلبية ذلك كانت وحدة نواة uinput.
للقيام بذلك:
- الحصول على تكوين النواة الحالية على الجهاز
cp /proc/config.gz config.gz gunzip config.gz
- تحميل كود النواة
- تنزيل وتثبيت سلسلة الأدوات
- انسخ تهيئة kernel إلى المجلد الذي يحتوي على رمز kernel
- إضافة وحدة uinput إلى التكوين
echo "CONFIG_INPUT_UINPUT=m" >> config
- بدء التجميع عن طريق تشغيل سلسلة الأدوات أولاً
source /opt/trik-sdk/environment-setup-arm926ejste-oe-linux-gnueabi make
- انسخ وحدات النواة إلى بطاقة الذاكرة
make INSTALL_MOD_PATH=/mnt/trik-sd modules_install
- بناء صورة uBoot ونسخها إلى / التمهيد
make uImage cp arch/arm/boot/uImage /mnt/trik-sd/boot/uImage-3.6.7
الآن لا يقسم البرنامج على عدم وجود وحدة kernel ، ولكن بعد ذلك لا يمكننا فعل أي شيء. ستكون تعليمات لوحة الألعاب مفيدة في وقت لاحق.
المرحلة 5. طهي عصيدة من الفأس
للوصول إلى خطة "tyap-blooper". نظرًا لعدم وجود طريقة ملائمة لوضع البرامج اللازمة على التوزيع الأصلي ، سنضع شيئًا شائعًا. يحتوي المعالج على بنية ARMv5TE ، مما يعني أن هناك توزيعات له.
نحن نحاول فك حزم وتشغيل Arch Arch العالمي لـ ARM وعند التحميل في وحدة التحكم ، نرى أن systemd يتطلب إصدارًا أحدثًا من kernel ، وليس لدينا. محاولات نقل نواة 4.16 باءت بالفشل واستغرقت الكثير من الوقت.
ننتقل إلى خيار آخر - دبيان. توجد صورة قرص مع نظام مثبت لـ ARM ، ولكن من الأفضل وضع نظام نظيف مع الحزم والإعدادات اللازمة لنا.
التثبيت في QEMU
قم بتنزيل صورة التثبيت (رابط إلى .iso ) وقم بتثبيت QEMU.
نحتاج أيضًا إلى صورة kernel و initrd لبدء التثبيت ، والذي يمكن تنزيله من هنا .
قم بإنشاء صورة لبطاقة ذاكرة بحجم بطاقة ذاكرة حقيقية (في هذه الحالة 4 جيجا بايت):
qemu-img create -f raw debian.img 4G
نبدأ التثبيت:
qemu-system-arm -M versatilepb -kernel vmlinuz-3.2.0-4-versatile -initrd initrd.gz -hda debian.img -cdrom debian-7.11.0-armel-CD-1.iso
إذا كنت ستقوم بعمل تخطيط قرص لتوزيع أصلي نسبي غير قياسي ، فاترك قسم الجذر أولاً ، وإلا سيتعين عليك تغيير معلمات تمهيد kernel في uBoot. يوجد رقم القسم الذي يوجد عليه نظام الملفات الجذر.
يحتوي الترميز القياسي على:
- قسم EXT4 لنظام ملفات الجذر 1.3 GB
- قسم FAT32 لتخزين بيانات المستخدم ≈ 500 ميجابايت في الحجم
إخراج fdisk لصورة التوزيع الأصلي:
Disk: trik-distro.img geometry: 893/64/63 [3604478 sectors] Signature: 0xAA55 Starting Ending
بعد وضع المعايير ، نترك لشرب بضعة أكواب من الشاي ، لأنه المحاكي ليس أسرع بكثير من معالج ARM حقيقي.
لبدء النظام المثبت ، تحتاج إلى صورة initrd أخرى ، يمكن التقاطها من هنا .
نبدأ النظام:
qemu-system-arm -M versatilepb -kernel vmlinuz-3.2.0-4-versatile -initrd initrd.img-3.2.0-4-versatile -hda debian.img -append "root=/dev/sda1"
إعداد النظام
بعد البدء ، ندخل المستخدم الفائق ، ونتحقق من الاتصال بالإنترنت ، ونحدث المستودعات والنظام ، ونضع الحد الأدنى لمجموعة البرامج:
apt-get update apt-get upgrade apt-get install curl git mc htop joystick
المحطات
نقوم بتحرير /etc/inittab
، وإزالة المحطات غير الضرورية ، وتشغيل UART الذي نحتاجه لنا وإضافة الإدخال التلقائي للمستخدم المناسب (استخدم الجذر فقط عند التصحيح). الإدخال التلقائي مفيد إذا كنت تخطط لتشغيل shell للتحكم في وحدة التحكم.
1:2345:respawn:/sbin/getty 38400 tty1 --autologin root
بلوتوث وواي فاي
قم بتثبيت bluez-utils و wpasupplicant للوصول إلى Wi-Fi و Bluetooth.
apt-get install bluez-utils wpasupplicant
نقوم بتعطيل واجهة eth0 وتكوين واجهة wlan1 في /etc/network/interfaces
:
# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8) # The loopback interface auto lo iface lo inet loopback # Wireless interfaces auto wlan1 iface wlan1 inet dhcp wireless_mode managed wireless_essid any wpa-driver wext wpa-conf /etc/wpa_supplicant.conf
أضف الشبكة مسبقًا إلى /etc/wpa_supplicant.conf
، لأنه القيام بذلك على وحدة التحكم نفسها ليس مناسبًا:
wpa_passphrase ssid password >> /etc/wpa_supplicant.conf
إذا لم يكن لديك وصول Wi-Fi ، يمكنك استخدام UART لمزيد من التكوين ، ولكن ضع في اعتبارك أن النواة تعرض بشكل افتراضي جميع الأخطاء لهذا الجهاز الطرفي. لذلك ، أثناء العملية ، قد تقاطعك رسالة مفاجئة من النواة أو الخدمة.
أضف برنامج نصي لتمكين Bluetooth. هذه المرة ، قم بتعديل /etc/init.d/bluetooth
:
139: case $1 in start) echo 1 >> /sys/devices/virtual/gpio/gpio107/value 168: hciattach /dev/ttyS0 texas log_end_msg 0 ;;
وبالتالي ، ستقوم جميع الخدمات التي تتطلب خدمة Bluetooth بتشغيل الأوامر اللازمة للتهيئة.
اسحب لليمين ، اسحب لليمين
نزيل البرامج والخدمات غير الضرورية التي يمكن عرضها باستخدام htop ، لأنها تحتل مكانًا ثمينًا في ذاكرة الوصول العشوائي:

في هذه الحالة ، تحتوي خدمة ConsoleKit على الكثير من العمليات . انقل ملف هذه الخدمة إلى المجلد الجذر في حالة الاسترداد:
mv /usr/share/dbus-1/system-services/org.freedesktop.ConsoleKit.service /root/
قبل إغلاق الخدمة ، كان استهلاك ذاكرة الوصول العشوائي 19 ميجا بايت ، وبعد - 16 ميجا بايت.
أقسام النظام
على الرغم من أن uBoot ينقل إلى kernel الجهاز الذي يوجد عليه قسم الجذر ، فإنه يستحق كتابته في /etc/fstab
أجل الموثوقية. نغير السطر الأول المسؤول عن قسم الجذر:
/dev/mmcblk0p1 / auto defaults 1 1 proc /proc proc defaults 0 0 devpts /dev/pts devpts mode=0620,gid=5 0 0 usbdevfs /proc/bus/usb usbdevfs noauto 0 0 tmpfs /run tmpfs mode=0755,nodev,nosuid,strictatime 0 0 tmpfs /var/volatile tmpfs defaults 0 0
إذا لم تجعل القسم الجذر هو الأول ، فلا تنس تحديد رقم القسم المطلوب.
إذا تركت قسم FAT الثاني لبيانات المستخدم ، فأنت بحاجة إلى إنشاء مجلد لتركيب القسم فيه
mkdir /usr/share/trik
واكتب القسم في /etc/fstab
:
/dev/mmcblk0p2 /usr/share/trik vfat defaults 0 0
المرحلة 6. نحاول عصيدة لدينا
بعد تكوين صورة النظام ، يجب تركيبها لتثبيت وحدات النواة والنواة نفسها:
حيث ، NNNN = حجم القطاع * بداية القسم. الحجم الافتراضي للقطاع هو 512 بايت.
نقوم أيضًا بتوزيع التوزيع الأصلي:
fdisk -l trik-distro.img mount -o loop,offset=NNNN trik-distro.img /mnt/trik-clean
نزيل نواة QEMU ووحداته ، مثل ليست مخصصة لمنصتنا. نقوم بنسخ النواة والوحدات الجديدة ، تمامًا كما هو الحال في التوزيع الأصلي.
rm -rf /mnt/debian/boot/ rm -rf /mnt/debian/lib/modules/3.2.0-4-versatile rm -rf /mnt/debian/lib/modules/3.2.0-5-versatile mkdir /mnt/debian/boot/ cp arch/arm/boot/uImage /mnt/debian/boot/ make INSTALL_MOD_PATH=/mnt/debian modules_install
سنحتاج إلى برامج ثابتة لوحدة Wi-Fi ، والتي هي في التوزيع الأصلي في مجلد / lib / البرامج الثابتة وبرنامج Bluetooth الثابت الذي اكتشفناه سابقًا.
cp /mnt/trik-clean/lib/firmware/* /mnt/debian/lib/firmware/ cp TIInit_7.6.15.bts /mnt/debian/lib/firmware/
فصل صور القرص:
umount /mnt/trik-clean umount /mnt/debian
وابدأ نسخ الصورة إلى بطاقة الذاكرة باستخدام dd:
# ( ) lsblk dd if=debian.img of=/dev/sdX bs=4M
المرحلة 7. خط النهاية
نقوم بتجميع برامج توصيل لوحة الألعاب على النظام الجديد وتثبيت برنامج sixad.
نقوم بتوصيل لوحة الألعاب عبر USB بوحدة التحكم وتشغيل البرنامج لإنشاء زوج:
root@trik:~/bt
عندما يتم توصيل لوحة الألعاب ، لا يحدث شيء وتكون خدمة sixad صامتة:
sixad-bin[2675]: started sixad-bin[2675]: sixad started, press the PS button now sixad-bin[2675]: unable to connect to sdp session
لكن مجتمع Raspberry Pi قام بالفعل بعمل "عكاز" لإصلاح الاتصال .
نعيد بناء البرنامج ونفرح.
sixad-bin[2833]: started sixad-bin[2833]: sixad started, press the PS button now sixad-bin[2833]: unable to connect to sdp session sixad-sixaxis[2836]: started sixad-sixaxis[2836]: Connected 'PLAYSTATION(R)3 Controller (00:**:**:**:**:09)' [Battery 02]
الآن لوحة الألعاب متاحة للنظام كجهاز إدخال ، وسيظهر البرنامج jstest حالة جميع الأزرار وأجهزة الاستشعار التناظرية:
root@trik:~# ls /dev/input/ by-path event0 event1 event2 event3 js0 js1 js2 mice root@trik:~# jstest --normal /dev/input/jsX Driver version is 2.1.0. Joystick (PLAYSTATION(R)3 Controller (00:**:**:**:**:09)) has 29 axes (X, Y, Z, Rx, Ry, Rz, Throttle, Rudder, Wheel, Gas, Brake, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, (null), (null), (null), (null), (null), (null), (null), (null)) and 17 buttons (Trigger, ThumbBtn, ThumbBtn2, TopBtn, TopBtn2, PinkieBtn, BaseBtn, BaseBtn2, BaseBtn3, BaseBtn4, BaseBtn5, BaseBtn6, BtnDead, BtnA, BtnB, BtnC, BtnX). Testing ... (interrupt to exit) Axes: 0: 0 1: 0 2: 0 3: 0 4: -7150 5: -7746 6:-32767 7: 0 8: 0 9: 0 10: 0 11: 0 12: 0 13: 0 14: 0 15: 0 16: 0 17: 0 18: 0 19: 0 20: 0 21: 0 22: 0 23: 0 24: 0 25: 0 26: 0 27: 0 28: 0 Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 10:off 11:off 12:off 13:off 14:off 15:off 16:off
حيث X هو رقم الجهاز في النظام ، افتراضيًا - 2. يمكن عرض عدد الأزرار والمحاور هنا .
استخدم في الممارسة
فيديو يظهر لوحة اللعب على يوتيوب .
روابط مفيدة
برامج لتوصيل لوحة الألعاب Dualshock 3 - sixpair و sixad .
بالنسبة لأجهزة الألعاب وأجهزة الإدخال الأخرى ، توجد مكتبة C خفيفة الوزن - libenjoy .
الكود المصدري لبرنامج التحكم في المحركات المؤازرة والمحركات هو مستودع GitHub .
جميع ملفات التكوين من المقالة الخاصة بعدة توزيع مؤقتة هي مستودع GitHub .
مصدر النواة هو مستودع جيثب .
حقائق مثيرة للاهتمام حول وحدة التحكم
- تنص المواصفات على أن ذاكرة الوصول العشوائي 256 ميجا بايت. ولكن إذا قمت بتشغيل htop ، فسترى أنه يتوفر فقط 128 ميغابايت. هذا محدود بخيارات النواة التي يمكن عرضها في وحدة تحكم uBoot:
mem=128M console=ttyS1,115200n8 rw noinitrd rootwait root=/dev/mmcblk0p1 vt.global_cursor_default=0 consoleblank=0
يتم تمييز رقاقة الذاكرة 3PC22 D9MTD المصنعة بواسطة Micron. لم يكن من الممكن العثور على معلومات حول حجمه الحالي.
- يتم تخزين uBoot على ذاكرة فلاش SPI التي تكون فيها النواة سلكية أيضًا ، ولا يتم استخدامها. يمكنك محاولة استخدام هذا المكان لمهامك أو نسخ نواة جديدة وإعادة تكوين uBoot بحيث يستخدمه.
عناوين الصور من dmesg:
[ 11.598170] 0x000000000000-0x000000040000 : "uboot" [ 11.642985] 0x000000040000-0x000000080000 : "uboot-env1" [ 11.706256] 0x000000080000-0x0000000c0000 : "uboot-env2" [ 11.761827] 0x0000000c0000-0x000000100000 : "config-periph" [ 11.805129] 0x000000100000-0x000000400000 : "kernel" [ 11.861864] 0x000000400000-0x000001000000 : "RootFS"
- تحتوي شاشة وحدة التحكم ، على الرغم من صغرها ، على مستشعر مقاوم. ما إذا كان المستشعر نفسه متصلًا غير معروف.
- يحتوي Dualshock 3 على مصابيح LED في موصل USB تُظهر عدد لوحة الألعاب / عصا التحكم. هناك لوحة ألعاب واحدة في الفيديو ، لكن رقمها هو 3. هذا ليس خطأ ، لأنه هناك نوعان آخران من "عصا التحكم" في النظام: مقياس التسارع والجيروسكوب.
واجهت مشاكل أثناء الاستخدام
- يتوقف الروبوت في بعض الأحيان بشدة ، دون إيقاف تشغيل المحركات المؤازرة ، مما يسمح لهم بتغيير موقفهم من الضوضاء على خط البيانات. وقد شوهد هذا حتى على التوزيع القياسي .
- إدراج وحدات تحكم PWM يختلف عما هو مكتوب في الوثائق . على الأقل في نقية C هذا لم ينجح.
- يتوقف USB أحيانًا عن العمل على دبيان.