NRF52833 USB HID KEYBOARD

HI Q&A

typedef struct {
      uint8_t mods;
      uint8_t reserved;
      uint8_t keys[KEYBOARD_REPORT_KEYS];
}report_keyboard_t;

report_keyboard_t  key_report={0};

#define HID_KBD_INTERFACE 0
#define HID_MOUSE_INTERFACE 1
#define HID_EXTRA_INTERFACE 2

void hid_kbd_user_ev_handler(app_usbd_class_inst_t const *p_inst, app_usbd_hid_user_event_t event);

static const app_usbd_hid_subclass_desc_t *keyboard_hid_report_desc[] = {&kbd_desc};


 APP_USBD_HID_GENERIC_GLOBAL_DEF(m_app_hid_kbd,
                                                                        HID_KBD_INTERFACE,
                                                                        hid_kbd_user_ev_handler,
                                                                        (NRF_DRV_USBD_EPIN1),
                                                                        keyboard_hid_report_desc,
                                                                        5,
                                                                        1,
                                                                        0,
                                                                        APP_USBD_HID_SUBCLASS_BOOT,
                                                                       APP_USBD_HID_PROTO_KEYBOARD);

#define APP_USBD_HID_KBD_REPORT_DSC() \
{ \
0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ \
0x09, 0x06, /* USAGE (Keyboard)  */ \
0xa1, 0x01, /* COLLECTION (Application) */ \
0x05, 0x07, /* USAGE_PAGE (Keyboard) */ \
0x19, 0xe0, /* USAGE_MINIMUM (Keyboard LeftControl) */ \
0x29, 0xe7, /* USAGE_MAXIMUM (Keyboard Right GUI)  */ \
0x15, 0x00, /* LOGICAL_MINIMUM (0) */ \
0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ \
0x75, 0x01, /* REPORT_SIZE (1)  1bit */ \
0x95, 0x08, /* REPORT_COUNT (8)  */ \
0x81, 0x02, /* INPUT (Data,Var,Abs)  */ \
0x95, 0x01, /* REPORT_COUNT (1) */ \
0x75, 0x08, /* REPORT_SIZE (8) */ \
0x81, 0x03, /* INPUT (Cnst,Var,Abs) */ \
0x95, 0x05, /* REPORT_COUNT (5) */ \
0x75, 0x01, /* REPORT_SIZE (1) */ \
0x05, 0x08, /* USAGE_PAGE (LEDs) */ \
0x19, 0x01, /* USAGE_MINIMUM (Num Lock) */ \
0x29, 0x05, /* USAGE_MAXIMUM (Kana) */ \
0x91, 0x02, /* OUTPUT (Data,Var,Abs) */ \
0x95, 0x01, /* REPORT_COUNT (1) */ \
0x75, 0x03, /* REPORT_SIZE (3) */ \
0x91, 0x03, /* OUTPUT (Cnst,Var,Abs) */ \
0x95, 0x06, /* REPORT_COUNT (6) */ \
0x75, 0x08, /* REPORT_SIZE (8) */ \
0x15, 0x00, /* LOGICAL_MINIMUM (0) */ \
0x25, 0x65, /* LOGICAL_MAXIMUM (101) */ \
0x05, 0x07, /* USAGE_PAGE (Keyboard) */ \
0x19, 0x00, /* USAGE_MINIMUM (Reserved (no event indicated))*/ \
0x29, 0x65, /* USAGE_MAXIMUM (Keyboard Application) */ \
0x81, 0x00, /* INPUT (Data,Ary,Abs) */ \
0xc0 /* END_COLLECTION */ \
}

APP_USBD_HID_GENERIC_SUBCLASS_REPORT_DESC(kbd_desc, APP_USBD_HID_KBD_REPORT_DSC());

I store the received keystroke data into key_report.keys[];

                                    via usb_kbd_keys_send(&key_report);

                                    call app_usbd_hid_generic_in_report_set(&m_app_hid_kbd,report,sizeof(report)); 

The key value in key_report.keys[] is correct every time.

Pressing any key sometimes shows '3' or 'E', which is confusing to me.

Parents Reply Children
  • Hi Hieu

      thanks for your reply!

    APP_USBD_CLASS_TYPEDEF(app_usbd_hid_generic, \
    APP_USBD_HID_GENERIC_CONFIG(0, (NRF_DRV_USBD_EPIN1, NRF_DRV_USBD_EPOUT1)), \
    APP_USBD_HID_GENERIC_INSTANCE_SPECIFIC_DEC, \
    APP_USBD_HID_GENERIC_DATA_SPECIFIC_DEC \
    );

    void usb_kbd_keys_send(report_keyboard_t *report)  
    {
        ret_code_t err_code;
    
        if (!NRF_USBD->ENABLE)
        {
            return;
        }
        if (!usb_started){
            return;
        }
    
        if(!kbd_report_queue_is_empty())
        {
            NRF_LOG_INFO("usb buffer in");
            memcpy(kbd_report_queue[kbd_report_queue_wp], report, KEYBOARD_REPORT_SIZE);
            kbd_report_queue_wp++;
            kbd_report_queue_wp %= KBD_REP_QUEUE_LEN;
            kbd_key_buffer_send();
            return;
        }
        if (m_report_pending)
        {
            NRF_LOG_INFO("usb buffer in");
            memcpy(kbd_report_queue[kbd_report_queue_wp], report, KEYBOARD_REPORT_SIZE);
            kbd_report_queue_wp++;
            kbd_report_queue_wp %= KBD_REP_QUEUE_LEN;
        }
        else
        {         
             
            err_code =app_usbd_hid_generic_in_report_set(    //app_usbd_hid_generic_in_report_set
                   &m_app_hid_kbd,
                   report,
                   sizeof(*report)); 
                     
            if(err_code == NRF_SUCCESS)
                m_report_pending = true;  
    
            if(err_code == NRF_ERROR_BUSY){
                NRF_LOG_INFO("usb buffer in");
                memcpy(kbd_report_queue[kbd_report_queue_wp], report, KEYBOARD_REPORT_SIZE);
                kbd_report_queue_wp++;
                kbd_report_queue_wp %= KBD_REP_QUEUE_LEN;
            }
            else if(err_code == NRF_SUCCESS){
            m_report_pending = true;        
            }
            else{
               APP_ERROR_CHECK(err_code);
            }
        }
    }
    

    ‘H’ is I pressed the key 50 times ‘3’ and ‘E’ are random displays.

Related