Cara mengirim transfer kontrol USB (aplikasi UWP)

Artikel ini menunjukkan:

  • Cara memformat paket penyiapan USB
  • Cara memulai transfer kontrol USB dari aplikasi Anda

API penting

Aplikasi yang berkomunikasi dengan perangkat USB biasanya mengirim beberapa permintaan transfer kontrol. Permintaan tersebut mendapatkan informasi tentang perangkat dan mengirim perintah kontrol yang ditentukan oleh vendor perangkat keras. Dalam topik ini Anda akan mempelajari tentang transfer kontrol dan cara memformat dan mengirimnya di aplikasi UWP Anda.

Transfer kontrol dapat membaca atau menulis informasi konfigurasi atau melakukan fungsi khusus perangkat yang ditentukan oleh vendor perangkat keras. Jika transfer melakukan operasi tulis, itu adalah transfer OUT; operasi baca, ini adalah transfer IN. Terlepas dari arahnya, perangkat lunak, seperti aplikasi UWP Anda, pada sistem host selalu membangun dan memulai permintaan transfer kontrol. Terkadang, aplikasi Anda dapat memulai transfer kontrol yang membaca atau menulis data. Dalam hal ini, Anda mungkin perlu mengirim buffer tambahan.

Untuk mengakomodasi semua jenis transfer kontrol, Windows.Devices.Usb menyediakan metode berikut:

transfer kontrol usb untuk api runtime windows untuk usb.

Transfer kontrol USB juga digunakan untuk mendapatkan data deskriptor atau mengirim perintah standar. Namun, kami sarankan Anda mengirim jenis permintaan tersebut dengan memanggil metode tertentu yang disediakan oleh Windows.Devices.Usb daripada membangun transfer kontrol, secara manual. Misalnya, untuk memilih pengaturan alternatif, panggil SelectSettingAsync alih-alih memanggil SendControlOutTransferAsync (UsbSetupPacket).

Transfer kontrol untuk jenis permintaan standar tertentu tidak didukung. Namun, jika perangkat Anda termasuk dalam kelas perangkat yang didukung oleh Windows.Devices.Usb, Anda dapat mengirim beberapa permintaan seperti yang ditentukan oleh spesifikasi kelas perangkat.

Sebelum memulai

  • Anda harus membuka perangkat dan mendapatkan objek UsbDevice . Baca Cara menyambungkan ke perangkat USB (aplikasi UWP).
  • Dapatkan informasi tentang perintah kontrol yang ditentukan vendor. Perintah tersebut biasanya didefinisikan dalam spesifikasi perangkat keras.
  • Anda dapat melihat kode lengkap yang ditampilkan dalam topik ini dalam sampel CustomUsbDeviceAccess, Scenario2_ControlTransfer.cpp dan Scenario2_ControlTransfer.h.

Langkah 1: Mengisi paket penyiapan

Dalam topik ini, kami akan mengirim transfer kontrol ke perangkat yang berkedip lampu dalam berbagai pola. Untuk mengisi paket penyiapan, Anda harus mengetahui perintah kontrol ditentukan oleh vendor perangkat keras:

  • bmRequestType (D7): OUT
  • bmRequestType (D4): Perangkat
  • bmRequestType (D6... D5): Vendor
  • bRequest: 0x03
  • wValue: 0-7 (angka apa pun dalam rentang tersebut, inklusif)
  • wIndex: 0
  • wLength: 0

Untuk transfer kontrol, Anda harus mengisi paket penyiapan yang berisi semua informasi tentang transfer; apakah permintaan membaca atau menulis data, jenis permintaan, dan sebagainya. Format paket penyiapan didefinisikan dalam spesifikasi USB resmi. Nilai bidang paket penyiapan disediakan oleh spesifikasi perangkat keras perangkat.

  1. Buat objek UsbSetupPacket .

  2. Isi objek UsbSetupPacket dengan mengatur berbagai properti. Tabel ini memperlihatkan bidang paket penyiapan yang ditentukan USB, dan properti yang sesuai dengan bidang tersebut:

    Bidang di Bagian 9.3 Properti Deskripsi
    bmRequestType (D7) UsbControlRequestType.Direction Arah permintaan. Apakah permintaan berasal dari host ke perangkat (Transfer keluar) atau perangkat ke host (Dalam transfer)
    bmRequestType (D4) UsbControlRequestType.Recipient Penerima permintaan. Semua transfer kontrol menargetkan titik akhir default. Namun, penerima mungkin perangkat, antarmuka, titik akhir, atau lainnya. Untuk informasi selengkapnya tentang perangkat USB, antarmuka, hierarki titik akhir, lihat Tata Letak Perangkat.
    bmRequestType (D6... D5) UsbControlRequestType.ControlTransferType Kategori permintaan. Standar, kelas, atau vendor.
    bRequest UsbSetupPacket.Request Jenis permintaan. Jika permintaan adalah permintaan standar, seperti permintaan GET_DESCRIPTOR, permintaan tersebut ditentukan oleh spesifikasi USB. Jika tidak, itu bisa didefinisikan vendor.
    wValue UsbSetupPacket.Value Tergantung pada jenis permintaan.
    Windex UsbSetupPacket.Index Tergantung pada jenis permintaan.
    wLength UsbSetupPacket.Length Panjang paket data yang dikirim atau diterima dalam permintaan ini.

! [CATATAN] Untuk transfer kontrol tertentu, Anda mungkin perlu menyediakan bmRequestType sebagai byte mentah. Dalam hal ini, Anda dapat mengatur byte di properti UsbControlRequestType.AsByte .

Langkah 2: Mulai operasi asinkron untuk mengirim transfer kontrol

Untuk mengirim transfer kontrol, Anda harus memiliki objek UsbDevice . Transfer kontrol Anda mungkin atau mungkin tidak memerlukan paket data yang mengikuti paket penyiapan.

Untuk memulai transfer kontrol, panggil penimpaan SendControlInTransferAsync atau SendControlOutTransferAsync. Jika transfer menggunakan paket data, maka panggil SendControlOutTransferAsync (UsbSetupPacket, IBuffer), SendControlInTransferAsync (UsbSetupPacket, IBuffer). Metode tersebut mengambil parameter tambahan yang berisi data untuk menulis atau menerima data dari perangkat. Gunakan diagram alur untuk menentukan penimpaan mana yang akan dipanggil.

Panggilan dimulai dan operasi asinkron. Ketika operasi selesai, panggilan mengembalikan objek IAsyncOperation yang berisi hasil operasi. Untuk transfer OUT, objek mengembalikan jumlah byte yang dikirim dalam transfer. Untuk transfer IN, objek berisi buffer yang berisi data yang dibaca dari perangkat.

Contoh kode transfer kontrol USB

Contoh kode ini menunjukkan cara mengirim transfer kontrol yang mengubah pola berkedip pada perangkat SuperMUTT. Paket penyiapan untuk transfer berisi perintah yang ditentukan vendor. Contohnya ada di Scenario2_ControlTransfer.cpp.

async Task SetSuperMuttLedBlinkPatternAsync(Byte pattern)
        {
            UsbSetupPacket initSetupPacket = new UsbSetupPacket
            {
                RequestType = new UsbControlRequestType
                {
                    Direction = UsbTransferDirection.Out,
                    Recipient = UsbControlRecipient.Device,
                    ControlTransferType = UsbControlTransferType.Vendor
                },
                Request = SuperMutt.VendorCommand.SetLedBlinkPattern,
                Value = pattern,
                Length = 0
            };

            UInt32 bytesTransferred = await EventHandlerForDevice.Current.Device.SendControlOutTransferAsync(initSetupPacket);

            MainPage.Current.NotifyUser("The Led blink pattern is set to " + pattern.ToString(), NotifyType.StatusMessage);
        }

Contoh kode ini menunjukkan cara mengirim transfer kontrol yang mengubah pola berkedip pada perangkat SuperMUTT. Paket penyiapan untuk transfer berisi perintah yang ditentukan vendor. Contohnya ada di Scenario2_ControlTransfer.cpp.

async Task<IBuffer> SendVendorControlTransferInToDeviceRecipientAsync(Byte vendorCommand, UInt32 dataPacketLength)
 {
    // Data will be written to this buffer when we receive it
    var buffer = new Windows.Storage.Streams.Buffer(dataPacketLength);

    UsbSetupPacket initSetupPacket = new UsbSetupPacket
    {
        RequestType = new UsbControlRequestType
        {
            Direction = UsbTransferDirection.In,
            Recipient = UsbControlRecipient.Device,
            ControlTransferType = UsbControlTransferType.Vendor,
        },
        Request = vendorCommand,
        Length = dataPacketLength
    };

    return await EventHandlerForDevice.Current.Device.SendControlInTransferAsync(initSetupPacket, buffer);
}