summaryrefslogtreecommitdiffstats
path: root/app/tablet.c
blob: 5445c2967432be22dc2e24ae4923d5c0c49e5633 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "project.h"

static const uint8_t tablet_report_descriptor[] = {
  0x05, 0x01,                   // USAGE_PAGE (Generic Desktop)
  0x09, 0x02,                   // USAGE (Mouse)
  0xa1, 0x01,                   // COLLECTION (Application)
  0x09, 0x01,                   //   USAGE (Pointer)
  0xa1, 0x00,                   //   COLLECTION (Physical)
  0x05, 0x01,                   //     USAGE_PAGE (Generic Desktop)
  0x09, 0x30,                   //     USAGE (X)
  0x09, 0x31,                   //     USAGE (Y)
  0x15, 0x00,                   //     LOGICAL_MINIMUM (0)
  0x26, 0xff, 0x7f,             //     LOGICAL_MAXIMUM (32767)
  0x75, 0x10,                   //     REPORT_SIZE (16)
  0x95, 0x02,                   //     REPORT_COUNT (2)
  0x81, 0x02,                   //     INPUT (Data,Var,Abs)
  0x05, 0x01,                   //     USAGE_PAGE (Generic Desktop)
  0x09, 0x38,                   //     USAGE (Wheel)
  0x15, 0x81,                   //     LOGICAL_MINIMUM (-127)
  0x25, 0x7f,                   //     LOGICAL_MAXIMUM (127)
  0x75, 0x08,                   //     REPORT_SIZE (8)
  0x95, 0x01,                   //     REPORT_COUNT (1)
  0x81, 0x06,                   //     INPUT (Data,Var,Rel)
  0x05, 0x09,                   //     USAGE_PAGE (Button)
  0x19, 0x01,                   //     USAGE_MINIMUM (Button 1)
  0x29, 0x03,                   //     USAGE_MAXIMUM (Button 3)
  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)
  0x95, 0x01,                   //     REPORT_COUNT (1)
  0x75, 0x05,                   //     REPORT_SIZE (5)
  0x81, 0x01,                   //     INPUT (Cnst,Ary,Abs)
  0xc0,                         //   END_COLLECTION
  0x09, 0x3c,                   //   USAGE (Button 60)
  0x06, 0x00, 0xff,             //   USAGE_PAGE (Vendor Defined Page 1)
  0x09, 0x01,                   //   USAGE (Vendor Usage 1)
  0x15, 0x00,                   //   LOGICAL_MINIMUM (0)
  0x25, 0x01,                   //   LOGICAL_MAXIMUM (1)
  0x75, 0x01,                   //   REPORT_SIZE (1)
  0x95, 0x02,                   //   REPORT_COUNT (2)
  0xb1, 0x22,                   //   FEATURE (Data,Var,Abs,NPrf)
  0x75, 0x06,                   //   REPORT_SIZE (6)
  0x95, 0x01,                   //   REPORT_COUNT (1)
  0xb1, 0x01,                   //   FEATURE (Cnst,Ary,Abs)
  0xc0                          // END_COLLECTION
};

static const struct
{
  struct usb_hid_descriptor hid_descriptor;
  struct
  {
    uint8_t bReportDescriptorType;
    uint16_t wDescriptorLength;
  } __attribute__ ((packed)) hid_report;
} __attribute__ ((packed)) tablet_function =
{
  .hid_descriptor =
  {
  .bLength = sizeof (tablet_function),.bDescriptorType =
      USB_DT_HID,.bcdHID = 0x0100,.bCountryCode = 0,.bNumDescriptors = 1,}
  ,.hid_report =
  {
  .bReportDescriptorType = USB_DT_REPORT,.wDescriptorLength =
      sizeof (tablet_report_descriptor),}
,};

const struct usb_endpoint_descriptor tablet_endpoint = {
  .bLength = USB_DT_ENDPOINT_SIZE,
  .bDescriptorType = USB_DT_ENDPOINT,
  .bEndpointAddress = 0x83,
  .bmAttributes = USB_ENDPOINT_ATTR_INTERRUPT,
  .wMaxPacketSize = 6,
  .bInterval = 0x1 //0x20,
};

const struct usb_interface_descriptor tablet_iface = {
  .bLength = USB_DT_INTERFACE_SIZE,
  .bDescriptorType = USB_DT_INTERFACE,
  .bInterfaceNumber = 2,
  .bAlternateSetting = 0,
  .bNumEndpoints = 1,
  .bInterfaceClass = USB_CLASS_HID,
  .bInterfaceSubClass = 1,      /* boot */
  .bInterfaceProtocol = 2,      /* tablet */
  .iInterface = 0,

  .endpoint = &tablet_endpoint,

  .extra = &tablet_function,
  .extralen = sizeof (tablet_function),
};


void
tablet_get_descriptor (uint8_t ** buf, uint16_t * len)
{

  /* Handle the HID report descriptor. */
  *buf = (uint8_t *) tablet_report_descriptor;
  *len = sizeof (tablet_report_descriptor);
}

void
tablet_test (void)
{
  static int c = 0;
  uint8_t buf[6] = { 0, 0, 0, 0, 0 };

  buf[0] = c & 0xff;
  buf[1] = (c & 0x7fff) >> 8;
  buf[2] = (32767 - (c & 0x7fff)) & 0xff;
  buf[3] = (32767 - (c & 0x7fff)) >> 8;
  buf[4] = (c & 8) ? -1 : 1;
  buf[5] = c;

  c++;

  usbd_ep_write_packet (usbd_dev, 0x83, buf, 6);
}