Bagikan melalui


Menggunakan Interupsi untuk Membangunkan Perangkat

Saat perangkat beralih ke status daya rendah, kerangka kerja akan terputus (atau melaporkan sebagai tidak aktif) mengganggu yang digunakan untuk penanganan I/O. Dimulai dengan KMDF 1.13 dan UMDF 2.0 yang berjalan pada Windows 8.1, driver WDF dapat membuat objek interupsi kerangka kerja yang tetap aktif ketika perangkat beralih ke status daya rendah, dan kemudian dapat digunakan untuk membangkitkan perangkat dan memulihkannya sepenuhnya pada status D0.

Jika Anda mengembangkan driver WDF untuk platform System on a Chip (SoC), Anda dapat menggunakan interupsi seperti itu untuk membangkitkan perangkat yang tidak menyediakan mekanisme sinyal bangun tradisional. Untuk menggunakan fungsionalitas ini, perangkat harus memiliki dukungan perangkat keras untuk gangguan bangun, seperti yang diekspos melalui ACPI. Driver yang membuat gangguan harus menjadi pemilik kebijakan daya perangkat.

Ketika perangkat beralih ke status daya rendah, kerangka kerja tidak memutuskan sambungan interupsi yang telah diidentifikasi sebagai berkemampuan bangun. Saat perangkat terganggu, kerangka kerja memanggil rutinitas panggilan balik EvtDeviceD0Entry dan EvtInterruptIsr driver di IRQL = PASSIVE_LEVEL.

Jika driver Anda sudah membuat objek interupsi tingkat pasif untuk penanganan I/O, sebaiknya bagikan objek interupsi yang sama untuk fungsionalitas bangun. Dalam skenario ini, rutinitas panggilan balik EvtInterruptIsr driver menerapkan logika kondisional untuk melakukan penanganan untuk gangguan terkait I/O, serta penanganan bangun.

Namun, jika driver Anda menggunakan gangguan yang memerlukan penanganan di IRQL (DIRQL) perangkat, sebaiknya buat objek gangguan kerangka kerja tambahan untuk menyediakan fungsionalitas bangun.

Ikuti langkah-langkah ini untuk membuat objek interupsi berkemampuan bangun di driver KMDF atau UMDF Anda:

  1. Panggil WdfDeviceAssignS0IdleSettings, biasanya dari EvtDriverDeviceAdd, menentukan IdleCanWakeFromS0 dalam parameter IdleCaps .

  2. Secara opsional, panggil WdfDeviceInitSetPowerPolicyEventCallbacks untuk mendaftarkan fungsi panggilan balik peristiwa yang dijelaskan dalam Mendukung Bangun Sistem.

  3. Panggil WDF_INTERRUPT_CONFIG_INIT untuk menginisialisasi struktur WDF_INTERRUPT_CONFIG . Berikan fungsi panggilan balik EvtInterruptIsr , untuk dipanggil pada tingkat pasif. Dalam struktur konfigurasi, atur PassiveHandling dan CanWakeDevice ke TRUE. Kemudian panggil WdfInterruptCreate dari fungsi panggilan balik EvtDevicePrepareHardware driver Anda untuk membuat objek gangguan kerangka kerja.

  4. Panggil WdfDeviceAssignSxWakeSettings untuk mengonfigurasi perangkat untuk membangunkan sistem dari status daya rendah.

    WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&wakeSettings);
    wakeSettings.DxState = PowerDeviceD3;
    wakeSettings.UserControlOfWakeSettings = WakeDoNotAllowUserControl;
    wakeSettings.Enabled = WdfTrue;
    
    status = WdfDeviceAssignSxWakeSettings(Device, &wakeSettings);
    if (!NT_SUCCESS(status)) {
        Trace(TRACE_LEVEL_ERROR,"WdfDeviceAssignSxWakeSettings failed %x\n", status);
        return status;
    }
    
  5. Ketika perangkat beralih ke status daya rendah, kerangka kerja tidak memanggil EvtInterruptDisable untuk gangguan berkemampuan bangun. Kerangka kerja memang memanggil EvtDeviceArmWakeFromS0 jika driver telah menyediakannya.

  6. Ketika perangkat memberi sinyal gangguan bangun, kerangka kerja memanggil rutinitas panggilan balik EvtDeviceD0Entry driver.

  7. Jika panggilan balik EvtDeviceD0Entry driver kembali berhasil, kerangka kerja memanggil panggilan balik EvtInterruptIsr driver pada tingkat pasif. Sebelum handler interupsi kembali, penghandel harus membungkam gangguan di pengontrol interupsi. Jika driver mengembalikan kode kegagalan dari EvtDeviceD0Entry, kerangka kerja memutuskan gangguan dan memanggil panggilan balik EvtInterruptDisable driver, jika driver telah menyediakannya.

  8. Kerangka kerja memanggil rutinitas panggilan balik peristiwa bangun berikut, jika driver telah menyediakan:

  9. Kerangka kerja berlanjut dengan urutan panggilan balik power-up normal, seperti yang dijelaskan dalam Urutan Power-Up untuk Fungsi atau Driver Filter.

Anda dapat menggunakan ekstensi debugger !wdfkd.wdfinterrupt untuk menunjukkan apakah interupsi tertentu telah dikonfigurasi agar dapat dibangunkan.

Fungsionalitas gangguan bangun tidak dapat digunakan bersama dengan penangguhan selektif USB.