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.
usb.org diye bir site var elbette biliyorsunuz ama bir hatırlatayım dedim.
http://www.beyondlogic.org/usbnutshell/usb5.shtml
http://www.thesycon.de/eng/usb_descriptordumper.shtml
Okuyarak beceremiycem gibi gorunuyor.
Firmalar calisanlarina USB egitimini nasil aldiriyorlar acaba?
İ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.
USb orgdan destek alıyorlardır.
http://www.usb.org/developers/hidpage/#Descriptor_Tool (http://www.usb.org/developers/hidpage/#Descriptor_Tool)
HID Descriptor Tool (http://www.usb.org/developers/hidpage/dt2_4.zip)
http://www.usb.org/developers/hidpage/dt2_4.zip (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/hidpage/)
http://www.usb.org/developers/devclass_docs/HID1_11.pdf (http://www.usb.org/developers/devclass_docs/HID1_11.pdf)
http://www.usb.org/developers/devclass_docs/Hut1_12.pdf (http://www.usb.org/developers/devclass_docs/Hut1_12.pdf)
http://www.alanmacek.com/usb/ (http://www.alanmacek.com/usb/)
http://www.alanmacek.com/usb/descriptors.asm (http://www.alanmacek.com/usb/descriptors.asm)
http://www.usbmadesimple.co.uk/ums_4.htm (http://www.usbmadesimple.co.uk/ums_4.htm)
http://www.microchip.com/forums/tm.aspx?m=413261 (http://www.microchip.com/forums/tm.aspx?m=413261)
http://www.circuitsathome.com/mcu/arduino-usb-host-part-3-descriptors (http://www.circuitsathome.com/mcu/arduino-usb-host-part-3-descriptors)
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.
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
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.
http://www.usb.org/developers/defined_class/ (http://www.usb.org/developers/defined_class/)
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!!!
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/
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)
;)
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)
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.
Alıntı yapılan: bunalmis - 26 Ocak 2011, 22:19:54
bConfigurationValue=Anlamadim
iConfiguration=Anlamadim
bConfigurationValue => multidevice kullanım yaparken birden fazla konfigürasyon tanımlanıyor demiştim burda o konfigürasyonlara index atıyoruz (1,2...)
iConfiguration => konfigürasyonun kullanacağı string'in index'ini buraya yazıyoruz (1. string,2.string,...) Bu stringleri de aşağıda tanımlıyacağız.
Pickit2 çalışan aygıta ait tanımlama bilgisi
http://www.speedyshare.com/files/26511477/pk2descriptor.zip
Alıntı yapılan: bunalmis - 27 Ocak 2011, 00:15:33
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.
Bunu hazır örneğini upload etmiştim zaten galiba mesajı okumadın. header dosyası istemişsin ben tüm dosyaları gönderdim. microchipn genel amaçlı hid örneği var.
https://www.picproje.org/index.php/topic,31499.msg220050.html#msg220050
okudum okumasina da tablodaki degerlerinin anlamini anlamayinca devam edesim gelmedi.
Alıntı yapılan: cynetron - 27 Ocak 2011, 00:18:02
Alıntı yapılan: bunalmis - 26 Ocak 2011, 22:19:54
bConfigurationValue=Anlamadim
iConfiguration=Anlamadim
bConfigurationValue => multidevice kullanım yaparken birden fazla konfigürasyon tanımlanıyor demiştim burda o konfigürasyonlara index atıyoruz (1,2...)
iConfiguration => konfigürasyonun kullanacağı string'in index'ini buraya yazıyoruz (1. string,2.string,...) Bu stringleri de aşağıda tanımlıyacağız.
Bu durumda benim ornegimde tek konfigurasyon olacagina gore
bConfigurationValue=1
iConfiguration=0 diyesim geliyor fakat
Device descriptordeki
iManufacturer=XXXX
iProduct=YYYY
iSerialNumber=ZZZZ
degiskenleri de string alanindan deger almayacaklarmiydi. Bu durumda iConfiguration=3 yazasim geliyor fakat orneklerde 0 goruyorum.
Tanımlama yaptığımız yerin en alt kısmında stringlere (Cihazı taktığımızda bilgisayarın gördüğü isim) index atıyoruz, o indexlerden hangisini kullandığımızı buraya yazıyoruz
Bu örnekte görüldüğü gibi...
;
; This file contains a set of descriptors for a CDC Virtual serial com interface.
;
#define __EP0_BUFF_SIZE 8 ; 8, 16, 32, or 64
#define __MAX_NUM_INT 1 ; For tracking Alternate Setting
#define __MAX_EP_NUMBER 3 ; UEP3
#define __NUM_CONFIGURATIONS 1
#define __NUM_INTERFACES 2
#define __MODE_PP _PPBM0
#define __UCFG_VAL _PUEN | _TRINT | _FS | __MODE_PP ; Set bus for Full Speed
#define __USB_USE_CDC ; Inform the rest of the library subroutines that we're using a CDC interface
; CDC
#define __CDC_COMM_INTF_ID 0
#define __CDC_COMM_UEP UEP2
#define __CDC_INT_BD_IN __ep2Bi
#define __CDC_INT_EP_SIZE 8
#define __CDC_DATA_INTF_ID 1
#define __CDC_DATA_UEP UEP3
#define __CDC_BULK_BD_OUT __ep3Bo
#define __CDC_BULK_OUT_EP_SIZE 64 ; 64 byte output buffer.
#define __CDC_BULK_BD_IN __ep3Bi
#define __CDC_BULK_IN_EP_SIZE 64 ; 64 byte input buffer
#define __VID_Value 0x04D8 ; VID (Vendor Id)
#define __PID_Value 0x000A ; PID (Product Id)
#define __MAX_POWER 40 ; Maximum power consumption (in mA)
;
; ------------------------------------------------------------------------------
; This table is polled by the host immediately after USB Reset has been released.
; These fields are application dependent to be modified to meet your specifications.
;
__DeviceDescriptor
retlw (__EndDeviceDescriptor - __DeviceDescriptor) / 2 ; Length of this descriptor
retlw __DSC_DEV ; bDescType Device
dt 0x10, 0x01 ; bcd USB Revision 1.10 low byte, high byte
retlw __CDC_DEVICE ; bDeviceClass
retlw 0x00 ; bDeviceSubClass
retlw 0x00 ; bDeviceProtocol
retlw __EP0_BUFF_SIZE ; bMaxPacketSize for EP0
dt low(__VID_Value), high(__VID_Value) ; Vendor Id (VID) low byte, high byte
dt low(__PID_Value), high(__PID_Value) ; Product ID (PID) low byte, high byte
dt 0x00, 0x00 ; bcd Device Device release number low byte, high byte
retlw 0x01 ; iManufacturer Manufacturer string index
retlw 0x02 ; iProduct Product string index
retlw 0x00 ; iSerialNumber Device serial number string index
retlw __NUM_CONFIGURATIONS ; bNumConfigurations
__EndDeviceDescriptor
; ------------------------------------------------------------------------------
; This table is retrieved by the host after the address has been set.
; This table defines the configurations available for the device.
; See section 9.6.2 of the Rev 1.0 USB specification (page 184).
; These fields are application dependent to be modified to meet your specifications.
;
; Configuration pointer table
__USB_CD_Ptr
__Configs
db low ___Config1, high ___Config1
db low ___Config1, high ___Config1
; Configuration Descriptor
___Config1
retlw 9 ; Length of this descriptor
retlw __DSC_CFG ; bDescType Configuration
__Config1Len
retlw low ((__EndConfig1 - ___Config1) / 2) ; Length of this configuration
retlw high ((__EndConfig1 - ___Config1) / 2)
retlw __NUM_INTERFACES ; Number of interfaces in this configuration
retlw 0x01 ; Configuration Value
retlw 0x02 ; Index for this configuration ------------------------------------------------------------------------------------------------------------------
retlw 0x80 ; bmAttributes
retlw (__MAX_POWER * 2) ; Max power consumption (2X mA)
; Interface Descriptor
retlw 9 ; Length of this descriptor
retlw __DSC_INTF ; DescType Interface
retlw 0 ; Interface number
retlw 0 ; Alternate setting
retlw 1 ; Number of endpoints in this interface
retlw __COMM_INTF ; Class code
retlw __ABSTRACT_CONTROL_MODEL ; Subclass code
retlw __V25TER ; Protocol code
retlw 0 ; Interface string index
; CDC Class-Specific Descriptors
retlw 5 ; bFNLength (USB_CDC_HEADER_FN_DSC)
retlw __CS_INTERFACE ; bDscType
retlw __DSC_FN_HEADER ; bDscSubType
dt 0x10, 0x01 ; bcd CDC low byte, high byte
retlw 4 ; bFNLength (USB_CDC_ACM_FN_DSC)
retlw __CS_INTERFACE ; bDscType
retlw __DSC_FN_ACM ; bDscSubType
retlw 2 ; bmCapabilities
retlw 5 ; bFNLength (USB_CDC_UNION_FN_DSC)
retlw __CS_INTERFACE ; bDscType
retlw __DSC_FN_UNION ; bDscSubType
retlw __CDC_COMM_INTF_ID ; bMasterIntf
retlw __CDC_DATA_INTF_ID ; bSaveIntf0
retlw 5 ; bFNLength (USB_CDC_CALL_MGT_FN_DSC)
retlw __CS_INTERFACE ; bDscType
retlw __DSC_FN_CALL_MGT ; bDscSubType
retlw 0 ; bmCapabilities
retlw __CDC_DATA_INTF_ID ; bDataInterface
; Endpoint Descriptor
retlw 7 ; bLength (USB_EP_DSC)
retlw __DSC_EP ; bDscType
retlw _EP02_IN ; bEPAdr
retlw 3 ; bmAttributes (_INT)
retlw low (__CDC_INT_EP_SIZE) ; wMaxPktSize
retlw high (__CDC_INT_EP_SIZE)
retlw 2 ; bInterval
; Interface Descriptor
retlw 9 ; Length of this descriptor
retlw __DSC_INTF ; INTERFACE descriptor type
retlw 1 ; Interface Number
retlw 0 ; Alternate Setting Number
retlw 2 ; Number of endpoints in this intf
retlw __DATA_INTF ; Class code
retlw 0 ; Subclass code
retlw __NO_PROTOCOL ; Protocol code
retlw 0 ; Interface string index
; Endpoint Descriptors
retlw 7 ; bLength (USB_EP_DSC)
retlw __DSC_EP ; bDscType
retlw _EP03_OUT ; bEPAdr
retlw 2 ; bmAttributes (_BULK)
retlw low (__CDC_BULK_OUT_EP_SIZE) ; wMaxPktSize
retlw high (__CDC_BULK_OUT_EP_SIZE)
retlw 0 ; bInterval
retlw 7 ; bLength (USB_EP_DSC)
retlw __DSC_EP ; bDscType
retlw _EP03_IN ; bEPAdr
retlw 2 ; bmAttributes (_BULK)
retlw low (__CDC_BULK_IN_EP_SIZE) ; wMaxPktSize
retlw high (__CDC_BULK_IN_EP_SIZE)
retlw 0 ; bInterval
__EndConfig1
; String pointer table
__USB_SD_Ptr
__Strings
db low __String0, high __String0
db low __String1, high __String1
db low __String2, high __String2 ---------------------------------------------------------------------------------------------------------------------------------
db low __String3, high __String3
db low __String4, high __String4
__String0
retlw (__String1 - __String0) / 2 ; Length of string
retlw __DSC_STR ; Descriptor type 3
dt 0x09, 0x04 ; Language ID (0x0409 as defined by Microsoft)
__String1
retlw (__String2 - __String1) / 2
retlw __DSC_STR
dt __VdrNmeStr
__String2 -------------------------------------------------------------------------------------------------------------------------
retlw (__String3 - __String2) / 2
retlw __DSC_STR
dt __DvcDscStr
__String3
retlw (__String4 - __String3) / 2
retlw __DSC_STR
dt __VerStr
__String4
retlw (__String5 - __String4) / 2
retlw __DSC_STR
dt 'C', 0, 'f', 0, 'g', 0, '1', 0
__String5
; Vendor Name String
#define __VdrNmeStr 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'c', 0, 'h', 0, 'i', 0, 'p', 0
; Device Description String
#define __DvcDscStr 'P', 0, 'I', 0, 'C', 0, '1', 0, '8', 0, ' ', 0, 'U', 0, 'S', 0, 'B', 0, ' ', 0, 'C', 0, 'D', 0, 'C', 0 -----------------------------------------------------------------
; Version String
#define __VerStr 'V', 0, '1', 0, '.', 0, '1', 0, 'F', 0, 'S', 0
Benim kafamda farkli bir sey var sanirim.
Device descriptorde 3 tane stringe ait index var.
iManufacturer=XXXX
iProduct=YYYY
iSerialNumber=ZZZZ
Birde configurasyon descriptorde karsimiza iconfiguration cikti
ben soyle dusunuyordum
String1 Bunun indexi xxxx yerine yazilacak
String2 Bunun indexi yyyy yerine yazilacak
String3 Bunun indexi zzzz yerine yazilacak
String4 Bunun indexi iconfiguratin yerine yazilacak
Neyse yarin dokumanlara yenibastan bakayim. Bir sey yanlis anladim henuz cozemedim.
Doğru düşünüyorsunuz stringleri aşağıda oluşturup index numarasını yazacaksınız, elinizde 4 tane string olacak.
konfigürasyondaki çok önemsenmiyor çünkü oluşturacağınız driverda vereceğiniz isim daha baskın geliyor ve o ismi alıyor,
bu yüzden eldeki stringlerden biri tanımlanarak o alan geçiştiriliyor.
cynetron Dedigin gibiymis.
T2 nin verdigi PIC2 ye ait tablolardan sorunumu anladim.
Descriptorlerde kullanilmasini istedigimiz stringleri alt alta yaziyoruz ve bunlarin index degerlerini ilgili descriptore isliyoruz.
Eger birbirinin ayni stringler olacaksa stringleri tekrar tekrar yazmiyor ayni indexi ilgili descriptorlerde kullaniyoruz.
Bu durumda genelde 0 oluyor dedigim string indexler aslinda ayni string descriptordeki ilk mesaji verdirme amacini guduyormus.
T2 nin verdigi descriptorler cok guzel gorunuyor. Aciklama satirlarina Turkce ilaveler yaptigimizda bu baslik HID tipinde USB cihazlarin descriptorlerini ana hatlariyla ogrenmek isteyenler icin mukemmel hale gelecek.
Descriptor 3.sayfaya tasindi.
Araya bir saplama yapayim.
Hayirsever bir vatandasin birisi vendor ID ve Product ID icin para odeyip sonrada ayni makinaya bagli usb cihazlarinizda sadece bir tane bu numarada cihaz kullanmaya raziysaniz
alin size hibe ediyorum, dileyen diledigi cipte diledigi uygulamada kullansin. Kullananlarin basina is getirmeyecegim tarzinda bir durum varmi?
Bu site 10€ ya product id satıyor, her cihaz için 1 tane rahatlıkla alınabilir
http://www.mcselec.com/index.php?page=shop.product_details&flypage=shop.flypage&product_id=92&option=com_phpshop&Itemid=1
ayrıca microchip kendi VID si üzerinden PID imkanıda veriyor
http://ww1.microchip.com/downloads/en/AppNotes/Application%20for%20USB%20Vendor%20ID%20Sublicense.pdf
Yada 4000$/65535 = 6,1 cent$/ürün olarak picproje olarak toplu olarak VID ve PID alınabilir ;)
Alıntı yapılan: cynetron - 27 Ocak 2011, 03:24:52
Yada 4000$/65535 = 6,1 cent$/ürün olarak picproje olarak toplu olarak VID ve PID alınabilir ;)
Boyle bir organizasyona sıcak bakanlarla 64 kişilik katılım çok rahat elde edilebilir. 4000/64=63$ maliyeti olur. (Bilemedik 100$)
Adam başı 1000 farklı cihaz yapacak kadar da seçeneğimiz olur. Hesabımda hata yoksa bu organizasyonu hemen başlatalım.
Satın alımı firma adına yapmak şartmı acaba. Picproje organizasyonu olarak satın alma durumumuz olabilirmi?
Ayrı bir konu açıp sıcak bakanları oraya toplayalım yalnız, buradaki konuyu dağıtmayalım =)
Ayrı kullanımdan ötürü logo kullanımı kısıtı gelebilir, bunların detaylarını o konu başlığı üzerinden devam ettirelim =)
O zaman senden uygun bir bolumde baslik acmani rica edelim. Boyle bir organizasyonda ben varim. Hatta zamanin musait se adamlarla yazismalari sen yurutebilirsin.
Dersler, iş ayrıca bazı ufak projelerle uğraşmaktan kendime pek vakit ayıramıyorum hocam,
gerekli desteği verebilirim ama işi yürütme konusunda zaman problemim çok oluyor, bu konuda affınıza sığınıcam =(
2-3 sene önce de aynı konu gündeme geldi. yine söyledim bedava PID veriyorlar neden almıuyorsunuz. adam illaki benim çipimi kullanacaksın da demiyor. VID onun PID senin. Yani bu 8 adet pidi sana tahsis etmiş. FTDI veriyor. hala veriyorsa bir bakın.
http://www.keil.com/forum/search.asp?SA=&KW=&DY=&PL=&Q=hid+usb&KB=ON&PM=ON&FR=ON&PG=9&PX=1
Zamanında burada veya başka formda usb ile ilgili sorular sormuştum ama herhangi bir neticeye ulaşamamıştım keilin kendi formunda sorduğum zaman gayet hızlıca çözüme ulaştım. kolay gelsin.
Report descriptor hakkinda birseyler soyleyecek olan varmi?
Evet T2 ne yapacagiz simdi, bu report descriptorde ne degisiklikler yapilabilir? Bu descriptorde ne ne ise yariyor?
HID cihaza ait report descriptor, gelen verilerin baytların hatta bitlerin bir haritasıdır. hangi bitin hangi işe yarayacağını bilgisayar tarafında ayıklamamızı sağlayan bir tanımlamadır. Mesela joystik yaptık üzerinde 6 buton ve 6 tane pot olsun. butonların on off bilgisini bazı bitlerden alabiliriz. Pot adc değerini ifade eden baytlar da vardır. ve kesin olarak bu bilgileri alabiliriz. Windows apilerinden bu bilgileri alabiliyormuşuz.
Vendordefined report kullanırsanız, cihaza gönderdiğiniz 64 bayt yerine ulaşır. ve cihazdan gelen 64 baytı da okursunuz. Baytlar buton veya POT verisi gibi ayrılmamış. Baytların neyi ifade ettiğini ise kendiniz belirleyebilirsiniz. Mesela ilk 3 bayt işlem kodu, sonraki 3 bayt işlemin datası sonraki baytlar da başka bir şeyi olabilir.
Bu projedeki (https://www.picproje.org/index.php/topic,31499.msg220050/topicseen.html#msg220050) report descriptor, size 1 interface için maksimum transfer hızı sağlar. ayrıca bir yerlerini değiştirmenize gerek yok. 1ms içinde 64 bayt gönderebilir ve alabilirsiniz.
En son sayfaya taşındı.
Ben sizin verdiğiniz bilgileri teyid edebilecek durumda değilim. O kadar bilm yok. Calışan cihaz olarak örnek verdiğim pickit 2 tanımlamasında da hata varmış. görmüşsünüzdür. 2 tane config var gibi görünüyor. 2. si nerede? hem de hid versiyonu yanlış görünüyordu. Fakat bu hatalar ciddi olmasa gerek. çünkü cihaz çalışıyor.
Ayrıyeten cihazın çalışabilmesi için başka değerleri de report count ile aynı yani 64 ayarlamamız gerekir
#define __HID_INT_IN_EP_SIZE 64
#define __HID_INT_OUT_EP_SIZE 64
gibi
@bunalmis hocam;
Maksimum 64KB/s transfer hızı projeniz için yeterli olacakmı sizce ?
Eskiden FT232 ile çalışırken 115200 baud kullanıyordum.
Bu hız, saniyede yaklaşık 10K byte demek. Ustelik bunlar sadece sade veriler değil, al gülüm ver gülüm, olmadı bir daha gibi soft protokolüme ait istek ve yanıtları da içerdiğinden saniyede aktarılan saf verilerin sayıyı bunun çok altında kalıyordu.
Haliyle tamamen USB ye geçtiğimde 32Kb/sec bile işimi fazlasıyla görecek.
Alıntı yapılan: t2 - 28 Ocak 2011, 11:24:27
..Calışan cihaz olarak örnek verdiğim pickit 2 tanımlamasında da hata varmış. görmüşsünüzdür. 2 tane config var gibi görünüyor. 2. si nerede? hem de hid versiyonu yanlış görünüyordu. Fakat bu hatalar ciddi olmasa gerek. çünkü cihaz çalışıyor.
Ayrıyeten cihazın çalışabilmesi için başka değerleri de report count ile aynı yani 64 ayarlamamız gerekir
#define __HID_INT_IN_EP_SIZE 64
#define __HID_INT_OUT_EP_SIZE 64
gibi
Verdiğin PIC2 descriptörleri kendime göre uyarlayıp yukarıda açıklamaya çalışıyorum. Çok fazla değişikli yaptığımı hatırlamıyorum. Yanlış hatırlamıyorsam, çipim desteklediği için paket boyunu 8 den 64 de çıkarttım.
Configurasyon sayısını da 1 yapıp bunu bNumConfigurations ve bConfigurationValue yerlerine yazmıştım. Bu durumda descriptorlerde hatamız yok.
Sadece Report descriptor kafama yatmadı bunu modifiye etmeye çalışıyorum fakat çok karmaşık, farklı bir iki dokumanı izleyip anlamaya çalışıyorum.
Bu kısmı anlatacak biri çıksa da beni bu zahmetten kurtarsa diye de bekliyorum.
Şeytan bu desriptörü traşla diyor ama çekiniyorum. Sanki bununla hiç işim olmayacak gibi duruyor.
Peki bunu değiştirmek istememenize sebep nedir? Sorun mu çıkıyor? pic kit 2 yerine diğer örneği kullansak daha iyi olabilir. En azından hid versiyonunu 1.11 olarak düzgün yazmışlar. bu daha güvenilir.
https://www.picproje.org/index.php/topic,31499.msg220050/topicseen.html#msg220050
http://frank.circleofcurrent.com/cache/hid_tutorial_1.htm (http://frank.circleofcurrent.com/cache/hid_tutorial_1.htm)
Alıntı yapılan: t2 - 28 Ocak 2011, 13:02:37
Peki bunu değiştirmek istememenize sebep nedir? Sorun mu çıkıyor? pic kit 2 yerine diğer örneği kullansak daha iyi olabilir. En azından hid versiyonunu 1.11 olarak düzgün yazmışlar. bu daha güvenilir.
https://www.picproje.org/index.php/topic,31499.msg220050/topicseen.html#msg220050
Degistirmek istememin sebebi yapmak istedigim cihaz belli. Buna ait desriptorlerin icinde PIC2 ve microchipe ait hic bir kirinti kalmasin.
Her ne kadar hala VID ve PID kalsa da bunlari en kisa zamanda degistirecegim.
Ikinci verdigin ornege derinlemesine bakmadim hemen bakayim.
/* Device Descriptor */
ROM USB_DEVICE_DESCRIPTOR device_dsc=
{
0x12, // Size of this descriptor in bytes
USB_DESCRIPTOR_DEVICE, // DEVICE descriptor type
0x0200, // USB Spec Release Number in BCD format
0x00, // Class Code
0x00, // Subclass code
0x00, // Protocol code
USB_EP0_BUFF_SIZE, // Max packet size for EP0, see usb_config.h
0x04D8, // Vendor ID
0x003F, // Product ID: Custom HID demo
0x0002, // Device release number in BCD format
0x01, // Manufacturer string index
0x02, // Product string index
0x00, // Device serial number string index
0x01 // Number of possible configurations
};
/* Configuration 1 Descriptor */
ROM BYTE configDescriptor1[]={
/* Configuration Descriptor */
0x09,//sizeof(USB_CFG_DSC), // Size of this descriptor in bytes
USB_DESCRIPTOR_CONFIGURATION, // CONFIGURATION descriptor type
0x29,0x00, // Total length of data for this cfg
1, // Number of interfaces in this cfg
1, // Index value of this configuration
0, // Configuration string index
_DEFAULT | _SELF, // Attributes, see usb_device.h
50, // Max power consumption (2X mA)
/* Interface Descriptor */
0x09,//sizeof(USB_INTF_DSC), // Size of this descriptor in bytes
USB_DESCRIPTOR_INTERFACE, // INTERFACE descriptor type
0, // Interface Number
0, // Alternate Setting Number
2, // Number of endpoints in this intf
HID_INTF, // Class code
0, // Subclass code
0, // Protocol code
0, // Interface string index
/* HID Class-Specific Descriptor */
0x09,//sizeof(USB_HID_DSC)+3, // Size of this descriptor in bytes
DSC_HID, // HID descriptor type
0x11,0x01, // HID Spec Release Number in BCD format (1.11)
0x00, // Country Code (0x00 for Not supported)
HID_NUM_OF_DSC, // Number of class descriptors, see usbcfg.h
DSC_RPT, // Report descriptor type
HID_RPT01_SIZE,0x00,//sizeof(hid_rpt01), // Size of the report descriptor
/* Endpoint Descriptor */
0x07,/*sizeof(USB_EP_DSC)*/
USB_DESCRIPTOR_ENDPOINT, //Endpoint Descriptor
HID_EP | _EP_IN, //EndpointAddress
_INTERRUPT, //Attributes
0x40,0x00, //size
0x01, //Interval
/* Endpoint Descriptor */
0x07,/*sizeof(USB_EP_DSC)*/
USB_DESCRIPTOR_ENDPOINT, //Endpoint Descriptor
HID_EP | _EP_OUT, //EndpointAddress
_INTERRUPT, //Attributes
0x40,0x00, //size
0x01 //Interval
};
//Language code string descriptor
ROM struct{BYTE bLength;BYTE bDscType;WORD string[1];}sd000={
sizeof(sd000),USB_DESCRIPTOR_STRING,{0x0409
}};
--------------------------------------------------------------------------------
//Class specific descriptor - HID
ROM struct{BYTE report[HID_RPT01_SIZE];}hid_rpt01={
{
0x06, 0x00, 0xFF, // Usage Page = 0xFF00 (Vendor Defined Page 1)
0x09, 0x01, // Usage (Vendor Usage 1)
0xA1, 0x01, // Collection (Application)
0x19, 0x01, // Usage Minimum
0x29, 0x40, // Usage Maximum //64 input usages total (0x01 to 0x40)
0x15, 0x01, // Logical Minimum (data bytes in the report may have minimum value = 0x00)
0x25, 0x40, // Logical Maximum (data bytes in the report may have maximum value = 0x00FF = unsigned 255)
0x75, 0x08, // Report Size: 8-bit field size
0x95, 0x40, // Report Count: Make sixty-four 8-bit fields (the next time the parser hits an "Input", "Output", or "Feature" item)
0x81, 0x00, // Input (Data, Array, Abs): Instantiates input packet fields based on the above report size, count, logical min/max, and usage.
0x19, 0x01, // Usage Minimum
0x29, 0x40, // Usage Maximum //64 output usages total (0x01 to 0x40)
0x91, 0x00, // Output (Data, Array, Abs): Instantiates output packet fields. Uses same report size and count as "Input" fields, since nothing new/different was specified to the parser since the "Input" item.
0xC0} // End Collection
};
vid ve pid ile, cihazın ismi gibi bazı stringleri direk editlersiniz. String vasıtasıyla descriptyor uzunluğu değiştiyse onu yeniden sayıp yerine yazılabilir. Diğer kısımlar firmanın kendine has bilgiler değildir.
En sagdaki kirmizi renkli verilerden ilki, o descriptordeki sıra no (index), diğeri ise o satırdaki verinin kac byte oldugunu söylermekte.
Tabiki bu değerler biz okuyanlar icin. Yoksa cipin icine sadece en soldaki degerleri gömeceğiz.
Connection Status Device connected, Current Configuration 1, Speed Full, Device Address 3 , Number Of Open Pipes 2
Device Descriptorümüz
bLength= 0x12..................... Bu tablonun uzunluğu (byte sayısı) daima 0x12....0-1 Byte
bDescriptorType= 0x01......... Bu descriptörde bu değer daima 0x01 ..................1-1 Byte
bcdUSB= 0x00,02.................. USB 2.0 (0x110 da USB 1.1)................................2-2 Byte
bDeviceClass=0x00............... Sınıf bilgisini Interface Descriptorden al demek.....4-1 Byte
bDeviceSubClass=0x00......... Alt sınıfı yok...........................................................5-1 Byte
bDeviceProtocol=0x00........... Protokol yok..........................................................6-1 Byte
bMaxPacketSize0=0x40......... Paketler 64 byte taşıyacak....................................7-1 Byte
idVendor=0xD8,0x04............. Microchipe ait kod (USB organizasyonu veriyor)...8-2 Byte
idProduct=0x3F,0x00............. Microchipe ait kod (Micro chip veriyor)................. 10-2 Byte
bcdDevice=0x00,0x02............ Cihazın sürüm numarası (Micro chip veriyor).........12-2 Byte
iManufacturer=0x01............... 1 numaralı string...................................................14-1 Byte
iProduct=0x02........................ 2 numaralı string...................................................15-1 Byte
iSerialNumber=0x03............... 3 numaralı string...................................................16-1 Byte
bNumConfigurations=0x01..... Tek konfigurasyonumuz olacak.............................17-1 Byte
Bugune kadar farklı sınıf cihazlarda DeviceClass=0x00 görünce kafam karışıyordu.
Halbuki bu değer 0 olursa sınıf bilgisini Interface Descriptorden alacağız anlamına geliyormuş.
Configuration Descriptorümüz
bLength=09h..................... Bu tablonun uzunluğu (byte sayısı) daima 0x09....0-1 Byte
bDescriptorType=0x02........ Bu descriptörde bu değer daima 0x02 ..................1-1 Byte
wTotalLength=0x029,0x00.. Not 1 ....................................................................2-2 Byte
bNumInterfaces=0x01......... Interface sayımız.. ................................................4-1 Byte
bConfigurationValue=0x01.. Configurasyon değerimiz.......................................5-1 Byte
iConfiguration=0x00.............0 numaralı string kullanılacak................................6-1 Byte
bmAttributes=0xE0...............Not 2....................................................................7-1 Byte
bMaxPower=0x32.................USB hattan çekilecek akım....................................8-1 Byte
Not 1
configuration, interface, endpoint, ve HID descriptorler de dahıl olmak uzere toplam uzunluk.
9 + 9 + 7 + 7 + 9 = 41 yani 0x29
Not 2
Cihazımız USB hattından değil kendi güç kaynağından beslenecek ve remote wakeup özelliği olacak.
64 bitlik veri alış verişi yapan tek bir interfaceimiz var.
bmAttributes değerini oluşturmak için,
4..0: Reserved ...00000
5: Remote Wakeup ..1.....
6: Self Powered .1......
7: Reserved (1)
11100000=0xE0 değerini buluruz.
Device descriptörde bNumConfigurations=0x01 demiştik. O halde aşağıdaki Configuration Descriptor bu descriptor demektir.
0x01 değil de 0x02 olsaydı configuration descriptor sayımız da 2 olacak ve bConfigurationValue değerleri;
ilkinde bConfigurationValue=0x01
ikincisinde bConfigurationValue=0x02 olacaktır. (Teyid ederseniz çok iyi olur)
bMaxPower değeri için USB hattan asılınacak akım değerini bilmemiz gerekiyor. Benim uygulamamda bu akım sıfır olacağından
sıfır yazacağım. Fakat 0 dan büyük bir değer yazmam da da sakınca yok görünüyor. 100mA akım çektiğimi varsayarsan bunun
yarısı 50 yani 0x32
Interface Descriptorümüz
Iki tane End Pointimiz var. Birisi input digeri output amacli
bLength=0x09..................... Bu tablonun uzunluğu (byte sayısı) daima 0x09....0-1 Byte
bDescriptorType=0x04......... Bu descriptörde bu değer daima 0x04 ..................1-1 Byte
bInterfaceNumber=0x00.......1 tane Interfaceimiz var ve numarası 0..................2-1 Byte
bAlternateSetting=0x00........Alternatif Setting yok..............................................3-1 Byte
bNumEndpoints=0x02...........2 tane End Point var...............................................4-1 Byte
bInterfaceClass=0x03...........HID sınıfındanız......................................................5-1 Byte
bInterfaceSubClass=0x00.....Alt sınıfımız yok.......................................................6-1 Byte
bInterfaceProtocol=0x00.......Protokolumuz yok...................................................7-1 Byte
iInterface=0x00.....................0 numaralı string.....................................................8-1 Byte
HID Descriptorümüz
bLength=0x09.......................Bu tablonun uzunluğu (byte sayısı) daima 0x09....0-1 Byte
bDescriptorType=0x21.......... Bu descriptörde bu değer daima 0x21 ..................1-1 Byte
bcdHID=0x00,0x02................ 0X100 yada daha büyük olmalı..............................2-2 Byte
bCountryCode=0x00............. Ülke kodu yok........................................................4-1 Byte
bNumDescriptors=0x01..........Rapor descriptorlerin sayısı...................................5-1 Byte
bDescriptorType=0x22...........Report descriptorün tipi.........................................6-1 Byte
wDescriptorLength=0x1D,0x00...Report descriptorün uzunluğu...............................7-2 Byte
Eğer HID desriptorde opsiyonel olarak, ilave descriptorlerimiz olacaksa bunların descrpitor tipini ve uzunluğunu yukarıdaki tablonun sonuna
ilave ediyoruz. Haliyle tablo boyu uzayacağından en baştaki bLength değerini de modifiye etmemiz gerekiyor. Benim uygulamamda böyle bir durum olmadığından yukarıdaki HID tablosunu aynen kullanacağız.
İki tane End Pointimiz var. Bunların herbiri için Endpoint descriptor tanımlayacağız.
Endpoint Descriptorlerimiz
1. Endpointe ait descriptor
bLength=0X07.......................Bu tablonun uzunluğu (byte sayısı) daima 0x07....0-1 Byte
bDescriptorType=0X05..........Bu descriptörde bu değer daima 0x05 ..................1-1 Byte
bEndpointAddress=0X81.......Not 3......................................................................2-1 Byte
bmAttributes=0X03...............Interrupt tipi transfer.............................................3-1 Byte
wMaxPacketSize=0x40,0x00.Paketler 64 byte uzunluğunda...............................4-2 Byte
bInterval=0x01......................Not 4......................................................................6-1 Byte
2. Endpointe ait descriptor
bLength=0x07.......................Bu tablonun uzunluğu (byte sayısı) daima 0x07....0-1 Byte
bDescriptorType=0x05..........Bu descriptörde bu değer daima 0x05 ..................1-1 Byte
bEndpointAddress=0x01.......Not 3......................................................................2-1 Byte
bmAttributes=0x03...............Interrupt tipi transfer.............................................3-1 Byte
wMaxPacketSize=0x40,0x00.Paketler 64 byte uzunluğunda...............................4-2 Byte
bInterval=0x01......................Not 4......................................................................6-1 Byte
Not 3
In tipi endpointimizin adresinde 7.bit 1
Out tipi endpointimizin adesinde 7.bit 0 dır.
Not 4
Interrupt transferde endpointlerimiz pc tarafindan ne sıklıkla yoklanacak?
Full speed için en dusuk deger olan 1 i kullanacağım. Bu değer 1ms ye karşılık geliyor.
String Descriptorlerimiz
char StringDesZero[4]={ //Language code string descriptor
4, 0x03, // Length, Type=String
0x09, 0x04}; // Code English
char ManufacStr[24]={
24, 0x03, // Length, Type=String
'C',0,'n',0,'c',0,'d',0,'e',0,'s',0,'i',0,'g',0,'n',0,'e',0,'r',0};
char ProductStr[26]={
26, 0x03, // Length, Type=String
'P',0,'C',0,'B',0,' ',0,'E',0,'n',0,'g',0,'r',0,'a',0,'v',0,'e',0,'r',0};
char SerialNumStr[10]={
10, 0x03, // Length, Type=String
'T',0,'0',0,'0',0,'0',0};
HID Report Descriptorümüz
Report descriptorun yapısı daha önceki karşılatığımız descriptor yapılarından çok farklıdır.
Her satır öncü veri içerir ve bu veri, satırdaki takip eden veriler hakkında açıklayıcı bilgileri barındırır.
Örneğin aşağıdaki ilk satırda 06 00 FF verisinde öncü verimiz 0xFF dir.
Usage Page (Vendor-Defined 1) 06 00 FF
Usage (Vendor-Defined 1) 09 01
Collection (Application) A1 01
Usage Minimum (Vendor-Defined 1) 19 01
Usage Maximum (Vendor-Defined 64) 29 40
Logical Minimum (0) 15 01
Logical Maximum (255) 25 40
Report Size ( 8 ) 75 08
Report Count (64) 95 40
Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 00
Usage Minimum (Vendor-Defined 1) 19 01
Usage Maximum (Vendor-Defined 64) 29 40
Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 00
End Collection C0
Nihayet yukaridaki 64 byte report desriptorleri barindiran HID descriptoru sorunsuz kullanmaya basladim.
Get Report Descriptor, Set Report Descriptor istekleriyle 64 byte veri transferini gerceklestirdim.
Ancak elimdeki test program sadece descriptorler uzerinden kontrol transferi ile veri aktarimi yapiyor. Halbuki interrupt transferi yaparak veri aktarmam gerekiyor. Bunun icin hazirda ornek program varmi?
Benim verdiğim örnekler zaten öyledir. interrupt transferi yaparak veri aktarır.
Bazı kötü haberlerim var: HID cihazlar çoğu pcde sorunsuz olmasına rağmen bazı bilgisayarlarda beklendiği gibi çalışmıyor ( ya da biz beceremedik diyelim) Mesela ince ayar yaptım 2-3 tane cihaz değiştirdim müşterinin sorunu yine düzelmedi. Sonra eski FTDI çip kullandığım eski versiyon cihazı taktım sorun düzeldi. Sorun nedir derseniz aygıt zamanlamasında kesintioluyor aygıtta veriler yerine ulaşmadı deyip beklemede kalıyor. Cihaz aygıt yöneticisinde sorunsuz görünmesina rağmen haberleşmede sıkıntı çıkıyor. Çünkü zamanlama zaten kesin değilmiş. yani 1ms dediysek 1.2 de olabilir. 0.8 de.
Ornek derken PC tarafinda kosturup usb cihazimi deneyebilecegim yazilimdan bahsediyorum.
Bugune kadar FT232 cipinde isimi FT nin kendi dll leri ile goruyordum. Simdi HID'a bulasinca sudan cikmis baliga dondum.
windowsun hid.dll inden bahsediliyor. Bu dll in fonksiyonlari nelerdir parmaterleri nelerdir basit bir ornek uygulama vs ariyorum.
Simdilik JEDI kompenent kullanilarak delphi de yazilmis ve hazir exe si de bulunan bir uygulama ile usb cihazimi deniyorum. Fakat bu program
interrupt transferi yapmiyor.
Verdigin desriptor isimi cok guzel gordu. Renklendirerek aciklamalar ekledigim desriptorlere son degisiklikleri de ilave edecegim. Benim tek yaptigim string desriptorler eklemek ve bunlarin indexlerini diger desriptorlerde yerine yazmak.
HID yapisinda iki tip transfer yapiyorsunuz. (Teyide ihtiyac var)
Ilki control transferi ile. Bu yontemde usb cihazdan report desriptor istiyorsunuz. USB cihazinizdaki islemci derhal report desriptorde belirtilen sayi kadar veriyi control hattindan PC ye yolluyor, yada tersine PC usb cihazimiza control hattindan HID report desriptorde bahsettigi kadar sayida veriyi yolluyor.
Ancak bu veri transferi yuksek hizli değil ve bus trafigine bagli olarak istekler gecikmeli giidiyor.
Eger veriler interrupt transferi ile yollanacaksa bu durumda veriler 1ms civarinda kesin olarak gonderiliyor. Fakat henuz bu transferi yapacak usb rutinlerini yazmadim. Yazabilmek icin pc tarafinda hazirda calisan bir program olmali ki debug islemlerim kolay yurusun.
Interrupt transferde 1ms belirtmeniz veri hızınızın %100 o hızda olmasını garantilemez. Sadece USB kaynaklarının büyük kısmını o transfere ayırarak bunu sağlamaya çalışır. Yani bu 1ms de olabilir 2 ms de. Transfer hızı USB veriyolundaki iş yüküne bakar. Bu nedenle zaman kritik bir uygulamada mevcut sistemdeki usb cihazların sayısını mümkün olduğunca az tutmak her zaman mantıklıdır.
Bu yazdiklarinizdan eminmisiniz? Cunku yazdiklariniz aynen bulk transfer icin gecerli.
bulk transferde endpoint için süre belirtmek anlamlı değil. çünkü işe yaramaz. isterseniz 0 isterseniz 10 yazın dikkate alınmaz. Fakat 1ms den daha kısa aralıklarla veri gönderip almaya kalkarsak sorun çıkabiliyordu.
Hocam dökümantasyonda belirtilen genelde garantili zaman kritik veri taşıma diye geçiyor ancak.
Bakın;
USB Complete 4rd - s76Alıntı Yap
At low and full speeds, the bandwidth available for an interrupt endpoint is
limited, but high speed and SuperSpeed loosen the limits.
Alıntı Yap...both bulk and interrupt
endpoints must wait for the host to request data before sending data.
USB Complete 4rd - s78Alıntı YapAn interrupt transfer guarantees a maximum latency, or time between transaction
attempts. In other words, there is no guaranteed transfer rate, just the guarantee
that the host will make bandwidth available for a transaction attempt in
each maximum latency period.
Burada belirtilen kısıtlı bant genişliği ve hostu bekleme mevzuları teorikte bahsedilen zamanlamayı yalanlayabiliyor.
Helede OHCI, UHCI, EHCI v.s. gibi host standartlarını düşününce.
Yani yazacağınız kodunda zamanlaması iyi olmalı ve 1ms küçümsenecek bir zamanlama değil.
Zaman kaymasını göz ardı edebilmek için cihazda ve pc tartafında yeterli bir buffer olmalı
Ne oldu bizim interrupt transferi.
Interrupt transferini sizler nasil yapiyorsunuz? Henuz PC tarafi icin tek bir ornek bile bulamadigim gibi, usb cipin yaziliminda da ne yapacagimi bilmiyorum. End Point 1 IN ve End Point OUT kuzu kuzu bekliyor. Simdilik tum transferler End Point 0 uzerinden gidip geliyor.
interrupt transferi için, örnek yayınlayacam. fakat şuan meşgulüm. DLL gerek. bu işin şanındandır. angarya işler, low level fonksiyonlar ile uğraşmadan kesin çözüm. Fakat bunu da sevmeyebilirsiniz. DLL içinde kimbilir ne vardır.
HID sinifindan cihazlarla interrupt transfer nasil yapiliyor anlamadim.
End Point 0 uzerinden kontrol transferi yaparak enumeration islemini yapiyoruz. Hatta End Point 0 uzerinden Get Report Descriptor ve Set Report Descriptor talepleri ile usb cihaza veri aktarabiliyor yada tersine veri alabiliyoruz.
Peki interrupt transferi nasil yapiyoruz? PC usb cihazimiza data yollayacaksa ne yapiyor? Endpoint1 e data yollamasi yetiyormu?
Usb cihaz PC ye data yollayacaksa Endpoint 1 bufferini doldurup yolla mi diyor? Yolla derse transfer ne zaman basliyor? Transferi PC mi baslatiyor yoksa usb cihazin yolla demesi yeterli mi?
Bu sorularin cevabini nasil nereden bulacagim?
Edit: Hep gozumun onundeki satirlari gormezlikten gelmisim. Umarim yeterli olur.
IN: The host will periodically poll the interrupt endpoint. This rate of polling is specified in the endpoint descriptor which is covered later. Each poll will involve the host sending an IN Token. If the IN token is corrupt, the function ignores the packet and continues monitoring the bus for new tokens.
If an interrupt has been queued by the device, the function will send a data packet containing data relevant to the interrupt when it receives the IN Token. Upon successful recept at the host, the host will return an ACK. However if the data is corrupted, the host will return no status. If on the other hand a interrupt condition was not present when the host polled the interrupt endpoint with an IN token, then the function signals this state by sending a NAK. If an error has occurred on this endpoint, a STALL is sent in reply to the IN token instead.
OUT: When the host wants to send the device interrupt data, it issues an OUT token followed by a data packet containing the interrupt data. If any part of the OUT token or data packet is corrupt then the function ignores the packet. If the function's endpoint buffer was empty and it has clocked the data into the endpoint buffer it issues an ACK informing the host it has successfully received the data. If the endpoint buffer is not empty due to processing of a previous packet, then the function returns an NAK. However if an error occurred with the endpoint consequently and its halt bit has been set, it returns a STALL.
İşlerden Dolayı (Sınav Haftası) Pek Takip Edemiyor Cevap Yazamıyorum.
Jan Hanımın Kitabı Mevcut Oradan yardım etmeye bilgi alışverişinde bulunmaya çalışacağım..
interrupt transfer örneği
http://www.speedyshare.com/files/26614681/USBProject.zip
Interrupt transferinin PC den cihaza dogru olan tarafini basardim. JEDI komponentli PC programinda zaten bunun ornek kodunu yazmislar.
(write butonu)
Fakat cihazdan PC ye dogru olan transfer icin delpi kodlarda ornek yok. Dolayisi ile usb tarafinin kodlarini yazamiyorum.
JEDI de bunun icin hangi komut kullaniliyor?
Componentin OnData eventi usb den data paketi geldiginde otomatik olarak tetikleniyor. Size sadece poniterin gosterdigi adreslerden datalari cekmek kaliyor.
evet öyledir. burayı göstermek datayı memorystream'e atmak için ^ filan gerek.
Aşağıdaki linkte de USB üzerine güzel şeyler yazmış güzel tecrübeler edinmişiz.
https://www.picproje.org/index.php/topic,39792.0.html (https://www.picproje.org/index.php/topic,39792.0.html)
Derli toplu olsun diye link vereyim istedim.