Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: z - 26 Ocak 2011, 17:06:16

Başlık: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 26 Ocak 2011, 17:06:16
USB haberlesme yapacak cihaz tasariminda en buyuk zorlugun, cipin hangi registerine hangi datayi yuklemek, gelen komutlara nasil cevap verilmesi gerektigini anlamak diye saniyordum fakat yanilmisim.

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

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

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

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

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

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

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

Device desriptorden basliyorum.

Cihazim icin Vendor ve Product ID sahibi oldugumu da varsayalim.

Standartlarla bu descriptorun nasil olacagi belirlenmis.


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


Device desriptoru olusturalim.

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

Burada anlamadigimi yazdigim yerleri aciklayabilecek varmi?

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

Başlık: Ynt: Bos USB Desriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: fatihkuzucu - 26 Ocak 2011, 17:52:37
usb.org diye bir site var elbette biliyorsunuz ama bir hatırlatayım dedim.

http://www.beyondlogic.org/usbnutshell/usb5.shtml
http://www.thesycon.de/eng/usb_descriptordumper.shtml
Başlık: Ynt: Bos USB Desriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 26 Ocak 2011, 18:10:15
Okuyarak beceremiycem gibi gorunuyor.

Firmalar calisanlarina USB egitimini nasil aldiriyorlar acaba?
Başlık: Ynt: Bos USB Desriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: mihri - 26 Ocak 2011, 18:36:34
İlgili mikroyu yada USB entegreyi aldığınız firmadan destek alma yoluna gittiniz mi hiç? Genelinin türkiye kadrosu fazla yardımcı olamıyor ama en azından merkezden birileri ile iletişime geçmenizi sağlayabilirler.
Başlık: Ynt: Bos USB Desriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: fatihkuzucu - 26 Ocak 2011, 18:50:53
USb orgdan destek alıyorlardır.

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

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


http://www.usb.org/developers/hidpage/ (http://www.usb.org/developers/hidpage/)
http://www.usb.org/developers/devclass_docs/HID1_11.pdf (http://www.usb.org/developers/devclass_docs/HID1_11.pdf)
http://www.usb.org/developers/devclass_docs/Hut1_12.pdf (http://www.usb.org/developers/devclass_docs/Hut1_12.pdf)
http://www.alanmacek.com/usb/ (http://www.alanmacek.com/usb/)
http://www.alanmacek.com/usb/descriptors.asm (http://www.alanmacek.com/usb/descriptors.asm)
http://www.usbmadesimple.co.uk/ums_4.htm (http://www.usbmadesimple.co.uk/ums_4.htm)
http://www.microchip.com/forums/tm.aspx?m=413261 (http://www.microchip.com/forums/tm.aspx?m=413261)
http://www.circuitsathome.com/mcu/arduino-usb-host-part-3-descriptors (http://www.circuitsathome.com/mcu/arduino-usb-host-part-3-descriptors)
Başlık: Ynt: Bos USB Desriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: t2 - 26 Ocak 2011, 18:56:15
HID Descriptor Tool vb uzun yol.  USB için üretici firmanın hid örneklerinden yola çıkın en kolayı bu. kendiniz yapabilirseniz sonuçta bunların modifiye edilmiş halini elde edeceksiniz.

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

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


Bu descriptorlar çipe özel değil. yani pic kullanmasanız başka çipi HID aygıt olarak kullanacaksanız hemen adapte edebilirsiniz. Çalışan bir örnek microchip Pickit2 Aygıt tam olarak yukarıda bahsettiğim gibi 64 bayt alma ve gönderme bufferine sahip  Full speed. 
Başlık: Ynt: Bos USB Desriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: ErsinErce - 26 Ocak 2011, 19:01:50
Device Class => Cihaz sınıfı yani HID,CDC, Mass Storage, Kişisel vs, eğer multi device ise custom ayarlanır
SubClass => Cihaz Yan özelliği varsa kullanılır genelde ya da  multidevice ise HID vb olduğu burada ayarlanıyordu doğru hatırlıyorsam
DeviceProtocol => protokol ayarı (Örnek: mass storagede scsi protokolü ayarı )
NumConfigurations => cihazın kullandığı konfigurasyon sayısı, multi device kullanırken yani örneğin aynı sistemde hem yazıcı hem mass storage varsa 2 konfigürasyon oluyor Device Class custom ayarlanırken SubClass(?) ile tanımlama bu yüzden gerekiyor.
Jan Axelson'un kitabında anlatıyor bunları aslında

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

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

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

Başlık: Ynt: Bos USB Desriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: Burak B - 26 Ocak 2011, 19:14:02
http://www.usb.org/developers/defined_class/ (http://www.usb.org/developers/defined_class/)
Başlık: Ynt: Bos USB Desriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: ErsinErce - 26 Ocak 2011, 19:18:58
Alıntı yapılan: t2 - 26 Ocak 2011, 19:10:42
Alıntı yapılan: cynetron - 26 Ocak 2011, 19:01:50
Device Class => Cihaz sınıfı yani HID,CDC, Mass Storage, Kişisel vs, eğer multi device ise custom ayarlanır
SubClass => Cihaz Yan özelliği varsa kullanılır genelde ya da  multidevice ise HID vb olduğu burada ayarlanıyordu doğru hatırlıyorsam
kitap mitap sallayın. hazır çalışan örnek var daha ne istiyorsunuz. onu değiştirmelisiniz. Adam fare yaptıysa descriptoru editleyip genel amaçlı hid aygıtı yapıverecez. bu zor bir şey değil.

T2 sanane kardeşim uğraşmak istiyorum, herşeye muhalif olma bende biliyorum hazır alıp kullanmayı, acil işim varsa öyle yapıyorum zaten.
Multifunction bir cihaz yapıyorsan hazır kodlarını bulamazsında, bulduğun şeyler benim kaç yıl önce yazdığım sorular olur orda kalır ;) (16f67j50 google it ;) )
Eğer yardımı olacak bilgin varsa söyle kenara çekil lütfen!!!
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 26 Ocak 2011, 22:08:17
Bakipta goremediklerimi gormemi sagladiniz.

Base Class  Descriptor Usage    Description

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

Device desriptorun, DeviceClass gozune yukaridakilerden uygun olani yazacagiz.

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

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

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

bNumConfigurations=0x01  olmali.

Umarim hatam yoktur.

Class= 0x03 iken
SubClass=0x01  Boot Interface

SubClass=0x01  iken

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

Gerektiginde bu linke muracat edilmeli. http://www.usb.org/developers/defined_class/
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 26 Ocak 2011, 22:19:54
Device descriptorum asagidaki gibi olacak.

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

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

Hatam varsa duzeltirseniz sevinirim.

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

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


Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: Burak B - 26 Ocak 2011, 23:48:12
;)
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: t2 - 26 Ocak 2011, 23:56:13
Bunalmis hocam elinizde kullanacağınız çipe ait bir hid örneği var mıdır? fare veya başka bir aygıt olabilir.  Bunu modifiye etmeye çalışabilirim. işiniz görülsün. Elinizde zaten çip varsa hemen deneyip sonucu görürsünüz.

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

__Config1Len
retlw low ((__EndConfig1-___Config1) / 2) ; Length of this configuration
retlw high ((__EndConfig1 - ___Config1) / 2)
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 27 Ocak 2011, 00:15:33
Malesef elimdeki cipin (LM3S9B92) cok basit HID ornegi yok (Mouse ve klavye ornegi var). Adamlar cipimizi alip rahatca kullansinlar diye usb library vermisler. Ustelik acik kodlari da mevcut. Fakat cok genel amacli yazilmis. Ben basite indirgemeye calistim ama beceremedim.  Eger istersen linkini verebilirim fkat kodlari buraya yapistiramam. (Download ederken doldurdugum kabul ettigimi onayladigim formda oyle diyorlardi)

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

Ama soyle bir iyilikte bulunursan sevinirim.

Benim yapmaya calistigim cihazi anladin.

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

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

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

Evet otomatik olayindan haberim var. Tablo boylari degisince otomatik derleyici hesaplayip bazi degerleri kendi olusturuyor. Fakat atla deve değil bytlari simdilik tek tek sayip kendim de koyarim yada bende ayni otomatik hesaplama islemini devreye sokarim.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: ErsinErce - 27 Ocak 2011, 00:18:02
Alıntı yapılan: bunalmis - 26 Ocak 2011, 22:19:54
bConfigurationValue=Anlamadim
iConfiguration=Anlamadim

bConfigurationValue => multidevice kullanım yaparken birden fazla konfigürasyon tanımlanıyor demiştim burda o konfigürasyonlara index atıyoruz (1,2...)
iConfiguration => konfigürasyonun kullanacağı string'in index'ini buraya yazıyoruz (1. string,2.string,...) Bu stringleri de aşağıda tanımlıyacağız.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: t2 - 27 Ocak 2011, 00:22:05
Pickit2 çalışan aygıta ait tanımlama bilgisi
http://www.speedyshare.com/files/26511477/pk2descriptor.zip
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: t2 - 27 Ocak 2011, 00:25:25
Alıntı yapılan: bunalmis - 27 Ocak 2011, 00:15:33
Boyle bir cihazin tum descriptorlerini olusturabilmek adina,  kes yapistir degistir mantigiyla ornek herhangi bir cihazin descriptorlerini modifiye edip al senin olusturmak istedigin descriptorler iste bunlar deyip buraya koyarsan, degiskenlerin hemen sagina aciklamalari yazar ve isi hizlandiririz.
Bunu hazır örneğini upload etmiştim zaten galiba mesajı okumadın. header dosyası istemişsin ben tüm dosyaları gönderdim. microchipn genel amaçlı hid örneği var.
https://www.picproje.org/index.php/topic,31499.msg220050.html#msg220050
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 27 Ocak 2011, 00:29:26
okudum okumasina da tablodaki degerlerinin anlamini anlamayinca devam edesim gelmedi.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 27 Ocak 2011, 00:32:03
Alıntı yapılan: cynetron - 27 Ocak 2011, 00:18:02
Alıntı yapılan: bunalmis - 26 Ocak 2011, 22:19:54
bConfigurationValue=Anlamadim
iConfiguration=Anlamadim

bConfigurationValue => multidevice kullanım yaparken birden fazla konfigürasyon tanımlanıyor demiştim burda o konfigürasyonlara index atıyoruz (1,2...)
iConfiguration => konfigürasyonun kullanacağı string'in index'ini buraya yazıyoruz (1. string,2.string,...) Bu stringleri de aşağıda tanımlıyacağız.

Bu durumda benim ornegimde tek konfigurasyon olacagina gore

bConfigurationValue=1
iConfiguration=0 diyesim geliyor fakat

Device descriptordeki

iManufacturer=XXXX
iProduct=YYYY
iSerialNumber=ZZZZ

degiskenleri de string alanindan deger almayacaklarmiydi. Bu durumda iConfiguration=3 yazasim geliyor fakat orneklerde 0 goruyorum.

Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: ErsinErce - 27 Ocak 2011, 00:34:50
Tanımlama yaptığımız yerin en alt kısmında stringlere (Cihazı taktığımızda bilgisayarın gördüğü isim) index atıyoruz, o indexlerden hangisini kullandığımızı buraya yazıyoruz
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: ErsinErce - 27 Ocak 2011, 00:38:06
Bu örnekte görüldüğü gibi...
;
; This file contains a set of descriptors for a CDC Virtual serial com interface.
;
#define  __EP0_BUFF_SIZE         8         ; 8, 16, 32, or 64
#define  __MAX_NUM_INT           1         ; For tracking Alternate Setting
#define  __MAX_EP_NUMBER         3         ; UEP3
#define  __NUM_CONFIGURATIONS    1
#define  __NUM_INTERFACES        2

#define  __MODE_PP               _PPBM0
#define  __UCFG_VAL              _PUEN | _TRINT | _FS | __MODE_PP  ; Set bus for Full Speed

#define __USB_USE_CDC                      ; Inform the rest of the library subroutines that we're using a CDC interface

; CDC
#define __CDC_COMM_INTF_ID        0
#define __CDC_COMM_UEP            UEP2
#define __CDC_INT_BD_IN           __ep2Bi
#define __CDC_INT_EP_SIZE         8
#define __CDC_DATA_INTF_ID        1
#define __CDC_DATA_UEP            UEP3
#define __CDC_BULK_BD_OUT         __ep3Bo
#define __CDC_BULK_OUT_EP_SIZE    64       ; 64 byte output buffer.
#define __CDC_BULK_BD_IN          __ep3Bi
#define __CDC_BULK_IN_EP_SIZE     64       ; 64 byte input buffer

#define __VID_Value 0x04D8                 ; VID (Vendor Id)
#define __PID_Value 0x000A                 ; PID (Product Id)
#define __MAX_POWER 40                     ; Maximum power consumption (in mA)
;
; ------------------------------------------------------------------------------
; This table is polled by the host immediately after USB Reset has been released.
; These fields are application dependent to be modified to meet your specifications.
;
__DeviceDescriptor
  retlw  (__EndDeviceDescriptor - __DeviceDescriptor) / 2  ; Length of this descriptor
  retlw  __DSC_DEV                    ; bDescType Device
  dt     0x10, 0x01                   ; bcd USB Revision 1.10 low byte, high byte
  retlw  __CDC_DEVICE                 ; bDeviceClass
  retlw  0x00                         ; bDeviceSubClass
  retlw  0x00                         ; bDeviceProtocol
  retlw  __EP0_BUFF_SIZE              ; bMaxPacketSize for EP0
  dt     low(__VID_Value), high(__VID_Value)   ; Vendor Id (VID) low byte, high byte
  dt     low(__PID_Value), high(__PID_Value)   ; Product ID (PID) low byte, high byte
  dt     0x00, 0x00                   ; bcd Device Device release number low byte, high byte
  retlw  0x01                         ; iManufacturer Manufacturer string index
  retlw  0x02                         ; iProduct Product string index
  retlw  0x00                         ; iSerialNumber Device serial number string index
  retlw  __NUM_CONFIGURATIONS         ; bNumConfigurations
__EndDeviceDescriptor

; ------------------------------------------------------------------------------
; This table is retrieved by the host after the address has been set.
; This table defines the configurations available for the device.
; See section 9.6.2 of the Rev 1.0 USB specification (page 184).
; These fields are application dependent to be modified to meet your specifications.
;
; Configuration pointer table
__USB_CD_Ptr
__Configs
  db  low ___Config1, high ___Config1
  db  low ___Config1, high ___Config1

; Configuration Descriptor
___Config1
  retlw  9                            ; Length of this descriptor
  retlw  __DSC_CFG                    ; bDescType Configuration
__Config1Len
  retlw  low ((__EndConfig1 - ___Config1) / 2)    ; Length of this configuration
  retlw  high ((__EndConfig1 - ___Config1) / 2)
  retlw  __NUM_INTERFACES             ; Number of interfaces in this configuration
  retlw  0x01                         ; Configuration Value
  retlw  0x02                         ; Index for this configuration ------------------------------------------------------------------------------------------------------------------
  retlw  0x80                         ; bmAttributes
  retlw  (__MAX_POWER * 2)            ; Max power consumption (2X mA)

; Interface Descriptor
  retlw  9                            ; Length of this descriptor
  retlw  __DSC_INTF                   ; DescType Interface
  retlw  0                            ; Interface number
  retlw  0                            ; Alternate setting
  retlw  1                            ; Number of endpoints in this interface
  retlw  __COMM_INTF                  ; Class code
  retlw  __ABSTRACT_CONTROL_MODEL     ; Subclass code
  retlw  __V25TER                     ; Protocol code
  retlw  0                            ; Interface string index

; CDC Class-Specific Descriptors
  retlw  5                            ; bFNLength (USB_CDC_HEADER_FN_DSC)
  retlw  __CS_INTERFACE               ; bDscType
  retlw  __DSC_FN_HEADER              ; bDscSubType
  dt     0x10, 0x01                   ; bcd CDC low byte, high byte

  retlw  4                            ; bFNLength (USB_CDC_ACM_FN_DSC)
  retlw  __CS_INTERFACE               ; bDscType
  retlw  __DSC_FN_ACM                 ; bDscSubType
  retlw  2                            ; bmCapabilities

  retlw  5                            ; bFNLength (USB_CDC_UNION_FN_DSC)
  retlw  __CS_INTERFACE               ; bDscType
  retlw  __DSC_FN_UNION               ; bDscSubType
  retlw  __CDC_COMM_INTF_ID           ; bMasterIntf
  retlw  __CDC_DATA_INTF_ID           ; bSaveIntf0

  retlw  5                            ; bFNLength (USB_CDC_CALL_MGT_FN_DSC)
  retlw  __CS_INTERFACE               ; bDscType
  retlw  __DSC_FN_CALL_MGT            ; bDscSubType
  retlw  0                            ; bmCapabilities
  retlw  __CDC_DATA_INTF_ID           ; bDataInterface

; Endpoint Descriptor
  retlw  7                            ; bLength (USB_EP_DSC)
  retlw  __DSC_EP                     ; bDscType
  retlw  _EP02_IN                     ; bEPAdr
  retlw  3                            ; bmAttributes (_INT)
  retlw  low (__CDC_INT_EP_SIZE)      ; wMaxPktSize
  retlw  high (__CDC_INT_EP_SIZE)
  retlw  2                            ; bInterval

; Interface Descriptor
  retlw  9                            ; Length of this descriptor
  retlw  __DSC_INTF                   ; INTERFACE descriptor type
  retlw  1                            ; Interface Number
  retlw  0                            ; Alternate Setting Number
  retlw  2                            ; Number of endpoints in this intf
  retlw  __DATA_INTF                  ; Class code
  retlw  0                            ; Subclass code
  retlw  __NO_PROTOCOL                ; Protocol code
  retlw  0                            ; Interface string index

; Endpoint Descriptors
  retlw  7                            ; bLength (USB_EP_DSC)
  retlw  __DSC_EP                     ; bDscType
  retlw  _EP03_OUT                    ; bEPAdr
  retlw  2                            ; bmAttributes (_BULK)
  retlw  low (__CDC_BULK_OUT_EP_SIZE) ; wMaxPktSize
  retlw  high (__CDC_BULK_OUT_EP_SIZE)
  retlw  0                            ; bInterval

  retlw  7                            ; bLength (USB_EP_DSC)
  retlw  __DSC_EP                     ; bDscType
  retlw  _EP03_IN                     ; bEPAdr
  retlw  2                            ; bmAttributes (_BULK)
  retlw  low (__CDC_BULK_IN_EP_SIZE)  ; wMaxPktSize
  retlw  high (__CDC_BULK_IN_EP_SIZE)
  retlw  0                            ; bInterval
__EndConfig1


; String pointer table
__USB_SD_Ptr
__Strings
  db  low __String0, high __String0
  db  low __String1, high __String1
  db  low __String2, high __String2   ---------------------------------------------------------------------------------------------------------------------------------
  db  low __String3, high __String3
  db  low __String4, high __String4

__String0
  retlw   (__String1 - __String0) / 2  ; Length of string
  retlw   __DSC_STR                    ; Descriptor type 3
  dt      0x09, 0x04                   ; Language ID (0x0409 as defined by Microsoft)
__String1
  retlw   (__String2 - __String1) / 2
  retlw   __DSC_STR
  dt __VdrNmeStr
__String2                                                           -------------------------------------------------------------------------------------------------------------------------
  retlw   (__String3 - __String2) / 2
  retlw   __DSC_STR
  dt __DvcDscStr
__String3
  retlw   (__String4 - __String3) / 2
  retlw   __DSC_STR
  dt __VerStr
__String4
  retlw   (__String5 - __String4) / 2
  retlw   __DSC_STR
  dt      'C', 0, 'f', 0, 'g', 0, '1', 0
__String5

; Vendor Name String
#define __VdrNmeStr 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'c', 0, 'h', 0, 'i', 0, 'p', 0
; Device Description String
#define __DvcDscStr 'P', 0, 'I', 0, 'C', 0, '1', 0, '8', 0, ' ', 0, 'U', 0, 'S', 0, 'B', 0, ' ', 0, 'C', 0, 'D', 0, 'C', 0       -----------------------------------------------------------------
; Version String
#define __VerStr    'V', 0, '1', 0, '.', 0, '1', 0, 'F', 0, 'S', 0
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 27 Ocak 2011, 00:41:22
Benim kafamda farkli bir sey var sanirim.

Device descriptorde 3 tane stringe ait index var.

iManufacturer=XXXX
iProduct=YYYY
iSerialNumber=ZZZZ

Birde configurasyon descriptorde karsimiza iconfiguration cikti

ben soyle dusunuyordum

String1  Bunun indexi xxxx yerine yazilacak
String2  Bunun indexi yyyy yerine yazilacak
String3  Bunun indexi zzzz yerine yazilacak
String4  Bunun indexi iconfiguratin yerine yazilacak

Neyse yarin dokumanlara yenibastan bakayim. Bir sey yanlis anladim henuz cozemedim.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: ErsinErce - 27 Ocak 2011, 00:49:32
Doğru düşünüyorsunuz stringleri aşağıda oluşturup index numarasını yazacaksınız, elinizde 4 tane string olacak.
konfigürasyondaki çok önemsenmiyor çünkü oluşturacağınız driverda vereceğiniz isim daha baskın geliyor ve o ismi alıyor,
bu yüzden eldeki stringlerden biri tanımlanarak o alan geçiştiriliyor.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 27 Ocak 2011, 02:35:08
cynetron Dedigin gibiymis.

T2 nin verdigi PIC2 ye ait tablolardan sorunumu anladim.

Descriptorlerde kullanilmasini istedigimiz stringleri alt alta yaziyoruz ve bunlarin index degerlerini ilgili descriptore isliyoruz.

Eger birbirinin ayni stringler olacaksa stringleri tekrar tekrar yazmiyor ayni indexi ilgili descriptorlerde kullaniyoruz.
Bu durumda genelde 0 oluyor dedigim string indexler aslinda ayni string descriptordeki ilk mesaji verdirme amacini guduyormus.

Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 27 Ocak 2011, 02:48:04
T2 nin verdigi descriptorler cok guzel gorunuyor. Aciklama satirlarina Turkce ilaveler yaptigimizda bu baslik HID tipinde USB cihazlarin descriptorlerini ana hatlariyla ogrenmek isteyenler icin mukemmel hale gelecek.

Descriptor 3.sayfaya tasindi.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 27 Ocak 2011, 03:05:48
Araya bir saplama yapayim.

Hayirsever bir vatandasin birisi vendor ID ve Product ID icin para odeyip sonrada ayni makinaya bagli usb cihazlarinizda sadece bir tane bu numarada cihaz kullanmaya raziysaniz
alin size hibe ediyorum, dileyen diledigi cipte diledigi uygulamada kullansin. Kullananlarin basina is getirmeyecegim tarzinda bir durum varmi?




Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: ErsinErce - 27 Ocak 2011, 03:24:52
Bu site 10€ ya product id satıyor, her cihaz için 1 tane rahatlıkla alınabilir
http://www.mcselec.com/index.php?page=shop.product_details&flypage=shop.flypage&product_id=92&option=com_phpshop&Itemid=1

ayrıca microchip kendi VID si üzerinden PID imkanıda veriyor
http://ww1.microchip.com/downloads/en/AppNotes/Application%20for%20USB%20Vendor%20ID%20Sublicense.pdf

Yada 4000$/65535 = 6,1 cent$/ürün olarak picproje olarak toplu olarak VID ve PID alınabilir  ;)
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 27 Ocak 2011, 13:41:10
Alıntı yapılan: cynetron - 27 Ocak 2011, 03:24:52
Yada 4000$/65535 = 6,1 cent$/ürün olarak picproje olarak toplu olarak VID ve PID alınabilir  ;)

Boyle bir organizasyona sıcak bakanlarla 64 kişilik katılım çok rahat elde edilebilir. 4000/64=63$ maliyeti olur. (Bilemedik 100$)

Adam başı 1000 farklı cihaz yapacak kadar da seçeneğimiz olur. Hesabımda hata yoksa bu organizasyonu hemen başlatalım.

Satın alımı firma adına yapmak şartmı acaba. Picproje organizasyonu olarak satın alma durumumuz olabilirmi?
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: ErsinErce - 27 Ocak 2011, 13:47:53
Ayrı bir konu açıp sıcak bakanları oraya toplayalım yalnız, buradaki konuyu dağıtmayalım =)
Ayrı kullanımdan ötürü logo kullanımı kısıtı gelebilir, bunların detaylarını o konu başlığı üzerinden devam ettirelim =)
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 27 Ocak 2011, 13:55:49
O zaman senden uygun bir bolumde baslik acmani rica edelim. Boyle bir organizasyonda ben varim. Hatta zamanin musait se adamlarla yazismalari sen yurutebilirsin.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: ErsinErce - 27 Ocak 2011, 14:10:01
Dersler, iş ayrıca bazı ufak projelerle uğraşmaktan kendime pek vakit ayıramıyorum hocam,
gerekli desteği verebilirim ama işi yürütme konusunda zaman problemim çok oluyor, bu konuda affınıza sığınıcam =(
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: t2 - 27 Ocak 2011, 14:33:41
2-3 sene önce de aynı konu gündeme geldi. yine söyledim bedava PID veriyorlar neden almıuyorsunuz. adam illaki benim çipimi kullanacaksın da demiyor. VID onun PID senin. Yani bu 8 adet pidi sana tahsis etmiş.  FTDI veriyor. hala veriyorsa bir bakın.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: computerboy - 27 Ocak 2011, 17:17:14
http://www.keil.com/forum/search.asp?SA=&KW=&DY=&PL=&Q=hid+usb&KB=ON&PM=ON&FR=ON&PG=9&PX=1

Zamanında burada veya başka formda usb ile ilgili sorular sormuştum ama herhangi bir neticeye ulaşamamıştım keilin kendi formunda sorduğum zaman gayet hızlıca çözüme ulaştım.  kolay gelsin.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 27 Ocak 2011, 20:41:55
Report descriptor hakkinda birseyler soyleyecek olan varmi?

Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 28 Ocak 2011, 01:09:53
Evet T2 ne yapacagiz simdi, bu report descriptorde ne degisiklikler yapilabilir? Bu descriptorde ne ne ise yariyor?
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: t2 - 28 Ocak 2011, 09:13:59
HID cihaza ait report descriptor, gelen verilerin baytların hatta bitlerin bir haritasıdır. hangi bitin hangi işe yarayacağını bilgisayar tarafında  ayıklamamızı sağlayan bir tanımlamadır. Mesela joystik yaptık üzerinde 6 buton ve 6 tane pot olsun. butonların on off bilgisini bazı bitlerden alabiliriz. Pot adc değerini ifade eden baytlar da vardır. ve kesin olarak bu bilgileri alabiliriz. Windows apilerinden bu bilgileri alabiliyormuşuz.

Vendordefined report kullanırsanız, cihaza gönderdiğiniz 64 bayt yerine ulaşır. ve cihazdan gelen 64 baytı da okursunuz.  Baytlar buton veya POT verisi gibi ayrılmamış.  Baytların neyi ifade ettiğini ise kendiniz belirleyebilirsiniz. Mesela ilk 3 bayt işlem kodu, sonraki 3 bayt işlemin datası sonraki baytlar da başka bir şeyi olabilir.

Bu projedeki  (https://www.picproje.org/index.php/topic,31499.msg220050/topicseen.html#msg220050) report descriptor, size 1 interface için maksimum  transfer hızı sağlar. ayrıca bir yerlerini değiştirmenize gerek yok.  1ms içinde 64 bayt gönderebilir ve alabilirsiniz.

Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 28 Ocak 2011, 11:18:43
En son sayfaya taşındı.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: t2 - 28 Ocak 2011, 11:24:27
Ben sizin verdiğiniz bilgileri teyid edebilecek durumda değilim. O kadar bilm yok.  Calışan cihaz olarak örnek verdiğim pickit 2 tanımlamasında da hata varmış. görmüşsünüzdür. 2 tane config var gibi görünüyor. 2. si nerede? hem de hid versiyonu yanlış görünüyordu. Fakat bu hatalar ciddi olmasa  gerek. çünkü cihaz çalışıyor.

Ayrıyeten cihazın çalışabilmesi için başka değerleri de report count ile aynı yani 64 ayarlamamız gerekir

#define   __HID_INT_IN_EP_SIZE   64
#define   __HID_INT_OUT_EP_SIZE   64
gibi
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: Burak B - 28 Ocak 2011, 12:13:04
@bunalmis hocam;
Maksimum 64KB/s transfer hızı projeniz için yeterli olacakmı sizce ?
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 28 Ocak 2011, 12:35:43
Eskiden FT232 ile çalışırken 115200 baud kullanıyordum.

Bu hız, saniyede yaklaşık 10K byte demek. Ustelik bunlar sadece sade veriler değil, al gülüm ver gülüm, olmadı bir daha gibi  soft protokolüme ait istek ve yanıtları da içerdiğinden saniyede aktarılan saf verilerin sayıyı bunun çok altında kalıyordu.

Haliyle tamamen USB ye geçtiğimde 32Kb/sec bile işimi fazlasıyla görecek.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 28 Ocak 2011, 12:54:23
Alıntı yapılan: t2 - 28 Ocak 2011, 11:24:27
..Calışan cihaz olarak örnek verdiğim pickit 2 tanımlamasında da hata varmış. görmüşsünüzdür. 2 tane config var gibi görünüyor. 2. si nerede? hem de hid versiyonu yanlış görünüyordu. Fakat bu hatalar ciddi olmasa  gerek. çünkü cihaz çalışıyor.

Ayrıyeten cihazın çalışabilmesi için başka değerleri de report count ile aynı yani 64 ayarlamamız gerekir

#define   __HID_INT_IN_EP_SIZE   64
#define   __HID_INT_OUT_EP_SIZE   64
gibi

Verdiğin PIC2 descriptörleri kendime göre uyarlayıp yukarıda açıklamaya çalışıyorum. Çok fazla değişikli yaptığımı hatırlamıyorum. Yanlış hatırlamıyorsam, çipim desteklediği için paket boyunu 8 den 64 de çıkarttım.

Configurasyon sayısını da 1 yapıp bunu bNumConfigurations ve bConfigurationValue yerlerine yazmıştım. Bu durumda descriptorlerde hatamız yok.

Sadece Report descriptor kafama yatmadı bunu modifiye etmeye çalışıyorum fakat çok karmaşık, farklı bir iki dokumanı izleyip anlamaya çalışıyorum.

Bu kısmı anlatacak biri çıksa da beni bu zahmetten kurtarsa diye de bekliyorum.

Şeytan bu desriptörü traşla diyor ama çekiniyorum. Sanki bununla hiç işim olmayacak gibi duruyor.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: t2 - 28 Ocak 2011, 13:02:37
Peki  bunu değiştirmek istememenize sebep nedir? Sorun  mu çıkıyor? pic kit 2 yerine diğer örneği kullansak daha iyi olabilir. En azından hid versiyonunu 1.11 olarak düzgün yazmışlar. bu daha güvenilir.
https://www.picproje.org/index.php/topic,31499.msg220050/topicseen.html#msg220050
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: Burak B - 28 Ocak 2011, 13:10:02
http://frank.circleofcurrent.com/cache/hid_tutorial_1.htm (http://frank.circleofcurrent.com/cache/hid_tutorial_1.htm)
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 28 Ocak 2011, 13:45:33
Alıntı yapılan: t2 - 28 Ocak 2011, 13:02:37
Peki  bunu değiştirmek istememenize sebep nedir? Sorun  mu çıkıyor? pic kit 2 yerine diğer örneği kullansak daha iyi olabilir. En azından hid versiyonunu 1.11 olarak düzgün yazmışlar. bu daha güvenilir.
https://www.picproje.org/index.php/topic,31499.msg220050/topicseen.html#msg220050

Degistirmek istememin sebebi yapmak istedigim cihaz belli. Buna ait desriptorlerin icinde PIC2 ve microchipe ait hic bir kirinti kalmasin.
Her ne kadar hala VID ve PID kalsa da bunlari en kisa zamanda degistirecegim.

Ikinci verdigin ornege derinlemesine bakmadim hemen bakayim.

/* Device Descriptor */
ROM USB_DEVICE_DESCRIPTOR device_dsc=
{
    0x12,    // Size of this descriptor in bytes
    USB_DESCRIPTOR_DEVICE,                // DEVICE descriptor type
    0x0200,                 // USB Spec Release Number in BCD format
    0x00,                   // Class Code
    0x00,                   // Subclass code
    0x00,                   // Protocol code
    USB_EP0_BUFF_SIZE,          // Max packet size for EP0, see usb_config.h
    0x04D8,                 // Vendor ID
    0x003F,                 // Product ID: Custom HID demo
    0x0002,                 // Device release number in BCD format
    0x01,                   // Manufacturer string index
    0x02,                   // Product string index
    0x00,                   // Device serial number string index
    0x01                    // Number of possible configurations
};

/* Configuration 1 Descriptor */
ROM BYTE configDescriptor1[]={
    /* Configuration Descriptor */
    0x09,//sizeof(USB_CFG_DSC),    // Size of this descriptor in bytes
    USB_DESCRIPTOR_CONFIGURATION,                // CONFIGURATION descriptor type
    0x29,0x00,            // Total length of data for this cfg
    1,                      // Number of interfaces in this cfg
    1,                      // Index value of this configuration
    0,                      // Configuration string index
    _DEFAULT | _SELF,               // Attributes, see usb_device.h
    50,                     // Max power consumption (2X mA)
                     
    /* Interface Descriptor */
    0x09,//sizeof(USB_INTF_DSC),   // Size of this descriptor in bytes
    USB_DESCRIPTOR_INTERFACE,               // INTERFACE descriptor type
    0,                      // Interface Number
    0,                      // Alternate Setting Number
    2,                      // Number of endpoints in this intf
    HID_INTF,               // Class code
    0,     // Subclass code
    0,     // Protocol code
    0,                      // Interface string index

    /* HID Class-Specific Descriptor */
    0x09,//sizeof(USB_HID_DSC)+3,    // Size of this descriptor in bytes
    DSC_HID,                // HID descriptor type
    0x11,0x01,                 // HID Spec Release Number in BCD format (1.11)
    0x00,                   // Country Code (0x00 for Not supported)
    HID_NUM_OF_DSC,         // Number of class descriptors, see usbcfg.h
    DSC_RPT,                // Report descriptor type
    HID_RPT01_SIZE,0x00,//sizeof(hid_rpt01),      // Size of the report descriptor
   
    /* Endpoint Descriptor */
    0x07,/*sizeof(USB_EP_DSC)*/
    USB_DESCRIPTOR_ENDPOINT,    //Endpoint Descriptor
    HID_EP | _EP_IN,                   //EndpointAddress
    _INTERRUPT,                       //Attributes
    0x40,0x00,                  //size
    0x01,                        //Interval

    /* Endpoint Descriptor */
    0x07,/*sizeof(USB_EP_DSC)*/
    USB_DESCRIPTOR_ENDPOINT,    //Endpoint Descriptor
    HID_EP | _EP_OUT,                   //EndpointAddress
    _INTERRUPT,                       //Attributes
    0x40,0x00,                  //size
    0x01                        //Interval
};

//Language code string descriptor
ROM struct{BYTE bLength;BYTE bDscType;WORD string[1];}sd000={
sizeof(sd000),USB_DESCRIPTOR_STRING,{0x0409
}};



--------------------------------------------------------------------------------

//Class specific descriptor - HID
ROM struct{BYTE report[HID_RPT01_SIZE];}hid_rpt01={
{
    0x06, 0x00, 0xFF,       // Usage Page = 0xFF00 (Vendor Defined Page 1)
    0x09, 0x01,             // Usage (Vendor Usage 1)
    0xA1, 0x01,             // Collection (Application)
    0x19, 0x01,             //      Usage Minimum
    0x29, 0x40,             //      Usage Maximum    //64 input usages total (0x01 to 0x40)
    0x15, 0x01,             //      Logical Minimum (data bytes in the report may have minimum value = 0x00)
    0x25, 0x40,              //      Logical Maximum (data bytes in the report may have maximum value = 0x00FF = unsigned 255)
    0x75, 0x08,             //      Report Size: 8-bit field size
    0x95, 0x40,             //      Report Count: Make sixty-four 8-bit fields (the next time the parser hits an "Input", "Output", or "Feature" item)
    0x81, 0x00,             //      Input (Data, Array, Abs): Instantiates input packet fields based on the above report size, count, logical min/max, and usage.
    0x19, 0x01,             //      Usage Minimum
    0x29, 0x40,             //      Usage Maximum    //64 output usages total (0x01 to 0x40)
    0x91, 0x00,             //      Output (Data, Array, Abs): Instantiates output packet fields.  Uses same report size and count as "Input" fields, since nothing new/different was specified to the parser since the "Input" item.
    0xC0}                   // End Collection
};                 
 

Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: t2 - 28 Ocak 2011, 13:58:41
vid ve pid ile, cihazın ismi gibi bazı stringleri direk editlersiniz.  String vasıtasıyla descriptyor uzunluğu değiştiyse onu yeniden sayıp yerine yazılabilir.  Diğer kısımlar firmanın kendine has bilgiler değildir. 
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 28 Ocak 2011, 14:15:13

En sagdaki kirmizi renkli verilerden ilki, o descriptordeki sıra no (index), diğeri ise o satırdaki verinin kac byte oldugunu söylermekte.
Tabiki bu değerler biz okuyanlar icin. Yoksa cipin icine sadece en soldaki degerleri gömeceğiz.

Connection Status Device connected, Current Configuration 1, Speed Full, Device Address 3 , Number Of Open Pipes 2

Device Descriptorümüz  

bLength= 0x12.....................  Bu tablonun uzunluğu (byte sayısı) daima 0x12....0-1 Byte
bDescriptorType= 0x01......... Bu descriptörde bu değer daima 0x01 ..................1-1 Byte
bcdUSB= 0x00,02.................. USB 2.0   (0x110 da USB 1.1)................................2-2 Byte
bDeviceClass=0x00............... Sınıf bilgisini Interface Descriptorden al demek.....4-1 Byte
bDeviceSubClass=0x00......... Alt sınıfı yok...........................................................5-1 Byte
bDeviceProtocol=0x00........... Protokol yok..........................................................6-1 Byte
bMaxPacketSize0=0x40......... Paketler 64 byte taşıyacak....................................7-1 Byte
idVendor=0xD8,0x04............. Microchipe ait kod  (USB organizasyonu veriyor)...8-2 Byte
idProduct=0x3F,0x00............. Microchipe ait kod  (Micro chip veriyor)................. 10-2 Byte
bcdDevice=0x00,0x02............ Cihazın sürüm numarası (Micro chip veriyor).........12-2 Byte
iManufacturer=0x01............... 1 numaralı string...................................................14-1 Byte
iProduct=0x02........................ 2 numaralı string...................................................15-1 Byte
iSerialNumber=0x03............... 3 numaralı string...................................................16-1 Byte
bNumConfigurations=0x01..... Tek konfigurasyonumuz olacak.............................17-1 Byte
 
Bugune kadar farklı sınıf cihazlarda DeviceClass=0x00 görünce kafam karışıyordu.
Halbuki bu değer 0 olursa sınıf bilgisini Interface Descriptorden alacağız  anlamına geliyormuş.

Configuration Descriptorümüz  

bLength=09h.....................  Bu tablonun uzunluğu (byte sayısı) daima 0x09....0-1 Byte
bDescriptorType=0x02........ Bu descriptörde bu değer daima 0x02 ..................1-1 Byte
wTotalLength=0x029,0x00.. Not 1 ....................................................................2-2 Byte
bNumInterfaces=0x01......... Interface sayımız.. ................................................4-1 Byte
bConfigurationValue=0x01.. Configurasyon değerimiz.......................................5-1 Byte
iConfiguration=0x00.............0 numaralı string kullanılacak................................6-1 Byte
bmAttributes=0xE0...............Not 2....................................................................7-1 Byte
bMaxPower=0x32.................USB hattan çekilecek akım....................................8-1 Byte

Not 1

configuration, interface, endpoint, ve HID descriptorler de dahıl olmak uzere toplam uzunluk.

9 + 9 + 7 + 7 + 9 = 41 yani 0x29

Not 2


Cihazımız USB hattından değil kendi güç kaynağından beslenecek ve remote wakeup özelliği olacak.
64 bitlik veri alış verişi yapan tek bir interfaceimiz var.

bmAttributes değerini oluşturmak için,

4..0: Reserved  ...00000   
5: Remote Wakeup  ..1..... 
6: Self Powered  .1...... 
7: Reserved (1)

11100000=0xE0 değerini buluruz.

Device descriptörde bNumConfigurations=0x01 demiştik. O halde aşağıdaki Configuration Descriptor bu descriptor demektir.
0x01 değil de 0x02 olsaydı configuration descriptor sayımız da 2 olacak ve bConfigurationValue değerleri;

ilkinde bConfigurationValue=0x01
ikincisinde bConfigurationValue=0x02 olacaktır.  (Teyid ederseniz çok iyi olur)

bMaxPower değeri için USB hattan asılınacak akım değerini bilmemiz gerekiyor. Benim uygulamamda bu akım sıfır olacağından
sıfır yazacağım. Fakat 0 dan büyük bir değer yazmam da da sakınca yok görünüyor. 100mA akım çektiğimi varsayarsan bunun
yarısı 50 yani 0x32



Interface Descriptorümüz  

Iki tane End Pointimiz var. Birisi input digeri output amacli

bLength=0x09.....................  Bu tablonun uzunluğu (byte sayısı) daima 0x09....0-1 Byte
bDescriptorType=0x04......... Bu descriptörde bu değer daima 0x04 ..................1-1 Byte
bInterfaceNumber=0x00.......1 tane Interfaceimiz var ve numarası 0..................2-1 Byte
bAlternateSetting=0x00........Alternatif Setting yok..............................................3-1 Byte
bNumEndpoints=0x02...........2 tane End Point var...............................................4-1 Byte
bInterfaceClass=0x03...........HID sınıfındanız......................................................5-1 Byte
bInterfaceSubClass=0x00.....Alt sınıfımız yok.......................................................6-1 Byte
bInterfaceProtocol=0x00.......Protokolumuz yok...................................................7-1 Byte
iInterface=0x00.....................0 numaralı string.....................................................8-1 Byte

HID Descriptorümüz  

bLength=0x09.......................Bu tablonun uzunluğu (byte sayısı) daima 0x09....0-1 Byte
bDescriptorType=0x21.......... Bu descriptörde bu değer daima 0x21 ..................1-1 Byte
bcdHID=0x00,0x02................ 0X100 yada daha büyük olmalı..............................2-2 Byte
bCountryCode=0x00............. Ülke kodu yok........................................................4-1 Byte
bNumDescriptors=0x01..........Rapor descriptorlerin sayısı...................................5-1 Byte
bDescriptorType=0x22...........Report descriptorün tipi.........................................6-1 Byte
wDescriptorLength=0x1D,0x00...Report descriptorün uzunluğu...............................7-2 Byte

Eğer HID desriptorde opsiyonel olarak, ilave descriptorlerimiz olacaksa bunların descrpitor tipini ve uzunluğunu yukarıdaki tablonun sonuna
ilave ediyoruz. Haliyle tablo boyu uzayacağından en baştaki bLength değerini de modifiye etmemiz gerekiyor. Benim uygulamamda böyle bir durum olmadığından yukarıdaki HID tablosunu aynen kullanacağız.

İki tane End Pointimiz var. Bunların herbiri için Endpoint descriptor tanımlayacağız.

Endpoint Descriptorlerimiz

1. Endpointe ait descriptor

bLength=0X07.......................Bu tablonun uzunluğu (byte sayısı) daima 0x07....0-1 Byte
bDescriptorType=0X05..........Bu descriptörde bu değer daima 0x05 ..................1-1 Byte
bEndpointAddress=0X81.......Not 3......................................................................2-1 Byte
bmAttributes=0X03...............Interrupt tipi transfer.............................................3-1 Byte
wMaxPacketSize=0x40,0x00.Paketler 64 byte uzunluğunda...............................4-2 Byte
bInterval=0x01......................Not 4......................................................................6-1 Byte


2. Endpointe ait descriptor

bLength=0x07.......................Bu tablonun uzunluğu (byte sayısı) daima 0x07....0-1 Byte
bDescriptorType=0x05..........Bu descriptörde bu değer daima 0x05 ..................1-1 Byte
bEndpointAddress=0x01.......Not 3......................................................................2-1 Byte
bmAttributes=0x03...............Interrupt tipi transfer.............................................3-1 Byte
wMaxPacketSize=0x40,0x00.Paketler 64 byte uzunluğunda...............................4-2 Byte
bInterval=0x01......................Not 4......................................................................6-1 Byte

Not 3

In tipi endpointimizin adresinde  7.bit 1
Out tipi endpointimizin adesinde 7.bit 0 dır.

Not 4

Interrupt transferde endpointlerimiz pc tarafindan ne sıklıkla yoklanacak?
Full speed için en dusuk deger olan 1 i kullanacağım. Bu değer 1ms ye karşılık geliyor.

String Descriptorlerimiz

char StringDesZero[4]={ //Language code string descriptor
4, 0x03,        // Length, Type=String
0x09, 0x04};    // Code English

char ManufacStr[24]={
24, 0x03,       // Length, Type=String
'C',0,'n',0,'c',0,'d',0,'e',0,'s',0,'i',0,'g',0,'n',0,'e',0,'r',0};

char ProductStr[26]={
26, 0x03,       // Length, Type=String
'P',0,'C',0,'B',0,' ',0,'E',0,'n',0,'g',0,'r',0,'a',0,'v',0,'e',0,'r',0};

char SerialNumStr[10]={
10, 0x03,       // Length, Type=String
'T',0,'0',0,'0',0,'0',0};

HID Report Descriptorümüz

Report descriptorun yapısı daha önceki karşılatığımız descriptor yapılarından çok farklıdır.
Her satır öncü veri içerir ve bu veri, satırdaki  takip eden veriler hakkında açıklayıcı bilgileri barındırır.

Örneğin aşağıdaki ilk satırda 06 00 FF verisinde öncü verimiz 0xFF dir.

Usage Page (Vendor-Defined 1) 06 00 FF 
Usage (Vendor-Defined 1) 09 01 
Collection (Application) A1 01 
Usage Minimum (Vendor-Defined 1) 19 01 
Usage Maximum (Vendor-Defined 64) 29 40 
Logical Minimum (0) 15 01 
Logical Maximum (255) 25 40 
Report Size ( 8 ) 75 08 
Report Count (64) 95 40 
Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 00 
Usage Minimum (Vendor-Defined 1) 19 01 
Usage Maximum (Vendor-Defined 64) 29 40 
Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 00 
End Collection C0 
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 31 Ocak 2011, 11:15:18
Nihayet yukaridaki 64 byte report desriptorleri barindiran HID descriptoru sorunsuz kullanmaya basladim.

Get Report Descriptor, Set Report Descriptor istekleriyle 64 byte veri transferini gerceklestirdim.

Ancak elimdeki test program sadece descriptorler uzerinden kontrol transferi ile veri aktarimi yapiyor. Halbuki interrupt transferi yaparak veri aktarmam gerekiyor. Bunun icin hazirda ornek program varmi?

Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: t2 - 31 Ocak 2011, 13:39:06
Benim verdiğim örnekler zaten öyledir. interrupt transferi yaparak veri aktarır.

Bazı kötü haberlerim var: HID cihazlar çoğu pcde sorunsuz olmasına rağmen bazı bilgisayarlarda beklendiği gibi çalışmıyor ( ya da biz beceremedik diyelim)  Mesela ince ayar yaptım 2-3 tane cihaz değiştirdim müşterinin sorunu yine düzelmedi. Sonra eski  FTDI çip kullandığım eski versiyon  cihazı taktım  sorun düzeldi.  Sorun nedir derseniz  aygıt zamanlamasında kesintioluyor  aygıtta  veriler yerine ulaşmadı deyip beklemede kalıyor. Cihaz aygıt yöneticisinde sorunsuz görünmesina rağmen haberleşmede sıkıntı çıkıyor.  Çünkü zamanlama  zaten kesin değilmiş. yani 1ms dediysek 1.2 de olabilir. 0.8 de.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 31 Ocak 2011, 13:50:44
Ornek derken PC tarafinda kosturup usb cihazimi deneyebilecegim yazilimdan bahsediyorum.

Bugune kadar FT232 cipinde isimi FT nin kendi dll leri ile goruyordum. Simdi HID'a bulasinca sudan cikmis baliga dondum.

windowsun hid.dll inden bahsediliyor. Bu dll in fonksiyonlari nelerdir parmaterleri nelerdir basit bir ornek uygulama vs ariyorum.

Simdilik JEDI kompenent kullanilarak delphi de yazilmis ve hazir exe si de bulunan bir uygulama ile usb cihazimi deniyorum. Fakat bu program
interrupt transferi yapmiyor.

Verdigin desriptor isimi cok guzel gordu. Renklendirerek aciklamalar ekledigim desriptorlere son degisiklikleri de ilave edecegim. Benim tek yaptigim string desriptorler eklemek ve bunlarin indexlerini diger desriptorlerde yerine yazmak.

HID yapisinda iki tip transfer yapiyorsunuz. (Teyide ihtiyac var)

Ilki control transferi ile. Bu yontemde usb cihazdan report desriptor istiyorsunuz. USB cihazinizdaki islemci derhal report desriptorde belirtilen sayi kadar veriyi control hattindan PC ye yolluyor, yada tersine PC usb cihazimiza control hattindan HID report desriptorde bahsettigi kadar sayida veriyi yolluyor.

Ancak bu veri transferi yuksek hizli değil ve bus trafigine bagli olarak istekler gecikmeli giidiyor.

Eger veriler interrupt transferi ile yollanacaksa bu durumda veriler 1ms civarinda kesin olarak gonderiliyor. Fakat henuz bu transferi yapacak usb rutinlerini yazmadim. Yazabilmek icin pc tarafinda hazirda calisan bir program olmali ki debug islemlerim kolay yurusun.


Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: Burak B - 31 Ocak 2011, 15:18:10
Interrupt transferde 1ms belirtmeniz veri hızınızın %100 o hızda olmasını garantilemez. Sadece USB kaynaklarının büyük kısmını o transfere ayırarak bunu sağlamaya çalışır. Yani bu 1ms de olabilir 2 ms de. Transfer hızı USB veriyolundaki iş yüküne bakar. Bu nedenle zaman kritik bir uygulamada mevcut sistemdeki usb cihazların sayısını mümkün olduğunca az tutmak her zaman mantıklıdır.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 31 Ocak 2011, 15:27:01
Bu yazdiklarinizdan eminmisiniz? Cunku yazdiklariniz aynen bulk transfer icin gecerli.

Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: t2 - 31 Ocak 2011, 15:32:05
bulk transferde endpoint için süre belirtmek anlamlı değil. çünkü işe yaramaz. isterseniz 0 isterseniz 10 yazın dikkate alınmaz.  Fakat 1ms den daha kısa aralıklarla veri gönderip almaya kalkarsak sorun çıkabiliyordu.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: Burak B - 31 Ocak 2011, 15:39:49
Hocam dökümantasyonda belirtilen genelde garantili zaman kritik veri taşıma diye geçiyor ancak.

Bakın;
USB Complete 4rd - s76
Alıntı Yap
At low and full speeds, the bandwidth available for an interrupt endpoint is
limited,
but high speed and SuperSpeed loosen the limits.

Alıntı Yap...both bulk and interrupt
endpoints must wait for the host to request data before sending data.

USB Complete 4rd - s78
Alıntı YapAn interrupt transfer guarantees a maximum latency, or time between transaction
attempts. In other words, there is no guaranteed transfer rate, just the guarantee
that the host will make bandwidth available for a transaction attempt in
each maximum latency period.

Burada belirtilen kısıtlı bant genişliği ve hostu bekleme mevzuları teorikte bahsedilen zamanlamayı yalanlayabiliyor.
Helede OHCI, UHCI, EHCI v.s. gibi host standartlarını düşününce.

Yani yazacağınız kodunda zamanlaması iyi olmalı ve 1ms küçümsenecek bir zamanlama değil.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: t2 - 31 Ocak 2011, 15:51:11
Zaman kaymasını göz ardı edebilmek için cihazda ve pc tartafında yeterli bir buffer olmalı
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 31 Ocak 2011, 16:11:02
Ne oldu bizim interrupt transferi.

Interrupt transferini sizler nasil yapiyorsunuz? Henuz PC tarafi icin tek bir ornek bile bulamadigim gibi, usb cipin yaziliminda da ne yapacagimi bilmiyorum. End Point 1 IN ve End Point OUT kuzu kuzu bekliyor. Simdilik tum transferler End Point 0 uzerinden gidip geliyor.

Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: t2 - 31 Ocak 2011, 16:26:19
interrupt transferi için, örnek yayınlayacam.  fakat şuan meşgulüm.  DLL  gerek. bu işin şanındandır. angarya işler, low level fonksiyonlar  ile uğraşmadan kesin çözüm.  Fakat bunu da sevmeyebilirsiniz. DLL içinde kimbilir ne vardır.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 01 Şubat 2011, 01:15:36
HID sinifindan cihazlarla interrupt transfer nasil yapiliyor anlamadim.

End Point 0 uzerinden kontrol transferi yaparak enumeration islemini yapiyoruz. Hatta End Point 0 uzerinden Get Report Descriptor ve Set Report Descriptor talepleri ile usb cihaza veri aktarabiliyor yada tersine veri alabiliyoruz.

Peki interrupt transferi nasil yapiyoruz? PC usb cihazimiza data yollayacaksa ne yapiyor? Endpoint1 e data yollamasi yetiyormu?

Usb cihaz PC ye data yollayacaksa Endpoint 1 bufferini doldurup yolla mi diyor? Yolla derse transfer ne zaman basliyor? Transferi PC mi baslatiyor yoksa usb  cihazin yolla demesi yeterli mi?

Bu sorularin cevabini nasil nereden bulacagim?

Edit: Hep gozumun onundeki satirlari gormezlikten gelmisim. Umarim yeterli olur.

IN: The host will periodically poll the interrupt endpoint. This rate of polling is specified in the endpoint descriptor which is covered later. Each poll will involve the host sending an IN Token. If the IN token is corrupt, the function ignores the packet and continues monitoring the bus for new tokens.

If an interrupt has been queued by the device, the function will send a data packet containing data relevant to the interrupt when it receives the IN Token. Upon successful recept at the host, the host will return an ACK. However if the data is corrupted, the host will return no status. If on the other hand a interrupt condition was not present when the host polled the interrupt endpoint with an IN token, then the function signals this state by sending a NAK. If an error has occurred on this endpoint, a STALL is sent in reply to the IN token instead.

OUT: When the host wants to send the device interrupt data, it issues an OUT token followed by a data packet containing the interrupt data. If any part of the OUT token or data packet is corrupt then the function ignores the packet. If the function's endpoint buffer was empty and it has clocked the data into the endpoint buffer it issues an ACK informing the host it has successfully received the data. If the endpoint buffer is not empty due to processing of a previous packet, then the function returns an NAK. However if an error occurred with the endpoint consequently and its halt bit has been set, it returns a STALL.


Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: muhittin_kaplan - 01 Şubat 2011, 01:49:47
İşlerden Dolayı (Sınav Haftası) Pek Takip Edemiyor Cevap Yazamıyorum.
Jan Hanımın Kitabı Mevcut Oradan yardım etmeye bilgi alışverişinde bulunmaya çalışacağım..
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: t2 - 01 Şubat 2011, 08:25:12
interrupt transfer örneği
http://www.speedyshare.com/files/26614681/USBProject.zip

Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 02 Şubat 2011, 19:33:48
Interrupt transferinin PC den cihaza dogru olan tarafini basardim. JEDI komponentli PC programinda zaten bunun ornek kodunu yazmislar.
(write butonu)

Fakat cihazdan PC ye dogru olan transfer icin delpi kodlarda ornek yok. Dolayisi ile usb tarafinin kodlarini yazamiyorum.

JEDI de bunun icin hangi komut kullaniliyor?
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 10 Şubat 2011, 13:18:01
Componentin OnData eventi usb den data paketi geldiginde otomatik olarak tetikleniyor. Size sadece poniterin gosterdigi adreslerden datalari cekmek kaliyor.

Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: t2 - 10 Şubat 2011, 13:42:55
evet öyledir. burayı göstermek datayı memorystream'e atmak için ^ filan gerek.
Başlık: Ynt: Bos USB Descriptorlerinin icini yapilacak tasarima gore doldurmak
Gönderen: z - 18 Mart 2013, 02:21:08
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.