STM32 USB Isochronous transfer sorunu

Başlatan volkii, 17 Eylül 2011, 22:57:45

volkii

herkese merhaba,

izokron transfer yöntemi ile haberleşmeye çalışıyorum ama ne yaptıysam olmadı. keilin hid kütüphanesi üzerinden ilerlemeye çalışıyorum. interrup transferle mximum 64 byte haberleşebiliyorum ama bu bana pek yeterli gelmedi, özellikle hız açısından. stm32 üzerinede örnek bulmak zor nette.

usb descriptor aşağıdadır. endpoint desc. kısmında endpoint1'i izokron tanımlıyorum ve programın diğer kısımlarındada bazı değişiklikler yapıyorum ama buna rağmen halen daha endpoint0 üzerinden data geliyor. iki endpoint tanımladım in ve out için ama oda olmadı. birde merak ettiğim izokronda en az 2 enpoint mi tanımlamak gerekiyor? çünkü interrup transferde 1 endpoint in olarak tanımlamak yetiyor. out işlemleri endpoint0 üzerinden gerçekleştiriliyor. sorularım saçma olabilir usb üzerinde yani sayılırım mazur görün. yardımlarınız bekliyorum.


#include "type.h"

#include "usb.h"
#include "usbcfg.h"
#include "usbdesc.h"

#include "hid.h"

/*------------------------------------------------------------------------------
  HID Report Descriptor
 *------------------------------------------------------------------------------*/

/*   Bit    Input       Output
      0      S2          LED0
      1      S3          LED1
      2     ---          LED2
      3     ---          LED3
      4     ---          LED4
      5     ---          LED5
      6     ---          LED6
      7     ---          LED7
*/

#define HID_INPUT_REPORT_BYTES       4              /* size of report in Bytes */
#define HID_OUTPUT_REPORT_BYTES      4              /* size of report in Bytes */
#define HID_FEATURE_REPORT_BYTES     4              /* size of report in Bytes */

const U8 HID_ReportDescriptor[] = {
  HID_UsagePageVendor( 0x00                     ),
  HID_Usage          ( 0x01                     ),
  HID_Collection     ( HID_Application          ),
    HID_LogicalMin   ( 0                        ),  // value range: 0 - 0xFF 
    HID_LogicalMaxS  ( 0xFF                     ),
    HID_ReportSize   ( 8                       ),  // 8 bits 
    HID_ReportCount  ( HID_INPUT_REPORT_BYTES   ),
    HID_Usage        ( 0x01                     ),
    HID_Input        ( HID_Data | HID_Variable | HID_Absolute ),
    HID_ReportCount  ( HID_OUTPUT_REPORT_BYTES  ),
    HID_Usage        ( 0x01                     ),
    HID_Output       ( HID_Data | HID_Variable | HID_Absolute ),
    HID_ReportCount  ( HID_FEATURE_REPORT_BYTES ),
    HID_Usage        ( 0x01                     ),
    HID_Feature      ( HID_Data | HID_Variable | HID_Absolute ),
  HID_EndCollection,
}; 

const U16 HID_ReportDescSize = sizeof(HID_ReportDescriptor);


/* USB Standard Device Descriptor */
const U8 USB_DeviceDescriptor[] = {
  USB_DEVICE_DESC_SIZE,              /* bLength */
  USB_DEVICE_DESCRIPTOR_TYPE,        /* bDescriptorType */
  WBVAL(0x0200), /* 2.00 */          /* bcdUSB */
  0x00,                              /* bDeviceClass */
  0x00,                              /* bDeviceSubClass */
  0x00,                              /* bDeviceProtocol */
  USB_MAX_PACKET0,                   /* bMaxPacketSize0 */
  WBVAL(0x1e2c) /*(0xC251)*/,                     /* idVendor */
  WBVAL(0x7d8) /*(0x2001)*/,                     /* idProduct */
  WBVAL(0x0100), /* 1.00 */          /* bcdDevice */
  0x01,                              /* iManufacturer */
  0x02,                              /* iProduct */
  0x03,                              /* iSerialNumber */
  0x01                               /* bNumConfigurations: one possible configuration*/
};

/* USB Configuration Descriptor */
/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor) */
const U8 USB_ConfigDescriptor[] = {
/* Configuration 1 */
  USB_CONFIGUARTION_DESC_SIZE,       /* bLength */
  USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */
  WBVAL(                             /* wTotalLength */
    USB_CONFIGUARTION_DESC_SIZE +
    USB_INTERFACE_DESC_SIZE     +
    HID_DESC_SIZE               +
    USB_ENDPOINT_DESC_SIZE
  ),
  0x01,                              /* bNumInterfaces */
  0x01,                              /* bConfigurationValue: 0x01 is used to select this configuration */
  0x00,                              /* iConfiguration: no string to describe this configuration */
  USB_CONFIG_BUS_POWERED /*|*/       /* bmAttributes */
/*USB_CONFIG_REMOTE_WAKEUP*/,
  USB_CONFIG_POWER_MA(100),          /* bMaxPower, device power consumption is 100 mA */

/* Interface 0, Alternate Setting 0, HID Class */
  USB_INTERFACE_DESC_SIZE,           /* bLength */
  USB_INTERFACE_DESCRIPTOR_TYPE,     /* bDescriptorType */
  0x00,                              /* bInterfaceNumber */
  0x00,                              /* bAlternateSetting */
  0x01,                              /* bNumEndpoints */
  USB_DEVICE_CLASS_HUMAN_INTERFACE,  /* bInterfaceClass */
  HID_SUBCLASS_NONE,                 /* bInterfaceSubClass */
  HID_PROTOCOL_NONE,                 /* bInterfaceProtocol */
  0x04,                              /* iInterface */
/* HID Class Descriptor */
/* HID_DESC_OFFSET = 0x0012 */
  HID_DESC_SIZE,                     /* bLength */
  HID_HID_DESCRIPTOR_TYPE,           /* bDescriptorType */
  WBVAL(0x0100), /* 1.00 */          /* bcdHID */
  0x00,                              /* bCountryCode */
  0x01,                              /* bNumDescriptors */
  HID_REPORT_DESCRIPTOR_TYPE,        /* bDescriptorType */
  WBVAL(HID_REPORT_DESC_SIZE),       /* wDescriptorLength */
/* Endpoint, HID Interrupt In */
  USB_ENDPOINT_DESC_SIZE,            /* bLength */
  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType */
  USB_ENDPOINT_IN(1),                /* bEndpointAddress */
  USB_ENDPOINT_TYPE_INTERRUPT,       /* bmAttributes */
  WBVAL(0x0004),                     /* wMaxPacketSize */
  0x01,          /* 32ms */          /* bInterval */
/* Terminator */
  0                                  /* bLength */
};

t2


  • Hangi çipi kullanırsan kullan HID interface ile Isochronous transfer yapamazsın.
  • Aygıt HID + Başka bir interface  içeriyorsa bu başka interface Isochronous transfer yapabilir.
  • Isochronous transfer  için sürücü yüklemen ya da işletim sisteminde gömülü hazır sürücülerden kullanman gerek

volkii

haklısın t2 bende şimdi gördüm. cevabın için teşekkür ederim. ozaman ilk önce benim uygun bir driver bulmam lazım pc arayüz için. veya nasıl bir yol izlemeliyim?

t2

#3
Varsa CDC örneğini modifiye ederek veya aynen kullanarak BULK transfer yapabilirsin. CDC için Windows sürücü, inf dosyadan ibarettir.  Bunu da vermişlerdir aynen kullanabilirsin.

CDC dışında "uygun bir driver bulmak" kolay bir şey değildir.   BULK için Libusb gibi Winusb  gibi bazı bedava sürücüler kulllanılaibilir. Isoc. sadece Winusb  destekliyor olabilir.

volkii

CDC bizim bildiğimiz usb to rs232 bridgelerde kullanılan yöntem değil midir? bunun usb hızını öldürdüğünü okumuştum bir yerde. benim yapmaya çalıştığım aslında tftde video oynatmak. ADC diye bir driver duydum ama detaylarını bilmiyorum açıkcası. CDC'yi inceliyorum hocam şimdi.