Bagaimana semuanya dimulai
Mari kita mulai dengan mengajukan masalah. Diberikan: satu laptop. Laptop baru, bermain game. Dengan RGB backlight. Berikut laptop seperti ini:
Gambar diambil dari lenovo.comAda juga program untuk laptop ini. Program hanya mengontrol lampu latar ini.
Satu-satunya masalah adalah program untuk Windows, tetapi saya ingin semuanya berfungsi di Linux favorit Anda. Dan bola lampu bersinar, dan agar warna-warna indah berkedip. Ya, itu hanya cara melakukannya, sehingga tanpa reverse engineering dan tanpa menulis driver Anda? Jawaban sederhana datang dengan cepat - tidak mungkin. Baiklah, ayo kita tulis driver.
Langkah 1 - mempelajari kode
Kami memiliki tiga tempat dari mana Anda dapat melihat bagaimana lampu latar berkedip. Dalam urutan meningkatnya kesulitan:
1. Program game besar dan baru Lenovo Nerve Center - di mana ada fungsi untuk mengonfigurasi semua backlight ini.
2. Kombinasi hotkey Fn + Space dimungkinkan. diproses oleh program yang sama.
3. BIOS. Saat laptop dimuat, lampu latar juga berkedip - tetapi hanya berwarna merah, dan hanya sedetik.
Ke depan, saya akan mengatakan bahwa saya harus mencoba ketiganya, tetapi saya membuat kemajuan dengan beberapa keberhasilan hanya pada awalnya. Kami akan membicarakannya.
Nah, buka folder program:

Kami segera melihat bahwa ada DLL dengan nama yang menarik - LedSettingsPlugin.dll. Apakah milik kita ...? Mari kita buka di IDA Pro dan lihatlah.

Perhatikan bagian kanan layar. Ada banyak informasi yang tersisa dari programmer - kami akan menggunakannya. Kami melihat bahwa karena alasan tertentu ada banyak baris yang mirip dengan nama metode. Mengapa

Dan ini adalah nama-nama metode. Betapa nyamannya! Katakanlah apa yang kita bisa dengan nama kita sendiri, dan lihat daftar fungsi lagi. Untuk memberi nama pada IDA, Anda dapat menggunakan tombol pintas N, atau cukup klik kanan pada apa yang ingin kita panggil.

Kami melihat fungsinya ... Y720LedSetHelper :: SetLEDStatusEx. Sepertinya kita perlu! Kami perhatikan bahwa sesuatu seperti string terbentuk di sini dan kemudian diteruskan ke CHidDevHelper :: HidRequestsByPath tertentu. Khusus tertarik pada var_38, semua metamorfosis yang ditunjuk oleh IDA untuk kami.
Var_34 juga menarik bagi kami. Itu berjalan tepat setelah var_38 - dalam tradisi perakitan, variabel disimpan dalam urutan terbalik di bawah RSP. Var_34 di sini hanya nama konstanta - -34h.
Kami mendapatkan bahwa mulai dari var_38 program menempatkan nol, maka gaya, warna, nomor tiga dan blok adalah bagian dari keyboard yang warna ini akan berlaku. (Ke depan, saya akan mengatakan bahwa tiga adalah nilai kecerahan di sini. Setelah membuatnya dapat diatur, kami mendapatkan driver lebih keren daripada yang asli!)
Mari kita masuk ke HidRequestsByPath dan akhirnya mencari tahu bagaimana hasilnya.

Kami melihat dua fungsi, HidD_GetFeature dan HidD_SetFeature. Keduanya dalam file tersebut tidak dilacak ... Tetapi mereka dilacak dengan sangat baik dalam dokumentasi resmi Microsoft - di
sini dan di
sini .
Anda dapat memberi selamat pada diri sendiri atas hal ini - kami tiba di sana. Ini bagian bawah, tidak perlu menggali lebih dalam. Di Linux, ada fungsi-fungsi seperti itu - Anda hanya perlu memanggil mereka dengan argumen yang sama, dan semuanya harus berjalan ... benarkah?
Langkah 2 - luncurkan prototipe ...?
Tidak juga. Mari mulai sederhana dan jalankan lsusb. Jadi kami menemukan keyboard, dan mengirim sesuatu ke sana.

Integrated Technology Express, Inc. terlihat paling menarik di sini. Kami akan menggunakan alat / dev / hidraw yang terkenal. Kami menemukan yang tepat ... Ini dilakukan dengan pencarian sederhana di file / sys / class / hidraw / hidraw * / perangkat / uevent.

Ini satu. Jumlahnya sama - itu artinya perangkat ini hidraw0. Tetapi kami mencoba mengirim data, dan tidak ada yang terjadi! Semacam omong kosong. Pada tahap ini, tangan mulai turun ... Mungkin, bukan untuk manusia biasa, apakah ini rekayasa terbalik?
Tapi mari kita lanjutkan. Kami akan mencoba. Jika penulis memahami semua ini, ia akan membalikkan pencarian driver kami dari Pusat Saraf yang sama .... Tapi kami tidak punya otak. Mari kita kembali ke Windows, ada satu ide.
Ada hal seperti itu di Windows - Device Manager. Ini memungkinkan Anda melakukan banyak hal - kami tertarik pada kenyataan bahwa ini memungkinkan Anda untuk mematikan perangkat. Sederhana dan tanpa kompromi.
Mari kita matikan perangkat satu per satu sampai kondisi bohlam berhenti berubah.

Yang ini dipotong. Jadi, jika Anda melihat ID Perangkat Keras, kita akan melihat siapa namanya dan apa yang dia makan.

Kami melihat - itu dia.

Perangkat yang saya telah banjir selama beberapa tahun di dmesg.
[Kenapa dia tidak muncul di lsusb? Dan bukan USB sama sekali. Ia menggunakan protokol H2C I2C, yang memungkinkan Anda untuk
menyembunyikan perangkat dari tangan pengrajin yang ingin tahu untuk menginstal gadget HID di bus komputer itu sendiri.]
Penyimpangan lirik - mari kita komit
Mencari perangkat yang benar, saya mengambil instalasi saya hampir ke kernel. Juga, saya tidak terlalu suka dengan apa yang saya perlihatkan lembar dmesg ini sebelum setiap kunci. Karena saya di sini, mengapa tidak menulis komit pendek? Tetap saja gatal tangan.
Apa yang perlu kita lihat adalah di mana perangkat berada di I2C HID, dan di mana menuliskan keanehan apa yang melekat di dalamnya.
Di sini Tanpa basa-basi lagi, mari kita dengarkan kesalahan - panjang masukan yang salah. Mari kita perbaiki.

Tambahkan quirk baru, beri nama I2C_HID_QUIRK_BAD_INPUT_SIZE. Dengan analogi dengan yang sudah ada.

Tambahkan perangkat kami ke daftar quirkut. Apa yang telah kami lakukan sejauh ini:
1. Cari di Internet untuk βi2c hid linux kernelβ. Klik pada respons keempat untuk DuckDuckGo.
2. Tulis tiga (!) Kata dalam Bahasa Inggris - BAD_INPUT_SIZE
3. Menambahkan satu ke BIT (4). Ternyata BIT (5).
4. Kami menambahkan satu nomor di hid-id.h - ID perangkat kami (tidak ditampilkan dalam ilustrasi, tetapi ada juga sekitar).
Mari kita memprogram sekarang.
Kita melihat baris - `ret_size = ihid-> inbuf [0] | ihid-> inbuf [1] << 8; `
Dan kemudian mengeluh bahwa ret_size tidak sama dengan yang diinginkannya.
Biarkan jika queer terlibat, lakukan hal yang sama, kebalikannya.

Kami mengirim tambalan ke milis, tanpa lupa menguji ... (sejujurnya, butuh lebih banyak untuk hanya menambahkan ke buletin otak. Itu tidak mudah.)

Dan itu dia.
Langkah 3 - pengemudi!
Lalu saya ingat - oh ya, Anda masih harus menulis driver. Saya memutuskan untuk tidak memasukkannya ke kernel (pertanyaan mulai muncul di sana, saya benar-benar harus berpikir. Jika ada warga Habrovsk yang dapat membantu saya memberi saran, tuliskan kepada saya - saya akan senang!)
Buka python. (Awalnya, bash dulu, tapi aku berubah pikiran dengan sangat cepat.) Kita akan menggunakan alat yang terkenal / dev / hidraw.
/ dev / hidraw0, / dev / hidraw1 - bagaimana cara kerja file-file ini? Untuk I / O sederhana, mereka dapat digunakan seperti file normal lainnya, dan itu akan berfungsi. Tapi GetFeature dan SetFeature harus mengotak-atik ...
StackOverflow (atau orang lain, saya tidak ingat sudah) menyarankan bahwa diperlukan beberapa ioctl. Ini adalah metode khusus untuk bekerja dengan file yang tidak biasa seperti perangkat HID, terminal, dan sejenisnya.
Ioctl bekerja seperti ini. Anda memberinya deskriptor file terbuka (yang tertarik pada apa itu,
ada tautan ke Wikipedia ), beberapa nomor dan buffer - setelah itu ia melakukan sesuatu dengan buffer ini dan mengembalikannya kembali. Saya tidak akan melebih-lebihkan, hanya ada banyak hal tergantung pada implementasinya. Biarkan saya memberi Anda contoh: 0xC0114806, atau sudah akrab dengan kami SetFeature. Itu
(6 << 29) | (ord('H') << 8) | (0x06 << 0) | (0x11 << 16).
6 pertama di sini berarti file akan terbuka untuk ditulis dan dibaca. Mengapa membaca tidak begitu jelas - tetapi ditulis untuk melakukannya, mungkin memang seharusnya demikian. Ord ('H') di sini - disingkat HID. Mungkin hal lain artinya, tergantung pada file. Dalam hal ini, HID.
0x06 - tim itu sendiri. Tim keenam dengan HID adalah SetFeature. Bagian terakhir adalah panjang buffer.
Tetap hanya untuk memanggil ioctl dengan nilai-nilai ini - dan hasilnya adalah driver.
Dia sedang bekerja .
Kata penutup
Saya harap itu menarik untuk dibaca. Bahkan bermanfaat, mungkin. Beberapa dihilangkan atau disingkat - pembaca yang berpandangan tajam, mungkin, akan mengetahui pembacaan keadaan pada pengemudi, dan beberapa SetFeature kedua, yang tidak disebutkan sama sekali dalam teks. Pengembangan driver dan kernel Linux adalah hal-hal besar, dan mereka tidak dapat sepenuhnya dikuasai dalam satu sepeda. Artikel ini kemungkinan besar bukan tentang ini, tetapi tentang fakta bahwa membuat sesuatu yang kecil dan menyenangkan, open-source atau untuk Anda sendiri, sama sekali tidak sulit. Anda hanya perlu menemukan satu minggu di malam hari dengan teh dan keinginan untuk mempelajari kode.