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,
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,
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.
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!