JEDI HidCtl de HidCtlDeviceData eventi hakkinda

Başlatan z, 06 Haziran 2012, 02:13:11

t2

#15
Cihaz tarafındaki işler için yardımcı olmaz.  Sadece pc tarafındaki işi yapıyor. HID aygıtın normal çalıştığı varsayılıyor.

z

#16
@t2

Sorunumu cozeceginden emin olsan dusunmeden komponenti alacagim.

Sorunumun ne oldugunu tam bilmiyorum. Belki de usb cihazin yaziliminda hata yada eksigim var.

PC tarafindaki yazilim, usb cihazimin sokulup takildigini, pid, vid degerini, seri nosunu vs vs zaten okuyabiliyor.

Su anki yapiyi ozetleyecek olursam

1. PC  Set report komutu ve bu komuta ait 64 byte veriyi pipe0 uzerinden karta gonderebiliyor.
2. Kart, Set report komutunu alinca pipe0 uzerinden bu 64 byte datayi aliyor.
3. Set report komutu aldigi icin kendi tarafindaki 64 byte veriyi PC'ye pipe 1 uzerinden gonderiyor. Boylece 64 bytelik veri degisdokusu yapabiliyorum.
4. PC Get report fonksiyonu cagirarak  bu datayi aliyor. (Burada beceremedigim kisim yazilimin bu veriyi event ile yakalamasi)

Ancak burada sorun, PC data geldimi gelmedimi diye bir fonksiyonu cagirmasi gerekiyor.

Ayrica istersek;

1. PC, 64 bytelik veriyi yukaridaki akistan farkli olarak Pipe1 uzerinden sorguz sualsiz karta gonderebiliyor.
2. Kart bu gelen 64 byte veriyi okuyup kullanabiliyor. Fakat PC ye bir geri bildirimde bulunmuyor.

Belki de akista bir hata yapiyorum. PC ile kart arasindaki haberlesme boyle olmamali. Neden dersen.

Mesela bu yapida klavye yapmaya kalksam, PCdeki yazilim,  set report komutu yollayip varsa basili tusu karttak istemek zorunda. Bu da bir seylerin yanlis oldugunu soyluyor.
Halbuki kart uzerindeki bir tusa basilinca PC deki yazilim event ile uyarilmali ve veriyi okumali.

Dolayisi ile sizden bahsettiginiz komponenti almis olmam isi cozmeyecek gibi. Eger cozerse alayim.

Umarim sorunumu anlatabilmisimdir. Tekrar dile getireyim. Kart tarafindaki usb yazilimi gelistirirken usb protokolun gereklerinden bazilarini atlamis olabilirim.

Mesela kart tarafinda Clear Feature komutuna iliskin kodlari da yazdim ancak PC den boyle bir komut gondermeyi bilmiyorum.

Bu arada report descriptor asagida ve bunu da gecen sene sen vermistin.

ReportDesc

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

z

Tahhminim dogru cikti. Set feature clear feature ile alakali imis.

JEDI ornekleri report uzerine kurulu. Report yerine Feature kullanildiginda on data event harekete geciyormus.

http://forums.obdev.at/viewtopic.php?f=8&t=2190

Her ihtimale karsi kodu buraya kopyaliyorum.

...
  private
    { Private-Deklarationen }
    dev: TJvHidDevice;
...
const
    USB_BUFFER_SIZE = 8;
...
type
  TLCD = packed record
    ID: byte;
    text: array[0..USB_BUFFER_SIZE-1] of char;
  end;
...
procedure TForm1.log(s: string);
begin
  ListBox1.ItemIndex := ListBox1.Items.Add(s);
end;
...
procedure TForm1.HIDCtlDeviceChange(Sender: TObject);
var
  x: integer;
  s: string;
begin
  with hidCtl do begin
    // check if owned device was plugged out
    if Assigned(Dev) and not Dev.IsPluggedIn then begin
      // give back device
      s := dev.ProductName;
      CheckIn(Dev);
      log(s + ' disconnected');
      dev := nil;
    end;
    // no device connected
    if not Assigned(Dev) then
      // take over device
      if CheckOutByID(Dev, $16C0, $05DF) then begin
        log(dev.ProductName + ' connected');
      end;
  end;
end;
...
procedure TForm1.Button1Click(Sender: TObject);
var
rep:TLCD;

begin
  if assigned(dev) then begin
    rep.id:=0;
    strpcopy(rep.text,'Hallo');
    dev.setOutputReport(rep,sizeOf(rep));
  end;
end;
...
procedure TForm1.HIDCtlDeviceData(HidDev: TJvHidDevice; ReportID: Byte;
  const Data: Pointer; Size: Word);
var
  buffer: array[0..100] of char;
  I: integer;
  s:string;
begin
     Move(Data^, buffer[0], Size);
     s:='';
     for i:=0 to size-1 do s:=s+', '+intToStr(ord(buffer[i]));
     log(s); 
end;


Denemesi yarina kaldi.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Sorunun kaynagi belli oldu.

http://www.usblyzer.com/download.htm den indirdigim usblyzer programi ile PC ile usb cihazim arasinda giden paketleri inceledigimde tum paketlerin control transfer altinda yapildigini gordum. Interrupt transfer ile sadece PC den cihaza aktarim var. Tersine usb cihazdan pc ye interrupt transferi yapilmiyor.

Yani usb cihazimda kodlarim eksik.



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

z

Veri aktariminda kullandigimiz 64 bytelik bufferlarla 64 byte data mi yoksa ID byte + 63 Data Byte mi yolluyoruz?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

bufferı kaç byte'a ayarladıysanız her transferinizde tam olarak gönderiliyor hocam, tanımlamalar 1 byte dan fazla tutuyor zaten

http://www.usbmadesimple.co.uk/ums_5.htm

z

Merak ettigim konu gonderilmesi gereken 64 byte verim olsun. Isin icine ID No da giriyorsa toplam 65 byte oluyor. Halbuki HID de data boyu max 64 byte olabiliyor.
Bu durumda data sayimi 63 de sinirlamalimiyim?

Kafam, buldugum HID descriptor orneklerinden birinde report size i 63 olarak ayarladigi icin karisti. Amaci 63 Data + 1 ID=64 byte mi ?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

HID içinde birden fazla tanımlama(Klavye + mouse vs) mevcutsa belki olabilir hocam
ama burada 4 byte tanımlanmış bir sistemin veri alış verişine baktığınızda sabit 4 byte gönderildiği görülüyor

incelediğiniz örnekte kaç tanımlama mevcut?

z

O ornegi alip uzerinde oynadim orjinal ornek neredededir bilmiyorum.

Su anda kullandigim HID Descriptor;

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, 0x01          ;//   REPORT_SIZE (8 Bits)
;          DCB    0x75, 0x08          ;//   REPORT_SIZE (8 Bits)
          DCB    0x85, 0x01          ; Report ID = 1
          DCB    0x95, 0x40          ;//   REPORT_COUNT (8  8 Bits, 8 Bytes)
;          DCB    0x95, 0x3F          ;//   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

3F tanimladigimda sorunsuz calisan programim 40 tanimlayinca Set report da hata vermeye basladi.  Bunu sorunu duzeltmek icin PC tarafindaki yazilima mudahale etmem gerekecek. Fazla oylanmamak adina sormak istedim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

http://www.cygnal.org/ubb/Forum9/HTML/001726.html

konunun benzerini burada da buldum hocam
eğer tek seferde 64 bytedan fazla aktarım söz konusu ise report id hid bloklarını birleştirmek için kullanılıyor
burada tek seferde 64 byte gönderdiğinizden report id kullanmanıza gerek yok hocam

t2

REPORT_SIZE 8,  (8bit)
REPORT_COUNT  64 olarak ayarlanır. (64 bayt. )

pc tarafına 65 byt gider. ilk bayt report ID  dir . 0'dan başlar.

z

T2 iste bu kafami karistiriyor. HID de max buf size 64 byte alabilirken report id de 1 byte olduguna gore nasil 64 byte data daha yollayabiliriz? Toplami 65 oluyor ve donanim buffer uzunlugunu asiyor.

Ote yandan ErsinErce'nin verdigi linkteki descriptorde    0x95, HID_IN_REPORT_SIZE - 1,
de HID_IN_REPORT_SIZE - 1     40H-1=3F yukaridaki 40H, 3FH karmasasinda kafamin bosyere karismadigini soyluyor.


-----------

Ayrica;

0x75, 0x08 Report size da verilerin 8 bit yani 1 bye oldugunu soyluyor diyoruz.

Bunu Usb Complete kitabinda

Two Global items describe the size and format of the report data.
Report Size  specifies the size in bits of a field in an Input, Output, or Feature
item. Each field contains one piece of data.
Report Count  specifies how many fields an Input, Output, or Feature item
contains.

For example, if a report has two 8-bit fields, Report Size is 08h and Report
Count is 02h. If a report has one 16-bit field, Report Size is 10h and Report
Count is 01h.
A single Input, Output, or Feature report  can contain multiple items, each with
its own Report Size and Report Count.


Satirlari da dogruluyor. Lakin ayni kitabin 296. sayfasinda

The HID specification defines two report item types: short items and long
items. As of HID 1.11, there are no defined Long items.
A Short item's 1-byte prefix specifies the item type, item tag, and item size.
These are the elements that make up the prefix byte:

1..0 Item size Number of bytes in the item
3..2 Item type Item scope: Main, Global, or Local
7..4 Item tag Item function

The item size specifies how many data bytes the item contains. Note that an
item size of 11
b
 corresponds to 4 data bytes (not 3):
The item type specifies the scope of th e item: Main (00), Global (01), or Local
(10). This chapter has more information about these item types.
The item tag specifies the item's function.

item size / Number of data bytes
00 /0 
01 /1
10 /2
11 /4
da kafami karistirdi.

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

t2

#27
Ben bufferi 64 bayt ayarlıyorum report count 64  report size 8 pcye 65 bayt gidiyor. önceki verdiğimprogramda görebilirsin. 65 bayt geldi diyor. yani buffersize+1 oluyor.

buffersize 64, report count 64 , report size 8 olacak. çalışıyor

hiç de kafamkarışmadı. çünkü neden böyle olduğunu anlamadım, lazım olmadı. adam yapmış yayınlamış ne kurcalayacam. çin atasözü, çalışıyorsa kurcalama demiş

FAkat bazı programlar Report ID yi ayıklıyor. 65 bayt değil de sana 64 bayt veriyor. ilk baytı ayrı parametre ile veriyor. galiba jedi o şekilde oluyordu.

z

Kurcalamak zorundayim.

Simdi 65 byte geldi mesajini sen verdiriyorsun.

Soyle bir durum da olabilir.

PC tarafinda bufferlari 65 byte aciyoruz. 0. terime reportd ID degerini yukluyoruz. Geri kalana da datalarimizi.
PC yazilimi (JEDI) 0.degeri alip setup pakette bir yere yaziyor olabilir. Geri kalan 64 bytei da usb fifoya yaziyordur.

Bu set report da 65 byte veri aktarimini aciklar. Cunku  setup paket ve data paket ayri ayri geliyor. Fakat get reportta ve interrupt transfer de setup paket olmadigina gore
65 byte gidemez.

Gordugun gibi kafam 4 bir yandan karismis durumda.

Senin tuzun kuru cunku device yazilimini hazir librraryden kullaniyorsun.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

65 bayt mesajını ben verdieriyorum ama pencereye 65 bayt yazıyor belki senin cihaz böyle çalışmamıştır. ilk bayt 0 oluyor. bu report ID imiş. başka reportlar olsa 1, 2... de olabilecek gibi.

Daha önceki senelerde bu senin çipin HID örneği yoktu. belkişimdi yapmışlardır. bir bak istersen.