Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak

Başlatan bunalmis, 26 Ocak 2011, 17:06:16

z

USB haberlesme yapacak cihaz tasariminda en buyuk zorlugun, cipin hangi registerine hangi datayi yuklemek, gelen komutlara nasil cevap verilmesi gerektigini anlamak diye saniyordum fakat yanilmisim.

Bunlar isin en kolay kismiymis. Asil zorluk USB standartlariyla belirlenmis Desriptorlerin icerikleri olusturabilmek.

HID olsun driver yazmaya gerek kalmasin dedim, hazir HID orneklerindeki Desriptorleri alip kullanayim dedim. Buldugum  her bir ornekde farkli durumlarla karsilastim. Bu kismi es gecip bir seyler yapmaya calismak yanlis olacak.

Yapmak istedigim sey, USB kartimda 64 Bytelik iki ayri ram alani var.

Bunlardan birisine yazdigim datalar PC deki 64 Bytelik alana gonderilecek.
Digerine de PC den bana gonderilen veriler yerlesecek.

USB tarafinda gonder dedigimde datalarim PC ye gitsin, PC data gonderdiginde de bundan haberim olsun.

Bu kadarcik bir isletim icin  EP1 in ve EP1 out ihtiyacim oldugu belli.

Bunun icin en bastan Device descriptorden baslayarak tum Descriptorlerimi olusturmam gerekecek. Sonucta sagdan soldan buldugumuz ornek programlarin desriptorlerini de biriler dolduruyor.  Bunlar kitaplarda ve usb speclerde yazilmis ama anlayamiyorum.

Device desriptorden basliyorum.

Cihazim icin Vendor ve Product ID sahibi oldugumu da varsayalim.

Standartlarla bu descriptorun nasil olacagi belirlenmis.

0     bLength 1 Descriptor size in bytes               (12h)
1     bDescriptorType 1 The constant DEVICE      (01h)
2     bcdUSB 2 USB specification release number (BCD)
4     bDeviceClass 1 Class code
5     bDeviceSubclass 1 Subclass code
6     bDeviceProtocol1Protocol C ode
7     bMaxPacketSize0 1 Maximum packet size for endpoint zero
8     idVendor 2 Vendor ID
10   idProduct 2 Product ID
12   bcdDevice 2 Device release number             (BCD)
14   iManufacturer 1 Index of string descriptor for the manufacturer
15   iProduct 1 Index of string descriptor for the product
16   iSerialNumber 1 Index of string descriptor for the serial number
17   bNumConfigurations 1 Number of possible configurations


Device desriptoru olusturalim.

bLength= 0x12 Bu zaten belli
bDescriptorType = 1  Bu da belli bir sey
bcdUSB=0002 Bu da belli
bDeviceClass= Anlamadim
bDeviceSubclass = Anlamadim
bDeviceProtocol=Anlamadim
bMaxPacketSize0=0x40
idVendor=Tamam bu veriye sahipim
idProduct=Buna da sahibim
bcdDevice=Bunu da belirlemek benim elimde
iManufacturer=Bunu desriptorlerin hepsi olusunca bulabilirim
iProduct=bunu da aynen yukaridaki sekilde bulurum
iSerialNumber=Bunu da aynen yukaridaki gibi sayar bulurum
bNumConfigurations=Anlamadim

Burada anlamadigimi yazdigim yerleri aciklayabilecek varmi?

Bu en kolay desriptordu daha bunun gibi 4-5 tana daha doldurulmasi gereken desriptor var.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fatihkuzucu

Exp.Kits http://tinyurl.com/3qhs8pm   Küçük adamların, küçük fikirleri... Büyük adamların, büyük hayalleri...

z

Okuyarak beceremiycem gibi gorunuyor.

Firmalar calisanlarina USB egitimini nasil aldiriyorlar acaba?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mihri

İlgili mikroyu yada USB entegreyi aldığınız firmadan destek alma yoluna gittiniz mi hiç? Genelinin türkiye kadrosu fazla yardımcı olamıyor ama en azından merkezden birileri ile iletişime geçmenizi sağlayabilirler.
"Eppur si muove!"

fatihkuzucu

USb orgdan destek alıyorlardır.

http://www.usb.org/developers/hidpage/#Descriptor_Tool

HID Descriptor Tool
http://www.usb.org/developers/hidpage/dt2_4.zip
This tool allows you to create, edit and validate HID Report Descriptors. The tool also supports a variety of output formats (.txt, .inc, .h, etc.). DT uses ASCII based Usage Tables and supports vendor defined pages as well. Included are Usage Table files for the HID Usage Table document 1.0 Release Candidate 1, Monitor Class 1.0 Release Candidate 2, and Power Class Spec. Read the included README.TXT file for more information.


http://www.usb.org/developers/hidpage/
http://www.usb.org/developers/devclass_docs/HID1_11.pdf
http://www.usb.org/developers/devclass_docs/Hut1_12.pdf
http://www.alanmacek.com/usb/
http://www.alanmacek.com/usb/descriptors.asm
http://www.usbmadesimple.co.uk/ums_4.htm
http://www.microchip.com/forums/tm.aspx?m=413261
http://www.circuitsathome.com/mcu/arduino-usb-host-part-3-descriptors
Exp.Kits http://tinyurl.com/3qhs8pm   Küçük adamların, küçük fikirleri... Büyük adamların, büyük hayalleri...

t2

HID Descriptor Tool vb uzun yol.  USB için üretici firmanın hid örneklerinden yola çıkın en kolayı bu. kendiniz yapabilirseniz sonuçta bunların modifiye edilmiş halini elde edeceksiniz.

Alıntı YapFirmalar calisanlarina USB egitimini nasil aldiriyorlar acaba?
Örnekler tam istediğinzi gibi işte. 64 bayt gönder ! gitsin. Geldiyse oku .  Gayet güzel çalışıyor. Burada değiştirilecek kısım sadece firma bilgileriniz.  hepsi o.  Kendinize ait VID ve pid iniz varsa onuda değiştirmelisiniz tabi. Aygıt takılınca " cnc bulundu" diyebilir o  stringi de değiştirebilirsiniz. BU stringler  kod içinde duruyor. yok hazır descriptor istemem diyorsanız gurur meselesi yaptıysanız orası başka.

Öncelikle yapılacka iş led yakma deneyi daha sonra usbden 64 bayt gönderip işlemcinin bunu alıp değerlendirerek geri 64 bayt gönderdiğini göreceğiz.  Daha sonra diğer zorluklar çıkacak. mesela  interval  1ms ise bundan daha kısa sürede gönderip alma yapamayız. her defasında 64 bayt gönderip alabiliyoruz. mutlaka istersek  USB iletiminin tamamlandığını  bildiren bitler var onları kontrol edebiliriz.


Bu descriptorlar çipe özel değil. yani pic kullanmasanız başka çipi HID aygıt olarak kullanacaksanız hemen adapte edebilirsiniz. Çalışan bir örnek microchip Pickit2 Aygıt tam olarak yukarıda bahsettiğim gibi 64 bayt alma ve gönderme bufferine sahip  Full speed. 

ErsinErce

Device Class => Cihaz sınıfı yani HID,CDC, Mass Storage, Kişisel vs, eğer multi device ise custom ayarlanır
SubClass => Cihaz Yan özelliği varsa kullanılır genelde ya da  multidevice ise HID vb olduğu burada ayarlanıyordu doğru hatırlıyorsam
DeviceProtocol => protokol ayarı (Örnek: mass storagede scsi protokolü ayarı )
NumConfigurations => cihazın kullandığı konfigurasyon sayısı, multi device kullanırken yani örneğin aynı sistemde hem yazıcı hem mass storage varsa 2 konfigürasyon oluyor Device Class custom ayarlanırken SubClass(?) ile tanımlama bu yüzden gerekiyor.
Jan Axelson'un kitabında anlatıyor bunları aslında

burda da detaylı anlatım mevcut; http://www.beyondlogic.org/usbnutshell/usb5.shtml

http://www.usb.org/developers/defined_class

t2

Alıntı yapılan: cynetron - 26 Ocak 2011, 19:01:50
Device Class => Cihaz sınıfı yani HID,CDC, Mass Storage, Kişisel vs, eğer multi device ise custom ayarlanır
SubClass => Cihaz Yan özelliği varsa kullanılır genelde ya da  multidevice ise HID vb olduğu burada ayarlanıyordu doğru hatırlıyorsam
kitap mitap sallayın. hazır çalışan örnek var daha ne istiyorsunuz. onu değiştirmelisiniz. Adam fare yaptıysa descriptoru editleyip genel amaçlı hid aygıtı yapıverecez. bu zor bir şey değil.

Alıntı YapbDeviceClass= Anlamadim
bDeviceSubclass = Anlamadim
bDeviceProtocol=Anlamadim
bNumConfigurations=Anlamadim
anlaşılmayan yerleri aynen benim örnekteki gibi değiştirin size sadece 1 tane NumConfigurations lazım oraya 1 yazıcaz.


Burak B

"... a healthy dose of paranoia leads to better systems." Jack Ganssle

ErsinErce

Alıntı yapılan: t2 - 26 Ocak 2011, 19:10:42
Alıntı yapılan: cynetron - 26 Ocak 2011, 19:01:50
Device Class => Cihaz sınıfı yani HID,CDC, Mass Storage, Kişisel vs, eğer multi device ise custom ayarlanır
SubClass => Cihaz Yan özelliği varsa kullanılır genelde ya da  multidevice ise HID vb olduğu burada ayarlanıyordu doğru hatırlıyorsam
kitap mitap sallayın. hazır çalışan örnek var daha ne istiyorsunuz. onu değiştirmelisiniz. Adam fare yaptıysa descriptoru editleyip genel amaçlı hid aygıtı yapıverecez. bu zor bir şey değil.

T2 sanane kardeşim uğraşmak istiyorum, herşeye muhalif olma bende biliyorum hazır alıp kullanmayı, acil işim varsa öyle yapıyorum zaten.
Multifunction bir cihaz yapıyorsan hazır kodlarını bulamazsında, bulduğun şeyler benim kaç yıl önce yazdığım sorular olur orda kalır ;) (16f67j50 google it ;) )
Eğer yardımı olacak bilgin varsa söyle kenara çekil lütfen!!!

z

Bakipta goremediklerimi gormemi sagladiniz.

Base Class  Descriptor Usage    Description

00h    Device Use class information in the Interface Descriptors
01h    Interface Audio   
02h    Both Communications and CDC Control
03h    Interface HID (Human Interface Device)
05h    Interface Physical
06h    Interface Image
07h    Interface Printer
08h    Interface Mass Storage
09h    Device Hub
0Ah    Interface CDC-Data
0Bh    Interface Smart Card
0Dh    Interface Content Security
0Eh    Interface Video
0Fh    Interface Personal Healthcare
DCh    Both    Diagnostic Device
E0h    Interface Wireless Controller
EFh    Both    Miscellaneous
FEh    Interface Application Specific
FFh    Both    Vendor Specific

Device desriptorun, DeviceClass gozune yukaridakilerden uygun olani yazacagiz.

Alıntı YapDevice Class => Cihaz sınıfı yani HID,CDC, Mass Storage, Kişisel vs, eğer multi device ise custom ayarlanır
SubClass => Cihaz Yan özelliği varsa kullanılır genelde ya da  multidevice ise HID vb olduğu burada ayarlanıyordu doğru hatırlıyorsam
DeviceProtocol => protokol ayarı (Örnek: mass storagede scsi protokolü ayarı )
NumConfigurations => cihazın kullandığı konfigurasyon sayısı, multi device kullanırken yani örneğin aynı sistemde hem yazıcı hem mass storage varsa 2 konfigürasyon oluyor Device Class custom ayarlanırken SubClass(?) ile tanımlama bu yüzden gerekiyor.

Bu durumda, en basta yapmayi istedigim HID cihazin (64 bytlik buffer degis tokus ozelligi) device descriptorunde

bDeviceClass= 0x03
bDeviceSubclass = 0x00
bDeviceProtocol=0x00

bNumConfigurations=0x01  olmali.

Umarim hatam yoktur.

Class= 0x03 iken
SubClass=0x01  Boot Interface

SubClass=0x01  iken

Protokol= 0x00h  Yok
Protokol= 0x01    Keyboard
Protokol= 0x02    Mouse


Gerektiginde bu linke muracat edilmeli. http://www.usb.org/developers/defined_class/
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Device descriptorum asagidaki gibi olacak.

bLength= 0x12
bDescriptorType = 1 
bcdUSB=0002
bDeviceClass= 0x03
bDeviceSubclass = 0x00
bDeviceProtocol=0x00
bMaxPacketSize0=0x40
idVendor=1234  (USB kurulusundan hakkini satin aldigimizda buna benzer bir verimiz olacak)
idProduct=5678 (USB kurulusundan hakkini satin aldigimizda buna benzer bir verimiz olacak)
bcdDevice=0102
iManufacturer=XXXX
iProduct=YYYY
iSerialNumber=ZZZZ
bNumConfigurations=0x01

xxxx,yyyy,zzzz icin,  string descriptoru olusturma asamasinda buraya geri gelip duzenleriz.

Hatam varsa duzeltirseniz sevinirim.

Device descriptorumu olusturduguma gore simdi de 9 byte'lik Configuration Descriptorumun icini doldurayim.

bLength=0x09
bDescriptorType=0x02
wTotalLength=XXXX   (Diger descriptorleri olusturduktan sonra geri gelip burayi degistirecegiz [2 Byte])
bNumInterfaces=0x02 (64 Byte'lik alma ve gonderme isini yapacak iki ayri interface'im var)
bConfigurationValue=Anlamadim
iConfiguration=Anlamadim
bmAttributes=0x60  (Cihazimin kendi beslemesi olacak, remote wakeup ozelligi olacak)
MaxPower=0x00 (Cihazimin kendi beslemesi olacagindan PCnin USB beslemesinden akim cekmeyecegim)


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

"... a healthy dose of paranoia leads to better systems." Jack Ganssle

t2

Bunalmis hocam elinizde kullanacağınız çipe ait bir hid örneği var mıdır? fare veya başka bir aygıt olabilir.  Bunu modifiye etmeye çalışabilirim. işiniz görülsün. Elinizde zaten çip varsa hemen deneyip sonucu görürsünüz.

Elde edilen yeni aygıt tanımlamasında bir hata varsa USBlyser  programı ile pcye bağlı aygıtı analiz edip hatalarını görebiliyoruz. Özellikle desciptor uzunluğu farkediyor. bunu otomatiğe bağlamamışsanız stringin uzunluğu  artıp azaldıkça baştaki uzunluğu manuel değiştirmeniz gerekecektir. Ben proton kullanıyorum mesela şöyle yapmış. benim config uzasa da kısalsa da sonundaki adres birlikte yer değiştiriyor dolayısıyla uzunluğu yeniden hesaplanıyor

__Config1Len
	retlw	low ((__EndConfig1-___Config1) / 2)	; Length of this configuration
	retlw	high ((__EndConfig1 - ___Config1) / 2)

z

Malesef elimdeki cipin (LM3S9B92) cok basit HID ornegi yok (Mouse ve klavye ornegi var). Adamlar cipimizi alip rahatca kullansinlar diye usb library vermisler. Ustelik acik kodlari da mevcut. Fakat cok genel amacli yazilmis. Ben basite indirgemeye calistim ama beceremedim.  Eger istersen linkini verebilirim fkat kodlari buraya yapistiramam. (Download ederken doldurdugum kabul ettigimi onayladigim formda oyle diyorlardi)

Desriptor tablosundaki degerlerin bir kismi bir baska header dosyalardan geliyor. Sonucta zaten usb yi kafaya taktim. Bu basliktaki tartismalarla gozum biraz aralanir gibi oldu. Dokumanlarda daha onceleri goremedigim basliklari artik secebilmeye basladim. O yuzden usb nin defterini bu baslikta durmeye kararliyim.

Ama soyle bir iyilikte bulunursan sevinirim.

Benim yapmaya calistigim cihazi anladin.

Boyle bir cihazin tum descriptorlerini olusturabilmek adina,  kes yapistir degistir mantigiyla ornek herhangi bir cihazin descriptorlerini modifiye edip al senin olusturmak istedigin descriptorler iste bunlar deyip buraya koyarsan, degiskenlerin hemen sagina aciklamalari yazar ve isi hizlandiririz.

Fakat tablolarda hangi deger ne anlama geliyor neden o degeri koydun yada koymuslari gene de tartisiriz.

Sen bana hazir desciptorleri vermis olsan bile hemen calisir hale getirebilirmiyim bilmiyorum. Cunku kodlarimi dogrudan cipin registerlerine ulasacak sekilde yaziyorum.
Zamanim bol.

Evet otomatik olayindan haberim var. Tablo boylari degisince otomatik derleyici hesaplayip bazi degerleri kendi olusturuyor. Fakat atla deve değil bytlari simdilik tek tek sayip kendim de koyarim yada bende ayni otomatik hesaplama islemini devreye sokarim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com