Raspberry Pi ile Linux sürücü geliştirmeyi öğrenme


13

Bazı gerçek donanım aygıtları için Linux aygıt sürücüsü yazmak istiyorum. Hangi Raspberry Pi çevre birimleri iyi bir seçimdir? Temelde aşağıdakilere ihtiyacım var:

  1. Yeni başlayanlar için yeterince küçük olmalıdır (en fazla birkaç ay, daha iyi birkaç hafta).

  2. Veri sayfası mevcut olmalıdır. İlk başta USB-Ethernet adaptörü hakkında düşünüyordum, ancak çok sınırlı bir veri sayfasına sahip gibi görünüyor.

Herhangi bir fikir? Seri konsolun GPIO üzerinden çalışmasını sağlamak gibi bir şey olabilir mi?


2
Linux sürücüleri çekirdek modülleridir ve teknik olarak donanım ile hiçbir ilgisi yoktur, bu yüzden denemek istediğiniz ilk şey muhtemelen bir char cihaz arayüzüdür - yani, bir char cihaz dosyası sağlayan bir şey önemsiz bir amaç için (proc'taki şeyler gibi) okunmalı ve / veya yazılmalıdır.
goldilocks

Tüm bunları yaptım, dersleri tamamladım ve yalancı cihazlar için çekirdek modülleri yazdım, çekirdek / sürücü geliştirme üzerine kitap okudum. Bu iyi, ama şimdi gerçek donanım ile çalışmak istiyorum ..
ivan

Greg KH bunu bir süre önce yazdı (belki bazı açılardan biraz modası geçmiş): linuxjournal.com/article/7353 Yani etrafında genel veri sayfaları olan USB cihazları var. Orada bazı ters mühendislik ipuçları var (Ben çok karmaşık bir şey tho yapmak istemem). GPIO pinleri için şeyler genellikle mevcut I2C vb. Sürücüleri kullanarak çalışır, ancak bunu görmezden gelebilir ve kendiniz bir şey yapabilirsiniz.
goldilocks

Yanıtlar:


4

Karmaşık cihazlar ve / veya karmaşık otobüsler ile arayüz oluştururken sürücüleri yazmayı öğrenmek zor olabilir. Bu nedenle, genellikle mikrodenetleyicilerle kullanılan I²C / SPI aygıtları gibi bazı basit ve iyi bilinen aygıtların (sürücülerinin çekirdekte var olan uygulamalarını yok sayarak) kullanmanızı öneririm. Örneğin, Arduino topluluğu tarafından "desteklenen" herhangi bir cihaz bulabilir (bunun için bir kütüphane / dokümantasyon var) ve RaspberryPi ile kullanmayı deneyin.

Bu yeterli değilse veya çok fazla donanım satın almak istemiyorsanız, kendiniz bir tane oluşturabilirsiniz. Sadece bazı mikrodenetleyiciler (atmega veya başka bir şey gibi) alın, bir cihaz haline gelmesi için bir program oluşturun ve sonra Linux sürücülerini kullanarak ara yüze bağlanmayı deneyin. Bu şekilde, farklı cihaz sınıflarını taklit edecek programlar kolayca oluşturabilirsiniz. "Firmware" inizi kendiniz yazacağınızdan, sorunları ayıklamanıza yardımcı olacaktır.

Bunun için bazı mikrodenetleyici programlama becerilerine ihtiyacınız var, ancak Arduino ile programlamayı öğrenmek zor değil ve yine de sürücü programcısı için yararlı bilginin olduğuna inanıyorum.


GPIO pinleri aracılığıyla yazılımda seri iletişim uygulamaya ne dersiniz? Örneğin seriyi PC'ye bağlayın ve en azından bir şeyleri konsola aktarmaya çalışın. Yaşayabilir mi?
ivan

@ivan: Bunu doğru anladığımdan emin değilim. Seri olarak, UART / rs232'yi ve yazılımla kastediyorsanız, bitbang'ı kastediyorsanız, zamanlama kısıtlamaları nedeniyle mümkün değildir. Öte yandan, Linux seri aygıtını RaspberryPi UART donanımını kullanarak (yeniden) uygulamak demek istiyorsanız, elbette yapılabilir. Bu donanım hakkında gereken tüm bilgilerin BCM2835 ARM Peripheralsbelgede bulunabileceğine inanıyorum . Ancak, bunu kullanabilmek için, önce çekirdekteki mevcut sürücüyü devre dışı bırakmanız gerektiğini unutmayın.
Krzysztof Adamski

Teşekkür ederim, ama utanç verici UART'ın imkansızlığından emin misiniz? Bu bağlantıyı buldum: ganssle.com/articles/auart.htm , düşük baud hızı ve en azından sadece gönderme parçasını (daha kolay) uygulamak için potansiyel olarak uygulanabilir görünüyor.
ivan

@ivan: Bu makale Linux gibi genel amaçlı işletim sistemlerine sahip sistemler hakkında görünmüyor. UART'ta, gerçek zamanlı işletim sistemi olmadan karşılamak çok zor olan gerçek sıkı zamanlama kısıtlamalarına sahipsiniz. Bununla birlikte, düşük baud hızında bunu yapmak mümkün olabilir, ancak gerçekten güvenilir olmayabilir.
Krzysztof Adamski

Haklı görünüyorsun: raspberrypi.stackexchange.com/questions/1987/… (ancak burada ilginç bir çözüm var). Yardımın için tekrar teşekkürler.
ivan

3

Şahsen, doğrudan GPIO pinlerine bağlı bir veya daha fazla LED gibi çok basit bir cihazla başlardım.

Takmaya hazır bir cihaz satın alabilir veya kendi cihazınızı bağlayabilirsiniz.

Bunun, sürücülerin hata ayıklama işleminin normal bir programdan sonra genellikle çok daha zor olduğunu göstermemizin nedeni, bu nedenle başlamak için basit bir zorluk yararlıdır, ayrıca daha sonra bu kodu daha karmaşık cihazlar için bir hata ayıklama yöntemi olarak kullanabilirsiniz ( bir osiloskopa takılacak GPIO pini) zamanlamanın önemli olduğu yerlerde.

İlgileniyorsa, burada LedBorg için bir çekirdek sürücüsü varsa , kaynak GPIO pinlerini düzenli aralıklarla sürmek için oldukça basit bir örnek olmalıdır.


Merhaba @PiBorg. doğrudan GPIO pinlerine bağlı bir veya daha fazla LED gibi bir aygıt için basit sürücüyü kodlamayı öğrenmeme yardımcı olacak bazı kaynakları söyleyebilir misiniz?
Sagar

0

Bir donanım sürücüsü yazabileceğiniz en basit "cihaz" (donanım sürücüsü geliştirme sizin işinizse) bir LED kadar basit olabilir (tırnak işaretlerini ekledim çünkü teknik olarak bir LED bir cihaz değil, ancak yine de bir parça @PiBorg tarafından önerildiği gibi.

Diğer seçenekler, bir fotodirenç, pasif kızılötesi sensörler (kısa: PIR), sıcaklık sensörleri, PC fanları (tercihen sadece izlemenizi değil, aynı zamanda RPM), LED nokta matrisleri vb. Temel olarak bu tür basit cihazlar, donanımda minimum seviyeye sahip olmanızı sağlar (böylece gerçekten başardıklarınızı görebilir ve dokunabilirsiniz) ve aynı zamanda çok daha karmaşık cihazlar için kullanılan birçok konu hakkında bilgi edinebilirsiniz. karmaşıklık çoğunlukla kullandıkları protokolden gelir.

Çekirdek modüllerine ekstra mil kazmak zorunda olmamanıza da dikkat edin. Elbette bunu yapmak istiyorsan kimse seni durdurmuyor. :)

Pasif bir kızılötesi sensörün arayüzüne bir örnek ( PIR teslim edildiğinde yakında test edeceğim: 3). Örneğin PIR ile çalışan bir çekirdek sürücüsünü nasıl oluşturabileceğinizi görmek için bunu alıp Linux çekirdeği dünyasına daha derin kazmaya başlayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.