// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <lib/hid/boot.h>

// This report descriptor matches the |hid_boot_mouse_report_t| struct.
const uint8_t boot_mouse_r_desc[50] = {
    0x05, 0x01,  // Usage Page (Generic Desktop Ctrls)
    0x09, 0x02,  // Usage (Mouse)
    0xA1, 0x01,  // Collection (Application)
    0x09, 0x01,  //   Usage (Pointer)
    0xA1, 0x00,  //   Collection (Physical)
    0x05, 0x09,  //     Usage Page (Button)
    0x19, 0x01,  //     Usage Minimum (0x01)
    0x29, 0x03,  //     Usage Maximum (0x03)
    0x15, 0x00,  //     Logical Minimum (0)
    0x25, 0x01,  //     Logical Maximum (1)
    0x95, 0x03,  //     Report Count (3)
    0x75, 0x01,  //     Report Size (1)
    0x81, 0x02,  //     Input (Data,Var,Abs,No Wrap,Linear,No Null Position)
    0x95, 0x01,  //     Report Count (1)
    0x75, 0x05,  //     Report Size (5)
    0x81, 0x03,  //     Input (Const,Var,Abs,No Wrap,Linear,No Null Position)
    0x05, 0x01,  //     Usage Page (Generic Desktop Ctrls)
    0x09, 0x30,  //     Usage (X)
    0x09, 0x31,  //     Usage (Y)
    0x15, 0x81,  //     Logical Minimum (-127)
    0x25, 0x7F,  //     Logical Maximum (127)
    0x75, 0x08,  //     Report Size (8)
    0x95, 0x02,  //     Report Count (2)
    0x81, 0x06,  //     Input (Data,Var,Rel,No Wrap,Linear,No Null Position)
    0xC0,        //   End Collection
    0xC0,        // End Collection
};

const uint8_t* get_boot_mouse_report_desc(size_t* size) {
  *size = sizeof(boot_mouse_r_desc);
  return boot_mouse_r_desc;
}

// This report descriptor matches the |hid_boot_kbd_report_t| struct.
const uint8_t boot_kbd_r_desc[63] = {
    0x05,
    0x01,  // Usage Page (Generic Desktop Ctrls)
    0x09,
    0x06,  // Usage (Keyboard)
    0xA1,
    0x01,  // Collection (Application)
    0x05,
    0x07,  //   Usage Page (Kbrd/Keypad)
    0x19,
    0xE0,  //   Usage Minimum (0xE0)
    0x29,
    0xE7,  //   Usage Maximum (0xE7)
    0x15,
    0x00,  //   Logical Minimum (0)
    0x25,
    0x01,  //   Logical Maximum (1)
    0x75,
    0x01,  //   Report Size (1)
    0x95,
    0x08,  //   Report Count (8)
    0x81,
    0x02,  //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
    0x95,
    0x01,  //   Report Count (1)
    0x75,
    0x08,  //   Report Size (8)
    0x81,
    0x01,  //   Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
    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,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
    0x95,
    0x01,  //   Report Count (1)
    0x75,
    0x03,  //   Report Size (3)
    0x91,
    0x01,  //   Output (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null
           //   Position,Non-volatile)
    0x95,
    0x06,  //   Report Count (6)
    0x75,
    0x08,  //   Report Size (8)
    0x15,
    0x00,  //   Logical Minimum (0)
    0x25,
    0x65,  //   Logical Maximum (101)
    0x05,
    0x07,  //   Usage Page (Kbrd/Keypad)
    0x19,
    0x00,  //   Usage Minimum (0x00)
    0x29,
    0x65,  //   Usage Maximum (0x65)
    0x81,
    0x00,  //   Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
    0xC0,  // End Collection
};

const uint8_t* get_boot_kbd_report_desc(size_t* size) {
  *size = sizeof(boot_kbd_r_desc);
  return boot_kbd_r_desc;
}
