Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Sirkuit terintegrasi System on a Chip (SoC) memanfaatkan pin I/O (GPIO) tujuan umum secara ekstensif. Untuk platform berbasis SoC, Windows mendefinisikan abstraksi umum untuk perangkat keras GPIO, dan abstraksi ini memerlukan dukungan dari namespace Advanced Configuration dan Power Interface (ACPI).
Abstraksi GPIO didukung oleh definisi Spesifikasi ACPI 5.0 yang tercantum dalam artikel ini.
Untuk memverifikasi bahwa pengontrol GPIO Anda memenuhi semua persyaratan platform Windows, lihat Daftar Periksa Persyaratan Pengontrol GPIO.
Perangkat pengontrol GPIO
Windows mendukung pengontrol GPIO. Pengontrol GPIO menyediakan berbagai fungsi untuk perangkat periferal, termasuk gangguan, sinyal input, dan sinyal output. Kemampuan GPIO dimodelkan sebagai perangkat pengontrol GPIO di namespace layanan. Ekstensi kerangka kerja GPIO (GpioClx) memodelkan perangkat pengontrol GPIO sebagai dipartisi ke dalam beberapa bank pin. Setiap pin bank memiliki 64 atau lebih sedikit pin yang dapat dikonfigurasi. Bank dalam pengontrol GPIO diurutkan relatif terhadap posisi pin mereka dalam ruang pin GPIO relatif pengontrol. Misalnya, bank 0 berisi pin 0-31 pada pengontrol, bank 1 berisi pin 32-63, dan sebagainya. Semua bank memiliki jumlah pin yang sama, kecuali untuk bank terakhir, yang mungkin memiliki lebih sedikit. Bank signifikan untuk firmware ACPI karena firmware harus melaporkan pemetaan sumber daya interupsi sistem kepada bank, seperti yang dijelaskan dalam bagian objek namespace GPIO di bawah ini.
Setiap pin pada bank memiliki sekumpulan parameter (misalnya, output, gangguan sensitif tingkat, input yang tidak terpental, dan sebagainya) yang menjelaskan bagaimana pin akan dikonfigurasi.
Pengontrol GPIO dan interupsi ActiveBoth
Fitur dari beberapa pengontrol GPIO adalah kemampuan untuk menghasilkan gangguan pada kedua tepi sinyal (naik, atau tepi ActiveHigh, dan jatuh, atau tepi ActiveLow). Ini berguna dalam berbagai aplikasi, termasuk antarmuka tombol, di mana peristiwa tekan tombol (satu tepi) dan peristiwa pelepas tombol (tepi yang berlawanan) bermakna. Fitur ini disebut sebagai "ActiveBoth".
Secara logis, sinyal ActiveBoth memiliki status yang ditegaskan dan tidak ditegaskan, apakah itu pernyataan sesaat (misalnya, tombol dorong), atau pernyataan yang sangat panjang (misalnya, penyisipan jack headphone). Deteksi Edge untuk interupsi ActiveBoth dapat diimplementasikan di perangkat keras pengontrol GPIO (ActiveBoth perangkat keras), atau ditiru dalam perangkat lunak driver GPIO (meniru ActiveBoth). Windows mengharuskan pengontrol GPIO yang menerapkan ActiveBoth harus menggunakan ActiveBoth yang ditimulasikan. Ini diperlukan untuk memastikan penanganan interupsi bermata ganda yang kuat untuk semua skenario. Untuk mendukung emulasi ActiveBoth, persyaratan perangkat keras berikut berlaku:
Pengontrol GPIO yang mendukung gangguan ActiveBoth harus mendukung gangguan mode tingkat, dan harus mendukung pemrograman ulang polaritas gangguan secara dinamis pada runtime.
Untuk meminimalkan risiko kesalahan I/O, Windows lebih memilih penggunaan pengontrol GPIO yang dipetakan memori alih-alih pengontrol GPIO yang terhubung dengan SPB. Bahkan, untuk perangkat Windows Button Array (PNP0C40), diperlukan bahwa GPIO ActiveBoth mengganggu perangkat ini terhubung ke pengontrol GPIO yang dipetakan memori, dan bukan ke pengontrol GPIO yang terhubung dengan SPB. Untuk menentukan gangguan tombol mana yang harus ActiveBoth, lihat bagian Perangkat tombol di topik Objek namespace ACPI lainnya .
Untuk menetapkan status awal deterministik untuk sinyal interupsi ActiveBoth, tumpukan perangkat GPIO Windows menjamin bahwa gangguan pertama yang dihasilkan setelah koneksi gangguan oleh driver akan selalu untuk status sinyal yang ditegaskan. Tumpukan selanjutnya mengasumsikan bahwa status yang dinyatakan dari semua baris interupsi ActiveBoth adalah tingkat logika rendah (tepi ActiveLow) secara default. Jika ini tidak terjadi pada platform Anda, Anda dapat mengambil alih default dengan menyertakan pengontrol GPIO Device-Specific Method (_DSM) di namespace pengontrol. Untuk informasi selengkapnya tentang metode ini, lihat GPIO Controller Device-Specific Method (_DSM).
Persyaratan ketiga dalam daftar sebelumnya menyiratkan bahwa driver untuk perangkat yang menggunakan ActiveBoth mungkin menerima gangguan segera setelah menginisialisasi (menyambungkan ke) interupsi, jika sinyal pada pin GPIO dalam keadaan tegas pada saat itu. Ini dimungkinkan, dan bahkan mungkin untuk beberapa perangkat (misalnya, headphone), dan harus didukung di driver.
Untuk mendukung ActiveBoth yang ditiru, driver pengontrol GPIO harus mengaktifkan ("ikut serta") emulasi ActiveBoth dengan menerapkan fungsi panggilan balik CLIENT_ReconfigureInterrupt , dan dengan mengatur bendera EmulateActiveBoth dalam struktur informasi dasar yang disediakan fungsi panggilan balik CLIENT_QueryControllerBasicInformation driver ke GpioClx. Untuk informasi selengkapnya, lihat Driver I/O Tujuan Umum (GPIO).
Objek namespace GPIO
Pengontrol GPIO, dan periferal yang terhubung ke sana, dijumlahkan oleh ACPI. Koneksi di antara mereka dijelaskan menggunakan Deskriptor Sumber Daya Koneksi GPIO. Untuk informasi selengkapnya, lihat bagian 6.4.3.8, "Deskriptor Koneksi", dari spesifikasi ACPI 5.0.
Identifikasi perangkat dan objek konfigurasi
Namespace ACPI perangkat pengontrol GPIO mencakup hal-hal berikut:
- Objek ID Perangkat Keras (_HID) yang mematuhi ACPI yang ditetapkan vendor.
- Sekumpulan sumber daya yang digunakan (_CRS) objek.
- Objek ID Unik (_UID), jika ada lebih dari satu instans pengontrol GPIO di namespace layanan (yaitu, dua atau lebih simpul namespace layanan yang memiliki objek identifikasi perangkat yang sama).
_CRS pengontrol GPIO berisi semua sumber daya (ruang alamat untuk register, gangguan sistem, dan sebagainya) yang dikonsumsi oleh semua bank di pengontrol GPIO. Pemetaan sumber daya-ke-bank yang mengganggu diwakili dalam urutan sumber daya interupsi tercantum dalam _CRS—yaitu, interupsi pertama yang tercantum ditetapkan ke bank 0, yang berikutnya tercantum ditetapkan ke bank 1, dan sebagainya. Bank dapat berbagi sumber daya interupsi, dalam hal ini interupsi tercantum sekali untuk setiap bank yang terhubung ke dalamnya, dalam urutan bank, dan dikonfigurasi sebagai Bersama.
Deskriptor sumber daya koneksi GPIO
Hubungan antara periferal dan pin GPIO tempat mereka terhubung dijelaskan ke sistem operasi oleh deskriptor sumber daya koneksi GPIO. Deskriptor sumber daya ini dapat menentukan dua jenis Koneksi GPIO: Koneksi interupsi GPIO dan koneksi I/O GPIO. Periferal mencakup deskriptor koneksi GPIO dalam _CRS mereka untuk semua I/O GPIO dan pin interupsi yang terhubung. Jika gangguan yang terhubung dapat dibangunkan (mampu membangunkan sistem dari status diam berdaya rendah), maka itu harus dikonfigurasi sebagai ExclusiveAndWake atau SharedAndWake. Untuk informasi selengkapnya, lihat Manajemen Daya Perangkat.
Deskriptor didefinisikan dalam bagian 6.4.3.8.1, "Deskriptor Koneksi GPIO", dari spesifikasi ACPI 5.0. Makro Templat Sumber Daya ASL untuk deskriptor ini dijelaskan dalam bagian 19.5.53, "GpioInt (GPIO Interupsi Connection Resource Descriptor Macro)", dari spesifikasi ACPI 5.0.
Peristiwa ACPI bersinyali GPIO
ACPI mendefinisikan model peristiwa platform yang memungkinkan peristiwa perangkat keras di platform untuk disinyalkan dan dikomunikasikan ke driver ACPI. Windows menyediakan layanan pemberitahuan untuk mengomunikasikan peristiwa platform ke driver perangkat. Sejumlah driver kotak masuk mengandalkan layanan ini untuk memberikan dukungan untuk perangkat yang ditentukan ACPI, seperti Tombol Daya Metode Kontrol, perangkat LID, Baterai Metode Kontrol, Zona Termal, dan sebagainya. Untuk informasi selengkapnya tentang pemberitahuan, lihat bagian 5.6.5, "Peristiwa ACPI yang Diberi Sinyal GPIO", dari spesifikasi ACPI.
Untuk platform SoC, gangguan GPIO digunakan untuk memberi sinyal peristiwa platform. Perangkat namespace layanan apa pun (perangkat "Sumber Peristiwa ACPI") yang memberi sinyal peristiwa ke drivernya menggunakan operator Pemberitahuan ASL memerlukan hal berikut:
Simpul namespace pengontrol GPIO tempat sinyal peristiwa ACPI terhubung harus menyertakan sumber daya GpioInt untuk pin tersebut dalam objek Informasi Peristiwa ACPI (_AEI) (lihat bagian 2.4.2.3.1, "Objek Informasi Peristiwa ACPI (_AEI) ", di bawah). Sumber daya GpioInt harus dikonfigurasi sebagai non-bersama (Eksklusif).
Simpul pengontrol juga harus berisi metode kontrol Edge (_Exx), Level (_Lxx) atau Peristiwa (_EVT) untuk setiap pin yang tercantum dalam objek _AEI.
Driver ACPI menangani GPIO yang tercantum mengganggu dan mengevaluasi metode kontrol Edge, Level, atau Event untuk itu. Metode kontrol menghentikan peristiwa perangkat keras, jika perlu, dan menjalankan operator Pemberitahuan yang diperlukan pada simpul namespace perangkat sumber peristiwa. Windows kemudian mengirim pemberitahuan ke pengandar perangkat. Beberapa peristiwa dapat diberi sinyal melalui sumber daya GpioInt yang sama jika metode kontrol peristiwa dapat meminta perangkat keras untuk menentukan peristiwa mana yang terjadi. Metode ini kemudian harus memberi tahu perangkat yang benar dengan kode pemberitahuan yang benar.
Objek Informasi Peristiwa ACPI (_AEI) Seperti yang disebutkan sebelumnya, namespace pengontrol GPIO harus berisi objek _AEI untuk mendukung peristiwa ACPI. Objek _AEI (lihat bagian 5.6.5.2 dalam spesifikasi ACPI 5.0) mengembalikan buffer Templat Sumber Daya yang hanya berisi deskriptor GpioInt yang memberi sinyal peristiwa ACPI melalui pengontrol GPIO ini. Setiap deskriptor sesuai dengan satu perangkat sumber peristiwa ACPI dan didedikasikan untuk perangkat tersebut (tidak dibagikan antar perangkat).
Wilayah operasi GeneralPurposeIO (OpRegions)
Pengontrol GPIO sering digunakan oleh firmware platform untuk mendukung sejumlah fitur perangkat keras platform seperti mengontrol daya dan jam, atau mengatur mode pada perangkat. Untuk mendukung penggunaan GPIO I/O dari metode kontrol ASL, ACPI 5.0 mendefinisikan jenis OpRegion baru, "GeneralPurposeIO".
GeneralPurposeIO OpRegions (lihat bagian 5.5.2.4.4 dari spesifikasi ACPI 5.0) dideklarasikan dalam cakupan namespace perangkat pengontrol GPIO yang drivernya akan menangani I/O. Deklarasi Bidang GeneralPurposeIO (lihat bagian 5.5.2.4.4.1 dari spesifikasi ACPI 5.0) menetapkan nama ke pin GPIO yang akan diakses dalam GeneralPurposeIO OpRegion. Sumber Daya Koneksi GpioIO (lihat bagian 19.5.53 dari spesifikasi ACPI 5.0) digunakan dalam deklarasi Bidang untuk menentukan nomor pin dan konfigurasi untuk referensi Bidang tertentu. Jumlah total bit bidang bernama yang mengikuti pendeskripsi koneksi harus sama dengan jumlah pin yang tercantum dalam deskriptor.
Bidang dalam OpRegion dapat dideklarasikan di mana saja di namespace layanan dan diakses dari metode apa pun di namespace layanan. Arah akses ke GeneralPurposeIO OpRegion ditentukan oleh akses pertama (baca atau tulis) dan tidak dapat diubah.
Karena akses OpRegion disediakan oleh driver perangkat pengontrol GPIO ("OpRegion Handler"), metode harus berhati-hati untuk tidak mengakses OpRegion sampai driver tersedia. Kode ASL dapat melacak status handler OpRegion dengan menyertakan metode Wilayah (_REG) di bawah perangkat pengontrol GPIO (lihat bagian 6.5.4 dari spesifikasi ACPI 5.0). Selain itu, objek Dependensi OpRegion (_DEP) (lihat bagian 6.5.8 dari spesifikasi ACPI 5.0) dapat digunakan di bawah perangkat apa pun yang memiliki metode mengakses bidang GPIO OpRegion, jika diperlukan. Lihat bagian Dependensi perangkat di topik Objek namespace manajemen perangkat untuk diskusi kapan harus menggunakan _DEP. Penting bahwa driver tidak diberi sumber daya I/O GPIO yang juga ditetapkan ke GeneralPurposeIO OpRegions. Opregions adalah untuk penggunaan eksklusif metode kontrol ASL.