Mempartisi Pengontrol GPIO ke Bank Pin

Pengembang driver dapat, sebagai opsi, mempartisi perangkat pengontrol I/O (GPIO) tujuan umum ke dalam dua bank atau lebih pin GPIO. Misalnya, perangkat pengontrol GPIO yang memiliki 64 pin GPIO dapat dijelaskan oleh driver pengontrol GPIO sebagai dua bank, yang masing-masing memiliki 32 pin GPIO. Pengembang dapat menyediakan satu driver untuk mengelola semua bank dalam perangkat pengontrol GPIO, dan driver ini biasanya menggunakan satu objek perangkat untuk mewakili seluruh perangkat. Namun, beberapa atau semua bank dalam perangkat dapat dikelola secara independen dari bank lain di perangkat.

Biasanya, driver pengontrol GPIO memilih untuk mempartisi pengontrol GPIO menjadi dua bank atau lebih karena salah satu alasan berikut:

  • Status daya pin GPIO di bank dapat dikelola secara independen dari pin di bank lain.
  • Jumlah total pin dalam pengontrol GPIO lebih besar dari 64.

Ukuran bank maksimum yang didukung ekstensi kerangka kerja GPIO (GpioClx) adalah 64 pin. Perangkat pengontrol GPIO yang berisi lebih dari 64 pin harus dipartisi oleh driver menjadi dua bank atau lebih, yang masing-masing berisi tidak lebih dari 64 pin.

Untuk menentukan bagaimana pengontrol GPIO dipartisi ke bank, GpioClx memanggil fungsi panggilan balik peristiwa CLIENT_QueryControllerBasicInformation . Fungsi ini, yang diimplementasikan oleh driver pengontrol GPIO, memasok struktur CLIENT_CONTROLLER_BASIC_INFORMATION yang menjelaskan atribut dan kemampuan pengontrol GPIO. Dua anggota struktur ini, TotalPins dan NumberOfPinsPerBank, menentukan bagaimana pin dalam pengontrol GPIO dipartisi ke dalam bank. TotalPins menentukan jumlah total pin dalam pengontrol GPIO, dan NumberOfPinsPerBank menentukan jumlah pin per bank. Jika N adalah jumlah bank dalam pengontrol, bank diberi nomor dari 0 hingga Nā€“1. Semua kecuali bank terakhir (yaitu, nomor bank Nā€“1) harus berisi jumlah pin yang ditentukan dalam anggota NumberOfPinsPerBank . Bank terakhir dapat memiliki sejumlah pin dari satu ke NumberOfPinsPerBank.

GpioClx menentukan jumlah total bank dalam pengontrol GPIO dari nilai anggota TotalPins dan NumberOfPinsPerBank . GpioClx menggunakan rumus bilangan bulat berikut untuk menghitung jumlah total bank:

(TotalPins + NumberOfPinsPerBank ā€“ 1) / NumberOfPinsPerBank Di beberapa perangkat pengontrol GPIO, bank pin dalam perangkat dapat dihidupkan atau dialihkan ke status daya rendah secara independen dari bank lain di perangkat yang sama. Dengan demikian, ketika bank tertentu siaga, bank ini dapat dialihkan ke status daya rendah untuk mengurangi konsumsi daya. Untuk mengakomodasi perangkat tersebut, GpioClx mendukung manajemen daya tingkat komponen. GpioClx mendefinisikan dua status daya tingkat komponen, F0 (menyala penuh) dan F1 (daya rendah atau mati).

Untuk menentukan apakah pin GPIO mendukung manajemen daya tingkat komponen, GpioClx memanggil fungsi panggilan balik peristiwa CLIENT_QuerySetControllerInformation . Parameter InputBuffer dari fungsi ini adalah penunjuk ke struktur CLIENT_CONTROLLER_QUERY_SET_INFORMATION_INPUT . Untuk meminta informasi manajemen daya, pemanggil mengatur anggota RequestType dari struktur ini ke QueryBankPowerInformation.

Jika bank GPIO mendukung manajemen daya tingkat komponen, GpioClx memungkinkan transisi ke status daya F1 saat bank diam. Sebelum bank memasuki status F1, GpioClx memanggil fungsi panggilan balik peristiwa CLIENT_SaveBankHardwareContext untuk memberi tahu driver untuk menyimpan konteks perangkat keras (terutama, isi register) bank. Kemudian, setelah bank memasuki status F0, GpioClx memanggil fungsi panggilan balik peristiwa CLIENT_RestoreBankHardwareContext untuk memberi tahu driver untuk memulihkan konteks perangkat keras yang disimpan sebelumnya.