STM32F4 ile Klavye

Başlatan ArifAhmet, 16 Eylül 2014, 16:46:59

ArifAhmet

Merhabalar,
Stm32F4 ile klavye benzeri bişey yapmak istiyorum. Fakat klavyelerin çalışma mantığı hakkında pek bilgim yok. Verileri nasıl göndermem gerekiyor, nasıl bir yol izlemem gerekiyor.
İyi çalışmalar.
Yaşasın Open Source!

diot


ArifAhmet

Ben bu kiti mikroC kullanarak USB üzerinden klavye olarak tanıtamazmıyım?
Çok dikkatli incelemedim ama galiba burada PS2 üzerinden anlatıyor. Ben USB üzerinden yapmak istiyorum.
Yaşasın Open Source!


LukeSkywalker

Libstock.com adresine bakin aradiginizi bulacaksiniz.

ArifAhmet

Hocam orada klavyeyi okuma ile ilgili örnekler var fakat ben bu kiti klavye olarak kullanmak istiyorum. Örneğin butona basılınca  bilgisayar ekranına "A" yazsın. Bunun hakkında hiç örnek görmedim.
Yaşasın Open Source!

muhittin_kaplan



LukeSkywalker


minicihazlar

USB kütüphanesi içerisindeki örnekler arasında HID var, ordaki genel bir HID rapor yapısı ama birkaç değişiklikle klavye olarak çalışabilir.

muhittin_kaplan


minicihazlar

Benim CC2500 ve STM32F103 ile yaptığım ve presentasyonlarda kullandığım usb klavye'yi emüle edip yukarı veya aşağı butonuna basılmış gibi (uzaktan kumanda da hangisine basılırsa) PC'ye bilgi geçen kod var ama buraya nasıl yükleyeceğimi bulamadım, nasıl olacağı hakkında bilgi verirseniz yükleyeyim.

muhittin_kaplan

Hocam Programı Yüklemek için herhangi bir Host u kullanabilirsiniz,
4shared vb gibi.
ama kod yüklemek için yanıtla penceresinin üstündeki diez (sharp) yada "[" code" ]"  "["/code"]" blok arasını kullanabiirsiniz.

ama benim sormak istediğim şuydu, descriptionlarda nereleri değiştirirsek Klavye Yapabiliriz.

LukeSkywalker

Muhittin hocam, benim gönderdiğim kod içerisindeki USBDSC. C içerisindeki kod ile mikroc2nin kendi ürettiği kodu karşılaştırırsanız farklılıkları görebilirsiniz.

minicihazlar

En önemlisi report descriptor'u, benim ki şu şekilde:

const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
{
#if 0
  0x05, 0x01,         // Usage Page (Generic Desktop),
  0x09, 0x06,         // Usage (Keyboard),
  0xA1, 0x01,         // Collection (Application),
  0x05, 0x07,         //   Usage Page (Key Codes),
  0x19, 0x00,         //   Usage Minimum (0),
  0x29, 0x65,         //   Usage Maximum (101),
  0x75, 0x08,         //   Report Size (8),
  0x95, 0x01,         //   Report Count (1),
  0x15, 0x00,         //   Logical Minimum (0),
  0x25, 0x65,         //   Logical Maximum (101),
  0x81, 0x02,         //   Input (Data, Variable, Absolute), ;Modifier byte
  0xC0                // End Collection
#else
  0x05, 0x01,         // Usage Page (Generic Desktop),
  0x09, 0x06,         // Usage (Keyboard),
  0xA1, 0x01,         // Collection (Application),
  0x05, 0x07,         //   Usage Page (Key Codes);
  0x19, 0xE0,         //   Usage Minimum (224),
  0x29, 0xE7,         //   Usage Maximum (231),
  0x15, 0x00,         //   Logical Minimum (0),
  0x25, 0x01,         //   Logical Maximum (1),
  0x75, 0x01,         //   Report Size (1),
  0x95, 0x08,         //   Report Count (8),
  0x81, 0x02,         //   Input (Data, Variable, Absolute),   ;Modifier byte
  0x95, 0x01,         //   Report Count (1),
  0x75, 0x08,         //   Report Size (8),
  0x81, 0x01,         //   Input (Constant),    ;Reserved byte
  0x95, 0x06,         //   Report Count (6),
  0x75, 0x08,         //   Report Size (8),
  0x15, 0x00,         //   Logical Minimum (0),
  0x25, 0x65,         //   Logical Maximum(101),
  0x05, 0x07,         //   Usage Page (Key Codes),
  0x19, 0x00,         //   Usage Minimum (0),
  0x29, 0x65,         //   Usage Maximum (101),
  0x81, 0x00,         //   Input (Data, Array),    ;Key arrays (6 bytes)
  0xC0// End Collection
#endif
};


Burda her seferinde 8 byte'lık veri gidiyor PC'ye. İlki modifier byte diye yukarda belirtildi, bu shift vb tuşlara basılıp basılmadığını belirtiyor ve her bir bitin anlamı farklı. Sonraki byte önemsiz. Daha sonra ise 6 byte halinde o anda basılı olan tuşların scan kodu gidiyor. Genelde mantıklı olan bir tane tuş göndermek. Burda dikkat edilmesi gereken bir kere bu PC'ye gittikten sonra bunu sıfırlayıp tekrar göndermek, yoksa PC sürekli aynı karakteri basmaya devam ediyor. Diğer bir konu ise beni baya uğraştırmıştı. O da tuşların bildiğimiz ascii kodunu değil de scan kodunu göndermek gerektiği. Ben ascii kodu gönderiyordum ve pc birşey algılamıyordu, Bir döngü içinde tüm ascii kodları gönderince scan kodları ile çakışanlardan dolayı bazı karakterler görünce uyandım.

Neyse, şu istenen tuşun gönderilip gönderilmediğini o endpoint'in callback'i ile bir global değişken set ederek anlıyorum. Yani:

extern volatile uint32_t transfercompleted;

void EP1_IN_Callback(void)
{
  transfercompleted = 1;
}


Gönderim kısmıda şu şekilde:

  while(1)
  {    
    memset(buf, 0, sizeof(buf));
    len = sizeof(buf);
    if(CC2500_ReceivePacket(buf, &len) != 0)
    {
      GPIO_ResetBits(GPIOA, LED_GREEN);          
      if((transfercompleted) && (bDeviceState == CONFIGURED))
      {
        KeyBufferAll[2] = buf[0];
        USB_SIL_Write(EP1_IN, (uint8_t *)KeyBufferAll, 8);
        transfercompleted = 0;        
        SetEPTxValid(ENDP1);
        while(transfercompleted == 0);
        KeyBufferAll[2] = 0;
        USB_SIL_Write(EP1_IN, (uint8_t *)KeyBufferAll, 8);
        transfercompleted = 0;        
        SetEPTxValid(ENDP1);
        while(transfercompleted == 0);        
      }    
      GPIO_SetBits(GPIOA, LED_GREEN);      
    }  
  } 


Diğer bir nokta ben usb cihazın suspend gibi power management özelliklerini kapattım, bunları da eklemek beni için gereksizde. Bunlar açılabilir.

Son olarak kodu yüklemek için gerekli sitelere şirket ağından bağlanamıyorum, akşam fırsat olunca yüklemeye çalışırım.