Menyembunyikan deskripsi protokol. Pengenalan dunia perangkat USB menggunakan contoh mikrokontroler dari Silicon Laboratories. Memproses data masuk dan menghasilkan paket keluar

Kontrol

Informasi tentang perangkat USB disebut Deskriptor dan disimpan dalam ROM-nya. Antarmuka deskriptor dapat mendefinisikan suatu perangkat sebagai milik salah satu dari sejumlah kelas yang terbatas. Perangkat kelas HID menggunakan driver yang sesuai untuk mengambil dan merutekan semua data.

Deskriptor perangkat menentukan deskriptor kelas lain yang ada. Misalnya, Deskriptor Laporan dan Deskriptor Fisik.

Struktur deskriptornya adalah sebagai berikut:

Deskriptor perangkat dan konfigurasi adalah satu per perangkat. Mungkin terdapat beberapa deskriptor antarmuka (misalnya, MFP mungkin memiliki antarmuka printer, antarmuka pemindai, dll.).

Deskriptor laporan menjelaskan setiap bagian data yang dihasilkan perangkat dan ukuran data yang benar-benar berubah. Misalnya, elemen yang mendeskripsikan posisi atau status tombol ditentukan.

Deskriptor laporan dimuat dan diproses oleh driver kelas HID segera setelah perangkat terdeteksi. Protokol untuk perangkat lama dan baru dibuat dengan menggabungkan data dalam deskriptor pelaporan.

Perangkat HID dibagi menjadi beberapa kelas (keyboard, mouse, joystick, dll.). Ini memungkinkan Anda menyatukan deskriptor laporan. Namun, beberapa kelas mungkin berisi subkelas, misalnya subkelas perangkat boot.

Jika perangkat dapat digunakan di BIOS, maka perangkat tersebut ditetapkan sebagai dapat di-boot menggunakan parameter

bInterfaceSubClass

0 - tidak ada subkelas (perangkat biasa);

1 - perangkat boot;

2-255 - dipesan.

Parameter bInterfaceProtocol masuk akal jika perangkat dinyatakan dapat di-boot.

1 - papan ketik;

3-255 - dipesan.

Penting untuk menentukan apakah suatu perangkat termasuk dalam kelas HID bukan berdasarkan parameter bDeviceClass dan bDeviceSubClass, tetapi berdasarkan parameter bInterfaceClass dan bInterfaceSubClass.

Deskriptor laporan terdiri dari unsur informasi (Item).

Elemen tersebut mungkin menyertakan elemen data tambahan. Ukuran blok data ditentukan oleh tipe dasarnya (pendek dan panjang). Singkatnya, volumenya bisa 0, 1, 2 atau 4 byte. Elemen panjang memiliki nilai bSize = 2.

Driver HID mem-parsing seluruh laporan dari host secara linier, mencari elemen sesuai dengan deskriptor laporan dan menyimpannya dalam tabel elemen.

Penggunaan

Ini adalah bagian dari deskriptor laporan yang menentukan apa yang harus dilakukan dengan data (misalnya masukan x, y, z).

Orientasi HID

Secara default, arah pergerakannya adalah dari kiri ke kanan (X), dari atas ke bawah (Y), dan dari jauh lebih dekat (Z).

Dimungkinkan untuk mengirimkan nilai di luar batas yang diizinkan, dalam hal ini host akan mengabaikannya dan nilai saat ini tidak akan diubah. Inilah yang disebut nilai NULL. Disarankan untuk menggunakan 0 sebagai NULL, mis. Kisaran koordinat yang dapat diterima dimulai dari 1.

Deskriptor HID

Mendefinisikan panjang dan jenis deskriptor budak untuk perangkat. Terdiri dari bagian-bagian berikut:

Sekali lagi, laporan adalah paket data dari sudut pandang HID. Deskriptor laporan adalah deskripsi struktur paket tertentu. Berdasarkan hal tersebut, host memproses laporan dari perangkat dan menganalisis konten setiap paket. Deskriptor laporan secara kondisional dibagi menjadi beberapa blok. Bagian pertama blok berisi tiga bidang: tipe elemen, tag elemen, dan ukuran elemen. Bersama-sama, bidang-bidang ini menentukan informasi apa yang terkandung dalam blok tersebut.

Berikut tiga jenis elemen: Maain, Global, Lokal. Misalnya, tag berikut sesuai dengan tipe Utama:

Input - mengacu pada data perangkat, seperti posisi kursor, status tombol, dll.

Output - menentukan data yang akan dikirim ke perangkat dari host.

Fitur - menjelaskan konfigurasi perangkat yang dapat dikirim ke perangkat.

Koleksi - pengelompokan semantik elemen Input, Output, dan Fitur.

End Collection - menunjukkan akhir dari kumpulan elemen.

Tag Utama setiap elemen menentukan ukuran data yang dikembalikan oleh kontrol tertentu dan menentukan apakah data tersebut absolut atau relatif, dan seterusnya.

Tipe Lokal dan Global menentukan nilai data minimum dan maksimum, dan seterusnya.

Elemen lokal hanya menjelaskan bidang data yang ditentukan oleh elemen Utama berikutnya. Elemen global menjadi atribut default untuk semua bidang data berikutnya dalam deskriptor tersebut.

Contoh:

Jumlah Laporan (2)

Jumlah Laporan (2)

Ukuran Laporan(3) menentukan ukuran elemen dalam bit (dalam hal ini 3);

Jumlah Laporan (2) menentukan jumlah elemen tersebut.

Jika kita dapat memuat dan mengirimkan data tentang tiga tombol yang ditekan secara bersamaan, maka laporannya adalah sebagai berikut:

Ukuran Laporan (8),

Laporkan Koin (3),

Jika laporan menunjukkan status 8 tombol, maka tampilannya seperti ini:

Ukuran Laporan (1),

Laporkan Koin (8),

Deskriptor laporan mungkin berisi beberapa elemen Utama. Masing-masing elemen deskripsi data kontrol berikut diperlukan (yang lain bersifat opsional):

  • Input (Output atau Fitur)
  • Penggunaan
  • Halaman Penggunaan
  • Minimum Logis
  • Maksimum Logis
  • Ukuran Laporan
  • Jumlah Laporan

Contoh berdasarkan mouse 3 tombol:

Halaman Penggunaan (Desktop Generik), ;halaman penggunaan umum

Penggunaan (Mouse),

Koleksi (Aplikasi), ;buka tipe mouse

Penggunaan (Penunjuk),

Koleksi (Fisik), ;koleksi indeks terbuka

Halaman Penggunaan (Tombol),

Minimal Penggunaan (1),

Penggunaan Maksimum (3),

Minimum Logis (0),

Maksimum Logis (1), ;bidang mengembalikan data dari 0 hingga 1

Jumlah Laporan (3),

Ukuran Laporan (1), ;buat 3 bidang satu bit (tombol 1, 2 dan 3)

Input (Data, Variabel, Absolut), ;buat kolom untuk laporan input

Jumlah Laporan (1),

Ukuran Laporan (5), ;buat bidang konstan 5-bit

Input (Konstan), ;tambahkan bidang ke laporan masuk

Halaman Penggunaan (Desktop Generik),

Penggunaan (X),

Penggunaan (Y),

Minimum Logis (-127),

Maksimum Logis (127), ;bidang mengembalikan nilai dari -127 hingga 127

Ukuran Laporan (8),

Jumlah Laporan (2), ;buat 2 bidang 8 bit (X dan Y)

Input (Data, Variabel, Relatif), ;tambahkan kolom ke laporan masuk

Koleksi Akhir, ;tutup koleksi penunjuk

Akhiri Koleksi; tutup koleksi mouse

Koleksi membuka kumpulan data:

  • Fisik 0x00
  • Aplikasi 0x01
  • Logis 0x02
  • Laporkan 0x03
  • Dinamakan Array 0x04
  • Sakelar Penggunaan 0x05
  • Penggunaan 0x06
  • Dicadangkan 0x07 - 0x7F - untuk penggunaan di masa mendatang
  • Dicadangkan 0x80 - 0xFF - untuk vendor

Semua elemen berisi awalan 1-byte yang mengidentifikasi tipe elemen yang mendasarinya. HID mendefinisikan 2 format elemen utama:

Pendek dengan panjang total 1-5 byte, digunakan untuk elemen yang paling sering muncul.

Panjangnya 3-258 byte, digunakan untuk elemen yang membutuhkan data dalam jumlah besar.

Format pendek dan panjang berisi ukuran, jenis, dan tag elemen dalam byte pertama.

Format pendek

Format panjang

Minimum Logis & Maksimum Logis

LMin & LMax mengikat nilai yang dikembalikan oleh perangkat, dan Minimum Fisik dan Maksimum Fisik memberi arti pada batasan ini, memungkinkan nilai untuk diskalakan. Misalnya, termometer memiliki derajat logis dari 0 hingga 999, tetapi derajat fisik dari 32 hingga 212 derajat.

Mari kita lihat contoh mouse dengan sensitivitas 400dpi:

Jadi rumus menghitung rasionya harusnya seperti itu

(127-(-127)) / ((3175-(-3175)) * 10^-4) = 400 dpi

Kueri standar

Kelas HID menggunakan permintaan Get_Descriptor standar. Permintaan Get_Descriptor(Configuration) mengembalikan deskriptor konfigurasi, semua deskriptor antarmuka, deskriptor Titik Akhir, dan semua deskriptor HID untuk setiap antarmuka. Seharusnya tidak mengembalikan pegangan String, laporkan pegangannya.

Jadi urutannya harus sebagai berikut:

1.Dapatkan_Deskriptor

Struktur:

Tabel yang mendefinisikan Tipe Deskriptor (byte tinggi wValue dalam permintaan Get_Descriptor):

2. Set_Deskriptor

Struktur:

3. Kueri Khusus Kelas

Struktur:

Nilai bRequest yang tersedia:

4. Dapatkan_Laporan

mValue menentukan jenis laporan dalam byte tinggi dan ID Laporan dalam byte rendah. ID Laporan disetel ke 0 jika tidak digunakan. Jenis laporan didefinisikan sebagai berikut:

5.Set_Laporan

Arti dari field ini mirip dengan permintaan Get_Report.

6.Dapatkan_Idle

Membaca persentase menganggur sistem saat ini untuk setiap Laporan Masukan.

7.Set_Idle

Permintaan ini diperlukan untuk membatasi tingkat polling untuk interupsi titik akhir. Hal ini juga menjadi alasan bagi NAK untuk semua interupsi jajak pendapat pada titik akhir sementara nilai saat ini tetap tidak berubah. Jika tidak ada perubahan, pemungutan suara akan dilanjutkan hingga mencapai NAK.

8. Dapatkan_Protokol

Kueri membaca protokol mana yang sedang aktif.

Didukung oleh perangkat kelas boot.

9.Set_Protokol

Beralih antara protokol boot dan protokol pelaporan. Saat diinisialisasi, semua perangkat menggunakan protokol pelaporan secara default.

Mbed OS adalah sistem operasi sumber terbuka untuk platform yang menggunakan mikrokontroler Arm yang dirancang khusus untuk perangkat Internet of Things (IoT): perangkat berdaya rendah dan terbatas yang perlu terhubung ke internet. Mbed OS menyediakan lapisan abstraksi untuk mikrokontroler yang dijalankannya, sehingga pengembang dapat fokus pada penulisan aplikasi C/C++ yang memanggil fungsionalitas yang tersedia pada berbagai perangkat keras. Aplikasi Mbed OS dapat digunakan kembali pada platform apa pun yang kompatibel dengan Mbed.

Di halaman ini

Memulai

Jika Anda ingin langsung terjun:

  • Kode sumber tersedia di GitHub dan di halaman rilis kami.

Kode sumber dan lisensi

Kami merilis Mbed OS di bawah lisensi Apache 2.0, sehingga Anda dapat menggunakannya dengan percaya diri dalam proyek komersial dan pribadi. Untuk informasi lebih lanjut tentang pelisensian, silakan lihat dokumentasi pelisensian kami.

Diagram arsitektur

Ini adalah arsitektur dasar papan Mbed:

Fondasi Mbed OS

Mbed OS menggunakan lapisan abstraksi perangkat keras (HAL) untuk mendukung bagian paling umum dari mikrokontroler, seperti pengatur waktu. Landasan ini memfasilitasi penulisan aplikasi terhadap sekumpulan antarmuka pemrograman aplikasi (API); perangkat Anda secara otomatis menyertakan perpustakaan dan dukungan driver yang diperlukan untuk periferal MCU standar, seperti I2C, serial, dan SPI.

HAL juga berfungsi sebagai titik awal ketika menambahkan dukungan untuk target atau fitur baru ke target yang sudah ada. Kami bekerja sama dengan Mitra silikon kami untuk mem-porting fitur-fitur baru ini ke papan pengembangan Mbed Enabled.

Mbed OS memiliki inti RTOS, sehingga mendukung eksekusi perangkat lunak real-time yang deterministik, multithread. Primitif RTOS selalu tersedia, memungkinkan driver dan aplikasi mengandalkan thread, semaphore, mutex, dan fitur RTOS lainnya.

Struktur Mbed OS memungkinkan pencocokan aplikasi dan sistem penyimpanan. Dengan kata lain, jika opsi penyimpanan tingkat blok bervariasi dan bergantung pada aplikasi, Anda dapat memilih sistem file yang paling sesuai dengan perangkat IoT Anda. Sistem file FAT - didukung oleh kartu SD - menyediakan kompatibilitas dengan sistem operasi lain, seperti Windows, Mac OS atau Linux. Ketika keandalan yang tinggi dan pemulihan dari kegagalan daya adalah hal yang penting, masuk akal untuk menggunakan sistem file tertanam kami, yang didukung dengan chip flash (Q)SPI NOR.

Terakhir, Mbed OS mengimplementasikan lapisan penargetan ulang dan integrasi proses booting dari setiap rantai alat yang didukung untuk Anda, sehingga pengembangan aplikasi terasa serupa dengan pengembangan C atau C++ untuk sistem operasi lainnya.

Konektivitas

Arm bekerja dengan Mitranya untuk mengaktifkan Bluetooth Hemat Energi, NFC, RFID, LoRa, 6LoWPAN-ND, Thread, Wi-SUN, Ethernet, Wi-Fi, IoT seluler dan seluler (LPWA) di seluruh perangkat dan arsitektur sistem yang menjalankan Mbed OS. Mbed OS menawarkan inti stabil dari teknologi konektivitas yang ada. Pada saat yang sama, ia menambahkan fitur-fitur modern dalam rilis fitur triwulanan, sehingga Anda selalu mendapat informasi tentang tren industri sehingga Anda dapat beralih ke solusi baru dan inovatif yang menghasilkan nilai bisnis.

Tumpukan jaringan dan konektivitas cukup fleksibel untuk memenuhi kebutuhan desain perangkat IoT yang paling menuntut, baik kombinasi mikrokontroler chip tunggal dan radio, atau beberapa chip yang terhubung melalui bus serial. Perancang sistem dapat yakin dengan tumpukan konektivitas tersertifikasi kami, seperti tumpukan Thread tersertifikasi kami, karena kematangan, interoperabilitas, dan komponennya yang tervalidasi.

Mbed OS sepenuhnya mendukung Platform Pelion IoT kami, sehingga Anda dapat mengelola perangkat yang Anda gunakan dan datanya. Bersama-sama, Mbed OS dan Pelion membentuk ekosistem koheren yang memenuhi kebutuhan sebagian besar proyek siap produksi.

Keamanan

Platform Pelion IoT memiliki keamanan bawaan di semua tingkat, yang menekankan perlindungan terhadap pelanggaran dan mitigasi konsekuensinya. Di samping layanan cloud yang diperkuat, tumpukan komunikasi yang kuat, dan pembaruan firmware yang aman, Mbed menawarkan dua blok bangunan tertanam khusus keamanan: Arm Mbed TLS dan Secure Partition Manager (SPM) yang memenuhi praktik terbaik industri sebagai bagian dari Arsitektur Keamanan Platform Arm. Saluran komunikasi aman Mbed TLS antara perangkat dan gateway atau server, dan penggunaan manajer partisi aman dan domain keamanan terisolasi untuk layanan sistem tepercaya mengurangi permukaan serangan. Secara keseluruhan, hal ini memberikan model keamanan chip-ke-cloud yang unik, mengandalkan kemampuan tingkat rendah yang disediakan oleh Mitra ekosistem silikon Arm untuk mengamankan data dan identitas perangkat yang terhubung ke cloud.

Pendekatan kami terhadap keamanan adalah dengan memanfaatkan protokol standar industri, cipher, dan rangkaian enkripsi yang canggih mengikuti rekomendasi dari NIST dan organisasi terkait lainnya. Hal ini memberi kita akses terhadap karya terbaru dari komunitas riset keamanan global, dan bukan pada sumber daya internal yang terbatas. Kami secara rutin memverifikasi hasil upaya ini dengan tinjauan kode, latihan penetrasi, dan metode lainnya.

Pembaruan firmware jarak jauh

Mbed OS menawarkan integrasi yang mulus dengan Layanan Pembaruan Manajemen Perangkat Pelion, sehingga Anda dapat memperbarui aplikasi perangkat Anda atau versi Mbed OS. Alat pengembangan Arm Mbed CLI dapat membuat muatan pembaruan, menghasilkan manifesnya, dan mengirimkannya ke perangkat pengembangan Anda dengan dua perintah. Jika Anda ingin memperbarui grup perangkat, Anda dapat membuat dan mengunggah manifes dan payload Anda ke Portal Manajemen Perangkat dan menjalankan kampanye standar dari sana. Kompiler Online juga menawarkan integrasi cepat untuk alur pengembangan.

Perangkat keras

Arm, Mitranya, dan komunitas pengembang Arm Mbed bekerja sama untuk mengembangkan proyek Mbed OS. Ekosistem yang berkembang ini berarti Mbed OS menyertakan driver untuk banyak perangkat keras yang berbeda, sehingga Anda dapat berkonsentrasi pada kode aplikasi yang bersih dan portabel.

Secara garis besar, perangkat keras yang dapat Anda lihat di situs kami ada tiga jenis:

  • Modul: menyertakan mikrokontroler, konektivitas sentris IoT, dan memori internal yang diperlukan. Mereka ideal untuk merancang produk IoT, mulai dari pembuatan prototipe hingga produksi massal. Modul yang Diaktifkan Mbed memiliki dukungan penuh untuk Mbed OS dengan semua driver konektivitas yang tersedia.
  • Papan: papan pengembangan adalah cara murah untuk mulai mengembangkan dengan Mbed OS dan komponen lainnya.
  • Komponen: Basis Data Komponen menghosting pustaka yang dapat digunakan kembali untuk berbagai perangkat keras, middleware, dan layanan IoT yang dapat Anda gunakan dengan Mikrokontroler Arm. Komponen-komponen ini dapat digunakan sebagai landasan untuk mengembangkan prototipe dan produk dengan cepat.

Peralatan

Rangkaian produk Mbed mencakup alat yang Anda perlukan untuk bekerja dengan Mbed OS, apa pun tingkat keahlian Anda. Jika Anda seorang pengembang berpengalaman dengan pengaturan desktop, Anda mungkin lebih suka bekerja secara offline dengan Arm Mbed CLI, alat baris perintah berbasis Python kami. Anda dapat menggunakan Mbed CLI dengan salah satu dari tiga toolchain yang didukung: Arm Compiler 6, GCC, dan IAR. Anda juga dapat mengekspor proyek untuk IDE lain, seperti Keil MDK. Mbed OS menyertakan kode integrasi untuk setiap rantai alat yang didukung agar aman untuk thread.

Perangkat dari Silicon Laboratories tidak begitu populer di kalangan amatir; mereka jauh dari produk andalan seperti Atmel. Namun, mereka juga memiliki mikrokontroler jalur utama dalam paket TQFP yang cukup dapat diakses oleh manusia biasa, dan starter kit USB ToolStick (yang baru-baru ini disebutkan di hub). Saya sendiri memulai perkenalan saya dengan teknologi mikroprosesor dengan bekerja dengan “silab”, dan cukup berhasil.
Pada artikel ini saya akan memberi tahu Anda bagaimana Anda dapat mengatur komunikasi antara komputer dan MK menggunakan antarmuka USB, dan bagaimana Silabs mencoba menyederhanakannya bagi pengembang.
Sebagai pengujian kami akan menggunakan papan C8051F320DK, dengan mikrokontroler seri F32x, masing-masing, mendukung perangkat keras USB, dan lingkungan pengembangan uVision4 Keil.

Sebelum Anda mulai menggali penerapan komunikasi USB, Anda perlu memutuskan beberapa aspek dasar protokol: tempat apa yang ditempati perangkat dalam topologi (host atau slave) dan apa sifat informasi yang dikirimkan melalui antarmuka.

Arsitektur USB memungkinkan empat tipe dasar transfer data:

  • Kontrol pesan ( transfer kendali) – digunakan untuk mengonfigurasi perangkat selama koneksinya dan untuk mengontrol perangkat selama pengoperasian. Protokol memberikan jaminan pengiriman data.
  • Transfer array data ( transfer data massal) adalah transfer tanpa kewajiban apa pun mengenai penundaan pengiriman dan kecepatan transmisi. Transfer array dapat menempati seluruh bandwidth bus yang bebas dari jenis transfer lainnya. Roda gigi ini memiliki prioritas paling rendah dan dapat ditangguhkan ketika bus memuat banyak muatan. Pengiriman dijamin - jika terjadi kesalahan yang tidak disengaja, pengulangan dilakukan. Transfer array cocok untuk bertukar data dengan printer, pemindai, perangkat penyimpanan, dll.
  • Interupsi ( mengganggu transfer) – transmisi pendek yang bersifat spontan dan harus diservis tidak lebih lambat dari yang dibutuhkan oleh perangkat.
    Batas waktu layanan diatur pada kisaran 10-255 ms untuk
    rendah, 1-255 ms untuk kecepatan penuh, pada kecepatan tinggi Anda dapat memesan 125 µs. Jika terjadi kesalahan pertukaran acak, pengulangan dilakukan. Interupsi digunakan, misalnya saat memasukkan karakter dari keyboard atau untuk mengirimkan pesan tentang pergerakan mouse.
  • Transmisi isokron ( transfer isokron) – transmisi berkelanjutan secara real-time, menempati bagian kapasitas bus yang telah disepakati sebelumnya dengan jaminan waktu tunda pengiriman. Mereka memungkinkan Anda untuk mengatur saluran dengan bandwidth 1,023 MB/s (atau dua 0,5 MB/s masing-masing) dengan kecepatan penuh, menempati 70% dari bandwidth yang tersedia (sisanya dapat diisi dengan saluran yang kurang luas). Pada kecepatan tinggi, titik akhir dapat menerima tautan hingga 24 MB/s (192 Mbps). Jika kesalahan terdeteksi, data isochronous tidak dicoba lagi - paket yang tidak valid akan diabaikan. Transfer isochronous diperlukan untuk perangkat streaming: kamera video, perangkat audio digital (speaker USB, mikrofon), perangkat pemutaran dan perekam audio dan video (CD dan DVD).
Jika MK terhubung ke komputer, pengontrolnya jelas akan menjadi perangkat budak.

Membuat Perangkat Joystick yang Sesuai dengan HID USB

Jenis perangkat USB yang paling umum dan paling mudah diterapkan adalah HID (Human Interface Devices). Jenis transmisi yang digunakan, standar untuk perangkat tersebut, adalah interupsi. Perwakilan khas dari kelas ini adalah keyboard USB, mouse, joystick, panel pengaturan monitor, pembaca kode batang, pembaca kartu, dll.
Kelebihan perangkat HID adalah:
  • kemudahan implementasi;
  • kode kompak;
  • Dukungan Windows (tidak diperlukan driver tambahan).
Jadi, mari kita terapkan yang paling sederhana manipulator joystick. Misalnya, kita memerlukan pegangan gas dengan dua (atau lebih) tombol untuk mekanisme tempur (!), yang kita rakit di garasi. Papan demo C8051F320DK memiliki satu resistor variabel dan 2 tombol - minimal cukup.

Silabovtsy memberikan contoh firmware mikrokontroler, yang mengemulasi mouse USB dengan antarmuka HID. Contoh ini cukup untuk mengimplementasikan sebagian besar antarmuka interaksi manusia dengan cepat dan mudah. Akibatnya, dalam contoh yang diambil sebagai dasar, perlu dilakukan pengerjaan ulang:

  1. Konfigurasi deskriptor perangkat HID;
  2. prosedur transfer data;
  3. Pegangan nama perangkat HID.
Mari kita mulai dengan deskriptor perangkat
Kita memerlukan deskriptor dalam bentuk berikut:
kode const hid_report_descriptor HIDREPORTDESC =
{
0x05, 0x01, // USAGE_PAGE (Desktop Umum)

0x09, 0x04, // PENGGUNAAN (Joystick)
0xa1, 0x01, // KOLEKSI (Aplikasi)
0x05, 0x02, // USAGE_PAGE (Kontrol Simulasi)
0x09, 0xbb, // PENGGUNAAN (Throttle)
0x15, 0x00, // LOGIS_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // UKURAN_LAPORAN (8)
0x95, 0x01, // REPORT_COUNT (1)

0x05, 0x09, // USAGE_PAGE (Tombol)
0x19, 0x01, // USAGE_MINIMUM (Tombol 1)
0x29, 0x02, // USAGE_MAXIMUM (Tombol 2)
0x15, 0x00, // LOGIS_MINIMUM (0)
0x25, 0x01, // LOGIS_MAKSIMUM (1)
0x75, 0x01, // UKURAN_LAPORAN (1)
0x95, 0x08, // REPORT_COUNT (8)
0x55, 0x00, // UNIT_EKPONEN (0)
0x65, 0x00, // UNIT (Tidak Ada)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0 //END_COLLECTION
}
Sekarang mari kita lihat lebih dekat apa itu. Bagian terpenting dalam mendeskripsikan perangkat masa depan adalah tipe data. Bagian harus dijelaskan Kontrol Simulasi(simulasi elemen kontrol), yang baru saja dimiliki Mencekik(throttle), untuk ini kami menunjukkan:
  • rentang nilai di mana ia akan beroperasi Mencekik– LOGICAL_MINIMUM(0) dan LOGICAL_MAXIMUM(255),
  • atur ukuran rentang ini (satu byte) – REPORT_SIZE (8) dan
  • jumlah kontrol jenis ini – REPORT_COUNT (1).
Ceritanya serupa dengan tombol (USAGE_PAGE ( Tombol)):
  • rentang nilai - LOGICAL_MINIMUM(0) dan LOGICAL_MAXIMUM(1);
  • ukuran rentang(satu bit) - REPORT_SIZE(1);
  • ada lebih dari satu tombol, jadi disini perlu menggunakan field panjang byte yang artinya REPORT_COUNT (8);
Semua ini diperlukan untuk sistem operasi; sekarang ia akan mengetahui cara menangani 2 byte yang akan diterimanya dari pengontrol, menggunakan deskriptor sebagai kunci dekripsi.
Ya, dan juga, di .h ada baris berikut, tepat sebelum deklarasi hid_report_descriptor:
#tentukan HID_REPORT_DESCRIPTOR_SIZE 0x002C
#define HID_REPORT_DESCRIPTOR_SIZE_LE 0x2C00 //LITTLE ENDIAN

Penting di sini bahwa ukuran deskriptor diatur setelah deskriptor itu sendiri dikompilasi, dan itu harus ditentukan agar pengontrol dapat dikenali oleh komputer.

Untuk menyederhanakan tugas membuat deskriptor, Anda dapat menggunakan program yang terdapat di www.usb.org (HID Descriptor Tool). Program ini dilengkapi dengan contoh konfigurasi beberapa perangkat HID, yang dapat Anda sesuaikan dengan tugas Anda atau membuat perangkat HID Anda sendiri.
Ini mengakhiri deskripsi joystick dan Anda perlu menyiapkan data untuk ditransfer ke PC.

Prosedur transfer data
Kami menemukan kode berikut dalam contoh:
batal IN_Laporan(batal)(

IN_PACKET = VEKTOR;
IN_PACKET = TOMBOL;

// arahkan pointer IN_BUFFER ke paket data dan setel
// Panjang IN_BUFFER untuk mengirimkan ukuran laporan yang benar
IN_BUFFER.Ptr = IN_PACKET;
IN_BUFFER.Panjang = 2;
}

Prosedur ini melibatkan kompilasi paket terkirim, yang kemudian dikirimkan melalui penunjuk yang rumit (sebenarnya, ini hanyalah struktur penunjuk dan panjangnya) dan dikirimkan oleh perangkat kami. Hal utama adalah menyusun paket dengan hati-hati, seperti yang ditunjukkan oleh komentar tersebut kepada kami, dan kemudian mereka akan melakukan semuanya tanpa partisipasi kami.
Sekarang saya akan memberi tahu Anda bagaimana dan di mana kita mendapatkan variabel VECTOR dan BUTTONS (keduanya bertipe unsigned char, berukuran byte).
Variabel global VECTOR diberi nilai dari ADC ketika terjadi interupsi darinya:
batal ADC_Conver_ISR(batal) interupsi 10
{
AD0INT = 0;

// indikasi operasi ADC
jika(VEKTOR != ADC0H)
LED = 1;
kalau tidak
LED = 0;

VEKTOR = ADC0H;
}

Variabel global BUTTONS juga mengubah nilainya berdasarkan penekanan tombol. Tombol-tombol tersebut disurvei oleh interupsi pengatur waktu. Atur pengatur waktu sesuai dengan preferensi pribadi Anda.
void Timer2_ISR (batal) interupsi 5
{
P2 &= ~Led_2;

If ((P2 & Sw1)==0) // Periksa apakah tombol #1 ditekan
{
// ditekan
TOMBOL = TOMBOL | (1<<0);
LED2 = 1;
}
kalau tidak
{
//tidak ditekan
TOMBOL = TOMBOL & 0xFE;
}

If ((P2 & Sw2)==0) // Periksa apakah tombol #2 ditekan
{
// ditekan
TOMBOL = TOMBOL | (1<<1);
LED2 = 1;
}
kalau tidak
{
//tidak ditekan
TOMBOL = TOMBOL & 0xFD;
}
TF2H = 0; // Hapus tanda interupsi Timer2
}

Deskriptor Nama Perangkat HID
Terakhir, kita dapat menyesuaikan data string sehingga perangkat memiliki nama yang kita inginkan (dalam contoh saya, “JOYSTICK-HABR”).
Mencari deskriptor string String2Desc, tulis ulang
#tentukan ukuran STR2LEN ("JOYSTICK-HABR") * 2

Kode const unsigned char String2Desc =
{
STR2LEN, 0x03,
"J", 0,
"HAI", 0,
"Y", 0,
"S", 0,
"T", 0,
"Aku", 0,
"C", 0,
"K", 0,
"-", 0,
"H", 0,
"A", 0,
"B", 0,
"R", 0,
};

Identifikasi Perangkat HID
Setelah menyusun proyek dan memprogram mikrokontroler, Anda dapat menghubungkan perangkat ke port USB. Tuan rumah menentukan bahwa perangkat tersebut termasuk dalam kelas HID dan mentransfer kendali perangkat ke driver yang sesuai.

Sekarang di Windows kita pergi ke Control Panel->Game Devices dan melihat penumpang kita di sana. Kami melihat properti dan memeriksa fungsinya.

Kecepatan transmisi yang rendah adalah batasan utama pilihan desain perangkat HID. Kecepatan transfer data maksimum yang mungkin dilakukan dengan organisasi pertukaran tersebut adalah 64 Kbit/detik. Angka ini, dibandingkan dengan kecepatan bus USB penuh sebesar 12 Mbit/s, tampak seperti kelemahan teknologi HID dalam hal pemilihan implementasi USB tertentu. Namun, untuk banyak tugas komunikasi, kecepatan yang ditentukan cukup memadai dan arsitektur HID, sebagai alat khusus, mengambil tempat yang tepat di antara metode pengorganisasian pertukaran data.

Secara umum, perangkat HID mudah diterapkan di hampir semua MCU yang mendukung USB. Sebagai aturan, satu contoh kerja dari pengembang sudah cukup, dengan menyesuaikannya Anda bisa mendapatkan fungsionalitas apa pun yang diperlukan.

Membuat perangkat USB lengkap menggunakan toolkit Silabs USBXpress

Namun ada saatnya Anda perlu menggunakan protokol Anda sendiri untuk bekerja dengan perangkat di MK. Pada saat yang sama, saya ingin mentransfer banyak data dengan kecepatan tinggi, dan melakukan semua ini menggunakan laptop saya, yang memiliki banyak USB dan tidak ada satu pun COM, dan bahkan perangkat Anda tidak boleh lebih besar dari kotak korek api, dan dipasang pada papan USB-UART pada chip FT232RL tidak dimungkinkan.
Saat itulah orang-orang dari Silabs memutuskan untuk membuat hidup semua orang lebih mudah dan menunjukkan “jalan menuju masa depan”, tanpa bersusah payah menulis kayu bakar dan firmware mereka sendiri.
Kit Pengembangan USBXpress adalah solusi lengkap untuk MCU dan host (PC), menyediakan pekerjaan sederhana dengan protokol USB menggunakan API tingkat tinggi untuk kedua sisi. Tidak diperlukan pengetahuan khusus tentang protokol USB itu sendiri atau penulisan driver. Inilah yang ditulis oleh kaum Silabov dalam panduan mereka.


Berbicara tentang Panduan Pemrogram: hanya memakan 30 halaman, ini sangat sederhana dan mudah dipahami. Saya pribadi tidak suka contohnya, seringkali ada tempat yang sangat bengkok, dan lebih baik tidak melihat program PC sama sekali, mereka sangat tidak dapat dibaca. .
USBXpress DK tersedia untuk mikrokontroler jalur C8051F32x, C8051F34x dan CP210x (USB-to-UART Bridge Controller). Perpustakaan USBXpress mencakup perpustakaan tingkat rendah, driver USB untuk PC, dan DLL untuk pengembangan aplikasi tingkat tinggi. Dan, tentu saja, serangkaian dokumentasi dan contoh.
Perpustakaan mengimplementasikan transfer data hanya dalam mode BULK. Saat menggunakan semua fungsi perpustakaan, implementasinya hanya akan memakan 3 KB memori Flash mikrokontroler.
Firmware
Mari kita lihat satu contoh yang kurang lebih sederhana dan mudah dipahami, fungsinya mirip dengan contoh HID sebelumnya. Kami tidak akan masuk ke aplikasi PC; semuanya akan menjadi jelas setelah kami menyelesaikan firmware untuk MK.
Jadi, inti dari contoh TestPanel: kita mengambil pembacaan dari mikrokontroler ADC (Potensiometer) dan termometer bawaan ( Suhu), serta dari menekan tombol ( Switch1Status Dan Switch2State), dan kita sendiri dapat mengedipkan LED ( Led1 Dan Led2).
Sekarang langkah-langkah wajib dan poin-poin halus yang akan kita pertimbangkan:
  1. Menulis deskriptor USB;
  2. Inisialisasi perangkat dan USB terpasang;
  3. Memproses data masuk dan menghasilkan paket keluar;
  4. Penanganan interupsi.
Namun pertama-tama, saat membuat proyek, jangan lupa sertakan file header di dalamnya USB_API.h dan perpustakaan itu sendiri USBX_F320_1.lib.
Menulis Deskriptor USB
Berbeda dengan HID dengan struktur formalnya yang cerdik, semuanya sederhana di sini
kode const UINT USB_VID = 0x10C4;
kode const UINT USB_PID = 0xEA61;
kode const BYTE USB_MfrStr = (0x1A,0x03,"S",0,"i",0,"l",0,"a,0,"b,0,"s,0);
kode const BYTE USB_ProductStr = (0x10,0x03,"U",0,"S",0,"B",0,"X",0,"_",0,"A",0,"P", 0);
kode const BYTE USB_SerialStr = (0x0A,0x03,"H",0,"A",0,"B",0,"R",0);
kode const BYTE USB_MaxPower = 15;
kode const BYTE USB_PwAttributes = 0x80;
kode const UINT USB_bcdDevice = 0x0100;

Saya pikir semuanya jelas dengan VID, PID dan nama, ditambah lagi Anda juga dapat mengatur arus maksimum dengan parameter MaxPower (max.current = _MaxPower*2), PwAttributes - parameter yang bertanggung jawab untuk membangunkan host dari jarak jauh, dan bcdDevice - nomor rilis perangkat.

Nuansa inisialisasi perangkat dan USB on board
Sekarang mari kita mulai dengan fungsi utama itu sendiri, di mana MK tanpa lelah akan menerima dan mengirimkan data.
batal utama (batal)
{
PCA0MD &= ~0x40; // Nonaktifkan pengatur waktu Watchdog
USB_Jam_Mulai(); // Init jam USB *sebelum* memanggil USB_Init
USB_Init(USB_VID,USB_PID,USB_MfrStr,USB_ProductStr,USB_SerialStr,USB_MaxPower,USB_PwAttributes,USB_bcdDevice);

Inisialisasi();
USB_Int_Enable();
...

Di sini, seperti yang diperlukan dalam komentar, pertama-tama perlu menginisialisasi generator jam untuk USB sebelum inisialisasi itu sendiri, dan baru kemudian melakukan operasi awal yang tersisa untuk MK - Initialize(); - yang mengkonfigurasi port, timer dan ADC; lalu kita aktifkan interupsi USB.

Memproses data masuk dan menghasilkan paket keluar
Di sini kita sampai pada hal yang paling penting
//... lanjutan dari main
sementara (1)
{
jika (Paket_Keluar == 1) Led1 = 1;
jika tidak, Led1 = 0;
jika (Paket_Keluar == 1) Led2 = 1;
jika tidak, Led2 = 0;

In_Packet = Switch1State;
In_Packet = Switch2State;
In_Packet = Potensiometer;
In_Packet = Suhu;
}
// akhir dari utama
}

Out_Packet – paket diterima dari host;
In_Packet - paket dikirim ke host;
Intinya jelas, MK selalu mengupdate paket terkirim dan membaca status paket diterima.

Penanganan interupsi
Sekarang singkatnya tentang dari mana kita mendapatkan nilai dalam paket yang dikirim. Seperti pada contoh HID, status tombol diperoleh dari interupsi dari timer, dan nilai ADC serta termometer diperoleh dari interupsi dari ADC.
Berikut adalah satu poin halus - saat menginisialisasi ADC, kami mengonfigurasinya sehingga konversi nilai terjadi ketika pengatur waktu meluap (yang sama yang kami gunakan untuk tombol), dan interupsi dari ADC itu sendiri terjadi ketika konversi selesai . Dan di sini, selain menerima nilai konverter di akhir prosedur, kami memanggil fungsi API
Block_Write(Dalam_Paket, 8)
yang mengirimkan data yang dikumpulkan ke komputer.
Menerima perintah dari komputer terjadi dalam prosedur pemrosesan interupsi USB:
batal USB_API_TEST_ISR(batal) interupsi 16
{
BYTE INTVAL = Get_Interrupt_Source();

Jika (INVAL & RX_COMPLETE)
{
Block_Read(Paket_Keluar, 8);
}

Jika (INTVAL & DEV_SUSPEND)
{
Tangguhkan_Perangkat();
}

Jika (INVAL & DEV_CONFIGURED)
{
Inisialisasi();
}
}

Poin ini dijelaskan secara rinci dalam Panduan Pemrogram. Intinya adalah fungsi API Get_Interrupt_Source() dipanggil, mengembalikan kode untuk alasan interupsi API.

Program di PC
Saya tidak akan membongkar program komputer. Tim Silab memberikan contoh dalam Visual Basic dan C, tetapi tanpa melihat kode sumbernya, menghubungkan perpustakaan di lingkungan pengembangan yang Anda gunakan dan membaca beberapa halaman tentang fungsi tersebut seharusnya tidak menimbulkan kerumitan apa pun.
Jadi saya akan menggunakan contoh program yang sudah dikompilasi.

Jadi, kami mengkompilasi proyek untuk MK, mem-flash-nya, menginstal driver universal untuk USBXpress dan menghubungkan papan debug. Sistem akan mendeteksi perangkat baru dan menginstal driver untuk perangkat tersebut.
Setelah instalasi, mari kita lihat apa yang terjadi di Windows Device Manager:


Sekarang mari kita jalankan programnya:


Kami melihat bahwa dia menemukan perangkat itu dengan benar.


Itu saja, sekarang Anda dapat menekan tombol, mengedipkan dioda, menghangatkan MK dengan tangan Anda, dan melihat bagaimana suhunya naik.

Kesimpulan

Secara umum, membuat perangkat USB menggunakan perpustakaan USBXpress ternyata merupakan proses yang lebih cepat dan transparan dibandingkan menggunakan arsitektur HID. Dan kecepatannya pasti akan lebih tinggi. Titik terlemahnya adalah perpustakaannya ditutup, dan tidak mungkin untuk mengetahui seberapa andal solusi ini, terlebih lagi, hanya mode transfer data BULK yang tersedia.
Sumber yang digunakan dan bermanfaat:
  1. Guk M., antarmuka perangkat keras PC. Ensiklopedi. - SPb.: Peter, 2002. - 528 hal.
  2. Kurilin A.I. Mikrokontroler Silicon Labs dengan antarmuka USB. Majalah “Komponen Elektronik” No. 5 Tahun 2007

Berkembang USB atau Bluetooth periferal, sering kali diperlukan untuk mengimplementasikan antarmuka Menyembunyikan. Dalam posting ini kita akan melakukannya seperti manusia, dan tidak seperti orang lain...

Secara singkat: apa itu HID dan apa fungsinya?

Seperti namanya, kelas antarmuka yang dimaksud dirancang untuk mengimplementasikan perangkat interaksi pengguna. Namun karena kesederhanaan dan kenyamanannya, mereka sering bekerja dengan periferal jenis lain melalui antarmuka ini. Dari sisi perangkat, penerapan HID sangat sederhana: Anda tidak perlu memikirkan protokol pertukaran data tingkat rendah, menjelaskan laporan, dan memproses permintaan dengan mudah. Dan di sisi host, perangkat HID dapat bekerja di ruang pengguna melalui driver sistem operasi standar. Tentu saja, CDC ACM juga memungkinkan Anda untuk bertukar data dengan perangkat dengan cara yang sama, tetapi kelas ini lebih sulit diterapkan pada perangkat, lebih mudah untuk mengatur interaksi thread yang berkelanjutan, dan kurang cocok untuk bekerja dalam permintaan-respons mode.

Baca selengkapnya: dari mana kaki tumbuh dan cara kerjanya

HID adalah hal yang universal: pertukaran data dilakukan dengan mengirim dan menerima apa yang disebut laporan (Laporan HID), yang masing-masing harus kami jelaskan dengan cara khusus sehingga driver sistem operasi yang bertanggung jawab untuk bekerja dengan HID dapat memahami dengan benar internal struktur data kami. Jika kita menerapkan perangkat input standar, seperti keyboard, mouse, atau joystick, maka dengan menganalisis isi deskriptor laporan perangkat kita, pengemudi akan memahami cara memperoleh data yang diinginkan, baik itu tombol yang ditekan atau informasi. tentang gerakan penunjuk. Meskipun kami menggunakan HID untuk beberapa tujuan kami sendiri dan bertukar laporan dari program kami sendiri, kami tetap diwajibkan untuk mendeskripsikan laporan dengan baik sesuai dengan spesifikasinya.

Deskriptor laporan

Jadi, pembentukan deskriptor laporan yang sama adalah bagian tersulit dalam penerapan periferal HID. Apa pun yang dilakukan pengembang, semuanya akan berakhir buruk. Beberapa menggunakan program khusus (seperti yang resmi Alat Deskriptor HID), yang memungkinkan Anda membuat deskriptor di antarmuka grafis, dan menampilkan kumpulan byte yang sudah jadi. Yang lain menggunakan konverter yang mengubah deskripsi teks menjadi kode dan sebaliknya (misalnya, hidrd). Semuanya akan baik-baik saja, tetapi dukungan lebih lanjut terhadap kode tersebut yang dihasilkan oleh alat pihak ketiga akan menjadi jauh lebih rumit: dengan setiap koreksi, Anda perlu menggunakan program terkait lagi. Yang lain lagi dengan bodohnya mengambil deskriptor yang sudah jadi dari contoh, menyesuaikan ukuran dan jumlah data agar sesuai dengan tugas mereka, dan menukar paket dalam formatnya sendiri yang tidak sesuai dengan isi deskriptor sebenarnya. Namun pendekatan ini juga penuh dengan banyak momen buruk, yang tidak selalu terlihat jelas, seperti, secara umum, penyimpangan lainnya dari isi spesifikasi.

Kami akan mengambil rute langsung: kami akan membentuk deskriptor dengan cara yang jelas dan mudah dibaca, menggunakan makro dari praprosesor C, dengan cara yang familiar dan nyaman bagi kami, para spesialis CSE. Pendekatan ini tidak menggantikan kebutuhan untuk membiasakan diri dengan spesifikasi Menyembunyikan 1.11 untuk memahami prinsip dasar pembuatan deskriptor pelaporan, namun membebaskan Anda dari kebutuhan untuk mengetahui detail format biner. Dengan kata lain, kami akan mendeskripsikan deskriptor kira-kira seperti yang dijelaskan dalam contoh spesifikasi yang disebutkan di atas.

Prinsip dasar

Bagi yang terlalu malas untuk membahas spesifikasinya sekarang dan mendalami intinya, baca teks gratis saya di bawah ini.

Deskripsi laporan terdiri dari apa yang disebut elemen atau poin, yang masing-masing terdiri dari header dan, opsional, blok data. Secara umum, elemen bisa pendek dan panjang, tetapi di sini kami hanya akan menjelaskan yang pendek saja, karena kami hanya akan mengerjakannya. Header elemen mencakup bidang ukuran data (2 bit), bidang tipe (2 bit), dan bidang tag (4 bit) dengan total 8 bit. Bidang ukuran menentukan panjang data dalam byte: 0, 1, 2 atau 4 byte. Bidang tipe menentukan tipe: main, global, lokal. Bidang tag menentukan elemen itu sendiri. Ada banyak elemen yang berbeda, dan kami tidak akan menjelaskan semuanya di sini; kami hanya akan fokus pada beberapa elemen utama saja.

Contoh deskriptor

Anggaplah kita sedang mengembangkan perangkat standar seperti mouse. Berikut adalah contoh deskriptor laporan dari spesifikasi:

Halaman Penggunaan (Desktop Generik), Penggunaan (Mouse), Koleksi (Aplikasi), Penggunaan (Pointer), Koleksi (Fisik), Halaman Penggunaan (Tombol), Penggunaan Minimum (01), Maksimum Penggunaan (03), Minimum Logis (0) , Maksimum Logis (1), Jumlah Laporan (3), Ukuran Laporan (1), Input (Data, Variabel, Mutlak), Jumlah Laporan (1), Ukuran Laporan (5), Input (Konstan), Halaman Penggunaan (Desktop Generik ), Penggunaan (X), Penggunaan (Y), Logis Minimum (-127), Logis Maksimum (127), Ukuran Laporan (8), Jumlah Laporan (2), Input (Data, Variabel, Relatif), Pengumpulan Akhir, Akhir Koleksi

Apa yang kita lihat di sini? Dan kami hanya melihat elemen kami, satu elemen per baris. Setiap elemen dalam contoh ini membutuhkan 2 atau 1 byte. Yang pertama adalah elemen global Halaman Penggunaan, yang menjelaskan tujuan perangkat kita (Desktop Generik). Berikutnya adalah elemen Penggunaan lokal, yang menentukan jenis perangkat sebenarnya (Mouse), sehingga memberikan petunjuk kepada driver OS. Kemudian, dengan menggunakan elemen Koleksi utama, deskripsi kumpulan jenis Aplikasi dimulai, dan sekali lagi ada elemen Halaman Penggunaan, tetapi kali ini mendefinisikan tujuan koleksi sebagai penunjuk (Pointer), dengan demikian semua elemen selanjutnya naik ke elemen di akhir koleksi akan merujuk ke pointer.

Selanjutnya, kumpulan tipe Fisik dimulai dan dalam kumpulan ini elemen laporan Tombol dijelaskan. Elemen lokal Penggunaan Minimum dan Penggunaan Maksimum dikaitkan dengan kasus penggunaan tertentu, dalam hal ini elemen tersebut mengidentifikasi tombol mouse pertama dan terakhir. Selanjutnya, elemen global Logical Minimum dan Logical Maximum menetapkan nilai minimum dan maksimum dari status tombol-tombol ini. Elemen global berikut Jumlah Laporan dan Ukuran Laporan menentukan jumlah nilai dalam laporan dan ukuran setiap nilai dalam bit. Elemen Input utama mengakhiri deskripsi tombol dan mendefinisikan bidang yang dijelaskan sebagai bagian dari deskriptor laporan input. Tanda berikut diberikan dalam tanda kurung: Data - berarti bahwa bidang yang dijelaskan harus diperlakukan sebagai data dan bukan sebagai konstanta, Variabel - variabel dijelaskan dan bukan array, Absolut - nilai harus diperlakukan sebagai absolut.

Seringkali lebih mudah untuk menyelaraskan data berdasarkan byte atau kata, tetapi dalam deskripsi laporan, ukurannya ditentukan dalam bit, jadi apa yang disebut padding ditambahkan untuk penyelarasan. Tiga baris berikutnya hanya menyatakan indentasi setelah bit status dari tiga tombol dalam laporan dengan jumlah 1 dan ukuran 5 bit, dan agar driver mengabaikan bit ini, bendera Konstan digunakan di Elemen masukan, bukan Data.

Berikut ini menjelaskan bidang koordinat kursor dengan cara yang sama. Karena mouse, tidak seperti digitizer, biasanya menghasilkan koordinat relatif, Relatif ditentukan dalam elemen Input, bukan Absolut. Dan karena koordinat relatif ini dapat berupa positif dan negatif, nilai batas yang sesuai ditunjukkan dalam Logical Minimum dan Logical Maximum dari -127 hingga 127. Setiap nilai dialokasikan hingga 8 bit (Ukuran Laporan) dan total 2 nilai ​​(Jumlah Laporan). Petunjuk kepada pengemudi tentang urutan bidang dengan nilai koordinat diberikan di sini menggunakan elemen Penggunaan.

Deskripsi deskriptor di C

Jadi, tugas kita adalah menyajikan deskripsi yang sama menggunakan bahasa C, yang akan dibantu oleh preprosesor C. Contoh yang sama akan terlihat seperti sekarang:

#termasuk /* Definisi makro untuk HID Report Descriptor DSL kami */ #include "hid_def.h" static const uint8_t hid_report_descriptor = ( HID_USAGE_PAGE (GENERIC_DESKTOP), HID_USAGE (MOUSE), HID_COLLECTION (APPLICATION), HID_USAGE (POINTER), HID_COLLECTION (FISIK), HID_USAGE_PAGE (BUTTONS), HID_USAGE_MINIMUM (1, 1), HID_USAGE_MAXIMUM (1, 3), HID_LOGICAL_MINIMUM (1, 0), HID_LOGICAL_MAXIMUM (1, 1), HID_REPORT_COUNT (3), HID_REPORT_SIZE (1), HID_INPUT (DATA, VARIABEL, MUTLAK ) , Hid_report_count (1), hid_report_size (5), hid_input (konstan), hid_usage_page (generic_desktop), hid_usage (x), hid_usage (y), hid_logical_minimum (1, -127), hid _Logical_maximum (1, 127), hid_report_size ( 8) , HID_REPORT_COUNT (2), HID_INPUT (DATA, VARIABEL, RELATIF), HID_END_COLLECTION (FISIK), HID_END_COLLECTION (APLIKASI), );

Seperti yang Anda lihat, deskripsinya sedekat mungkin dengan contoh spesifikasi, tetapi ada beberapa perbedaan terkait implementasi makro praprosesor yang menjelaskan elemen. Karena ukuran data beberapa elemen tidak tetap, kami perlu menunjukkan ukuran ini. Oleh karena itu, parameter pertama untuk elemen yang menetapkan batas minimum/maksimum adalah ukuran nilai dalam byte, dan parameter kedua adalah nilai itu sendiri. Makro yang mendefinisikan elemen utama Input, Output, Feature dirancang sedemikian rupa sehingga dapat menerima sejumlah flag sebagai input, termasuk tidak ada flag, sehingga flag Data dan Absolute sebenarnya tidak diperlukan, karena sudah disetel secara default.

Anda mungkin memperhatikan bahwa makro HID_END_COLLECTION kami menggunakan tipe koleksi sebagai argumen. Jadi, dari sudut pandang deskriptor, hal ini tidak masuk akal, hal ini dilakukan hanya untuk kenyamanan, sehingga segera jelas koleksi mana yang sedang diselesaikan, tetapi secara teknis Anda dapat menentukan argumen apa pun yang Anda suka atau lakukan tanpa argumen tersebut. sama sekali.

Bergabunglah dengan pesta

Saya tidak akan menyembunyikannya, definisi makro untuk bahasa khusus domain kami ada di file sembunyikan_def.h berisi keajaiban praprosesor dalam dosis besar yang ditentukan dalam file header lain makro.h.

Saya telah mengirimkan proyek ini ke repositori github:katyo/hid_def, jadi sekaranglah waktunya untuk mulai menulis deskriptor laporan HID dengan cara yang manusiawi.

Saat ini, sebagian besar komputer modern tidak memiliki port serial dan paralel, yang sebelumnya digunakan untuk bermain game. Penggunaan USB kini semakin populer di kalangan peminat. Sayangnya, USB bukanlah protokol yang paling mudah dan sering kali sangat mengintimidasi. Namun, ada beberapa solusi di pasaran yang memudahkan penerapan perangkat USB.

Proyek ini membahas penggunaan mikrokontroler dan kompiler PIC berkemampuan USB untuk mengubah joystick port game lama sehingga dapat digunakan melalui USB. Salah satu manfaat kompiler mikroC adalah pembuatan perpustakaan HID USB yang memudahkan pembuatan perangkat USB HID. Saat menulis kode USB menggunakan kompiler mikroC, perangkat USB yang dihasilkan adalah perangkat HID sebenarnya yang dapat digunakan untuk mengirim dan menerima data dari mikrokontroler PIC. Namun, dimungkinkan untuk memodifikasi deskriptor USB yang dihasilkan oleh mikroC sehingga perangkat USB HID tertentu dapat diperoleh, seperti keyboard, mouse, joystick, atau tablet input grafis.

Penyusun

Proyek ini menggunakan kompiler mikroC v8. Metode yang digunakan mirip dengan kebanyakan kompiler lain yang menghasilkan kode HID.

tuas kendali

Proyek ini menggunakan joystick lama IBM 76H1571, foto ditampilkan di bawah:

76H1571 adalah joystick 4 tombol dengan roda throttle dan sakelar tampilan topi POV. Hal yang paling menarik adalah Anda tidak dapat menggunakan roda dan sakelar secara bersamaan - Anda dapat menggunakan salah satu elemen atau elemen lainnya. Dua sakelar geser di bagian depan joystick digunakan untuk menghidupkan dan mematikan roda dan sakelar POV, sehingga Anda dapat memilih elemen mana pun yang ingin Anda gunakan kapan saja.

Karena tidak ada batasan pada antarmuka USB, joystick yang dikonversi akan dapat menggunakan roda dan sakelar tampilan secara bersamaan. Maka kedua sakelar tersebut tidak akan digunakan, jadi mengapa tidak menetapkan fungsi baru padanya?

Sebagai kesimpulan, saya ingin menunjukkan bahwa joystick yang dikonversi memiliki karakteristik sebagai berikut:

  • Joystick 2 sumbu
  • Throttle Roda
  • Sakelar POV 4 arah
  • 6 tombol

Deskriptor Laporan HID

Ketika kompiler menghasilkan kode HID USB, ia membuat deskriptor yang dikirim ke host USB dan menunjukkan jenis perangkat USB apa yang sedang dihubungkan. Deskriptor perangkat HID sedikit berbeda karena memiliki deskriptor tambahan yang terpasang di dalamnya yang mengidentifikasi jenis perangkat HID dan cara penggunaannya. Bagian ini akan membahas proses mengubah perangkat kita menjadi joystick.

Membuat Pegangan

Situs web USB IF menghosting program berguna yang membuat pembuatan deskriptor laporan HID menjadi lebih mudah. Ini disebut Alat Deskriptor HID dan dapat diunduh secara gratis dari halaman Alat HID. Setelah mengunduh, buka paket arsip dan jalankan file Dt.exe.

Dengan menggunakan program ini Anda dapat membuat deskriptor laporan Anda sendiri untuk joystick (atau perangkat HID lainnya), menentukan jumlah sumbu dan tombol, dan menentukan karakteristik lainnya (pedal kemudi, roda, dll.). Program ini juga dilengkapi dengan templat deskriptor yang dapat langsung Anda gunakan atau modifikasi sesuai kebutuhan Anda. Mereka berada di folder yang sama dengan file yang dapat dieksekusi dan memiliki ekstensi .hid. Templat pegangan joystick disebut joystk.hid, itulah yang saya gunakan. Setelah dimuat, layar berikut akan muncul:

Bagian penting disorot dengan bingkai merah. Mereka menunjukkan parameter berikut:

  • 1 roda, dijelaskan dengan nilai 8-bit dari -127 hingga 127
  • sumbu X dan Y
  • 1 sakelar tampilan POV, memiliki 4 posisi (0-3) dan mewakili sudut 0-270, dijelaskan dengan nilai 4-bit
  • 4 tombol, masing-masing dijelaskan oleh 1 bit

Seperti yang Anda lihat, indikatornya REPORT_SIZE mendefinisikan kedalaman bit data yang digunakan untuk mewakili parameter dan eksponen REPORT_COUNT, yang menentukan jumlah laporan yang dikirim untuk mewakili parameter.

Modifikasi deskriptor

Menambahkan pegangan ke kode Anda

Setelah membuat pegangan laporan, Anda harus mengekspornya ke kode C. Untuk melakukan ini, klik File->Simpan Sebagai dalam menu program Alat Deskriptor HID. Pada kotak dialog yang muncul, ubah jenis file menjadi File Tajuk (*.h).

Ini akan membuat file header C yang nantinya dapat Anda tambahkan ke proyek Anda.

integrasi mikroC

Untuk menambahkan file header ke deskriptor yang dihasilkan oleh mikroC, Anda perlu melakukan beberapa langkah. Jika Anda melihat deskriptor mikroC Anda akan melihat bahwa setiap byte diikuti oleh sebuah karakter ‘,0’ (mengabaikan tanda kutip, ini koma-nol). Anda perlu mengubah deskriptor laporan yang dibuat, termasuk data ekstensi. Anda akan mendapatkan pegangan yang terlihat seperti ini:

0x05, 0, 0x01, 0, // USAGE_PAGE (Desktop Generik) 0x15, 0, 0x00, 0, // LOGICAL_MINIMUM (0) 0x09, 0, 0x04, 0, // USAGE (Joystick) 0xa1, 0, 0x01, 0 , // KOLEKSI (Aplikasi) 0x05, 0, 0x02, 0, // USAGE_PAGE (Kontrol Simulasi) 0x09, 0, 0xbb, 0, // USAGE (Throttle) 0x15, 0, 0x81, 0, // LOGICAL_MINIMUM (-127 ) 0x25, 0, 0x7f, 0, // LOGICAL_MAXIMUM (127) 0x75, 0, 0x08, 0, // REPORT_SIZE (8) 0x95, 0, 0x01, 0, // REPORT_COUNT (1) 0x81, 0, 0x02, 0 , // INPUT (Data,Var,Abs) 0x05, 0, 0x01, 0, // USAGE_PAGE (Desktop Generik) 0x09, 0, 0x01, 0, // USAGE (Penunjuk) 0xa1, 0, 0x00, 0, // KOLEKSI (Fisik) 0x09, 0, 0x30, 0, /////////////////////////////////////// / // // PENGGUNAAN (X) 0x09, 0, 0x31, 0, // PENGGUNAAN (Y) 0x95, 0, 0x02, 0, // REPORT_COUNT (2) 0x81, 0, 0x02, 0, // INPUT (Data , Var,Abs) 0xc0, 0, // END_COLLECTION 0x09, 0, ////////////////////////////////// // ///////// 0x39, 0, // PENGGUNAAN (Tombol topi) 0x15, 0, 0x00, 0, // LOGICAL_MINIMUM (0) 0x25, 0, 0x03, 0, // LOGICAL_MAXIMUM (3) 0x35, 0, 0x00, 0, // PHYSICAL_MINIMUM (0) 0x46, 0, 0x0e, 0, 0x01, 0, // PHYSICAL_MAXIMUM (270) 0x65, 0, 0x14, 0, // UNIT (Bahasa Inggris Rot:Angular Pos) 0x75, 0, 0x04, 0, // REPORT_SIZE (4) 0x95, 0, 0x01, 0, // REPORT_COUNT (1) 0x81, 0, 0x02, 0, // INPUT (Data,Var,Abs) 0x05, 0, // //////////////////////////////////// 0x09, 0, // USAGE_PAGE (Tombol) 0x19, 0 , 0x01, 0, // USAGE_MINIMUM (Tombol 1) 0x29, 0, 0x04, 0, // USAGE_MAXIMUM (Tombol 4) 0x15, 0, 0x00, 0, // LOGICAL_MINIMUM (0) 0x25, 0, 0x01, 0, / / ​​LOGICAL_MAXIMUM ( 1) 0x75, 0, 0x01, 0, // REPORT_SIZE (1) 0x95, 0, 0x04, 0, // REPORT_COUNT (4) 0x55, 0, 0x00, 0, // UNIT_EXPONENT (0) 0x65, 0 , 0x00, 0, // UNIT (Tidak Ada) 0x81, 0, 0x02, 0, // INPUT (Data,Var,Abs) 0xc0, 0 // END_COLLECTION

Setelah deskriptor diisi, langkah selanjutnya adalah menghapus deskriptor laporan yang dihasilkan oleh mikroC dan menggantinya dengan milik Anda. Untuk melakukannya, pertama-tama buatlah handle mikroC menggunakan alat HID mikroC, lalu buka di editor.

Data pegangan sebenarnya disimpan seluruhnya dalam array Tabel Desc. 50 entri terbawah dalam array adalah pegangan laporan (baris 109-160). Hapus baris ini, lalu tempelkan ke deskriptor baru di lokasi ini. Sekarang Anda perlu melakukan modifikasi berikut pada file USBdsc.c:

  • Ubah baris 23 agar cocok ukuran kosong deskriptor laporan (yaitu ukuran deskriptor yang dihasilkan oleh alat HID, tanpa tambahan entri 0' yang perlu ditambahkan untuk mikroC - 77 byte dalam kasus deskriptor default untuk joystick):
    • karakter yang tidak ditandatangani const HID_ReportDesc_len = 77;
  • Hapus batas array untuk Tabel Desc di jalur 36:
  • unsigned char const DescTables = (

Hanya itu yang ada di sana. Sekarang deskriptornya telah dimodifikasi dan dapat berfungsi sebagai joystick USB. Cara termudah untuk mengujinya adalah dengan mengkompilasi kode mikrokontroler PIC, sambungkan ke port USB PC Anda dan pastikan kode tersebut dikenali dengan benar oleh PC. Selanjutnya, Anda perlu pergi ke Control Panel dan membuka kotak dialog Game Devices. Joystick Anda akan muncul di daftar perangkat.

Mentransfer data ke PC

Jika mikrokontroler PIC dikenali sebagai joystick USB, maka bagian tersulit dari proyek ini selesai. Mentransfer data joystick ke PC dilakukan dengan cara yang sederhana. Saat kami sebelumnya membuat pegangannya, kami merancang format data yang nyaman dalam hal pegangannya. Sebagai hasil percobaan, kami memperoleh parameter berikut:

Nilai Wheel, X dan Y adalah nilai 8-bit. Namun, nilai pemilih tampilan POV dan tombol adalah 4-bit, sehingga dikemas ke dalam satu byte. Format data diberikan di bawah ini:

Berkat format data yang telah ditentukan sebelumnya, Anda dapat dengan mudah merekam kode program yang berfungsi sebagai antarmuka untuk beberapa tombol dan potensiometer, dan mengirimkan data ke PC untuk mengonfirmasi bahwa kode program berfungsi dengan benar. Mode pengoperasian joystick PIC dapat ditentukan dalam opsi Perangkat permainan pada kotak dialog panel kontrol.

Perangkat keras

Setelah memeriksa kodenya, Anda perlu melakukan konversi joystick yang sebenarnya. Untuk melakukan ini, pertama-tama Anda harus membongkar joystick dan melepaskan kabel papan dan port permainan yang ada:

Menyiapkan sakelar

Selanjutnya Anda perlu mencari tahu bagaimana semua sakelar dan potensiometer dihubungkan. Potensiometer untuk joystick dan sumbu roda mudah diidentifikasi dan dihubungkan bersama untuk memberikan daya, ground, dan tegangan ke mikrokontroler PIC. Sakelarnya sedikit lebih sulit dipahami karena bergantung pada jenis joystick. Dengan menelusuri jejak pada papan sirkuit tercetak, diketahui bagaimana sakelar-sakelar itu dihubungkan; lihat gambar di bawah ini:

Elemen yang paling menarik adalah tombol tampilan POV. Alih-alih 4 sakelar terpisah, sakelar tampilan POV dihubungkan dengan kabel sebagai sistem analog di mana hambatan melalui kabel hijau dan oranye menentukan tombol mana yang ditekan. Tabel di bawah ini menunjukkan resistansi masing-masing saklar:

Oleh karena itu, untuk menentukan arah saklar tampilan POV, kabel-kabelnya akan dihubungkan pada rangkaian pembagi tegangan seperti gambar di bawah ini:

Saat menghubungkan kabel ke sumber listrik 5 V, kita mendapatkan tegangan berikut:

Diagram kelistrikan

Setelah menentukan sambungan kabel joystick, kami merancang sirkuit yang akan terhubung ke semua tombol dan potensiometer dan mengirim data ke PC. Untuk tujuan ini digunakan mikrokontroler PIC18F2550 yang beroperasi pada frekuensi 20 MHz. Sakelar terhubung ke port PORTB, potensiometer dan sakelar tampilan POV terhubung ke ADC port PORTA. Diagramnya ditunjukkan di bawah ini:

Papan tempat memotong roti ditunjukkan di bawah ini (ada tiga kabel jumper, klik untuk gambar lebih besar):

Setelah membuat papan dan mengujinya, tempatkan papan ke dasar joystick dan ganti kabel port game dengan kabel USB. Foto joystick yang dikonversi ditunjukkan di bawah ini:

Perangkat siap digunakan! Pasang joystick dan sambungkan ke port USB gratis. Pada saat yang sama, itu harus dideteksi dengan benar oleh OS Windows. Anda dapat mengkalibrasinya dan mulai menggunakannya untuk game yang mendukung joystick.

Kesimpulan

Dengan proyek ini Anda dapat membunuh dua burung dengan satu batu. Di satu sisi, proyek ini menunjukkan cara membuat joystick USB HID dan mengubah joystick lama Anda menjadi yang modern atau membuat joystick Anda sendiri. Di sisi lain, jika Anda tahu cara membuat kode program untuk joystick USB, maka Anda dapat membuat kode untuk perangkat HID apa pun, karena semuanya serupa, satu-satunya perbedaan adalah untuk setiap perangkat Anda perlu membuat laporan HID deskriptor dan menyediakan pengiriman data ke PC.

Daftar elemen radio

Penamaan Jenis Denominasi Kuantitas CatatanTokobuku catatan saya
U1 MK PIC 8-bit

PIC18F2550

1
  • Sergei Savenkov

    semacam ulasan "pendek"... seolah-olah mereka sedang terburu-buru di suatu tempat