Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: z - 29 Ocak 2011, 02:28:43

Başlık: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: z - 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?
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: t2 - 29 Ocak 2011, 09:38:57
Cihazın USB 2.0  olması  full speed  olduğu anlamına gelmez.

USB 1.1 cihaz da  full speed , low speed   olabilir.
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: z - 29 Ocak 2011, 12:02:34
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?

Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: Burak B - 29 Ocak 2011, 13:11:23
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.
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: controller - 29 Ocak 2011, 14:14:12
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.
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: z - 29 Ocak 2011, 14:17:17
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?

Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: z - 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?
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: Burak B - 29 Ocak 2011, 14:39:22
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 :).
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: tmcone - 29 Ocak 2011, 17:58:16
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.


Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: z - 10 Mart 2013, 02:08:31
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.

Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: z - 10 Mart 2013, 05:18:03
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?
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: t2 - 10 Mart 2013, 06:25:18
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.


Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: z - 10 Mart 2013, 14:26:29
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.
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: z - 11 Mart 2013, 02:47:49
Ş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.

Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: 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
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: z - 16 Mart 2013, 15:21:23
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.

Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: ErsinErce - 16 Mart 2013, 18:45:06
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?)
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: z - 16 Mart 2013, 19:27:58
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?

Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: t2 - 16 Mart 2013, 21:30:15
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.
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: z - 16 Mart 2013, 22:43:04
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.

Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: t2 - 16 Mart 2013, 22:59:53
Peki çalışan örnek yapmamış mı firma?
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: z - 16 Mart 2013, 23:28:13
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.

Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: z - 17 Mart 2013, 16:05:48
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
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: t2 - 17 Mart 2013, 16:24:54
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.
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: z - 17 Mart 2013, 16:41:49
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.
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: SpeedyX - 17 Mart 2013, 17:08:11
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.
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: t2 - 17 Mart 2013, 17:34:40
Zor olan 2tane HID interface yapmak. Asıl mesele bu
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: ErsinErce - 18 Mart 2013, 01:36:31
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
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: z - 18 Mart 2013, 01:40:52
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.

@Ersinerce

Tam 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.
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: ErsinErce - 18 Mart 2013, 01:55:30
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
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: 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.

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.

Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: ErsinErce - 18 Mart 2013, 13:55:31
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
...
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: t2 - 18 Mart 2013, 14:18:01
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.
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: ErsinErce - 18 Mart 2013, 14:52:05
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
Başlık: Ynt: 1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa
Gönderen: t2 - 18 Mart 2013, 23:58:17
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