كما اتضح ، قليلون هم على علم بوجود وضع التراكب في ACPICA ودعمهم في Linux. أريد ملء هذه الفجوة بمثال إضافة عبيد I2C إلى النظام دون إعادة ترجمة.
الظروف الأولية
دعنا نقول عند بدء التشغيل
i2cdetect -y -r 0
لدينا الصورة التالية:
إخراج I2cdetect 0 1 2 3 4 5 6 7 8 9
00: - - - - - - - - - - - -
10: - - - - - - - - - - - - - - - -
20: - - - - - - - - - - - - - - - -
30: - - - - - - - - - - - - - - - -
40: - - - - - - - - - - - - - - - -
50: - - - 53 - - - 57 - - - - - - - -
60: - - - - - - - - - - - - - - - -
70: - - - - - - -
حيث تم الكشف عن التسارع ADXL345 في العنوان 0x53 ، ويقع رقاقة EEPROM الذاكرة 24c128 في العنوان 0x57. لا تتوفر أوصاف هذه الأجهزة في ACPI ، أي في جدول
DSDT .
إضافة ADXL345 التسارع
كل ما نحتاج إلى معرفته هنا هو العنوان الذي يستجيب به الجهاز ، ومعرفاته التي يدعمها برنامج التشغيل ، وتكرار الحافلة التي يجب أن يعمل عليها.
يرجى ملاحظة أن تردد الحافلة I2C على جانب السائق يتم ضبطه في الغالب على الحد الأدنى الذي تدعمه جميع أجهزة الرقيق على هذا الحافلة!أوه نعم ، كان هناك وقت كان فيه النظام الفرعي
IIO غير موجود ، وكان برنامج التشغيل ADXL345 موجودًا بالفعل. لذلك ، نحن نستخدم واحدة
جديدة متاحة من خلال النظام الفرعي IIO.
إجمالي،
- العنوان: 0x53
- تردد الحافلة: 400 كيلو هرتز
- رابط إلى جهاز التحكم الرئيسي: \ _SB.PCI0.I2C1
- المعرف: adi ، adxl345
تجدر الإشارة إلى أننا نستخدم معرفًا خاصًا هنا ، مخصص للأنظمة ذات
OF . كطبقة في ACPI ، تمت إضافة معرف خاص
PRP0001 ، مما يضمن التوافق مع برامج التشغيل المكتوبة مسبقًا لـ OF.
نترجم المعلومات المستلمة إلى
ASL :
ASL Code لـ ADXL345 Accelerometer DefinitionBlock ("adxl345.aml", "SSDT", 5, "", "ADXL345", 1) { External (_SB_.PCI0.I2C1, DeviceObj) Scope (\_SB.PCI0.I2C1) { Device (ACL0) { Name (_HID, "PRP0001") Name (_DDN, "Analog Devices ADXL345 3-axis accelerometer") Name (_CRS, ResourceTemplate () { I2cSerialBusV2 ( 0x0053,
أضف EEPROM 24c128
كما في الحالة السابقة ، نحصل على المعلومات اللازمة حول الجهاز وبرنامج التشغيل الخاص به:
- العنوان: 0x57
- تردد الحافلة: 400 كيلو هرتز
- رابط إلى جهاز التحكم الرئيسي: \ _SB.PCI0.I2C1
- رقم الهوية: INT3499
- الحجم: 1024
- حجم الصفحة: 32
ASL code for EEPROM 24c128 DefinitionBlock ("at24.aml", "SSDT", 5, "", "AT24", 1) { External (_SB_.PCI0.I2C1, DeviceObj) Scope (\_SB.PCI0.I2C1) { Device (EEP0) { Name (_HID, "INT3499") Name (_DDN, "Atmel AT24 compatible EEPROM") Name (_CRS, ResourceTemplate () { I2cSerialBusV2 ( 0x0057,
لاحظ الفرق مع الخيار السابق. يستخدم معرف ACPI مباشرةً ، والذي يتم تخصيصه في المساحة التي تتحكم فيها Intel ، وذلك بفضل نظام Intel Galileo. الفارق الثاني ، نقوم بتمرير معلمات الجهاز إضافية في شكل سلاسل قيمة المفتاح.
خيارات التهيئة الممكنة
ماذا تفعل الآن مع كل هذا؟ الخوارزمية بسيطة. أولاً ، تحتاج إلى ترجمة الملفات الناتجة إلى رمز ASL bytecode. يتحقق عن طريق استدعاء الأوامر
iasl adxl345.asl
وقياسا ل EEPROM. ثانياً ، اختر طريقة لتهيئة الجدول الذي تم إنشاؤه حديثًا. يوجد بالفعل ثلاثة منهم: 1) الانضمام إلى initramfs ، 2) التحميل على نظام العمل عبر ConfigFS ، 3) تحميل الجدول من متغير EFI. النظر في أول اثنين منهم أدناه.
الانضمام إلى initramfs
لن نفعل أي شيء مع أرشيف
initramfs نفسه ، ومع ذلك ، يوصى بحفظ الأصل في مكان ما جانبا.
بعد هذا الإجراء ، يمكنك استبدال الأرشيف القديم بأخرى جديدة وإعادة تشغيل الكمبيوتر.
يجب أن يظهر شيء من هذا القبيل في إخراج dmesg:
[ 0.000000] ACPI: Table Upgrade: install [SSDT- - ADXL345] [ 0.000000] ACPI: SSDT 0x000000003F4FF5C4 0000A6 (v05 ADXL345 00000001 INTL 20170303)
لاحظ أن النواة تدعم فقط سلسلة من 64 من هذه المحفوظات.
تنزيل عبر ConfigFS
تتوفر هذه الميزة عندما يتم ترجمة kernel باستخدام خيار CONFIG_ACPI_CONFIGFS ويتم تثبيت ConfigFS. على افتراض أنه مثبت في الدليل الفرعي
/ sys / kernel / config ، فإن المثال التالي يوضح كيفية تحميل جدول.
cd /sys/kernel/config/acpi/table mkdir adxl345 cat ~/adxl354.aml > adxl345/aml
استنتاج
على الرغم من أن ASL يتطلب أقواسًا أكثر من النظير ، إلا أنه لا يوفر فرصًا أقل لوصف الأجهزة. لذلك ، هناك عدد من الأمثلة في مشروع
meta-acpi ، حيث يمكنك على وجه الخصوص العثور على أوصاف
لمصابيح LED والأزرار المتصلة بخطوط GPIO وشرائح الذاكرة وحتى وصف وحدة
Adafruit 2.8 " - شاشة TFT مع شاشة تعمل باللمس!