Mempelajari pengembangan driver Linux dengan Raspberry Pi

13

Saya ingin menulis driver perangkat Linux untuk beberapa perangkat perangkat keras nyata. Periferal Raspberry Pi apa yang pas? Pada dasarnya saya membutuhkan yang berikut ini:

  1. Itu harus cukup kecil untuk pemula (paling sedikit beberapa bulan, beberapa minggu lebih baik).

  2. Lembar data harus tersedia. Pada awalnya saya berpikir tentang adaptor USB-Ethernet, tetapi sepertinya memiliki datasheet yang sangat terbatas.

Ada ide? Mungkin sesuatu seperti membuat konsol serial berfungsi di atas GPIO?

ivan
sumber
2
Driver Linux adalah modul kernel, dan secara teknis mereka tidak harus ada hubungannya dengan perangkat keras sama sekali, jadi hal pertama yang ingin Anda coba mungkin adalah antarmuka perangkat char - yaitu, sesuatu yang menyediakan file perangkat char yang dapat dibaca dari dan / atau ditulis ke (seperti barang di proc) untuk tujuan sepele.
goldilocks
Saya melakukan semua itu, menyelesaikan tutorial dan menulis modul kernel untuk perangkat semu, bersama dengan membaca buku tentang pengembangan kernel / driver. Ini semua baik, tapi sekarang saya ingin bekerja dengan perangkat keras nyata ..
ivan
Greg KH menulis ini beberapa waktu lalu (mungkin sedikit ketinggalan zaman dalam beberapa hal): linuxjournal.com/article/7353 Jadi ada perangkat USB dengan lembar data publik sekitar. Dia punya beberapa tip rekayasa terbalik di sana (saya tidak ingin melakukannya dengan sesuatu yang terlalu rumit tho). Hal-hal untuk pin GPIO Saya kira umumnya bekerja menggunakan driver I2C dll yang ada, tetapi Anda bisa mengabaikannya dan melakukan sesuatu sendiri.
goldilocks

Jawaban:

4

Mungkin sulit untuk belajar driver menulis ketika berinteraksi dengan perangkat yang rumit dan / atau bus yang rumit. Karena itu saya akan merekomendasikan baik menggunakan beberapa perangkat sederhana dan terkenal (mengabaikan implementasi driver yang ada di kernel) seperti perangkat I²C / SPI yang biasanya digunakan dengan mikrokontroler. Misalnya Anda dapat menemukan perangkat apa pun yang "didukung" oleh komunitas Arduino (artinya ada perpustakaan / dokumentasi untuknya) dan coba gunakan dengan RaspberryPi.

Jika itu tidak cukup atau Anda tidak ingin membeli terlalu banyak perangkat keras, Anda dapat membuatnya sendiri. Hanya mendapatkan beberapa mikrokontroler (seperti atmega atau sesuatu), buat program untuk itu menjadi beberapa perangkat dan kemudian coba berinteraksi dengannya menggunakan driver Linux. Dengan cara ini Anda dapat dengan mudah membuat program yang akan meniru berbagai kelas perangkat. Dan karena Anda akan menulis sendiri "firmware" Anda, itu akan membantu Anda men-debug masalah.

Anda memerlukan beberapa keterampilan pemrograman mikrokontroler untuk itu tetapi tidak sulit untuk belajar pemrograman dengan Arduino dan saya percaya itu adalah pengetahuan yang berguna untuk programmer driver.

Krzysztof Adamski
sumber
Bagaimana dengan menerapkan komunikasi serial dalam perangkat lunak melalui pin GPIO? Misalnya, sambungkan serial ke PC dan cobalah untuk setidaknya mengeluarkan sesuatu ke konsol. Apakah itu layak?
ivan
@ van: Saya tidak yakin apakah saya mengerti itu benar. Jika, secara serial, maksud Anda UART / rs232 dan oleh perangkat lunak, maksud Anda bitbanging, maka itu tidak mungkin karena kendala waktu. Jika, di sisi lain, maksud Anda (kembali) mengimplementasikan perangkat seri Linux menggunakan perangkat keras RaspberryPi UART, maka tentu saja itu bisa dilakukan. Saya percaya semua informasi yang diperlukan tentang perangkat keras ini dapat ditemukan dalam BCM2835 ARM Peripheralsdokumen. Tetapi ingat bahwa untuk menggunakannya, Anda harus terlebih dahulu menonaktifkan driver yang ada di kernel.
Krzysztof Adamski
Terima kasih, tetapi apakah Anda yakin tentang ketidakmungkinan UART bit-banging? Saya menemukan tautan ini: ganssle.com/articles/auart.htm sehingga tampaknya berpotensi dapat dilakukan untuk baud rate yang rendah dan untuk setidaknya hanya menerapkan pengiriman bagian (yang lebih mudah).
ivan
@ivan: Artikel ini sepertinya bukan tentang sistem dengan sistem operasi serba guna seperti Linux. Di UART Anda memiliki batasan waktu yang sangat ketat yang sangat sulit dipenuhi tanpa sistem operasi waktu nyata. Yang sedang berkata, Mungkin dimungkinkan untuk melakukannya dengan baudrate rendah tetapi mungkin tidak benar-benar dapat diandalkan.
Krzysztof Adamski
Sepertinya Anda benar: raspberrypi.stackexchange.com/questions/1987/… (namun ada solusi menarik di sana). Sekali lagi terima kasih atas bantuan Anda.
ivan
3

Secara pribadi saya akan mulai dengan perangkat yang sangat sederhana, seperti satu atau lebih LED yang terhubung langsung ke pin GPIO.

Anda dapat membeli perangkat yang siap dipasang, atau mentransfer perangkat Anda sendiri.

Alasan saya menyarankan ini adalah bahwa driver debug umumnya jauh lebih sulit daripada program normal, oleh karena itu tantangan sederhana untuk memulai bermanfaat, juga Anda kemudian dapat menggunakan kode itu sebagai metode debug untuk perangkat yang lebih kompleks (status ke pin GPIO untuk dilampirkan ke osiloskop) di mana waktu itu penting.

Jika menarik ada driver kernel untuk LedBorg tersedia di sini , sumber harus menjadi contoh yang cukup sederhana untuk mengemudi pin GPIO secara berkala.

PiBorg
sumber
Hai @ Piorg. dapatkah Anda memberi tahu beberapa sumber yang membantu saya mempelajari kode driver sederhana untuk perangkat seperti satu atau lebih LED yang terhubung langsung ke pin GPIO?
Sagar
0

"Perangkat" paling sederhana yang dapat Anda gunakan untuk menulis driver perangkat keras (jika pengembangan driver perangkat keras adalah hal Anda) juga dapat sesederhana LED (saya menambahkan tanda kutip karena secara teknis LED bukan perangkat tetapi masih berupa perangkat keras) seperti yang disarankan oleh @PiBorg.

Pilihan lain adalah beberapa perangkat / komponen yang mudah-antarmuka seperti photoresistor, sensor inframerah pasif (pendek: PIR), sensor suhu, kipas PC (lebih disukai kipas 4-kawat yang memungkinkan Anda tidak hanya memantau tetapi juga mengontrol RPM), matriks LED dot dan sebagainya. Pada dasarnya perangkat sederhana semacam itu akan memungkinkan Anda untuk memiliki minimum pada perangkat keras (sehingga Anda dapat melihat dan menyentuh apa yang sebenarnya telah Anda capai) dan pada saat yang sama Anda dapat belajar tentang banyak topik yang digunakan untuk perangkat yang jauh lebih kompleks di mana kompleksitasnya sebagian besar berasal dari protokol yang mereka gunakan.

Perlu diingat juga bahwa Anda tidak perlu melakukan penggalian lebih jauh ke dalam modul kernel. Tentu saja jika Anda ingin melakukan itu tidak ada yang menghentikan Anda. :)

Berikut adalah contoh interfacing sensor inframerah pasif (saya akan segera mengujinya ketika PIR saya dikirim: 3). Anda dapat mengambil ini dan mulai menggali lebih dalam ke dunia kernel Linux untuk melihat bagaimana Anda bisa misalnya membuat driver kernel, yang bekerja dengan PIR.

rbaleksandar
sumber