Bilgisayar STM32F4 USB HID aygıtımı Israrla Mouse olarak tanıyor.

Başlatan Klein, 12 Eylül 2015, 01:44:16

Klein

Konu başlığında özetledim.
STCube ile USB HID konfigürasyonu  oluşturdum. Fakat PC aygıtı ısrarla Mouse olarak tanıyor.
Protokol, subclass , PID , VID  değiştirmediğim ayar kalmadı.  Windows'u ilk kez bu kadar kararlı gördüm.

Aslında işimi engellemiyor ( ya da ben öyle sanıyorum) Ancak aygıtın mouse olarak görünmesi rahatsız edici.

Sorun hakkında fikri olan var mı?

z

HID Report descriptoru  görebilirmiyiz? (Class specific descriptor)

İçinde sayısal veriler yoksa işimize yaramaz yalnız. Sayısal değerlerini görmemiz lazım.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

/* USB Standard Device Descriptor */
__ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
  {
    0x12,                       /*bLength */
    USB_DESC_TYPE_DEVICE,       /*bDescriptorType*/
#if (USBD_LPM_ENABLED == 1)
    0x01,                       /*bcdUSB */ /* changed to USB version 2.01 
                                               in order to support LPM L1 suspend
                                               resume test of USBCV3.0*/
#else  
    0x00,                       /* bcdUSB */
#endif  
    0x02,
    0x00,                       /*bDeviceClass*/
    0x00,                       /*bDeviceSubClass*/
    0x00,                       /*bDeviceProtocol*/
    USB_MAX_EP0_SIZE,          /*bMaxPacketSize*/
    LOBYTE(USBD_VID),           /*idVendor*/
    HIBYTE(USBD_VID),           /*idVendor*/
    LOBYTE(USBD_PID_FS),           /*idVendor*/
    HIBYTE(USBD_PID_FS),           /*idVendor*/
    0x00,                       /*bcdDevice rel. 2.00*/
    0x02,
    USBD_IDX_MFC_STR,           /*Index of manufacturer  string*/
    USBD_IDX_PRODUCT_STR,       /*Index of product string*/
    USBD_IDX_SERIAL_STR,        /*Index of serial number string*/
    USBD_MAX_NUM_CONFIGURATION  /*bNumConfigurations*/
  } ; 
/* USB_DeviceDescriptor */
/* BOS descriptor */
#if (USBD_LPM_ENABLED == 1)
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
  #pragma data_alignment=4   
#endif
__ALIGN_BEGIN  uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
{
  0x5,
  USB_DESC_TYPE_BOS,
  0xC,
  0x0,
  0x1,  /* 1 device capability */
        /* device capability*/
  0x7,
  USB_DEVICE_CAPABITY_TYPE,
  0x2,
  0x2, /*LPM capability bit set */
  0x0,
  0x0,
  0x0
};
#endif


Device Descriptor burada.
Ayrıca bir de Report Descriptor  varsa onu da arayayım

z

Yok hocam bunlar değil.

HID Class-Specific Descriptor
Report Descriptor

Bide descriptorun elemanlarının sayısal değerleri lazım.

Mesela    USB_MAX_EP0_SIZE bize bir şey ifade etmiyor bunun yerine 64 gibi değerleri görmek lazım.

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

Klein

Yok hocam bulamadım. Zaten  zaten bir çoğu da ya ön tanımlı değer ya da başka fonksiyon tarafından döndürülen değerler.


mesaj birleştirme:: 12 Eylül 2015, 02:46:49


Bir de bunlar var. Eğer bunlardan birisi ise ve  orada değeri görünmeyenlerden önemli olanları söylerseniz  bulurum.
Subclass 1 Protocol 2(Mouse)  idi. Ben onları 0 olarak değiştirdim.
/* USB HID device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ]  __ALIGN_END =
{
  0x09, /* bLength: Configuration Descriptor size */
  USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
  USB_HID_CONFIG_DESC_SIZ,
  /* wTotalLength: Bytes returned */
  0x00,
  0x01,         /*bNumInterfaces: 1 interface*/
  0x01,         /*bConfigurationValue: Configuration value*/
  0x00,         /*iConfiguration: Index of string descriptor describing
  the configuration*/
  0xE0,         /*bmAttributes: bus powered and Support Remote Wake-up */
  0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/
  
  /************** Descriptor of Joystick Mouse interface ****************/
  /* 09 */
  0x09,         /*bLength: Interface Descriptor size*/
  USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/
  0x00,         /*bInterfaceNumber: Number of Interface*/
  0x00,         /*bAlternateSetting: Alternate setting*/
  0x01,         /*bNumEndpoints*/
  0x03,         /*bInterfaceClass: HID*/
  0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
  0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
  0,            /*iInterface: Index of string descriptor*/
  /******************** Descriptor of Joystick Mouse HID ********************/
  /* 18 */
  0x09,         /*bLength: HID Descriptor size*/
  HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
  0x11,         /*bcdHID: HID Class Spec release number*/
  0x01,
  0x00,         /*bCountryCode: Hardware target country*/
  0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/
  0x22,         /*bDescriptorType*/
  HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
  0x00,
  /******************** Descriptor of Mouse endpoint ********************/
  /* 27 */
  0x07,          /*bLength: Endpoint Descriptor size*/
  USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/
  
  HID_EPIN_ADDR,     /*bEndpointAddress: Endpoint Address (IN)*/
  0x03,          /*bmAttributes: Interrupt endpoint*/
  HID_EPIN_SIZE, /*wMaxPacketSize: 4 Byte max */
  0x00,
  HID_FS_BINTERVAL,          /*bInterval: Polling Interval (10 ms)*/
  /* 34 */
} ;

/* USB HID device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_HID_Desc[USB_HID_DESC_SIZ]  __ALIGN_END  =
{
  /* 18 */
  0x09,         /*bLength: HID Descriptor size*/
  HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
  0x11,         /*bcdHID: HID Class Spec release number*/
  0x01,
  0x00,         /*bCountryCode: Hardware target country*/
  0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/
  0x22,         /*bDescriptorType*/
  HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
  0x00,
};

/* USB Standard Device Descriptor */
__ALIGN_BEGIN static uint8_t USBD_HID_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC]  __ALIGN_END =
{
  USB_LEN_DEV_QUALIFIER_DESC,
  USB_DESC_TYPE_DEVICE_QUALIFIER,
  0x00,
  0x02,
  0x00,
  0x00,
  0x00,
  0x40,
  0x01,
  0x00,
};

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
{
  0x05,   0x01,
  0x09,   0x02,
  0xA1,   0x01,
  0x09,   0x01,
  
  0xA1,   0x00,
  0x05,   0x09,
  0x19,   0x01,
  0x29,   0x03,
  
  0x15,   0x00,
  0x25,   0x01,
  0x95,   0x03,
  0x75,   0x01,
  
  0x81,   0x02,
  0x95,   0x01,
  0x75,   0x05,
  0x81,   0x01,
  
  0x05,   0x01,
  0x09,   0x30,
  0x09,   0x31,
  0x09,   0x38,
  
  0x15,   0x81,
  0x25,   0x7F,
  0x75,   0x08,
  0x95,   0x03,
  
  0x81,   0x06,
  0xC0,   0x09,
  0x3c,   0x05,
  0xff,   0x09,
  
  0x01,   0x15,
  0x00,   0x25,
  0x01,   0x75,
  0x01,   0x95,
  
  0x02,   0xb1,
  0x22,   0x75,
  0x06,   0x95,
  0x01,   0xb1,
  
  0x01,   0xc0
};

z

Hocam bu descriptörlerin her yerinde cihazın mouse olduğuna dair açıklamalar var zaten.

Bu descriptorlerle olmaz bu iş.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fatih6761

@Klein hocam initialization code'u CubeMX programıyla hazırlarsanız orada USB modu olarak Custom HID var.
Sanırım aradığınzı bu özellik. Tabi program son sürüm HAL'a uygun kod üreteceğinden mevcut kodunuza port etmek ne kadar mümkün olur ya da sıfırdan yazılabilecek bir şey mi o kısım size kalmış.

Klein

Zaten CubeMx ile ürettim.
Custom hid yaptığımda Oluyor.  Fakat bu sefer de  CPP Builder'de kullandığım  jVHid  komponenti aygıtı HID aygıt olarak tanımıyor.

@z
Evet hocam mouse diyor. Zaten öyle de davranıyor.  Protokolü değiştirince Mouse olmaktan çıkacağını düşünmüştüm.

Hazır kodlarla bu USB işi yürümeyecek gibi. Ya USB'den vazgeçeceğim ya da ciddi zaman ayırıp USB konusunu sıfırdan öğreneceğim. Karar veremedim.

Karamel

hocam ogrenmek her zaman iyidir. ::) ogrenmeyi secin  :P

mesaj birleştirme:: 12 Eylül 2015, 04:11:52

birde hocam. artik bilgisayarlarda serial port yok. (gerci ben kendimi bildim bileli yok). usb var. gerci oda artik 3.0 3.1 seklinde gelisiyor.

microcontrollerin usb unit i cok az islem gucu harciyarak iletisim kurabiliyor. diyelim ki usb den vazgectik. pc tarafina. yada microcontroller tarafina neler yapacagiz?

Klein

Ethernet USB'den daha kolay görünüyor gözüme.
Ethernet, TCP, IP vs..  dokümanını okuyunca Ne olduğunu anlayabiliorum. Ama USB'yi  kavrayamadım gitti.
Adam dokümanda yazıyor.
Protokol 1 ise Keyboard 2 ise mouse 0 ise  özel.  Ama protokolü değiştiriyorsun alet halen kendisini mouse zannediyor.
Protokol değişince bazı ayarlaruın da değişmesi gerekebilir. bunu anlarım.  eğer ben protokolü değiştirdiğim halde gerekli diğer ayarları yapmazsam hiç çalışma anlarım. Saçma sapan şeyler yap anlarım.  Ama protokol baytı bu işe yarar deyip  değiştirdiğim halde halen kendini mouse zannediyorsan, bunu anlayamam.

t2

Protokol 1 ise Keyboard 2 ise mouse 0 ise  özel

Sadece bunlar degismiyor. Device spesific descriptor. Gibi bir bölüm var. Mause,keyboard onu kullanıyor fakat custom HID olunca kullanılmıyor.

fatih6761

Alıntı yapılan: Karamel - 12 Eylül 2015, 04:08:23
hocam ogrenmek her zaman iyidir. ::) ogrenmeyi secin  :P

mesaj birleştirme:: 12 Eylül 2015, 04:11:52

birde hocam. artik bilgisayarlarda serial port yok. (gerci ben kendimi bildim bileli yok). usb var. gerci oda artik 3.0 3.1 seklinde gelisiyor.

microcontrollerin usb unit i cok az islem gucu harciyarak iletisim kurabiliyor. diyelim ki usb den vazgectik. pc tarafina. yada microcontroller tarafina neler yapacagiz?
@Klein hocam CustomHID ile MOUSE HID descriptor'larını karşılaştırsak bir şey çıkar mı acaba?

muhittin_kaplan

hocam bu usb başa bela bence, hadi mcu tarafını hallttin bundada pc tarafı su koyuyor

Klein

@fatih6761  Karşılaştırmayı denedim. Ama içinden çıkılabilecek gibi değil.
ST_CUBE ile yapmaktan vazgeçtim. Keil'in STM32F103 örneğini F405'e uyarlayacağım. imdilik en kısa yol bu gibi görünüyor.

ErsinErce

protokol ü 0 yaptığınızda descriptor ağır basıyor ve tanımlamalara bakıyor, hid descriptor ü iyi incelemeniz lazım
tanımlamalarda hala ekran yüzeyine koordinat gönderimi yapıyorsanız mouse olarak görmesi çok normal

http://eleccelerator.com/tutorial-about-usb-hid-report-descriptors/ burada çok güzel tek tek açıklanmış