ACPI: Menambahkan Perangkat Tanpa Kompilasi Kernel

Ternyata, sangat sedikit yang menyadari keberadaan mode overlay di ACPICA dan dukungan mereka di Linux. Saya ingin mengisi celah ini dengan contoh menambahkan budak I2C ke sistem tanpa kompilasi ulang.

Kondisi awal


Katakanlah saat startup

i2cdetect -y -r 0 

kami memiliki gambar berikut:

I2cdetect output
      0 1 2 3 4 5 6 7 8 9 abcdef
 00: - - - - - - - - - - - - 
 10: - - - - - - - - - - - - - - - - 
 20: - - - - - - - - - - - - - - - - 
 30: - - - - - - - - - - - - - - - - 
 40: - - - - - - - - - - - - - - - - 
 50: - - - 53 - - - 57 - - - - - - - - 
 60: - - - - - - - - - - - - - - - - 
 70: - - - - - - -                         


di mana accelerometer ADXL345 terdeteksi pada alamat 0x53, dan chip EEPROM memori 24c128 terletak di alamat 0x57. Deskripsi perangkat ini tidak tersedia di ACPI, yaitu di tabel DSDT .

Tambahkan ADXL345 Accelerometer


Yang perlu kita ketahui di sini adalah alamat di mana perangkat merespons, ID-nya didukung oleh pengemudi, frekuensi bus di mana ia harus bekerja. Harap dicatat bahwa frekuensi bus I2C di sisi pengemudi sering diatur ke minimum yang didukung oleh semua perangkat pendukung di bus ini!

Oh ya, ada waktu ketika subsistem IIO tidak ada, dan driver ADXL345 sudah ada. Jadi, kami menggunakan yang baru yang tersedia melalui subsistem IIO.

Total

  • Alamat: 0x53
  • Frekuensi Bus: 400kHz
  • Tautan ke perangkat master (pengontrol): \ _SB.PCI0.I2C1
  • ID: adi, adxl345

Perlu dicatat bahwa kami menggunakan pengidentifikasi khusus di sini, yang dimaksudkan untuk sistem dengan OF . Sebagai lapisan dalam ACPI, PRP0001 pengidentifikasi khusus telah ditambahkan, yang memastikan kompatibilitas dengan driver yang ditulis sebelumnya untuk OF.

Kami menerjemahkan informasi yang diterima ke ASL :

Kode ASL untuk Accelerometer ADXL345
 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" }, } }) } } } 


Tambahkan EEPROM 24c128


Seperti pada kasus sebelumnya, kami memperoleh informasi yang diperlukan tentang perangkat dan drivernya:

  • Alamat: 0x57
  • Frekuensi Bus: 400kHz
  • Tautan ke perangkat master (pengontrol): \ _SB.PCI0.I2C1
  • Nomor ID: INT3499
  • Volume: 1024
  • Ukuran Halaman: 32

Kode ASL untuk 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 }, } }) } } } 


Perhatikan perbedaannya dengan opsi sebelumnya. Ia menggunakan ID ACPI secara langsung, yang dialokasikan di ruang yang dikendalikan oleh Intel, berkat platform Intel Galileo. Perbedaan kedua, kami melewati parameter perangkat tambahan dalam bentuk string nilai kunci.

Opsi inisialisasi yang mungkin


Apa yang harus dilakukan sekarang dengan semua ini? Algoritma itu sederhana. Pertama, Anda perlu mengkompilasi file yang dihasilkan ke dalam bytecode ASL. Dicapai dengan memanggil perintah

 iasl adxl345.asl 

dan dengan analogi untuk EEPROM. Kedua, pilih cara untuk menginisialisasi tabel yang baru dibuat. Sebenarnya ada tiga dari mereka: 1) bergabung dengan initramfs, 2) memuat pada sistem kerja melalui ConfigFS, 3) memuat tabel dari variabel EFI. Pertimbangkan dua yang pertama di bawah ini.

Bergabung dengan initramfs

Kami tidak akan melakukan apa pun dengan arsip initramfs itu sendiri , namun, sebaiknya simpan yang asli di samping.

 #  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 

Setelah prosedur ini, Anda dapat mengganti arsip lama dengan yang baru dan me-restart komputer.
Sesuatu seperti ini akan muncul di output dmesg:

 [ 0.000000] ACPI: Table Upgrade: install [SSDT- - ADXL345] [ 0.000000] ACPI: SSDT 0x000000003F4FF5C4 0000A6 (v05 ADXL345 00000001 INTL 20170303) 

Perhatikan bahwa kernel hanya mendukung rantai hingga 64 arsip tersebut.

Unduh melalui ConfigFS

Fitur ini tersedia ketika kernel dikompilasi dengan opsi CONFIG_ACPI_CONFIGFS dan ConfigFS di-mount. Dengan asumsi ia sudah terpasang di subdirektori / sys / kernel / config , contoh berikut ini menunjukkan cara memuat tabel.

 cd /sys/kernel/config/acpi/table mkdir adxl345 cat ~/adxl354.aml > adxl345/aml 

Kesimpulan


Meskipun ASL membutuhkan lebih banyak tanda kurung daripada analog, namun demikian memberikan peluang yang tidak kalah untuk menggambarkan perangkat. Jadi, ada sejumlah contoh dalam proyek meta-acpi , di mana Anda khususnya dapat menemukan deskripsi LED dan tombol yang terhubung ke jalur GPIO, chip memori, dan bahkan deskripsi modul Adafruit 2.8 " - layar TFT dengan layar sentuh!

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


All Articles