Przeglądaj źródła

add initial printer、mtp、template class driver

sakumisu 3 lat temu
rodzic
commit
2ecde84a4e

+ 344 - 0
class/mtp/usb_mtp.h

@@ -0,0 +1,344 @@
+#ifndef _USB_MTP_H
+#define _USB_MTP_H
+
+#define USB_MTP_CLASS 0x06
+
+#define USB_MTP_SUB_CLASS 0x01U
+#define USB_MTP_PROTOCOL  0x01U
+
+#define MTP_REQUEST_CANCEL             0x64U
+#define MTP_REQUEST_GET_EXT_EVENT_DATA 0x65U
+#define MTP_REQUEST_RESET              0x66U
+#define MTP_REQUEST_GET_DEVICE_STATUS  0x67U
+
+/*
+ * MTP Class specification Revision 1.1
+ * Appendix B. Object Properties
+ */
+/* MTP OBJECT PROPERTIES supported*/
+#define MTP_OB_PROP_STORAGE_ID                          0xDC01U
+#define MTP_OB_PROP_OBJECT_FORMAT                       0xDC02U
+#define MTP_OB_PROP_PROTECTION_STATUS                   0xDC03U
+#define MTP_OB_PROP_OBJECT_SIZE                         0xDC04U
+#define MTP_OB_PROP_ASSOC_TYPE                          0xDC05U
+#define MTP_OB_PROP_ASSOC_DESC                          0xDC06U
+#define MTP_OB_PROP_OBJ_FILE_NAME                       0xDC07U
+#define MTP_OB_PROP_DATE_CREATED                        0xDC08U
+#define MTP_OB_PROP_DATE_MODIFIED                       0xDC09U
+#define MTP_OB_PROP_KEYWORDS                            0xDC0AU
+#define MTP_OB_PROP_PARENT_OBJECT                       0xDC0BU
+#define MTP_OB_PROP_ALLOWED_FOLD_CONTENTS               0xDC0CU
+#define MTP_OB_PROP_HIDDEN                              0xDC0DU
+#define MTP_OB_PROP_SYSTEM_OBJECT                       0xDC0EU
+#define MTP_OB_PROP_PERS_UNIQ_OBJ_IDEN                  0xDC41U
+#define MTP_OB_PROP_SYNCID                              0xDC42U
+#define MTP_OB_PROP_PROPERTY_BAG                        0xDC43U
+#define MTP_OB_PROP_NAME                                0xDC44U
+#define MTP_OB_PROP_CREATED_BY                          0xDC45U
+#define MTP_OB_PROP_ARTIST                              0xDC46U
+#define MTP_OB_PROP_DATE_AUTHORED                       0xDC47U
+#define MTP_OB_PROP_DESCRIPTION                         0xDC48U
+#define MTP_OB_PROP_URL_REFERENCE                       0xDC49U
+#define MTP_OB_PROP_LANGUAGELOCALE                      0xDC4AU
+#define MTP_OB_PROP_COPYRIGHT_INFORMATION               0xDC4BU
+#define MTP_OB_PROP_SOURCE                              0xDC4CU
+#define MTP_OB_PROP_ORIGIN_LOCATION                     0xDC4DU
+#define MTP_OB_PROP_DATE_ADDED                          0xDC4EU
+#define MTP_OB_PROP_NON_CONSUMABLE                      0xDC4FU
+#define MTP_OB_PROP_CORRUPTUNPLAYABLE                   0xDC50U
+#define MTP_OB_PROP_PRODUCERSERIALNUMBER                0xDC51U
+#define MTP_OB_PROP_REPRESENTATIVE_SAMPLE_FORMAT        0xDC81U
+#define MTP_OB_PROP_REPRESENTATIVE_SAMPLE_SIZE          0xDC82U
+#define MTP_OB_PROP_REPRESENTATIVE_SAMPLE_HEIGHT        0xDC83U
+#define MTP_OB_PROP_REPRESENTATIVE_SAMPLE_WIDTH         0xDC84U
+#define MTP_OB_PROP_REPRESENTATIVE_SAMPLE_DURATION      0xDC85U
+#define MTP_OB_PROP_REPRESENTATIVE_SAMPLE_DATA          0xDC86U
+#define MTP_OB_PROP_WIDTH                               0xDC87U
+#define MTP_OB_PROP_HEIGHT                              0xDC88U
+#define MTP_OB_PROP_DURATION                            0xDC89U
+#define MTP_OB_PROP_RATING                              0xDC8AU
+#define MTP_OB_PROP_TRACK                               0xDC8BU
+#define MTP_OB_PROP_GENRE                               0xDC8CU
+#define MTP_OB_PROP_CREDITS                             0xDC8DU
+#define MTP_OB_PROP_LYRICS                              0xDC8EU
+#define MTP_OB_PROP_SUBSCRIPTION_CONTENT_ID             0xDC8FU
+#define MTP_OB_PROP_PRODUCED_BY                         0xDC90U
+#define MTP_OB_PROP_USE_COUNT                           0xDC91U
+#define MTP_OB_PROP_SKIP_COUNT                          0xDC92U
+#define MTP_OB_PROP_LAST_ACCESSED                       0xDC93U
+#define MTP_OB_PROP_PARENTAL_RATING                     0xDC94U
+#define MTP_OB_PROP_META_GENRE                          0xDC95U
+#define MTP_OB_PROP_COMPOSER                            0xDC96U
+#define MTP_OB_PROP_EFFECTIVE_RATING                    0xDC97U
+#define MTP_OB_PROP_SUBTITLE                            0xDC98U
+#define MTP_OB_PROP_ORIGINAL_RELEASE_DATE               0xDC99U
+#define MTP_OB_PROP_ALBUM_NAME                          0xDC9AU
+#define MTP_OB_PROP_ALBUM_ARTIST                        0xDC9BU
+#define MTP_OB_PROP_MOOD                                0xDC9CU
+#define MTP_OB_PROP_DRM_STATUS                          0xDC9DU
+#define MTP_OB_PROP_SUB_DESCRIPTION                     0xDC9EU
+#define MTP_OB_PROP_IS_CROPPED                          0xDCD1U
+#define MTP_OB_PROP_IS_COLOUR_CORRECTED                 0xDCD2U
+#define MTP_OB_PROP_IMAGE_BIT_DEPTH                     0xDCD3U
+#define MTP_OB_PROP_FNUMBER                             0xDCD4U
+#define MTP_OB_PROP_EXPOSURE_TIME                       0xDCD5U
+#define MTP_OB_PROP_EXPOSURE_INDEX                      0xDCD6U
+#define MTP_OB_PROP_TOTAL_BITRATE                       0xDE91U
+#define MTP_OB_PROP_BITRATE_TYPE                        0xDE92U
+#define MTP_OB_PROP_SAMPLE_RATE                         0xDE93U
+#define MTP_OB_PROP_NUMBER_OF_CHANNELS                  0xDE94U
+#define MTP_OB_PROP_AUDIO_BITDEPTH                      0xDE95U
+#define MTP_OB_PROP_SCAN_TYPE                           0xDE97U
+#define MTP_OB_PROP_AUDIO_WAVE_CODEC                    0xDE99U
+#define MTP_OB_PROP_AUDIO_BITRATE                       0xDE9AU
+#define MTP_OB_PROP_VIDEO_FOURCC_CODEC                  0xDE9BU
+#define MTP_OB_PROP_VIDEO_BITRATE                       0xDE9CU
+#define MTP_OB_PROP_FRAMES_PER_THOUSAND_SECONDS         0xDE9DU
+#define MTP_OB_PROP_KEYFRAME_DISTANCE                   0xDE9EU
+#define MTP_OB_PROP_BUFFER_SIZE                         0xDE9FU
+#define MTP_OB_PROP_ENCODING_QUALITY                    0xDEA0U
+#define MTP_OB_PROP_ENCODING_PROFILE                    0xDEA1U
+#define MTP_OB_PROP_DISPLAY_NAME                        0xDCE0U
+#define MTP_OB_PROP_BODY_TEXT                           0xDCE1U
+#define MTP_OB_PROP_SUBJECT                             0xDCE2U
+#define MTP_OB_PROP_PRIORITY                            0xDCE3U
+#define MTP_OB_PROP_GIVEN_NAME                          0xDD00U
+#define MTP_OB_PROP_MIDDLE_NAMES                        0xDD01U
+#define MTP_OB_PROP_FAMILY_NAME                         0xDD02U
+#define MTP_OB_PROP_PREFIX                              0xDD03U
+#define MTP_OB_PROP_SUFFIX                              0xDD04U
+#define MTP_OB_PROP_PHONETIC_GIVEN_NAME                 0xDD05U
+#define MTP_OB_PROP_PHONETIC_FAMILY_NAME                0xDD06U
+#define MTP_OB_PROP_EMAIL_PRIMARY                       0xDD07U
+#define MTP_OB_PROP_EMAIL_PERSONAL_1                    0xDD08U
+#define MTP_OB_PROP_EMAIL_PERSONAL_2                    0xDD09U
+#define MTP_OB_PROP_EMAIL_BUSINESS_1                    0xDD0AU
+#define MTP_OB_PROP_EMAIL_BUSINESS_2                    0xDD0BU
+#define MTP_OB_PROP_EMAIL_OTHERS                        0xDD0CU
+#define MTP_OB_PROP_PHONE_NUMBER_PRIMARY                0xDD0DU
+#define MTP_OB_PROP_PHONE_NUMBER_PERSONAL               0xDD0EU
+#define MTP_OB_PROP_PHONE_NUMBER_PERSONAL_2             0xDD0FU
+#define MTP_OB_PROP_PHONE_NUMBER_BUSINESS               0xDD10U
+#define MTP_OB_PROP_PHONE_NUMBER_BUSINESS_2             0xDD11U
+#define MTP_OB_PROP_PHONE_NUMBER_MOBILE                 0xDD12U
+#define MTP_OB_PROP_PHONE_NUMBER_MOBILE_2               0xDD13U
+#define MTP_OB_PROP_FAX_NUMBER_PRIMARY                  0xDD14U
+#define MTP_OB_PROP_FAX_NUMBER_PERSONAL                 0xDD15U
+#define MTP_OB_PROP_FAX_NUMBER_BUSINESS                 0xDD16U
+#define MTP_OB_PROP_PAGER_NUMBER                        0xDD17U
+#define MTP_OB_PROP_PHONE_NUMBER_OTHERS                 0xDD18U
+#define MTP_OB_PROP_PRIMARY_WEB_ADDRESS                 0xDD19U
+#define MTP_OB_PROP_PERSONAL_WEB_ADDRESS                0xDD1AU
+#define MTP_OB_PROP_BUSINESS_WEB_ADDRESS                0xDD1BU
+#define MTP_OB_PROP_INSTANT_MESSENGER_ADDRESS           0xDD1CU
+#define MTP_OB_PROP_INSTANT_MESSENGER_ADDRESS_2         0xDD1DU
+#define MTP_OB_PROP_INSTANT_MESSENGER_ADDRESS_3         0xDD1EU
+#define MTP_OB_PROP_POSTAL_ADDRESS_PERSONAL_FULL        0xDD1FU
+#define MTP_OB_PROP_POSTAL_ADDRESS_PERSONAL_LINE_1      0xDD20U
+#define MTP_OB_PROP_POSTAL_ADDRESS_PERSONAL_LINE_2      0xDD21U
+#define MTP_OB_PROP_POSTAL_ADDRESS_PERSONAL_CITY        0xDD22U
+#define MTP_OB_PROP_POSTAL_ADDRESS_PERSONAL_REGION      0xDD23U
+#define MTP_OB_PROP_POSTAL_ADDRESS_PERSONAL_POSTAL_CODE 0xDD24U
+#define MTP_OB_PROP_POSTAL_ADDRESS_PERSONAL_COUNTRY     0xDD25U
+#define MTP_OB_PROP_POSTAL_ADDRESS_BUSINESS_FULL        0xDD26U
+#define MTP_OB_PROP_POSTAL_ADDRESS_BUSINESS_LINE_1      0xDD27U
+#define MTP_OB_PROP_POSTAL_ADDRESS_BUSINESS_LINE_2      0xDD28U
+#define MTP_OB_PROP_POSTAL_ADDRESS_BUSINESS_CITY        0xDD29U
+#define MTP_OB_PROP_POSTAL_ADDRESS_BUSINESS_REGION      0xDD2AU
+#define MTP_OB_PROP_POSTAL_ADDRESS_BUSINESS_POSTAL_CODE 0xDD2BU
+#define MTP_OB_PROP_POSTAL_ADDRESS_BUSINESS_COUNTRY     0xDD2CU
+#define MTP_OB_PROP_POSTAL_ADDRESS_OTHER_FULL           0xDD2DU
+#define MTP_OB_PROP_POSTAL_ADDRESS_OTHER_LINE_1         0xDD2EU
+#define MTP_OB_PROP_POSTAL_ADDRESS_OTHER_LINE_2         0xDD2FU
+#define MTP_OB_PROP_POSTAL_ADDRESS_OTHER_CITY           0xDD30U
+#define MTP_OB_PROP_POSTAL_ADDRESS_OTHER_REGION         0xDD31U
+#define MTP_OB_PROP_POSTAL_ADDRESS_OTHER_POSTAL_CODE    0xDD32U
+#define MTP_OB_PROP_POSTAL_ADDRESS_OTHER_COUNTRY        0xDD33U
+#define MTP_OB_PROP_ORGANIZATION_NAME                   0xDD34U
+#define MTP_OB_PROP_PHONETIC_ORGANIZATION_NAME          0xDD35U
+#define MTP_OB_PROP_ROLE                                0xDD36U
+#define MTP_OB_PROP_BIRTHDATE                           0xDD37U
+#define MTP_OB_PROP_MESSAGE_TO                          0xDD40U
+#define MTP_OB_PROP_MESSAGE_CC                          0xDD41U
+#define MTP_OB_PROP_MESSAGE_BCC                         0xDD42U
+#define MTP_OB_PROP_MESSAGE_READ                        0xDD43U
+#define MTP_OB_PROP_MESSAGE_RECEIVED_TIME               0xDD44U
+#define MTP_OB_PROP_MESSAGE_SENDER                      0xDD45U
+#define MTP_OB_PROP_ACT_BEGIN_TIME                      0xDD50U
+#define MTP_OB_PROP_ACT_END_TIME                        0xDD51U
+#define MTP_OB_PROP_ACT_LOCATION                        0xDD52U
+#define MTP_OB_PROP_ACT_REQUIRED_ATTENDEES              0xDD54U
+#define MTP_OB_PROP_ACT_OPTIONAL_ATTENDEES              0xDD55U
+#define MTP_OB_PROP_ACT_RESOURCES                       0xDD56U
+#define MTP_OB_PROP_ACT_ACCEPTED                        0xDD57U
+#define MTP_OB_PROP_OWNER                               0xDD5DU
+#define MTP_OB_PROP_EDITOR                              0xDD5EU
+#define MTP_OB_PROP_WEBMASTER                           0xDD5FU
+#define MTP_OB_PROP_URL_SOURCE                          0xDD60U
+#define MTP_OB_PROP_URL_DESTINATION                     0xDD61U
+#define MTP_OB_PROP_TIME_BOOKMARK                       0xDD62U
+#define MTP_OB_PROP_OBJECT_BOOKMARK                     0xDD63U
+#define MTP_OB_PROP_BYTE_BOOKMARK                       0xDD64U
+#define MTP_OB_PROP_LAST_BUILD_DATE                     0xDD70U
+#define MTP_OB_PROP_TIME_TO_LIVE                        0xDD71U
+#define MTP_OB_PROP_MEDIA_GUID                          0xDD72U
+
+/*  MTP event codes*/
+#define MTP_EVENT_UNDEFINED               0x4000U
+#define MTP_EVENT_CANCELTRANSACTION       0x4001U
+#define MTP_EVENT_OBJECTADDED             0x4002U
+#define MTP_EVENT_OBJECTREMOVED           0x4003U
+#define MTP_EVENT_STOREADDED              0x4004U
+#define MTP_EVENT_STOREREMOVED            0x4005U
+#define MTP_EVENT_DEVICEPROPCHANGED       0x4006U
+#define MTP_EVENT_OBJECTINFOCHANGED       0x4007U
+#define MTP_EVENT_DEVICEINFOCHANGED       0x4008U
+#define MTP_EVENT_REQUESTOBJECTTRANSFER   0x4009U
+#define MTP_EVENT_STOREFULL               0x400AU
+#define MTP_EVENT_DEVICERESET             0x400BU
+#define MTP_EVENT_STORAGEINFOCHANGED      0x400CU
+#define MTP_EVENT_CAPTURECOMPLETE         0x400DU
+#define MTP_EVENT_UNREPORTEDSTATUS        0x400EU
+#define MTP_EVENT_OBJECTPROPCHANGED       0xC801U
+#define MTP_EVENT_OBJECTPROPDESCCHANGED   0xC802U
+#define MTP_EVENT_OBJECTREFERENCESCHANGED 0xC803U
+
+/*
+ * MTP Class specification Revision 1.1
+ * Appendix D. Operations
+ */
+
+/* Operations code */
+#define MTP_OP_GET_DEVICE_INFO            0x1001U
+#define MTP_OP_OPEN_SESSION               0x1002U
+#define MTP_OP_CLOSE_SESSION              0x1003U
+#define MTP_OP_GET_STORAGE_IDS            0x1004U
+#define MTP_OP_GET_STORAGE_INFO           0x1005U
+#define MTP_OP_GET_NUM_OBJECTS            0x1006U
+#define MTP_OP_GET_OBJECT_HANDLES         0x1007U
+#define MTP_OP_GET_OBJECT_INFO            0x1008U
+#define MTP_OP_GET_OBJECT                 0x1009U
+#define MTP_OP_GET_THUMB                  0x100AU
+#define MTP_OP_DELETE_OBJECT              0x100BU
+#define MTP_OP_SEND_OBJECT_INFO           0x100CU
+#define MTP_OP_SEND_OBJECT                0x100DU
+#define MTP_OP_FORMAT_STORE               0x100FU
+#define MTP_OP_RESET_DEVICE               0x1010U
+#define MTP_OP_GET_DEVICE_PROP_DESC       0x1014U
+#define MTP_OP_GET_DEVICE_PROP_VALUE      0x1015U
+#define MTP_OP_SET_DEVICE_PROP_VALUE      0x1016U
+#define MTP_OP_RESET_DEVICE_PROP_VALUE    0x1017U
+#define MTP_OP_TERMINATE_OPEN_CAPTURE     0x1018U
+#define MTP_OP_MOVE_OBJECT                0x1019U
+#define MTP_OP_COPY_OBJECT                0x101AU
+#define MTP_OP_GET_PARTIAL_OBJECT         0x101BU
+#define MTP_OP_INITIATE_OPEN_CAPTURE      0x101CU
+#define MTP_OP_GET_OBJECT_PROPS_SUPPORTED 0x9801U
+#define MTP_OP_GET_OBJECT_PROP_DESC       0x9802U
+#define MTP_OP_GET_OBJECT_PROP_VALUE      0x9803U
+#define MTP_OP_SET_OBJECT_PROP_VALUE      0x9804U
+#define MTP_OP_GET_OBJECT_PROPLIST        0x9805U
+#define MTP_OP_GET_OBJECT_PROP_REFERENCES 0x9810U
+#define MTP_OP_GETSERVICEIDS              0x9301U
+#define MTP_OP_GETSERVICEINFO             0x9302U
+#define MTP_OP_GETSERVICECAPABILITIES     0x9303U
+#define MTP_OP_GETSERVICEPROPDESC         0x9304U
+
+/*
+ * MTP Class specification Revision 1.1
+ * Appendix C. Device Properties
+ */
+
+/* MTP device properties code*/
+#define MTP_DEV_PROP_UNDEFINED                      0x5000U
+#define MTP_DEV_PROP_BATTERY_LEVEL                  0x5001U
+#define MTP_DEV_PROP_FUNCTIONAL_MODE                0x5002U
+#define MTP_DEV_PROP_IMAGE_SIZE                     0x5003U
+#define MTP_DEV_PROP_COMPRESSION_SETTING            0x5004U
+#define MTP_DEV_PROP_WHITE_BALANCE                  0x5005U
+#define MTP_DEV_PROP_RGB_GAIN                       0x5006U
+#define MTP_DEV_PROP_F_NUMBER                       0x5007U
+#define MTP_DEV_PROP_FOCAL_LENGTH                   0x5008U
+#define MTP_DEV_PROP_FOCUS_DISTANCE                 0x5009U
+#define MTP_DEV_PROP_FOCUS_MODE                     0x500AU
+#define MTP_DEV_PROP_EXPOSURE_METERING_MODE         0x500BU
+#define MTP_DEV_PROP_FLASH_MODE                     0x500CU
+#define MTP_DEV_PROP_EXPOSURE_TIME                  0x500DU
+#define MTP_DEV_PROP_EXPOSURE_PROGRAM_MODE          0x500EU
+#define MTP_DEV_PROP_EXPOSURE_INDEX                 0x500FU
+#define MTP_DEV_PROP_EXPOSURE_BIAS_COMPENSATION     0x5010U
+#define MTP_DEV_PROP_DATETIME                       0x5011U
+#define MTP_DEV_PROP_CAPTURE_DELAY                  0x5012U
+#define MTP_DEV_PROP_STILL_CAPTURE_MODE             0x5013U
+#define MTP_DEV_PROP_CONTRAST                       0x5014U
+#define MTP_DEV_PROP_SHARPNESS                      0x5015U
+#define MTP_DEV_PROP_DIGITAL_ZOOM                   0x5016U
+#define MTP_DEV_PROP_EFFECT_MODE                    0x5017U
+#define MTP_DEV_PROP_BURST_NUMBER                   0x5018U
+#define MTP_DEV_PROP_BURST_INTERVAL                 0x5019U
+#define MTP_DEV_PROP_TIMELAPSE_NUMBER               0x501AU
+#define MTP_DEV_PROP_TIMELAPSE_INTERVAL             0x501BU
+#define MTP_DEV_PROP_FOCUS_METERING_MODE            0x501CU
+#define MTP_DEV_PROP_UPLOAD_URL                     0x501DU
+#define MTP_DEV_PROP_ARTIST                         0x501EU
+#define MTP_DEV_PROP_COPYRIGHT_INFO                 0x501FU
+#define MTP_DEV_PROP_SYNCHRONIZATION_PARTNER        0xD401U
+#define MTP_DEV_PROP_DEVICE_FRIENDLY_NAME           0xD402U
+#define MTP_DEV_PROP_VOLUME                         0xD403U
+#define MTP_DEV_PROP_SUPPORTEDFORMATSORDERED        0xD404U
+#define MTP_DEV_PROP_DEVICEICON                     0xD405U
+#define MTP_DEV_PROP_PLAYBACK_RATE                  0xD410U
+#define MTP_DEV_PROP_PLAYBACK_OBJECT                0xD411U
+#define MTP_DEV_PROP_PLAYBACK_CONTAINER             0xD412U
+#define MTP_DEV_PROP_SESSION_INITIATOR_VERSION_INFO 0xD406U
+#define MTP_DEV_PROP_PERCEIVED_DEVICE_TYPE          0xD407U
+
+/* Container Types */
+#define MTP_CONT_TYPE_UNDEFINED 0U
+#define MTP_CONT_TYPE_COMMAND   1U
+#define MTP_CONT_TYPE_DATA      2U
+#define MTP_CONT_TYPE_RESPONSE  3U
+#define MTP_CONT_TYPE_EVENT     4U
+
+#ifndef MTP_STORAGE_ID
+#define MTP_STORAGE_ID 0x00010001U /* SD card is inserted*/
+#endif                             /* MTP_STORAGE_ID */
+
+#define MTP_NBR_STORAGE_ID         1U
+#define FREE_SPACE_IN_OBJ_NOT_USED 0xFFFFFFFFU
+
+/* MTP storage type */
+#define MTP_STORAGE_UNDEFINED     0U
+#define MTP_STORAGE_FIXED_ROM     0x0001U
+#define MTP_STORAGE_REMOVABLE_ROM 0x0002U
+#define MTP_STORAGE_FIXED_RAM     0x0003U
+#define MTP_STORAGE_REMOVABLE_RAM 0x0004U
+
+/* MTP file system type */
+#define MTP_FILESYSTEM_UNDEFINED        0U
+#define MTP_FILESYSTEM_GENERIC_FLAT     0x0001U
+#define MTP_FILESYSTEM_GENERIC_HIERARCH 0x0002U
+#define MTP_FILESYSTEM_DCF              0x0003U
+
+/* MTP access capability */
+#define MTP_ACCESS_CAP_RW             0U /* read write */
+#define MTP_ACCESS_CAP_RO_WITHOUT_DEL 0x0001U
+#define MTP_ACCESS_CAP_RO_WITH_DEL    0x0002U
+
+/* MTP standard data types supported */
+#define MTP_DATATYPE_INT8    0x0001U
+#define MTP_DATATYPE_UINT8   0x0002U
+#define MTP_DATATYPE_INT16   0x0003U
+#define MTP_DATATYPE_UINT16  0x0004U
+#define MTP_DATATYPE_INT32   0x0005U
+#define MTP_DATATYPE_UINT32  0x0006U
+#define MTP_DATATYPE_INT64   0x0007U
+#define MTP_DATATYPE_UINT64  0x0008U
+#define MTP_DATATYPE_UINT128 0x000AU
+#define MTP_DATATYPE_STR     0xFFFFU
+
+/* MTP reading only or reading/writing */
+#define MTP_PROP_GET     0x00U
+#define MTP_PROP_GET_SET 0x01U
+
+#endif

+ 98 - 0
class/mtp/usbd_mtp.c

@@ -0,0 +1,98 @@
+/**
+ * @file usbd_mtp.h
+ * @brief
+ *
+ * Copyright (c) 2022 sakumisu
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+#include "usbd_core.h"
+#include "usbd_mtp.h"
+
+/* Device data structure */
+struct mtp_cfg_priv {
+    USB_MEM_ALIGN32 uint8_t device_status;
+} usbd_mtp_cfg;
+
+/* max USB packet size */
+#ifndef CONFIG_USB_HS
+#define MTP_BULK_EP_MPS 64
+#else
+#define MTP_BULK_EP_MPS 512
+#endif
+
+#define MSD_OUT_EP_IDX 0
+#define MSD_IN_EP_IDX  1
+
+/* Describe EndPoints configuration */
+static usbd_endpoint_t mtp_ep_data[2];
+
+/**
+ * @brief Handler called for Class requests not handled by the USB stack.
+ *
+ * @param setup    Information about the request to execute.
+ * @param len       Size of the buffer.
+ * @param data      Buffer containing the request result.
+ *
+ * @return  0 on success, negative errno code on fail.
+ */
+static int mtp_class_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len)
+{
+    USB_LOG_DBG("MTP Class request: "
+                "bRequest 0x%02x\r\n",
+                setup->bRequest);
+
+    switch (setup->bRequest) {
+        case MTP_REQUEST_CANCEL:
+
+            break;
+        case MTP_REQUEST_GET_EXT_EVENT_DATA:
+
+            break;
+        case MTP_REQUEST_RESET:
+
+            break;
+        case MTP_REQUEST_GET_DEVICE_STATUS:
+
+            break;
+
+        default:
+            USB_LOG_WRN("Unhandled MTP Class bRequest 0x%02x\r\n", setup->bRequest);
+            return -1;
+    }
+
+    return 0;
+}
+
+static void usbd_mtp_bulk_out(uint8_t ep)
+{
+}
+
+static void usbd_mtp_bulk_in(uint8_t ep)
+{
+}
+
+static void mtp_notify_handler(uint8_t event, void *arg)
+{
+    switch (event) {
+        case USBD_EVENT_RESET:
+            break;
+
+        default:
+            break;
+    }
+}

+ 36 - 0
class/mtp/usbd_mtp.h

@@ -0,0 +1,36 @@
+/**
+ * @file usbd_mtp.h
+ * @brief
+ *
+ * Copyright (c) 2022 sakumisu
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+#ifndef _USBD_MTP_H
+#define _USBD_MTP_H
+
+#include "usb_mtp.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif

+ 125 - 0
class/mtp/usbh_mtp.c

@@ -0,0 +1,125 @@
+/**
+ * @file usbh_mtp.c
+ * @brief
+ *
+ * Copyright (c) 2022 sakumisu
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+#include "usbh_core.h"
+#include "usbh_mtp.h"
+
+#define DEV_FORMAT "/dev/mtp"
+
+static int usbh_mtp_connect(struct usbh_hubport *hport, uint8_t intf)
+{
+    struct usbh_endpoint_cfg ep_cfg = { 0 };
+    struct usb_endpoint_descriptor *ep_desc;
+    int ret;
+
+    struct usbh_mtp *mtp_class = usb_malloc(sizeof(struct usbh_mtp));
+    if (mtp_class == NULL) {
+        USB_LOG_ERR("Fail to alloc mtp_class\r\n");
+        return -ENOMEM;
+    }
+
+    memset(mtp_class, 0, sizeof(struct usbh_mtp));
+
+    mtp_class->hport = hport;
+    mtp_class->ctrl_intf = intf;
+    mtp_class->data_intf = intf + 1;
+
+    hport->config.intf[intf].priv = mtp_class;
+    hport->config.intf[intf + 1].priv = NULL;
+    strncpy(hport->config.intf[intf].devname, DEV_FORMAT, CONFIG_USBHOST_DEV_NAMELEN);
+
+#ifdef CONFIG_USBHOST_MTP_NOTIFY
+    ep_desc = &hport->config.intf[intf].ep[0].ep_desc;
+    ep_cfg.ep_addr = ep_desc->bEndpointAddress;
+    ep_cfg.ep_type = ep_desc->bmAttributes & USB_ENDPOINT_TYPE_MASK;
+    ep_cfg.ep_mps = ep_desc->wMaxPacketSize;
+    ep_cfg.ep_interval = ep_desc->bInterval;
+    ep_cfg.hport = hport;
+    usbh_ep_alloc(&mtp_class->intin, &ep_cfg);
+
+#endif
+    for (uint8_t i = 0; i < hport->config.intf[intf + 1].intf_desc.bNumEndpoints; i++) {
+        ep_desc = &hport->config.intf[intf + 1].ep[i].ep_desc;
+
+        ep_cfg.ep_addr = ep_desc->bEndpointAddress;
+        ep_cfg.ep_type = ep_desc->bmAttributes & USB_ENDPOINT_TYPE_MASK;
+        ep_cfg.ep_mps = ep_desc->wMaxPacketSize;
+        ep_cfg.ep_interval = ep_desc->bInterval;
+        ep_cfg.hport = hport;
+        if (ep_desc->bEndpointAddress & 0x80) {
+            usbh_ep_alloc(&mtp_class->bulkin, &ep_cfg);
+        } else {
+            usbh_ep_alloc(&mtp_class->bulkout, &ep_cfg);
+        }
+    }
+
+    return ret;
+}
+
+static int usbh_mtp_disconnect(struct usbh_hubport *hport, uint8_t intf)
+{
+    int ret = 0;
+
+    struct usbh_mtp *mtp_class = (struct usbh_mtp *)hport->config.intf[intf].priv;
+
+    if (mtp_class) {
+        if (mtp_class->bulkin) {
+            ret = usb_ep_cancel(mtp_class->bulkin);
+            if (ret < 0) {
+            }
+            usbh_ep_free(mtp_class->bulkin);
+        }
+
+        if (mtp_class->bulkout) {
+            ret = usb_ep_cancel(mtp_class->bulkout);
+            if (ret < 0) {
+            }
+            usbh_ep_free(mtp_class->bulkout);
+        }
+
+        usb_free(mtp_class);
+
+        USB_LOG_INFO("Unregister MTP Class:%s\r\n", hport->config.intf[intf].devname);
+        memset(hport->config.intf[intf].devname, 0, CONFIG_USBHOST_DEV_NAMELEN);
+
+        hport->config.intf[intf].priv = NULL;
+        hport->config.intf[intf + 1].priv = NULL;
+    }
+
+    return ret;
+}
+
+static const struct usbh_class_driver mtp_class_driver = {
+    .driver_name = "mtp",
+    .connect = usbh_mtp_connect,
+    .disconnect = usbh_mtp_disconnect
+};
+
+CLASS_INFO_DEFINE const struct usbh_class_info mtp_class_info = {
+    .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL,
+    .class = USB_MTP_CLASS,
+    .subclass = USB_MTP_SUB_CLASS,
+    .protocol = USB_MTP_PROTOCOL,
+    .vid = 0x00,
+    .pid = 0x00,
+    .class_driver = &mtp_class_driver
+};

+ 47 - 0
class/mtp/usbh_mtp.h

@@ -0,0 +1,47 @@
+/**
+ * @file usbh_mtp.h
+ * @brief
+ *
+ * Copyright (c) 2022 sakumisu
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+#ifndef _USBH_MTP_H
+#define _USBH_MTP_H
+
+#include "usb_mtp.h"
+
+struct usbh_mtp {
+    struct usbh_hubport *hport;
+
+    uint8_t intf;          /* interface number */
+    usbh_epinfo_t bulkin;  /* BULK IN endpoint */
+    usbh_epinfo_t bulkout; /* BULK OUT endpoint */
+#ifdef CONFIG_USBHOST_MTP_NOTIFY
+    usbh_epinfo_t intin; /* Interrupt IN endpoint (optional) */
+#endif
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif

+ 14 - 0
class/printer/usb_printer.h

@@ -0,0 +1,14 @@
+#ifndef _USB_PRINTER_H
+#define _USB_PRINTER_H
+
+#define PRINTER_SUBCLASS 0x01U
+
+#define PRINTER_REQUEST_GET_DEVICE_ID   0x00U
+#define PRINTER_REQUEST_GET_PORT_SATTUS 0x01U
+#define PRINTER_REQUEST_SOFT_RESET      0x02U
+
+#define PRINTER_STATUS_NO_ERROR    0x00U
+#define PRINTER_STATUS_SELECTED    0x08U
+#define PRINTER_STATUS_PAPER_EMPTY 0x10U
+
+#endif

+ 91 - 0
class/printer/usbd_printer.c

@@ -0,0 +1,91 @@
+/**
+ * @file usbd_printer.h
+ * @brief
+ *
+ * Copyright (c) 2022 sakumisu
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+#include "usbd_core.h"
+#include "usbd_printer.h"
+
+/* Device data structure */
+struct printer_cfg_priv {
+    uint8_t *device_id;
+    uint8_t port_status;
+} usbd_printer_cfg;
+
+/**
+ * @brief Handler called for Class requests not handled by the USB stack.
+ *
+ * @param setup    Information about the request to execute.
+ * @param len       Size of the buffer.
+ * @param data      Buffer containing the request result.
+ *
+ * @return  0 on success, negative errno code on fail.
+ */
+static int printer_class_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len)
+{
+    USB_LOG_DBG("Printer Class request: "
+                "bRequest 0x%02x\r\n",
+                setup->bRequest);
+
+    switch (setup->bRequest) {
+        case PRINTER_REQUEST_GET_DEVICE_ID:
+
+            break;
+        case PRINTER_REQUEST_GET_PORT_SATTUS:
+
+            break;
+        case PRINTER_REQUEST_SOFT_RESET:
+
+            break;
+        default:
+            USB_LOG_WRN("Unhandled Printer Class bRequest 0x%02x\r\n", setup->bRequest);
+            return -1;
+    }
+
+    return 0;
+}
+
+static void printer_notify_handler(uint8_t event, void *arg)
+{
+    switch (event) {
+        case USBD_EVENT_RESET:
+            break;
+
+        default:
+            break;
+    }
+}
+
+void usbd_printer_add_interface(usbd_class_t *devclass, usbd_interface_t *intf)
+{
+    static usbd_class_t *last_class = NULL;
+
+    if (last_class != devclass) {
+        last_class = devclass;
+        usbd_class_register(devclass);
+    }
+
+    intf->class_handler = printer_class_request_handler;
+    intf->custom_handler = NULL;
+    intf->vendor_handler = NULL;
+    intf->notify_handler = printer_notify_handler;
+
+    usbd_class_add_interface(devclass, intf);
+}

+ 38 - 0
class/printer/usbd_printer.h

@@ -0,0 +1,38 @@
+/**
+ * @file usbd_printer.h
+ * @brief
+ *
+ * Copyright (c) 2022 sakumisu
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+#ifndef _USBD_PRINTER_H
+#define _USBD_PRINTER_H
+
+#include "usb_printer.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void usbd_printer_add_interface(usbd_class_t *devclass, usbd_interface_t *intf);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif

+ 156 - 0
class/printer/usbh_printer.c

@@ -0,0 +1,156 @@
+/**
+ * @file usbh_printer.c
+ * @brief
+ *
+ * Copyright (c) 2022 sakumisu
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+#include "usbh_core.h"
+#include "usbh_printer.h"
+
+#define DEV_FORMAT "/dev/printer"
+
+static int usbh_printer_get_device_id(struct usbh_printer *printer_class, uint8_t *buffer)
+{
+    struct usb_setup_packet *setup = printer_class->hport->setup;
+    int ret;
+
+    setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE;
+    setup->bRequest = PRINTER_REQUEST_GET_DEVICE_ID;
+    setup->wValue = 0;
+    setup->wIndex = printer_class->intf;
+    setup->wLength = 256;
+
+    return usbh_control_transfer(printer_class->hport->ep0, setup, buffer);
+}
+
+static int usbh_printer_get_port_status(struct usbh_printer *printer_class, uint8_t *buffer)
+{
+    struct usb_setup_packet *setup = printer_class->hport->setup;
+    int ret;
+
+    setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE;
+    setup->bRequest = PRINTER_REQUEST_GET_PORT_SATTUS;
+    setup->wValue = 0;
+    setup->wIndex = printer_class->intf;
+    setup->wLength = 1;
+
+    return usbh_control_transfer(printer_class->hport->ep0, setup, buffer);
+}
+
+static int usbh_printer_soft_reset(struct usbh_printer *printer_class)
+{
+    struct usb_setup_packet *setup = printer_class->hport->setup;
+    int ret;
+
+    setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE;
+    setup->bRequest = PRINTER_REQUEST_SOFT_RESET;
+    setup->wValue = 0;
+    setup->wIndex = printer_class->intf;
+    setup->wLength = 0;
+
+    return usbh_control_transfer(printer_class->hport->ep0, setup, NULL);
+}
+
+static int usbh_printer_connect(struct usbh_hubport *hport, uint8_t intf)
+{
+    struct usbh_endpoint_cfg ep_cfg = { 0 };
+    struct usb_endpoint_descriptor *ep_desc;
+    int ret;
+
+    struct usbh_printer *printer_class = usb_malloc(sizeof(struct usbh_printer));
+    if (printer_class == NULL) {
+        USB_LOG_ERR("Fail to alloc printer_class\r\n");
+        return -ENOMEM;
+    }
+
+    memset(printer_class, 0, sizeof(struct usbh_printer));
+
+    printer_class->hport = hport;
+    printer_class->intf = intf;
+
+    hport->config.intf[intf].priv = printer_class;
+    strncpy(hport->config.intf[intf].devname, DEV_FORMAT, CONFIG_USBHOST_DEV_NAMELEN);
+
+    for (uint8_t i = 0; i < hport->config.intf[intf + 1].intf_desc.bNumEndpoints; i++) {
+        ep_desc = &hport->config.intf[intf + 1].ep[i].ep_desc;
+
+        ep_cfg.ep_addr = ep_desc->bEndpointAddress;
+        ep_cfg.ep_type = ep_desc->bmAttributes & USB_ENDPOINT_TYPE_MASK;
+        ep_cfg.ep_mps = ep_desc->wMaxPacketSize;
+        ep_cfg.ep_interval = ep_desc->bInterval;
+        ep_cfg.hport = hport;
+        if (ep_desc->bEndpointAddress & 0x80) {
+            usbh_ep_alloc(&printer_class->bulkin, &ep_cfg);
+        } else {
+            usbh_ep_alloc(&printer_class->bulkout, &ep_cfg);
+        }
+    }
+
+    // uint8_t *device_id = usb_iomalloc(256);
+    // ret = usbh_printer_get_device_id(printer_class, device_id);
+    return ret;
+}
+
+static int usbh_printer_disconnect(struct usbh_hubport *hport, uint8_t intf)
+{
+    int ret = 0;
+
+    struct usbh_printer *printer_class = (struct usbh_printer *)hport->config.intf[intf].priv;
+
+    if (printer_class) {
+        if (printer_class->bulkin) {
+            ret = usb_ep_cancel(printer_class->bulkin);
+            if (ret < 0) {
+            }
+            usbh_ep_free(printer_class->bulkin);
+        }
+
+        if (printer_class->bulkout) {
+            ret = usb_ep_cancel(printer_class->bulkout);
+            if (ret < 0) {
+            }
+            usbh_ep_free(printer_class->bulkout);
+        }
+
+        usb_free(printer_class);
+
+        USB_LOG_INFO("Unregister Printer Class:%s\r\n", hport->config.intf[intf].devname);
+        memset(hport->config.intf[intf].devname, 0, CONFIG_USBHOST_DEV_NAMELEN);
+
+        hport->config.intf[intf].priv = NULL;
+    }
+
+    return ret;
+}
+
+static const struct usbh_class_driver printer_class_driver = {
+    .driver_name = "printer",
+    .connect = usbh_printer_connect,
+    .disconnect = usbh_printer_disconnect
+};
+
+CLASS_INFO_DEFINE const struct usbh_class_info printer_class_info = {
+    .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL,
+    .class = USB_DEVICE_CLASS_PRINTER,
+    .subclass = PRINTER_SUBCLASS,
+    .protocol = 0x00,
+    .vid = 0x00,
+    .pid = 0x00,
+    .class_driver = &printer_class_driver
+};

+ 44 - 0
class/printer/usbh_printer.h

@@ -0,0 +1,44 @@
+/**
+ * @file usbh_printer.h
+ * @brief
+ *
+ * Copyright (c) 2022 sakumisu
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+#ifndef _USBH_PRINTER_H
+#define _USBH_PRINTER_H
+
+#include "usb_printer.h"
+
+struct usbh_printer {
+    struct usbh_hubport *hport;
+
+    uint8_t intf;          /* interface number */
+    usbh_epinfo_t bulkin;  /* BULK IN endpoint */
+    usbh_epinfo_t bulkout; /* BULK OUT endpoint */
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif

+ 4 - 0
class/template/usb_xxx.h

@@ -0,0 +1,4 @@
+#ifndef _USB_XXX_H
+#define _USB_XXX_H
+
+#endif

+ 46 - 0
class/template/usbd_xxx.c

@@ -0,0 +1,46 @@
+#include "usbd_core.h"
+#include "usbd_xxx.h"
+
+static int xxx_class_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len)
+{
+    USB_LOG_WRN("XXX Class request: "
+                 "bRequest 0x%02x\r\n",
+                 setup->bRequest);
+
+    switch (setup->bRequest) {
+        default:
+            USB_LOG_WRN("Unhandled XXX Class bRequest 0x%02x\r\n", setup->bRequest);
+            return -1;
+    }
+
+    return 0;
+}
+
+static void xxx_notify_handler(uint8_t event, void *arg)
+{
+    switch (event) {
+        case USBD_EVENT_RESET:
+
+            break;
+
+        default:
+            break;
+    }
+}
+
+void usbd_xxx_add_interface(usbd_class_t *devclass, usbd_interface_t *intf)
+{
+    static usbd_class_t *last_class = NULL;
+
+    if (last_class != devclass) {
+        last_class = devclass;
+        usbd_class_register(devclass);
+    }
+
+    intf->class_handler = xxx_class_request_handler;
+    intf->custom_handler = NULL;
+    intf->vendor_handler = NULL;
+    intf->notify_handler = xxx_notify_handler;
+
+    usbd_class_add_interface(devclass, intf);
+}

+ 16 - 0
class/template/usbd_xxx.h

@@ -0,0 +1,16 @@
+#ifndef _USBD_XXX_H_
+#define _USBD_XXX_H_
+
+#include "usb_xxx.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void usbd_xxx_add_interface(usbd_class_t *devclass, usbd_interface_t *intf);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _USBD_XXX_H_ */

+ 93 - 0
class/template/usbh_xxx.c

@@ -0,0 +1,93 @@
+#include "usbh_core.h"
+#include "usbh_xxx.h"
+
+#define DEV_FORMAT "/dev/xxx"
+
+static int usbh_xxx_connect(struct usbh_hubport *hport, uint8_t intf)
+{
+    struct usbh_endpoint_cfg ep_cfg = { 0 };
+    struct usb_endpoint_descriptor *ep_desc;
+    int ret;
+
+    struct usbh_xxx *xxx_class = usb_malloc(sizeof(struct usbh_xxx));
+    if (xxx_class == NULL) {
+        USB_LOG_ERR("Fail to alloc xxx_class\r\n");
+        return -ENOMEM;
+    }
+
+    memset(xxx_class, 0, sizeof(struct usbh_xxx));
+
+    xxx_class->hport = hport;
+    xxx_class->intf = intf;
+
+    hport->config.intf[intf].priv = xxx_class;
+    strncpy(hport->config.intf[intf].devname, DEV_FORMAT, CONFIG_USBHOST_DEV_NAMELEN);
+
+    for (uint8_t i = 0; i < hport->config.intf[intf + 1].intf_desc.bNumEndpoints; i++) {
+        ep_desc = &hport->config.intf[intf + 1].ep[i].ep_desc;
+
+        ep_cfg.ep_addr = ep_desc->bEndpointAddress;
+        ep_cfg.ep_type = ep_desc->bmAttributes & USB_ENDPOINT_TYPE_MASK;
+        ep_cfg.ep_mps = ep_desc->wMaxPacketSize;
+        ep_cfg.ep_interval = ep_desc->bInterval;
+        ep_cfg.hport = hport;
+        if (ep_desc->bEndpointAddress & 0x80) {
+            usbh_ep_alloc(&rndis_class->bulkin, &ep_cfg);
+        } else {
+            usbh_ep_alloc(&rndis_class->bulkout, &ep_cfg);
+        }
+    }
+
+    return ret;
+
+}
+
+
+static int usbh_xxx_disconnect(struct usbh_hubport *hport, uint8_t intf)
+{
+    int ret = 0;
+
+    struct usbh_xxx *xxx_class = (struct usbh_xxx *)hport->config.intf[intf].priv;
+
+    if (xxx_class) {
+        if (xxx_class->bulkin) {
+            ret = usb_ep_cancel(xxx_class->bulkin);
+            if (ret < 0) {
+            }
+            usbh_ep_free(xxx_class->bulkin);
+        }
+
+        if (xxx_class->bulkout) {
+            ret = usb_ep_cancel(xxx_class->bulkout);
+            if (ret < 0) {
+            }
+            usbh_ep_free(xxx_class->bulkout);
+        }
+
+        usb_free(xxx_class);
+
+        USB_LOG_INFO("Unregister xxx Class:%s\r\n", hport->config.intf[intf].devname);
+        memset(hport->config.intf[intf].devname, 0, CONFIG_USBHOST_DEV_NAMELEN);
+
+        hport->config.intf[intf].priv = NULL;
+    }
+
+    return ret;
+}
+
+
+static const struct usbh_class_driver xxx_class_driver = {
+    .driver_name = "xxx",
+    .connect = usbh_xxx_connect,
+    .disconnect = usbh_xxx_disconnect
+};
+
+CLASS_INFO_DEFINE const struct usbh_class_info xxx_class_info = {
+    .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL,
+    .class = 0,
+    .subclass = 0,
+    .protocol = 0,
+    .vid = 0x00,
+    .pid = 0x00,
+    .class_driver = &xxx_class_driver
+};

+ 14 - 0
class/template/usbh_xxx.h

@@ -0,0 +1,14 @@
+#ifndef _USBH_XXX_H
+#define _USBH_XXX_H
+
+#include "usb_xxx.h"
+
+struct usbh_xxx {
+    struct usbh_hubport *hport;
+
+    uint8_t intf; /* interface number */
+    usbh_epinfo_t intin;  /* INTR IN endpoint */
+    usbh_epinfo_t intout; /* INTR OUT endpoint */
+};
+
+#endif