diff --git a/content/controllers/usb/cotm02001/_index.md b/content/controllers/usb/cotm02001/_index.md
index aae054d..fd8f72a 100644
--- a/content/controllers/usb/cotm02001/_index.md
+++ b/content/controllers/usb/cotm02001/_index.md
@@ -16,7 +16,7 @@ Internally, it is a HID device with a vendor-specific class. The reported data d
| **Product ID** | 0x77A7 |
| **Serial number** | *Unavailable* |
| **USB standard descriptor** | *Unavailable* |
-| **HID report descriptor** | Not provided |
+| **HID report descriptor** | [Link](/controllers/usb/descriptors/cotm02001_hid-report-descriptor.txt) (recreated, not provided by actual device) |
### Input
diff --git a/content/controllers/usb/descriptors/cotm02001_hid-report-descriptor.txt b/content/controllers/usb/descriptors/cotm02001_hid-report-descriptor.txt
new file mode 100644
index 0000000..1d0458c
--- /dev/null
+++ b/content/controllers/usb/descriptors/cotm02001_hid-report-descriptor.txt
@@ -0,0 +1,30 @@
+ 0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
+ 0x09, 0x04, // Usage (Joystick)
+ 0xA1, 0x01, // Collection (Application)
+ 0x75, 0x08, // Report Size (8)
+ 0x95, 0x01, // Report Count (1)
+ 0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
+ 0x09, 0x01, // Usage (Pointer)
+ 0xA1, 0x00, // Collection (Physical)
+ 0x09, 0x30, // Usage (X)
+ 0x15, 0x00, // Logical Minimum (0)
+ 0x26, 0xFF, 0x00, // Logical Maximum (255)
+ 0x75, 0x08, // Report Size (8)
+ 0x95, 0x01, // Report Count (1)
+ 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
+ 0xC0, // End Collection
+ 0x05, 0x09, // Usage Page (Button)
+ 0x19, 0x01, // Usage Minimum (0x01)
+ 0x29, 0x0E, // Usage Maximum (0x0E)
+ 0x15, 0x00, // Logical Minimum (0)
+ 0x25, 0x01, // Logical Maximum (1)
+ 0x35, 0x00, // Physical Minimum (0)
+ 0x45, 0x01, // Physical Maximum (1)
+ 0x75, 0x01, // Report Size (1)
+ 0x95, 0x0E, // Report Count (14)
+ 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
+ 0x95, 0x02, // Report Count (2)
+ 0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
+ 0xC0, // End Collection
+
+// 55 bytes
diff --git a/content/controllers/usb/descriptors/sotp031201_hid-report-descriptor.txt b/content/controllers/usb/descriptors/sotp031201_hid-report-descriptor.txt
new file mode 100644
index 0000000..1d0458c
--- /dev/null
+++ b/content/controllers/usb/descriptors/sotp031201_hid-report-descriptor.txt
@@ -0,0 +1,30 @@
+ 0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
+ 0x09, 0x04, // Usage (Joystick)
+ 0xA1, 0x01, // Collection (Application)
+ 0x75, 0x08, // Report Size (8)
+ 0x95, 0x01, // Report Count (1)
+ 0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
+ 0x09, 0x01, // Usage (Pointer)
+ 0xA1, 0x00, // Collection (Physical)
+ 0x09, 0x30, // Usage (X)
+ 0x15, 0x00, // Logical Minimum (0)
+ 0x26, 0xFF, 0x00, // Logical Maximum (255)
+ 0x75, 0x08, // Report Size (8)
+ 0x95, 0x01, // Report Count (1)
+ 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
+ 0xC0, // End Collection
+ 0x05, 0x09, // Usage Page (Button)
+ 0x19, 0x01, // Usage Minimum (0x01)
+ 0x29, 0x0E, // Usage Maximum (0x0E)
+ 0x15, 0x00, // Logical Minimum (0)
+ 0x25, 0x01, // Logical Maximum (1)
+ 0x35, 0x00, // Physical Minimum (0)
+ 0x45, 0x01, // Physical Maximum (1)
+ 0x75, 0x01, // Report Size (1)
+ 0x95, 0x0E, // Report Count (14)
+ 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
+ 0x95, 0x02, // Report Count (2)
+ 0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
+ 0xC0, // End Collection
+
+// 55 bytes
diff --git a/content/controllers/usb/sotp031201/_index.md b/content/controllers/usb/sotp031201/_index.md
index 20eec39..d420461 100644
--- a/content/controllers/usb/sotp031201/_index.md
+++ b/content/controllers/usb/sotp031201/_index.md
@@ -16,7 +16,7 @@ Internally, it is a HID device with a vendor-specific class. The reported data d
| **Product ID** | 0x0101
0x77A7 (P5/B5)
0x0004 (P5/B8) |
| **Serial number** | *None* |
| **USB standard descriptor** | [P4/B7](/controllers/usb/descriptors/sotp031201-P4B7_standard-descriptor.txt)
[P4/B7 (without B1)](/controllers/usb/descriptors/sotp031201-P4B1B7_standard-descriptor.txt)
[P5/B5](/controllers/usb/descriptors/sotp031201-P5B5_standard-descriptor.txt)
[P5/B7](/controllers/usb/descriptors/sotp031201-P5B7_standard-descriptor.txt)
[P5/B8](/controllers/usb/descriptors/sotp031201-P5B8_standard-descriptor.txt)
[P13/B7](/controllers/usb/descriptors/sotp031201-P13B7_standard-descriptor.txt) |
-| **HID report descriptor** | Not provided |
+| **HID report descriptor** | [P4/B7, P4/B2-B7, P5/B7, P13/B7](/controllers/usb/descriptors/sotp031201_hid-report-descriptor.txt) (recreated, not provided by actual device) |
### P5/B5 cartridge
diff --git a/data/controllers.yml b/data/controllers.yml
index dbad44a..1dcbcfb 100644
--- a/data/controllers.yml
+++ b/data/controllers.yml
@@ -48,6 +48,7 @@ pnp:
pnp2:
name: "Densha de GO! Plug and Play 2"
date: 2023-12-07
+ code: "TPP-D-002"
ref: "/controllers/standalone/pnp2"
sotp031201:
@@ -56,7 +57,7 @@ sotp031201:
code: "SOTP-031201"
image: "sotp031201.jpg"
ref: "/controllers/usb/sotp031201"
- notes: "Released with 4 cassettes: P4-B7, P4-B7 (without B1), P5-B5 and P5-B8. Additional cassettes sold separately: P5-B7 and P13-B7."
+ notes: "Released with 4 cartridges: P4-B7, P4-B7 (without B1), P5-B5 and P5-B8. Additional cartridges sold separately: P5-B7 and P13-B7."
slph00051:
name: "Two handle controller (Sony PlayStation)"