Bagikan melalui


GPIO-Based Sumber Daya Perangkat Keras

Dimulai dengan Windows 8, pin I/O tujuan umum (GPIO) yang dikendalikan oleh driver pengontrol GPIO tersedia untuk driver lain sebagai sumber daya perangkat keras yang dikelola sistem. Pin I/O GPIO, yang merupakan pin yang dikonfigurasi sebagai input data atau output data, tersedia sebagai jenis sumber daya Windows baru, sumber daya I/O GPIO. Selain itu, pin interupsi GPIO, yang merupakan pin yang dikonfigurasi sebagai input permintaan interupsi, tersedia sebagai sumber daya interupsi Windows biasa.

Sumber daya I/O GPIO mewakili satu set atau beberapa pin GPIO yang dapat dibaca oleh driver untuk perangkat periferal atau tulis. Windows menyembunyikan detail tentang implementasi yang mendasar dari pin I/O GPIO sehingga driver perangkat periferal dapat ditulis untuk memanipulasi sumber daya I/O GPIO abstrak. Driver perangkat periferal yang menggunakan sumber daya abstrak ini dapat bekerja di seluruh platform terlepas dari perangkat keras pengontrol GPIO yang mengimplementasikan sumber daya. Sumber daya I/O GPIO diwakili oleh handel WDFIOTARGET yang mengaitkan sumber daya ini dengan driver pengontrol GPIO tertentu yang memiliki pin atau pin GPIO yang mendasar.

Biasanya, pin I/O pada pengontrol GPIO dapat dikonfigurasi baik untuk input atau untuk output, tergantung pada kemampuan perangkat keras pengontrol dan perangkat yang terhubung secara fisik ke pin. Dengan demikian, driver dapat membuka koneksi logis ke pin ini untuk operasi tulis atau baca, tetapi tidak keduanya. Namun, batasan ini diberlakukan oleh perangkat keras, dan bukan oleh ekstensi kerangka kerja GPIO (GpioClx). Jika perangkat keras memungkinkan pin I/O dikonfigurasi untuk input dan output, GpioClx memungkinkan driver untuk membuka koneksi logis ke pin untuk operasi baca dan tulis.

Untuk pin GPIO yang dikonfigurasi sebagai input permintaan interupsi, fakta bahwa permintaan interupsi diimplementasikan oleh pin GPIO alih-alih oleh pengontrol interupsi atau baris permintaan gangguan khusus sepenuhnya diabstraksi oleh sistem operasi. Gangguan GPIO disajikan kepada driver perangkat periferal sebagai sumber daya interupsi abstrak. Abstraksi sumber daya ini didukung oleh tumpukan driver GPIO dan oleh lapisan abstraksi perangkat keras (HAL). Dengan demikian, driver perangkat periferal yang menggunakan sumber daya interupsi sebagian besar dapat mengabaikan detail tentang implementasi yang mendasar dari sumber daya ini. Untuk informasi selengkapnya, lihat Gangguan GPIO.

Diagram berikut menunjukkan contoh penetapan sumber daya berbasis GPIO ke dua driver perangkat periferal:

contoh penetapan sumber daya berbasis gpio.

Dalam diagram sebelumnya, tiga sumber daya berbasis GPIO berikut ditetapkan driver perangkat periferal A:

  • Dua pin input data
  • Pin output data
  • Pin input interupsi

Dua sumber daya berbasis GPIO berikut ditetapkan ke driver perangkat periferal B:

  • Pin input data
  • Pin input interupsi

Driver A dan B menerima sumber daya yang ditetapkan dalam fungsi panggilan balik EvtDevicePrepareHardware mereka. Jika driver menerima, sebagai sumber daya, satu set atau beberapa pin I/O GPIO, driver dapat membuka koneksi ke pin ini untuk mengaksesnya. Driver mendapatkan handel WDFIOTARGET untuk mengidentifikasi koneksi dan mengirim permintaan I/O ke handel ini untuk membaca dari atau menulis ke pin ini.

Untuk contoh kode yang menunjukkan cara menyambungkan ke sekumpulan pin I/O GPIO dan mengirim permintaan I/O ke pin ini, lihat topik berikut:

Menyambungkan Driver KMDF ke Pin I/O GPIO

Dalam kedua topik, IoRoutine fungsi dalam contoh kode membuka sumber daya pin I/O GPIO baik untuk baca atau untuk tulis, tergantung pada ReadOperation nilai parameter. Jika sumber daya dibuka untuk dibaca (DesiredAccess = GENERIC_READ), pin dalam sumber daya dikonfigurasi sebagai input, dan permintaan IOCTL_GPIO_READ_PINS yang dikirim ke sumber daya pin membaca nilai input pada pin ini. GpioClx tidak mengizinkan permintaan IOCTL_GPIO_WRITE_PINS dikirim sekumpulan pin input, dan menyelesaikan permintaan tersebut dengan status kesalahan STATUS_GPIO_OPERATION_DENIED. Demikian pula, jika sumber daya pin dibuka untuk penulisan (DesiredAccess = GENERIC_WRITE), pin dalam sumber daya dikonfigurasi sebagai output, dan permintaan IOCTL_GPIO_WRITE_PINS yang dikirim ke sumber daya pin mengatur nilai dalam kait output yang mendorong pin ini. Biasanya, mengirim permintaan IOCTL_GPIO_READ_PINS ke sekumpulan pin output hanya membaca nilai terakhir yang ditulis ke kait output.

Untuk menggunakan sumber daya interupsi untuk menerima gangguan, driver klien harus menghubungkan rutinitas layanan interupsi (ISR) ke gangguan. Biasanya, driver membuat koneksi ini dengan memanggil metode WdfInterruptCreate (atau, mungkin, rutinitas IoConnectInterruptEx ). Untuk informasi selengkapnya tentang gangguan KMDF, lihat Membuat Objek Interupsi.

Berbeda dengan perangkat Plug and Play yang dapat terhubung secara dinamis dan terputus dari platform perangkat keras, perangkat pengontrol GPIO terpasang secara permanen. Selain itu, koneksi antara pin GPIO dan perangkat periferal diasumsikan permanen. (Atau, jika perangkat periferal dapat dilepas dari slot, slot didedikasikan untuk perangkat ini.) Oleh karena itu, sumber daya GPIO yang tersedia diperbaiki dan dapat ditentukan dalam firmware platform. Demikian pula, driver perangkat periferal yang menggunakan sumber daya GPIO diasumsikan untuk menggunakan set khusus sumber daya GPIO. Dengan demikian, persyaratan sumber daya untuk driver perangkat ini dapat ditentukan dalam firmware platform.

Ketika firmware platform menunjuk sekumpulan pin GPIO sebagai sumber daya I/O GPIO, firmware menunjukkan apakah pin dalam sumber daya ini dapat dibuka untuk bacaan, untuk tulis, atau untuk baca dan tulis.

Jika driver perangkat periferal menggunakan lebih dari satu sumber daya I/O GPIO, driver ini harus mengetahui urutan di mana sumber daya ini dijumlahkan oleh manajer PnP. Misalnya, jika driver menggunakan dua pin I/O GPIO, tetapi pin ini harus diakses secara independen dan pada waktu terpisah, firmware platform harus menggambarkan setiap pin sebagai sumber daya I/O GPIO terpisah. Manajer PnP menghitung sumber daya ini dalam urutan di mana mereka dijelaskan dalam firmware platform, yang harus sesuai dengan urutan yang diharapkan oleh driver.

Setelah driver perangkat periferal membuka koneksi ke sumber daya I/O GPIO, permintaan IOCTL_GPIO_READ_PINS atau IOCTL_GPIO_WRITE_PINS yang dikirim driver ini ke koneksi ini mengakses semua pin di sumber daya. Jika driver terkadang hanya harus mengakses subset pin ini, subset ini harus ditetapkan ke driver sebagai sumber daya terpisah.

Untuk informasi selengkapnya tentang permintaan IOCTL_GPIO_READ_PINS , termasuk pemetaan pin input data ke bit dalam buffer output permintaan, lihat IOCTL_GPIO_READ_PINS. Untuk informasi selengkapnya tentang permintaan IOCTL_GPIO_WRITE_PINS , termasuk pemetaan bit dalam buffer input permintaan ke pin output data, lihat IOCTL_GPIO_WRITE_PINS.