1487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang/* 2487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * Copyright (C) 2016 The Android Open Source Project 3487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * 4487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 5487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * you may not use this file except in compliance with the License. 6487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * You may obtain a copy of the License at 7487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * 8487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * http://www.apache.org/licenses/LICENSE-2.0 9487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * 10487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * Unless required by applicable law or agreed to in writing, software 11487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * distributed under the License is distributed on an "AS IS" BASIS, 12487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * See the License for the specific language governing permissions and 14487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * limitations under the License. 15487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang */ 16487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 17487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#ifndef _MTP_FFS_HANDLE_H 18487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#define _MTP_FFS_HANDLE_H 19487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 20487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <android-base/unique_fd.h> 21487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <IMtpHandle.h> 22487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 23487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangnamespace android { 24487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 25487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangclass MtpFfsHandleTest; 26487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 27487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangclass MtpFfsHandle : public IMtpHandle { 28487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang friend class android::MtpFfsHandleTest; 29487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangprivate: 30487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang int writeHandle(int fd, const void *data, int len); 31487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang int readHandle(int fd, void *data, int len); 32487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang int spliceReadHandle(int fd, int fd_out, int len); 33487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang bool initFunctionfs(); 34487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang void closeConfig(); 35487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang void closeEndpoints(); 36487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 37487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang bool mPtp; 38487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 390475d911fcc1e6e1b4f49626f59a0a07038590faJerry Zhang std::timed_mutex mLock; 40487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 41487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang android::base::unique_fd mControl; 42487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang // "in" from the host's perspective => sink for mtp server 43487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang android::base::unique_fd mBulkIn; 44487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang // "out" from the host's perspective => source for mtp server 45487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang android::base::unique_fd mBulkOut; 46487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang android::base::unique_fd mIntr; 47487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 48487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang int mMaxWrite; 49487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang int mMaxRead; 50487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 51cc9d0fdd302cf997607055e0a8b5559509cba766Jerry Zhang std::vector<char> mBuffer1; 52cc9d0fdd302cf997607055e0a8b5559509cba766Jerry Zhang std::vector<char> mBuffer2; 53cc9d0fdd302cf997607055e0a8b5559509cba766Jerry Zhang 54487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangpublic: 55487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang int read(void *data, int len); 56487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang int write(const void *data, int len); 57487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 585410756e75fb7567540f13d3813f42f4ac3838a0Jerry Zhang int receiveFile(mtp_file_range mfr, bool zero_packet); 59487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang int sendFile(mtp_file_range mfr); 60487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang int sendEvent(mtp_event me); 61487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 62b4f54266042f0553b41409a3d1f0542b684c2129Jerry Zhang /** 63b4f54266042f0553b41409a3d1f0542b684c2129Jerry Zhang * Open ffs endpoints and allocate necessary kernel and user memory. 64b4f54266042f0553b41409a3d1f0542b684c2129Jerry Zhang * Will sleep until endpoints are enabled, for up to 1 second. 65b4f54266042f0553b41409a3d1f0542b684c2129Jerry Zhang */ 66487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang int start(); 67487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang void close(); 68487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 69487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang int configure(bool ptp); 70487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 71487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang MtpFfsHandle(); 72487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang ~MtpFfsHandle(); 73487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang}; 74487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 75487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangstruct mtp_data_header { 76487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang /* length of packet, including this header */ 77487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang __le32 length; 78487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang /* container type (2 for data packet) */ 79487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang __le16 type; 80487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang /* MTP command code */ 81487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang __le16 command; 82487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang /* MTP transaction ID */ 83487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang __le32 transaction_id; 84487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang}; 85487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 86487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang} // namespace android 87487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 88487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#endif // _MTP_FF_HANDLE_H 89487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 90