1K5 ile full speed tanimi yapilmamissa fakat descriptorde USB 2.0 tanimliysa

Başlatan bunalmis, 29 Ocak 2011, 02:28:43

z

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?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

Cihazın USB 2.0  olması  full speed  olduğu anlamına gelmez.

USB 1.1 cihaz da  full speed , low speed   olabilir.

z

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?

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

Burak B

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.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

controller

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.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

z

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?

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

z

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?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

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 :).
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

tmcone

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.



z

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.

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

z

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?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

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.



z

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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Ş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.

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

t2

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


Sorunsuz full speed HID aygıt detayları, descriptor burada:
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