소스 검색

MTP Fixes (thanks Fredrik Hubinette)

teensy4-core
PaulStoffregen 7 년 전
부모
커밋
5128bae4e8
2개의 변경된 파일25개의 추가작업 그리고 9개의 파일을 삭제
  1. +11
    -1
      teensy3/usb_desc.c
  2. +14
    -8
      teensy3/usb_dev.c

+ 11
- 1
teensy3/usb_desc.c 파일 보기

@@ -943,7 +943,7 @@ static uint8_t config_descriptor[CONFIG_DESC_SIZE] = {
0x06, // bInterfaceClass (0x06 = still image)
0x01, // bInterfaceSubClass
0x01, // bInterfaceProtocol
0, // iInterface
4, // iInterface
// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
7, // bLength
5, // bDescriptorType
@@ -1290,6 +1290,13 @@ struct usb_string_descriptor_struct usb_string_serial_number_default = {
3,
{0,0,0,0,0,0,0,0,0,0}
};
#ifdef MTP_INTERFACE
struct usb_string_descriptor_struct usb_string_mtp = {
2 + 3 * 2,
3,
{'M','T','P'}
};
#endif

void usb_init_serialnumber(void)
{
@@ -1367,6 +1374,9 @@ const usb_descriptor_list_t usb_descriptor_list[] = {
#ifdef MULTITOUCH_INTERFACE
{0x2200, MULTITOUCH_INTERFACE, multitouch_report_desc, sizeof(multitouch_report_desc)},
{0x2100, MULTITOUCH_INTERFACE, config_descriptor+MULTITOUCH_HID_DESC_OFFSET, 9},
#endif
#ifdef MTP_INTERFACE
{0x0304, 0x0409, (const uint8_t *)&usb_string_mtp, 0},
#endif
{0x0300, 0x0000, (const uint8_t *)&string0, 0},
{0x0301, 0x0409, (const uint8_t *)&usb_string_manufacturer_name, 0},

+ 14
- 8
teensy3/usb_dev.c 파일 보기

@@ -274,14 +274,15 @@ static void usb_setup(void)
data = reply_buffer;
break;
case 0x0082: // GET_STATUS (endpoint)
if (setup.wIndex > NUM_ENDPOINTS) {
i = setup.wIndex & 0x7F;
if (i > NUM_ENDPOINTS) {
// TODO: do we need to handle IN vs OUT here?
endpoint0_stall();
return;
}
reply_buffer[0] = 0;
reply_buffer[1] = 0;
if (*(uint8_t *)(&USB0_ENDPT0 + setup.wIndex * 4) & 0x02) reply_buffer[0] = 1;
if (*(uint8_t *)(&USB0_ENDPT0 + i * 4) & 0x02) reply_buffer[0] = 1;
data = reply_buffer;
datalen = 2;
break;
@@ -358,18 +359,23 @@ static void usb_setup(void)
#endif

#if defined(MTP_INTERFACE)
case 0x2164: // Cancel Request (PTP spec, 5.2.1, page 8)
// TODO: required by PTP spec
endpoint0_stall();
return;
case 0x2166: // Device Reset (PTP spec, 5.2.3, page 10)
case 0x64A1: // Cancel Request (PTP spec, 5.2.1, page 8)
// TODO: required by PTP spec
endpoint0_stall();
return;
case 0x2167: // Get Device Statis (PTP spec, 5.2.4, page 10)
case 0x66A1: // Device Reset (PTP spec, 5.2.3, page 10)
// TODO: required by PTP spec
endpoint0_stall();
return;
case 0x67A1: // Get Device Statis (PTP spec, 5.2.4, page 10)
// For now, always respond with status ok.
reply_buffer[0] = 0x4;
reply_buffer[1] = 0;
reply_buffer[2] = 0x01;
reply_buffer[3] = 0x20;
data = reply_buffer;
datalen = 4;
break;
#endif

// TODO: this does not work... why?

Loading…
취소
저장