USB cipin D+ bacagina 1K5 direnci takmadigimiz durumda, Device Descriptorde ise bcdUSB degerini 2.0 icin tanimlarsak ne olur?
Enumeration asamasinda PC, bana device_qualifier descriptorunu soruyor, bunun sebebi yukaridaki gibi bir durum mu yoksa baska bir neden mi var?
Cihazın USB 2.0 olması full speed olduğu anlamına gelmez.
USB 1.1 cihaz da full speed , low speed olabilir.
USB 1.1 ile 2.0 in arasinda sadece hiz farki oldugunu saniyordum.
Alıntı YapUSB 1.1 ve USB 2.0 portları fiziksel olarak aynıdır. USB 1.1 standardı, veri iletişim hızını 12 Mbit/saniye ile sınırlar. USB 2.0'da veri iletişim hızı 480 Mbit/saniye'dir. Arada büyük fark vardır. USB portunu kullanan USB 1.1'nin hız kısıtlamasından dolayı yüksek performansta çalışan aygıtlar üretilemiyordu; USB 2.0 ile bu sınır ortadan kalktı. Örneğin, artık yüksek hızda CD / DVD yazıcılar USB 2.0 standardını kullanır.
Bu durumda Usb 2.0 High speed modu destekliyor. O halde Usb 1.1 de low speed ile full speed gibi neden iki ayri hiz farkina neden ihtiyac olunmus?
Cipimin dokumaninda
USB 2.0 full-speed (12 Mbps) and low-speed (1.5 Mbps) operation yaziyor.
Bu durumda bu cip USB 2.0 olmasina ragmen 480 Mbit/san hizi kullanamayacagim. Peki o zaman firma cipe neden USB 2.0 demis? Sadece Suspend ve Resume sinyallerinin eklenmis olmasi mi fark?
Hocam bunu bildiğinizi sanıyordum. Çinlilerin sık kullandığı bir aldatmacaydı bu mevzu bir aralar. Çakma MP4 playerlara usb 2.0 yazarlardı ama aktarım hızları çok yavaştı. Full Speed yani.
USB 2.0 = 480mbps değil. Full Speed ise 12, High Speed ise 480. ancak bu hız mevzunu usb chipin frekans ve sinyalizasyon hızı belirliyor bildiğim kadarıyla. Ve dediğiniz gibi USB 2.0 kural ve protokol olarak USB 2.0 hız olarak değil. Hız için özellikle HS diye bakmanız gerekiyor mcu ya.
http://www.beyondlogic.org/usbnutshell/usb2.shtml#SpeedIdentification
Alıntı Yap
You will notice we have not included speed identification for High Speed mode. High speed devices will start by connecting as a full speed device (1.5k to 3.3V). Once it has been attached, it will do a high speed chirp during reset and establish a high speed connection if the hub supports it. If the device operates in high speed mode, then the pull up resistor is removed to balance the line.
USB konusunda kafam o kadar karistiki bir seyler ogrenmeye basladim ama neyi biliyorum neyi bilmiyorum neyi yanlis biliyorum simdiler de ortaya cikmaya basladi.
Sorumu tekrar sorayim. Cihazim High speed yani 480 Mbps yi desteklemiyor.
Fakat dokumaninda USB 2.0 full-speed (12 Mbps) and low-speed (1.5 Mbps) operation diyor.
USB cihazin D- pini 1K5 ile high yapilirsa cihaz low speed oluyor. Yani 1.5 Mbps
USB cihazin D+ pini 1K5 ile high yapilirsa cihaz full speed oluyor. Yani 12 Mbps
Bu cihazin descriptor tanimlarinda cihazi USB 1.1 tanimlarsak ne olur? Ne maksatla 1.1 tanimlamak isterim?
Bu cihazin descriptor tanimlarinda cihazi USB 2.0 tanimlarsak ne olur? Ne maksatla 2.0 tanimlamak isterim?
Bazi cevaplar buldum fakat teyide muhtac.
USB 2.0 oldugunda Control transferinde 32 byte FIFO kullanabiliyoruz. USB 1.1 de bu sadece 8 Byte olabilir.
USB 2.0 oldugunda Suspend ve Resume sinyalleri taniniyor. USB 1.1 de bu sinyaller kullanilamiyor.
Butun olay bu mudur?
Hocam dedikleriniz doğru. USB 1.1 in bence bir esprisi yok. Eskiye uyumluluk adına var diye biliyorum. Yani eski sistemlere (USB 1.1 host olan) yeni bir 2.0 cihazı taktığınızda cihaz HS bile olsa FS çalışacaktır. Diğer yandan bunun tam tersindede sorun çıkmıyor. Yani 2.0 bir hosta eski bir 1.1 cihaz takarsanız paşa paşa çalışıyor. Tamamen uyumluluk adına yapılmış birşey. Birde USB 3.0 diye bir canavar var onuda unutmamak lazım aradaki USB 2.5 (wireless) v.s. saymıyorum bile :).
Alıntı yapılan: bunalmis - 29 Ocak 2011, 02:28:43
USB cipin D+ bacagina 1K5 direnci takmadigimiz durumda, Device Descriptorde ise bcdUSB degerini 2.0 icin tanimlarsak ne olur?
Enumeration asamasinda PC, bana device_qualifier descriptorunu soruyor, bunun sebebi yukaridaki gibi bir durum mu yoksa baska bir neden mi var?
USB hubda pull down dirençleri mevcut. D+ ya da D- ye pull up direnci takmadığınızda hat boşta algılanır, cihaz tespit edilemez.
bcdUSB değerininin 2.0 olması ne anlama gelir? Cihaz high speed desteğine sahipse bu değer mutlaka 2.0 olmalıdır. Ayrıca D+ pininde pull up direnci bulunmalıdır. Çünkü hi speed destekli cihazlar full speed ya da hi speed modda çalışırlar. Bu cihazlar, host tarafından descriptor istendiğinde mevcut çalışma hızına ait bilgilerle cevap verirler. Örneğin configuration descriptor sorulduğunda, cihaz full speed hızda çalışıyorsa bu hız için geçerli değerlerle geri döner. Yani descriptor lar çalışma hızına göre cevaplanır. İşte bu noktada diğer çalışma hızına ait bilgileri aktarmak için
(other_speed) device_qualifier descriptor ile
other_speed_configuration descriptor kullanılır. Eğer cihazınız sadece low speed veya full speed destekliyse bu durumda bcdUSB değerininin 2.0 olması cihazın, hostun device_qualifier desciptor isteğine doğru bir şekilde cevap vereceğini gösterir; hi speed destekli olmadığından Request Error ile geri döner. Eğer bcdUSB değeri 1.1 tanımlanmışsa cihazdan other_speed descriptor ı talep edilmemeli.
Alıntı yapılan: bunalmis - 29 Ocak 2011, 14:31:08
Bazi cevaplar buldum fakat teyide muhtac.
USB 2.0 oldugunda Control transferinde 32 byte FIFO kullanabiliyoruz. USB 1.1 de bu sadece 8 Byte olabilir.
USB 2.0 oldugunda Suspend ve Resume sinyalleri taniniyor. USB 1.1 de bu sinyaller kullanilamiyor.
Butun olay bu mudur?
Eğer cihazınız low speed ise bMaxPacketSize0 değeri 8, full speed ise 8-16-32-64, hi speed ise sadece 64 olarak tanımlabilir.
Suspend ve Resume sinyalleri emin değilim ama USB v1.1 de tanımlı olabilir.
STM32F103 için USB rutinlerimi yazıyorum.
D+ hattı 1K5 ile pullup yapılmış durumda.
Device descriptorde bMaxPcketSize0 değerim ise 64.
UsbCount0_Rx registerimde BLSize=1 ve NumBlock[4..0]=1;
Bu şartlar altında EP0 bufferım 64 byte olmuş oluyor.
Kodları koşturduğumda enumeration işlemi başlıyor ve Lowspeed USB Human Interfce Device bulunuyor ve driver listesinde ünlem var üzerinde.
Usblyzer ile baktığımda bMaxPcketSize0 40h yanında kırmızı ile Should be 8 bytes for low speed devices uyarısı var.
Cihazım full speed iken neden low speed olarak algılanıyor? Low speed olduğu için de 64 byte buffer tanımlamama kızıyor.
Hlbuki MaxpacketSıze değerini 64 byte yaparak usb rutinlerindeki angaryalardan kurtulmanın derdindeyim. Stellaris için kullandığım bu desriptor sorunsuz olarak çalışıyor ve 64 byte paketleri kullanabiliyordum ve cihazım full speed olarak algılanıyordu.
Desriptorleri hiç değiştirmeden STM32F103'e taşıdım.
Full speed USB cihazın data bufferlarının uzunluğu 8byte tanımlanırsa, 1ms lik zaman diliminde sadece 8 byte mı transfer edilir?
bMaxPcketSize0 sadece Ep0 icin gecerli diye biliyorum
Bunu 64 yaparsak bazi makinede xpde sorun,cikiyordu. Bu8de kalsin.
Report count 64 rep.size 8bit buf size64, interval1ms iyidir bunlar ep1 icin olup asil datayi iletir. Ep0 tanitma ve kontrol işi için(pic demolarında öyle)
1ms lik zamanda 64 bayt göndermek için:
report size =8 (bit)
reportcount =64
olmalı ayrıca gönderim yapacak endpoint bufferı 64 olmalı
eğer her 1ms de 16 bayt göndermek istersek:
report size =8 (bit)
reportcount =16
olmalı ayrıca gönderim yapacak endpoint bufferı 16 olmalı
Full speed USB cihazda, her interval süresinde, data gönderecek endpoint bufferlarının uzunluğu kadar gönderim yapılabilir.
Anladım hocam. Ben gene de daha önceki projemde (Stellaris) 0. da dahil olmak üzere End Pointlerimi 64 byte tanımlayıp sorunsuz kullanmıştım.
STM32F103'e geçince sorun çıktı. Gerçi sorun USB donanımlarının farklı registerlere sahip olmasından ve bunları tam tanımamamdan dolayı yaptığım yazılım hatasından kaynaklanıyor.
Gene de D+ hattı 1K5 ile pullup yapılmıs donanım nasıl olur da PC tarafından low speed olarak algılanır sebebini merak ediyorum.
Şu benim soruna bir el atsak.
Keil örneklerinde EP0 8 byte tanımlanmış. Ben 64 byte tanımlamak istiyorum.
Kodlarımı yazdım.
D+ hattım da 1k5 ile pullup durumunda.
Enerjiyi veriyorum ve PC usb hid cihaz buldum diyor. Bu durumda enumeration işlemi başarılı ki bu aşamaya geliyorum. (Acaba?)
Fakat control panelden bulunan hid cihaza bakınca üzerinde ünlem işareti görüyorum.
Usblyzer şle benim cihaza bakınca device descriptorde bMaxPacketSize0 40h yanında kırmızı renkle Should be 8 bytes for low speed devices uyarısı var.
Üstelik low speed bir cihaz bulunduğu da bir köşede yazıyor.
Aynı cihaz keil örnekleri ile bMaxPcketSize0 8 yani 8 byte paket uzunluğu için full speed olarak görüntüleniyor.
En büyük soru şu;
Cihazım nasıl olur da low speed olarak tanınır? Bunun cevabını bir bilsem belki yaptığım hatayı yakalayacağım.
bMaxPacketSize0'ı 8 yerine niçin 64 yapmak istiyorsun? önceki mesajlarda söylediğime inanmadın mı?
1msde 64 bayt göndermek için mi? öyleyse bunla işin yok. başka yeri ayarlaman gerek. bence senin descriptorda komple hata olabilir. windows çelişkiye düşüp yanlışyorumlamış olabilir
pic örneklerinde şöyle oluyordu belki de tüm HIDler için geçerlidir
endpoint0 sadece control transfer yapar aygıtın kendini tanıtması için filan kullanılıyor.
bMaxPacketSize0 = 8 yaparsak, aygıt kendini kolayca tanıtıyor sorun çıkmıyor. bunun dışında 1ms içinde 64 bayt gönderebilme kabiliyeti değişmiyor o ayrı birşeydir.
endpoint1 interval 1ms reportcount 64 olacak krallar gibi çalışacak..
descriptoru gereksiz uzatmayacaz. içindeki baytları sayacaz program içinde bunun uzunluğunu yazdığımız başka bir yer vardır oraya aynen descriptorlength neyse onu yazıcaz ya da derleyici bunu kendisi hesaplayacak o yazacak.
Belki de gerçekten direnç ile ilgilidir aynı zamanda hem D+ hem de D- ucuna direnç bağlanmış olabilir mi? (varsa)dahili ya da harici direnç ?
(http://s24.postimg.cc/kmbfn316t/pull_up.jpg)
http://s24.postimg.cc/kmbfn316t/pull_up.jpg (http://s24.postimg.cc/kmbfn316t/pull_up.jpg)
Sorunsuz full speed HID aygıt detayları, descriptor burada:
http://speedy.sh/BxQPx/original-pickit3descriptor.zip (http://speedy.sh/BxQPx/original-pickit3descriptor.zip)
Demek ki NEYMİŞ? bMaxPacketSize0 = 8 OLACAKMIŞ.
Usblyser ile sorunlu aygıtınızın descriptorunu yukarıdaki gibi rapor alıp gönderebilirseniz belki sorunu anlayabiliriz
STM32F103 ile kontrol transferini 64 byte üzerinden gerçekleştiren varmı?
Rx ve TX buf uzunluklarını 64 Byte yaptığımda sorun çıkıyor. Her ne kadar asıl data alışverişi 64 bytelık Endpoint 1 üzerinden gerçekleşecek olsa da end point 0 da neden sorun yaşadığımı merak ediyorum.
hocam stm32f103 de 512 byte lık transfer buffer limiti var.
eğer descriptor ep ların aktarımında bu limiti aşıyorsa bu yüzden sıkıntı çıkabilir.
mümkünse descriptor ünüzü görme şansımız var mı?
elimde bulunan 64 byte transfer yapan eski örnek programlar;
http://www.4shared.com/rar/Xo1U1HnQ/stm32f103USB.html? (http://www.4shared.com/rar/Xo1U1HnQ/stm32f103USB.html?)
Descriptorleri ilk fırsatta vereyim. Yalnız yanlış anlaşılmayayım. 64 byte transferi EP0 üzerinden yapmak istiyorum. Özellikle de PC'den 64 Byte alma.
Şu sıralar yazılımımda hatalar yakaladım sorunum bitmese de bir kaç adım daha atabildim.
mesaj birleştirme:: 16 Mart 2013, 19:35:17
Alıntı yapılan: t2 - 11 Mart 2013, 08:39:41
bMaxPacketSize0'ı 8 yerine niçin 64 yapmak istiyorsun? önceki mesajlarda söylediğime inanmadın mı?
1msde 64 bayt göndermek için mi? öyleyse bunla işin yok. başka yeri ayarlaman gerek. bence senin descriptorda komple hata olabilir. windows çelişkiye düşüp yanlışyorumlamış olabilir
pic örneklerinde şöyle oluyordu belki de tüm HIDler için geçerlidir
endpoint0 sadece control transfer yapar aygıtın kendini tanıtması için filan kullanılıyor.
bMaxPacketSize0 = 8 yaparsak, aygıt kendini kolayca tanıtıyor sorun çıkmıyor. bunun dışında 1ms içinde 64 bayt gönderebilme kabiliyeti değişmiyor o ayrı birşeydir.
endpoint1 interval 1ms reportcount 64 olacak krallar gibi çalışacak..
descriptoru gereksiz uzatmayacaz. içindeki baytları sayacaz program içinde bunun uzunluğunu yazdığımız başka bir yer vardır oraya aynen descriptorlength neyse onu yazıcaz ya da derleyici bunu kendisi hesaplayacak o yazacak.
Belki de gerçekten direnç ile ilgilidir aynı zamanda hem D+ hem de D- ucuna direnç bağlanmış olabilir mi? (varsa)dahili ya da harici direnç ?
(http://s24.postimg.cc/kmbfn316t/pull_up.jpg)
http://s24.postimg.cc/kmbfn316t/pull_up.jpg (http://s24.postimg.cc/kmbfn316t/pull_up.jpg)
Sorunsuz full speed HID aygıt detayları, descriptor burada:
http://speedy.sh/BxQPx/original-pickit3descriptor.zip (http://speedy.sh/BxQPx/original-pickit3descriptor.zip)
Demek ki NEYMİŞ? bMaxPacketSize0 = 8 OLACAKMIŞ.
Usblyser ile sorunlu aygıtınızın descriptorunu yukarıdaki gibi rapor alıp gönderebilirseniz belki sorunu anlayabiliriz
EP0 ın 8 byte olması gerekliliği haricinde haklısın. Zira EP0 üzerinden de 1ms lik çerçeve içinde control transferi yaparak 64 byte yollayabiliyordum.
Stellaris de aynen dediğim gibi çalıştırdım. Hatta şu anki sorunlu yazılımımda da enumeration işlemlerinde EP0 dan 64 yapıyorum byte alıp verebiliyorum. (Ama enumeration başarılı olarak bitmiyor) Sorunum yazılımdaki hatadan olsa gerek problemin yakalanmasına az kaldı.
PC nin enumeration aşamasında EP0 dan 8 byte yolladığına bakma sen. İpler sana geçince hem EP0 dan Hem de EP1 den 64 byte alıp verebiliyorsun.
Böyle bir imkanım varken neden EP0 da 8 byte ile yetineyim ki?
8, olması elbette şart değil 16, 32 veya 64 olabilirmiş. ben de buna güvenerek 64 olarak ayarladım normal çalışıyordu. fakat başka pcye taktım aygıt tanınmadı . soru işareti çıkıyor. sadece 64ü 8 yapmak ile düzeldi.
ep0 üzerinden 8 er baytlık paketler halinde descriptorun gönderildiğini zannediyorum. descriptor uzunluğu 64 ise 8 interval gerekli oluyor diye zannetmekteyim. ep0 hid aygıtın kendi işleri için kullanılır bununla ayrıca data gönderip almaya çalışmak yanlış olur kanaatindeyim. fakat hepsi zandan ibarettir. USB complete kitabından da okumadım.
PC enumeration aşamasında EP0 tarafından istekleri 8 bytelık standart paketler olarak istiyor. Cevap yazarken göndereceğimiz descriptorlerun cogunlugu 8 bytedan fazla. Bu nedenle 8 li paketler halinde göndermek gerekiyor.
Fakat 64 byte lık buffer tanımlanırsa tek çırpıda ne gidecekse gidiyor. Bu kısma ait kodlar 64 byte buffer kullanıldığında daha basit oluyor.
İnterrupt transferinde enumertion işlemi bittikten sonra PC tarafındaki yazılımla ister EP0 dan ister EP1 den 64 byte data iste yada yaz.
Bu 1 ms lik peryod içinde 64 byte anlamına geleceği için avantajlı. En az bir yıldır bu şekilde kullanıyorum ve hiç bir sorunu yok. Fakat STM32 ye geçince kodları ayağa kaldırmak biraz sancılı olacak.
Şu aşamada PC isteği üzerine en son HID descriptoru yolluyorum ve bu aşama geçilmiyor. Halbuki aynı desriptoru sorunsuz olarak stellaris de kullanıyordum.
Neyse sebebini bulunca sizi de merakta bırakmam.
Peki çalışan örnek yapmamış mı firma?
Bir örnek var. Tüm parametreleri ayarlanabiliyor, sınıfı vs değiştirilebiliyor. Haliyle de çok karışık. Gene de onu referans alıyorum.
STALL olarak cevap vermem gereken bir sorguya hiç cevap vermediğim için USB cihazım sorunlu
ve Low Speed olarak algılanıyormuş.
Düzeltince artık 64 Byte Bufferlarım tanınır oldu.
Alıntı yapılan: ErsinErce - 16 Mart 2013, 18:45:06
...mümkünse descriptor ünüzü görme şansımız var mı?...
Descriptorlerim aşağıdaki gibi ve sorunu yok.
USB_MAX_PACKET0 EQU 0x40 ; 64 BYTE
;***************************************************************************
; Device Descriptor
;***************************************************************************
DeviceDesc
DCB 0x12 ; Size of this descriptor in bytes
DCB 0x01 ; DEVICE descriptor type
DCB 0x00,0x02 ; USB Spec Release Number in BCD format
DCB 0x00 ; Class Code
DCB 0x00 ; Subclass code
DCB 0x00 ; Protocol code
DCB USB_MAX_PACKET0 ; Max packet size for EP0, see usb_config.h
DCB 0x83,0x04 ; Vendor ID
DCB 0x20,0x57 ; Product ID: Custom HID demo
; DCB 0xD8,0x04 ; Vendor ID
; DCB 0x3F,0x00 ; Product ID: Custom HID demo
DCB 0x00,0x02 ; Device release number in BCD format
DCB 0x01 ; Manufacturer string index
DCB 0x02 ; Product string index
DCB 0x03 ; Device serial number string index
DCB 0x01 ; Number of possible configurations
;***************************************************************************
; Configuration Descriptor
;***************************************************************************
ConfigDesc
DCB 0x09 ; sizeof(USB_CFG_DSC), // Size of this descriptor in bytes
DCB 0x02 ; CONFIGURATION descriptor type
DCB 0x29,0x00 ; Total length of data for this cfg (Config+Int+HidClass+EP0+EP1)
DCB 1 ; Number of interfaces in this cfg
DCB 1 ; Index value of this configuration
DCB 0 ; Configuration string index
DCB 0xE0 ; Attributes, 0x80 | 0x40 | 0x20
DCB 0xFA ; Max power consumption (2X mA) 500mA
;***************************************************************************
; Interface Descriptor
;***************************************************************************
IntDesc DCB 0x09 ; sizeof(USB_INTF_DSC), // Size of this descriptor in bytes
DCB 0x04 ; INTERFACE descriptor type
DCB 0 ; Interface Number
DCB 0 ; Alternate Setting Number
DCB 0x02 ; Number of endpoints in this intf
DCB 0x03 ; Class code HID
DCB 0 ; Subclass code
DCB 0 ; Protocol code
DCB 0 ; Interface string index
;***************************************************************************
; HID Class-Specific Descriptor
;***************************************************************************
DCB 0x09 ; sizeof(USB_HID_DSC)+3, // Size of this descriptor in bytes
DCB 0x21 ; HID descriptor type
DCB 0x00,0x02 ; HID Spec Release Number in BCD format (2.00)
DCB 0x00 ; Country Code (0x00 for Not supported)
DCB 0x01 ; Number of class descriptors
DCB 0x22 ; Report descriptor type
DCB HIDSIZE,0x00 ; sizeof(hid_rpt01),
;***************************************************************************
; Endpoint Descriptor (Input icin)
;***************************************************************************
DCB 0x07 ; sizeof(USB_EP_DSC)
DCB 0x05 ; Endpoint Descriptor
DCB 0x81 ; EndpointAddress (Adr=1 input)
DCB 0x03 ; Attributes (Interrupt transfer)
DCB 0x40,0x00 ; size
DCB 0x01 ; Interval
;***************************************************************************
; Endpoint Descriptor
;***************************************************************************
DCB 0x07 ; sizeof(USB_EP_DSC)
DCB 0x05 ; Endpoint Descriptor
DCB 0x01 ; EndpointAddress (Adr=1 output)
DCB 0x03 ; Attributes (Interrupt transfer)
DCB 0x40,0x00 ; size
DCB 0x01 ; Interval
;***************************************************************************
; Language code string descriptor
;***************************************************************************
StringDesZero
DCB ManufacStr - StringDesZero ; Length
DCB 0x03 ; Type=String
DCB 0x09,0x04 ; Code English
;***************************************************************************
; ManufacStr
;***************************************************************************
ManufacStr
DCB ProductStr - ManufacStr ; Length
DCB 0x03 ; Type=String
DCB 'C',0
DCB 'n',0
DCB 'c',0
DCB ' ',0
DCB 'D',0
DCB 'e',0
DCB 's',0
DCB 'i',0
DCB 'g',0
DCB 'n',0
DCB 'e',0
DCB 'r',0
;***************************************************************************
; ProductStr
;***************************************************************************
ProductStr
DCB SerialNumStr - ProductStr ; Length
DCB 0x03 ; Type=String
DCB 'S',0
DCB 'm',0
DCB 'd',0
DCB ' ',0
DCB 'P',0
DCB 'i',0
DCB 'c',0
DCB 'k',0
DCB '&',0
DCB 'P',0
DCB 'l',0
DCB 'a',0
DCB 'c',0
DCB 'e',0
;***************************************************************************
; SerialNumStr
;***************************************************************************
SerialNumStr
DCB ReportDesc - SerialNumStr ; Length
DCB 0x03 ; Type=String
DCB 'S',0
DCB 'N',0
DCB ':',0
DCB '0',0
DCB '2',0
DCB '0',0
DCB '1',0
DCB '3',0
;***************************************************************************
; Class specific descriptor - HID boyu 25 byte
; ReportDesc
;***************************************************************************
HIDSIZE EQU 25
ReportDesc
DCB 0x06, 0xA0, 0xFF ; USAGE_PAGE (Vendor Defined page 0xA1)
DCB 0x09, 0x01 ; USAGE (Vendor Usage 0x01)
DCB 0xA1, 0x01 ; COLLECTION (Application)
; Global items
DCB 0x15, 0x00 ; LOGICAL_MINIMUM(-128)
DCB 0x26, 0xFF,0x00 ; LOGICAL_MAXIMUM(+127)
DCB 0x75, 0x08 ; REPORT_SIZE (8 Bits)
DCB 0x95, 0x40 ; REPORT_COUNT (8 8 Bits, 8 Bytes)
; INPUT
DCB 0x09, 0x01 ; USAGE (Vendor Usage 0x03)
DCB 0x81, 0x02 ; INPUT (Data,Variable,Abs)
; OUTPUT
DCB 0x09, 0x01 ; USAGE (Vendor Usage 0x04)
DCB 0x91, 0x02 ; OUTPUT(Data, Variable,Abs
DCB 0xC0 ; END_COLLECTION
Hocam şimdi sıradaki sorunu bildiriyorum. Bunu halledersen çok önemli bir şey yapmış olursun
Belki yıllardır bizi oyaladılar HID aygıt tek interface olursa 1ms'de en fazla 64 bayt gönderebilir dendi
Halbuki bu aygıtların EP0 ı zaten var ve kontrol transfer yapabiliyor EP1 ise 1ms'de en fazla 64 bayt gönderme işiyle iştigal ediyordu.
Tanıtma işi biten EP0 data göndermeye devam edebilir(mi) ayrıca EP1 de göndermeye devam edecek. Bu durumda Composite Device (birden fazla interface) olmadan 1ms içinde 128 bayt iletebilecek miyiz? 128 olmasın 100 olsun, o da yeterli. Yani 64 bayt sınırını aşabilecek miyiz? tabi ki multi interface HID aygıtı yaparsanız aliyyülaaladır. bu dolambaçlı işe gerek yoktur.
Bu soru benim de kafamda, cevabını tahmin ediyorum ama debug kodlar yazıp sonucu doğrulamadım.
Tanıtma işlemi ardından EP0 dan 64 Byte alıp verebiliyoruz. EP1 den de.
Fakat 1ms lik zaman diliminde her iki paketi de gönderebileceğimizi sanmıyorum.
Çünkü örneğin STM32F103 de paket gelmişmi yada gitmişmi diye sorgu yapabildiğimiz bir register var.
Eğer paket geldi yada gittiyse bu registerden hangi EP registere data gelmiş yada gitmiş öğreniyoruz.
Bu register bize 0, 1, 2, 3 ... gibi EP registerin numarasını söylüyor.
Bu da demektir ki aynı anda iki EP ye ait paket gidip gelemez.
İlk fırsatta deneme kodu yazıp ulaştığım sonucu buraya yazarım.
------------------------------------
Tanışma faslında EP0 alma rutinlerinin normalde 8 byte uzunlukta olması yeterli. Çünkü gelen paketler hep 8 byte uzunlukta. Fakat giden paketlerin boyu değişken.
8 byte buffer seçildiğinde gönderilen paketi parça parça yollamak gerekiyor. Ayrıca tanışma faslından sonra 8 byte alma ile sınırlı kalınıyor.
Bufferları 64 byte yapınca hem yazılım sadeleşiyor hem de hız artıyor.
PC tarafındaki yazılımla EP1 üzerinden interrupt transfer metodu ile kartımla 64 byte lık data değiş tokuşu yapıyorum.
EP0 ile de kartla ilgili bilgileri gözetliyorum. Mesela Voltajlar, koordinatlar.
Bu PC yazılımımı daha anlaşılır ve sade kılıyor. Yoksa tüm haberleşmeyi EP1 den de yapabilirdim.
Eğer yanlış anlamadıysam;
Birden fazla interface yapmak mümkün, descriptorlerle oynayıp, diğer EP kontrol kodlarını da yazınca sorunsuz çalışıyor. Önceden NXP de 1 HID, 2 CDC ve 1 MSC yapmayı başarmıştım.
Zor olan 2tane HID interface yapmak. Asıl mesele bu
Configuration Descriptor içinde Number of interfaces i 2
Interface Descriptor numarası olarak ilk HID için 0 sonraki HID için 1 yi kullanmak yeterli olması lazım hocam
EP2 HID2 için atanıyor tabi
aşağıdaki düzenlemeye bakabilirseniz yaptığım değişikliğe göre biraz düzenleme yapabilirseniz çalışacağını düşünüyorum
HID rutinlerinde PC den istenen configurator numarasına göre EP seçimi olması gerekiyor tabi
bu tarz bir düzenlemeden sonra 7 HID cihaz bir anda bağlanabilir
bir de C de mi yazıyorsunuz yoksa asm de mi hocam?
USB_MAX_PACKET0 EQU 0x40 ; 64 BYTE
;***************************************************************************
; Device Descriptor
;***************************************************************************
DeviceDesc
DCB 0x12 ; Size of this descriptor in bytes
DCB 0x01 ; DEVICE descriptor type
DCB 0x00,0x02 ; USB Spec Release Number in BCD format
DCB 0x00 ; Class Code
DCB 0x00 ; Subclass code
DCB 0x00 ; Protocol code
DCB USB_MAX_PACKET0 ; Max packet size for EP0, see usb_config.h
DCB 0x83,0x04 ; Vendor ID
DCB 0x20,0x57 ; Product ID: Custom HID demo
; DCB 0xD8,0x04 ; Vendor ID
; DCB 0x3F,0x00 ; Product ID: Custom HID demo
DCB 0x00,0x02 ; Device release number in BCD format
DCB 0x01 ; Manufacturer string index
DCB 0x02 ; Product string index
DCB 0x03 ; Device serial number string index
DCB 0x01 ; Number of possible configurations
;***************************************************************************
; Configuration Descriptor
;***************************************************************************
ConfigDesc
DCB 0x09 ; sizeof(USB_CFG_DSC), // Size of this descriptor in bytes
DCB 0x02 ; CONFIGURATION descriptor type
DCB 0x29,0x00 ; Total length of data for this cfg (Config+Int+HidClass+EP0+EP1)
DCB 2 ; Number of interfaces in this cfg
DCB 1 ; Index value of this configuration
DCB 0 ; Configuration string index
DCB 0xE0 ; Attributes, 0x80 | 0x40 | 0x20
DCB 0xFA ; Max power consumption (2X mA) 500mA
;***************************************************************************
; Interface Descriptor 1
;***************************************************************************
IntDesc1 DCB 0x09 ; sizeof(USB_INTF_DSC), // Size of this descriptor in bytes
DCB 0x04 ; INTERFACE descriptor type
DCB 0 ; Interface Number
DCB 0 ; Alternate Setting Number
DCB 0x02 ; Number of endpoints in this intf
DCB 0x03 ; Class code HID
DCB 0 ; Subclass code
DCB 0 ; Protocol code
DCB 0 ; Interface string index
;***************************************************************************
; HID Class-Specific Descriptor
;***************************************************************************
DCB 0x09 ; sizeof(USB_HID_DSC)+3, // Size of this descriptor in bytes
DCB 0x21 ; HID descriptor type
DCB 0x00,0x02 ; HID Spec Release Number in BCD format (2.00)
DCB 0x00 ; Country Code (0x00 for Not supported)
DCB 0x01 ; Number of class descriptors
DCB 0x22 ; Report descriptor type
DCB HIDSIZE1,0x00 ; sizeof(hid_rpt01),
;***************************************************************************
; Endpoint Descriptor (Input icin)
;***************************************************************************
DCB 0x07 ; sizeof(USB_EP_DSC)
DCB 0x05 ; Endpoint Descriptor
DCB 0x81 ; EndpointAddress (Adr=1 input)
DCB 0x03 ; Attributes (Interrupt transfer)
DCB 0x40,0x00 ; size
DCB 0x01 ; Interval
;***************************************************************************
; Endpoint Descriptor
;***************************************************************************
DCB 0x07 ; sizeof(USB_EP_DSC)
DCB 0x05 ; Endpoint Descriptor
DCB 0x01 ; EndpointAddress (Adr=1 output)
DCB 0x03 ; Attributes (Interrupt transfer)
DCB 0x40,0x00 ; size
DCB 0x01 ; Interval
;***************************************************************************
; Class specific descriptor - HID boyu 25 byte
; ReportDesc1
;***************************************************************************
HIDSIZE1 EQU 25
ReportDesc1
DCB 0x06, 0xA0, 0xFF ; USAGE_PAGE (Vendor Defined page 0xA1)
DCB 0x09, 0x01 ; USAGE (Vendor Usage 0x01)
DCB 0xA1, 0x01 ; COLLECTION (Application)
; Global items
DCB 0x15, 0x00 ; LOGICAL_MINIMUM(-128)
DCB 0x26, 0xFF,0x00 ; LOGICAL_MAXIMUM(+127)
DCB 0x75, 0x08 ; REPORT_SIZE (8 Bits)
DCB 0x95, 0x40 ; REPORT_COUNT (8 8 Bits, 8 Bytes)
; INPUT
DCB 0x09, 0x01 ; USAGE (Vendor Usage 0x03)
DCB 0x81, 0x02 ; INPUT (Data,Variable,Abs)
; OUTPUT
DCB 0x09, 0x01 ; USAGE (Vendor Usage 0x04)
DCB 0x91, 0x02 ; OUTPUT(Data, Variable,Abs
DCB 0xC0 ; END_COLLECTION
;***************************************************************************
; Interface Descriptor 2
;***************************************************************************
IntDesc2 DCB 0x09 ; sizeof(USB_INTF_DSC), // Size of this descriptor in bytes
DCB 0x04 ; INTERFACE descriptor type
DCB 1 ; Interface Number
DCB 0 ; Alternate Setting Number
DCB 0x02 ; Number of endpoints in this intf
DCB 0x03 ; Class code HID
DCB 0 ; Subclass code
DCB 0 ; Protocol code
DCB 0 ; Interface string index
;***************************************************************************
; HID Class-Specific Descriptor
;***************************************************************************
DCB 0x09 ; sizeof(USB_HID_DSC)+3, // Size of this descriptor in bytes
DCB 0x21 ; HID descriptor type
DCB 0x00,0x02 ; HID Spec Release Number in BCD format (2.00)
DCB 0x00 ; Country Code (0x00 for Not supported)
DCB 0x01 ; Number of class descriptors
DCB 0x22 ; Report descriptor type
DCB HIDSIZE2,0x00 ; sizeof(hid_rpt01),
;***************************************************************************
; Endpoint Descriptor (Input icin)
;***************************************************************************
DCB 0x07 ; sizeof(USB_EP_DSC)
DCB 0x05 ; Endpoint Descriptor
DCB 0x82 ; EndpointAddress (Adr=1 input)
DCB 0x03 ; Attributes (Interrupt transfer)
DCB 0x40,0x00 ; size
DCB 0x01 ; Interval
;***************************************************************************
; Endpoint Descriptor
;***************************************************************************
DCB 0x07 ; sizeof(USB_EP_DSC)
DCB 0x05 ; Endpoint Descriptor
DCB 0x02 ; EndpointAddress (Adr=1 output)
DCB 0x03 ; Attributes (Interrupt transfer)
DCB 0x40,0x00 ; size
DCB 0x01 ; Interval
;***************************************************************************
; Class specific descriptor - HID boyu 25 byte
; ReportDesc2
;***************************************************************************
HIDSIZE2 EQU 25
ReportDesc2
DCB 0x06, 0xA0, 0xFF ; USAGE_PAGE (Vendor Defined page 0xA1)
DCB 0x09, 0x01 ; USAGE (Vendor Usage 0x01)
DCB 0xA1, 0x01 ; COLLECTION (Application)
; Global items
DCB 0x15, 0x00 ; LOGICAL_MINIMUM(-128)
DCB 0x26, 0xFF,0x00 ; LOGICAL_MAXIMUM(+127)
DCB 0x75, 0x08 ; REPORT_SIZE (8 Bits)
DCB 0x95, 0x40 ; REPORT_COUNT (8 8 Bits, 8 Bytes)
; INPUT
DCB 0x09, 0x01 ; USAGE (Vendor Usage 0x03)
DCB 0x81, 0x02 ; INPUT (Data,Variable,Abs)
; OUTPUT
DCB 0x09, 0x01 ; USAGE (Vendor Usage 0x04)
DCB 0x91, 0x02 ; OUTPUT(Data, Variable,Abs
DCB 0xC0 ; END_COLLECTION
;***************************************************************************
; Language code string descriptor
;***************************************************************************
StringDesZero
DCB ManufacStr - StringDesZero ; Length
DCB 0x03 ; Type=String
DCB 0x09,0x04 ; Code English
;***************************************************************************
; ManufacStr
;***************************************************************************
ManufacStr
DCB ProductStr - ManufacStr ; Length
DCB 0x03 ; Type=String
DCB 'C',0
DCB 'n',0
DCB 'c',0
DCB ' ',0
DCB 'D',0
DCB 'e',0
DCB 's',0
DCB 'i',0
DCB 'g',0
DCB 'n',0
DCB 'e',0
DCB 'r',0
;***************************************************************************
; ProductStr
;***************************************************************************
ProductStr
DCB SerialNumStr - ProductStr ; Length
DCB 0x03 ; Type=String
DCB 'S',0
DCB 'm',0
DCB 'd',0
DCB ' ',0
DCB 'P',0
DCB 'i',0
DCB 'c',0
DCB 'k',0
DCB '&',0
DCB 'P',0
DCB 'l',0
DCB 'a',0
DCB 'c',0
DCB 'e',0
;***************************************************************************
; SerialNumStr
;***************************************************************************
SerialNumStr
DCB ReportDesc - SerialNumStr ; Length
DCB 0x03 ; Type=String
DCB 'S',0
DCB 'N',0
DCB ':',0
DCB '0',0
DCB '2',0
DCB '0',0
DCB '1',0
DCB '3',0
Hatırlarsanız sorunum;
1K5 ile pull-up yapılmış usb cihaz, işletim sistemi tarafından üzerinde ünlemli olarak tanınıyor ve usblyzer de lowspeed cihaz olduğununun iddia ediyordu.
Ayrıca usblyzer, device descriptorde 64 byte olan paket boyunu kırmızı uyarı ile low speed cihazda bu değer 8 byte olmalı mesajını veriyordu.
Kodlardaki hatalarımı düzeltince artık usb cihazım PC ile sorunsuz konuşur hale geldi. Keil'de kodlarım koşarken işletim sistemi usb cihazı descriptorlerde belirtildiği gibi tanıyor.
Eğer brekpoint koyarak kodları durdurursam kısa bir süre sonra usblyzer bu cihazın lowspeed olduğunu ve 64 bytelık paket boy tanımının 8 byte olması gerektiği mesajını veriyor.Demekki bu tip programlara da çok güvenmemek lazım. Belli bir süre sonunda cevap alınamayan usb cihaz biraz evvel full speed iken bunu low speed diye lanse etmek bana bug gibi geldi.
Halbuki verilmesi gereken mesaj. Cihazınınız iletişimi sonlandırdı türünde bir şey olmalı. İşletim sistemi bunu ünlemle geçiştirirken usblyzerın böyle davranması çok kafa karıştırıcı oldu.
@ErsinerceTam olarak ne dediğini anlayamadım. Verdiğim descriptorler olduğu haliyle sorunsuz görünüyor.
Fakat dediğin değişiklikleri yapayım. Sen ne sorun gördün?
Bir ara güzel bir başlık açmıştım. Desriptor tasarımı gibi bir şeydi. Sağdan soldan kopyala yapıştır değil de
akıllı uslu sıfırdan usb descriptorlerinin tasarımını ele almıştık. https://www.picproje.org/index.php/topic,31537.msg220074.html#msg220074 (https://www.picproje.org/index.php/topic,31537.msg220074.html#msg220074)
Şu anda sadece HID descriptoru tam anlayamıyorum. Fakat descriptorlerimde sorun gördüysen üzerinde konuşalım isterim.
Alıntı Yapbir de C de mi yazıyorsunuz yoksa asm de mi hocam?
Tabiki asm. :)
C yi, ele geçirdiğim hazır kodlarda yapılan işi anlamak ve debug etmek adına kullanıyorum.
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.
yok sorun değil hocam composite HID konusu açılınca nasıl yapılabileceği hakkında yollardan birini söylemiştim.
diğer yolda tek EP kullanarak konfigürasyon numarasına bakmaktı diye hatırlıyorum ama emin olamıyorum HID konusuna tekrar bakmam gerekiyor
Birden fazla interface sahibi olan HID aygıt yapmak sadece descriptor kısmını düzgün şekilde ayarlamak ile olmuyor.
Aygıtın host tarafından gönderilen sorgulara aynen tek interface'de olduğu gibicevap verebilmesi gerekiyor.
z,
1ms içinde iki endpoint aynı anda gönderip alabilir kanaatindeyim. ilgili register hangisine sorgu geldise onu gösteriyor olabilir fakat 1ms içerisinde birden fazla tekrarlanırsa tümünü değerlendirme imkanı olabilir.
Alıntı yapılan: t2 - 18 Mart 2013, 09:57:32
Birden fazla interface sahibi olan HID aygıt yapmak sadece descriptor kısmını düzgün şekilde ayarlamak ile olmuyor.
Aygıtın host tarafından gönderilen sorgulara aynen tek interface'de olduğu gibicevap verebilmesi gerekiyor.
Alıntı yapılan: ErsinErce - 18 Mart 2013, 01:36:31
...
HID rutinlerinde PC den istenen configurator numarasına göre EP seçimi olması gerekiyor tabi
...
Hocam sen bu işi yapabilirsen müthiş olur.
Bir çok uygulamada, sürücü yükleme macerası tarih olur.
7 tane interface olsun.
1msde 7 x64 = 448 bayt transfer mümkün olur demek.
STM32 nin kendi kütüphanelerinde bu yapının içeriği mevcut
EP seçimi fonksiyonla seçilmiyor ama işlenirken fonksiyonun içinden seçildiğini görebiliyorsunuz
yapılması gereken bunu dışarıdan seçilebilir hale getirmek
Faydası olabilir düşüncesiyle bulduğum bir örneği iletiyorum. gerçi PIC için yapılmış. Hafif kalabilir:
http://sites.google.com/site/ytsnew/home/pic18f4550 (http://sites.google.com/site/ytsnew/home/pic18f4550)
Örneğe ulaşmak için sayfa ilerisinde şu kelimeleri arayalım
Composite devise (2 HIDs)
Windows Test uygulaması da mevcut.
Bu da descriptor:
/*********************************************************************
* Descriptor specific type definitions are defined in:
* usb_device.h
*
* Configuration options are defined in:
* usb_config.h
********************************************************************/
#ifndef __USB_DESCRIPTORS_C
#define __USB_DESCRIPTORS_C
/** INCLUDES *******************************************************/
#include "./USB/usb.h"
#include "./USB/usb_function_hid.h"
/** CONSTANTS ******************************************************/
#if defined(__18CXX)
#pragma romdata
#endif
/* 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
0x49,0x00, //YTS // Total length of data for this cfg
2, //YTS // 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 Descriptor1 */
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_EP1 | _EP_IN, //EndpointAddress
_INTERRUPT, //Attributes
0x40,0x00, //size
0x01, //Interval
/* Endpoint Descriptor */
0x07,/*sizeof(USB_EP_DSC)*/
USB_DESCRIPTOR_ENDPOINT, //Endpoint Descriptor
HID_EP1 | _EP_OUT, //EndpointAddress
_INTERRUPT, //Attributes
0x40,0x00, //size
0x01 //Interval
//YTS ADD
,
/* Interface Descriptor2 */
0x09,//sizeof(USB_INTF_DSC), // Size of this descriptor in bytes
USB_DESCRIPTOR_INTERFACE, // INTERFACE descriptor type
1,//YTS // 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_RPT02_SIZE,0x00,//YTS //sizeof(hid_rpt01), // Size of the report descriptor
/* Endpoint Descriptor */
0x07,/*sizeof(USB_EP_DSC)*/
USB_DESCRIPTOR_ENDPOINT, //Endpoint Descriptor
HID_EP2 | _EP_IN, //YTS //EndpointAddress
_INTERRUPT, //Attributes
0x40,0x00, //size
0x01, //Interval
/* Endpoint Descriptor */
0x07,/*sizeof(USB_EP_DSC)*/
USB_DESCRIPTOR_ENDPOINT, //Endpoint Descriptor
HID_EP2 | _EP_OUT, //YTS //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
}};
//Manufacturer string descriptor
ROM struct{BYTE bLength;BYTE bDscType;WORD string[25];}sd001={
sizeof(sd001),USB_DESCRIPTOR_STRING,
{'M','i','c','r','o','c','h','i','p',' ',
'T','e','c','h','n','o','l','o','g','y',' ','I','n','c','.'
}};
//Product string descriptor
ROM struct{BYTE bLength;BYTE bDscType;WORD string[22];}sd002={
sizeof(sd002),USB_DESCRIPTOR_STRING,
{'S','i','m','p','l','e',' ','H','I','D',' ',
'D','e','v','i','c','e',' ','D','e','m','o'
}};
//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
};
//YTS ADD
ROM struct{BYTE report[HID_RPT02_SIZE];}hid_rpt02={
{
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
};
//Array of configuration descriptors
ROM BYTE *ROM USB_CD_Ptr[]=
{
(ROM BYTE *ROM)&configDescriptor1
};
//Array of string descriptors
ROM BYTE *ROM USB_SD_Ptr[]=
{
(ROM BYTE *ROM)&sd000,
(ROM BYTE *ROM)&sd001,
(ROM BYTE *ROM)&sd002
};
/** EOF usb_descriptors.c ***************************************************/
#endif