Home | History | Annotate | Download | only in mtp
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef MTP_DESCRIPTORS_H
     18 #define MTP_DESCRIPTORS_H
     19 
     20 #include <linux/usb/ch9.h>
     21 #include <linux/usb/functionfs.h>
     22 #include <sys/endian.h>
     23 
     24 namespace android {
     25 
     26 constexpr char FFS_MTP_EP0[] = "/dev/usb-ffs/mtp/ep0";
     27 constexpr char FFS_MTP_EP_IN[] = "/dev/usb-ffs/mtp/ep1";
     28 constexpr char FFS_MTP_EP_OUT[] = "/dev/usb-ffs/mtp/ep2";
     29 constexpr char FFS_MTP_EP_INTR[] = "/dev/usb-ffs/mtp/ep3";
     30 
     31 constexpr char FFS_PTP_EP0[] = "/dev/usb-ffs/ptp/ep0";
     32 constexpr char FFS_PTP_EP_IN[] = "/dev/usb-ffs/ptp/ep1";
     33 constexpr char FFS_PTP_EP_OUT[] = "/dev/usb-ffs/ptp/ep2";
     34 constexpr char FFS_PTP_EP_INTR[] = "/dev/usb-ffs/ptp/ep3";
     35 
     36 constexpr int MAX_PACKET_SIZE_FS = 64;
     37 constexpr int MAX_PACKET_SIZE_HS = 512;
     38 constexpr int MAX_PACKET_SIZE_SS = 1024;
     39 constexpr int MAX_PACKET_SIZE_EV = 28;
     40 
     41 struct func_desc {
     42     struct usb_interface_descriptor intf;
     43     struct usb_endpoint_descriptor_no_audio sink;
     44     struct usb_endpoint_descriptor_no_audio source;
     45     struct usb_endpoint_descriptor_no_audio intr;
     46 } __attribute__((packed));
     47 
     48 struct ss_func_desc {
     49     struct usb_interface_descriptor intf;
     50     struct usb_endpoint_descriptor_no_audio sink;
     51     struct usb_ss_ep_comp_descriptor sink_comp;
     52     struct usb_endpoint_descriptor_no_audio source;
     53     struct usb_ss_ep_comp_descriptor source_comp;
     54     struct usb_endpoint_descriptor_no_audio intr;
     55     struct usb_ss_ep_comp_descriptor intr_comp;
     56 } __attribute__((packed));
     57 
     58 struct desc_v1 {
     59     struct usb_functionfs_descs_head_v1 {
     60         __le32 magic;
     61         __le32 length;
     62         __le32 fs_count;
     63         __le32 hs_count;
     64     } __attribute__((packed)) header;
     65     struct func_desc fs_descs, hs_descs;
     66 } __attribute__((packed));
     67 
     68 struct desc_v2 {
     69     struct usb_functionfs_descs_head_v2 header;
     70     // The rest of the structure depends on the flags in the header.
     71     __le32 fs_count;
     72     __le32 hs_count;
     73     __le32 ss_count;
     74     __le32 os_count;
     75     struct func_desc fs_descs, hs_descs;
     76     struct ss_func_desc ss_descs;
     77     struct usb_os_desc_header os_header;
     78     struct usb_ext_compat_desc os_desc;
     79 } __attribute__((packed));
     80 
     81 // OS descriptor contents should not be changed. See b/64790536.
     82 static_assert(sizeof(struct desc_v2) == sizeof(usb_functionfs_descs_head_v2) +
     83         16 + 2 * sizeof(struct func_desc) + sizeof(struct ss_func_desc) +
     84         sizeof(usb_os_desc_header) + sizeof(usb_ext_compat_desc),
     85         "Size of mtp descriptor is incorrect!");
     86 
     87 #define STR_INTERFACE "MTP"
     88 struct functionfs_lang {
     89     __le16 code;
     90     char str1[sizeof(STR_INTERFACE)];
     91 } __attribute__((packed));
     92 
     93 struct functionfs_strings {
     94     struct usb_functionfs_strings_head header;
     95     struct functionfs_lang lang0;
     96 } __attribute__((packed));
     97 
     98 extern const struct desc_v2 mtp_desc_v2;
     99 extern const struct desc_v2 ptp_desc_v2;
    100 extern const struct desc_v1 mtp_desc_v1;
    101 extern const struct desc_v1 ptp_desc_v1;
    102 extern const struct functionfs_strings mtp_strings;
    103 
    104 bool writeDescriptors(int fd, bool ptp);
    105 
    106 }; // namespace android
    107 
    108 #endif // MTP_DESCRIPTORS_H
    109