ACPI: إضافة أجهزة بدون إعادة ترجمة Kernel

كما اتضح ، قليلون هم على علم بوجود وضع التراكب في 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, // I2C Slave Address ControllerInitiated, 400000, // Bus speed AddressingMode7Bit, "\\_SB.PCI0.I2C1", // Link to ACPI I2C host controller 0 ) }) Name (_DSD, Package () { ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), Package () { Package () { "compatible", "adi,adxl345" }, } }) } } } 


أضف 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, // I2C Slave Address ControllerInitiated, 400000, // Bus speed AddressingMode7Bit, "\\_SB.PCI0.I2C1", // Link to ACPI I2C host controller 0 ) }) Name (_DSD, Package () { ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), Package () { Package () { "size", 1024 }, Package () { "pagesize", 32 }, } }) } } } 


لاحظ الفرق مع الخيار السابق. يستخدم معرف ACPI مباشرةً ، والذي يتم تخصيصه في المساحة التي تتحكم فيها Intel ، وذلك بفضل نظام Intel Galileo. الفارق الثاني ، نقوم بتمرير معلمات الجهاز إضافية في شكل سلاسل قيمة المفتاح.

خيارات التهيئة الممكنة


ماذا تفعل الآن مع كل هذا؟ الخوارزمية بسيطة. أولاً ، تحتاج إلى ترجمة الملفات الناتجة إلى رمز ASL bytecode. يتحقق عن طريق استدعاء الأوامر

 iasl adxl345.asl 

وقياسا ل EEPROM. ثانياً ، اختر طريقة لتهيئة الجدول الذي تم إنشاؤه حديثًا. يوجد بالفعل ثلاثة منهم: 1) الانضمام إلى initramfs ، 2) التحميل على نظام العمل عبر ConfigFS ، 3) تحميل الجدول من متغير EFI. النظر في أول اثنين منهم أدناه.

الانضمام إلى initramfs

لن نفعل أي شيء مع أرشيف initramfs نفسه ، ومع ذلك ، يوصى بحفظ الأصل في مكان ما جانبا.

 #  ACPI    cpio . #      /kernel/firmware/acpi  . #       . mkdir -p kernel/firmware/acpi cp adxl345.aml kernel/firmware/acpi cp at24.aml kernel/firmware/acpi #         initramfs: find kernel | cpio -H newc --create > /boot/instrumented_initramfs-vX.Y cat /boot/initramfs-vX.Y >> /boot/instrumented_initramfs-vX.Y 

بعد هذا الإجراء ، يمكنك استبدال الأرشيف القديم بأخرى جديدة وإعادة تشغيل الكمبيوتر.
يجب أن يظهر شيء من هذا القبيل في إخراج 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 مع شاشة تعمل باللمس!

Source: https://habr.com/ru/post/ar451668/


All Articles