xref: /aosp_15_r20/frameworks/av/media/mtp/MtpFfsHandle.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker #ifndef _MTP_FFS_HANDLE_H
18*ec779b8eSAndroid Build Coastguard Worker #define _MTP_FFS_HANDLE_H
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <android-base/properties.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <android-base/unique_fd.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <linux/aio_abi.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <mutex>
24*ec779b8eSAndroid Build Coastguard Worker #include <sys/poll.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <time.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <thread>
27*ec779b8eSAndroid Build Coastguard Worker #include <vector>
28*ec779b8eSAndroid Build Coastguard Worker 
29*ec779b8eSAndroid Build Coastguard Worker #include <IMtpHandle.h>
30*ec779b8eSAndroid Build Coastguard Worker 
31*ec779b8eSAndroid Build Coastguard Worker namespace android {
32*ec779b8eSAndroid Build Coastguard Worker 
33*ec779b8eSAndroid Build Coastguard Worker constexpr int NUM_IO_BUFS = 2;
34*ec779b8eSAndroid Build Coastguard Worker 
35*ec779b8eSAndroid Build Coastguard Worker struct io_buffer {
36*ec779b8eSAndroid Build Coastguard Worker     std::vector<struct iocb> iocbs;     // Holds memory for all iocbs. Not used directly.
37*ec779b8eSAndroid Build Coastguard Worker     std::vector<struct iocb*> iocb;     // Pointers to individual iocbs, for syscalls
38*ec779b8eSAndroid Build Coastguard Worker     std::vector<unsigned char> bufs;    // A large buffer, used with filesystem io
39*ec779b8eSAndroid Build Coastguard Worker     std::vector<unsigned char*> buf;    // Pointers within the larger buffer, for syscalls
40*ec779b8eSAndroid Build Coastguard Worker     unsigned actual;                    // The number of buffers submitted for this request
41*ec779b8eSAndroid Build Coastguard Worker };
42*ec779b8eSAndroid Build Coastguard Worker 
43*ec779b8eSAndroid Build Coastguard Worker template <class T> class MtpFfsHandleTest;
44*ec779b8eSAndroid Build Coastguard Worker 
45*ec779b8eSAndroid Build Coastguard Worker class MtpFfsHandle : public IMtpHandle {
46*ec779b8eSAndroid Build Coastguard Worker     template <class T> friend class MtpFfsHandleTest;
47*ec779b8eSAndroid Build Coastguard Worker protected:
48*ec779b8eSAndroid Build Coastguard Worker     void closeConfig();
49*ec779b8eSAndroid Build Coastguard Worker     void closeEndpoints();
50*ec779b8eSAndroid Build Coastguard Worker     void advise(int fd);
51*ec779b8eSAndroid Build Coastguard Worker     int handleControlRequest(const struct usb_ctrlrequest *request);
52*ec779b8eSAndroid Build Coastguard Worker     int doAsync(void* data, size_t len, bool read, bool zero_packet);
53*ec779b8eSAndroid Build Coastguard Worker     int handleEvent();
54*ec779b8eSAndroid Build Coastguard Worker     void cancelTransaction();
55*ec779b8eSAndroid Build Coastguard Worker     void doSendEvent(mtp_event me);
56*ec779b8eSAndroid Build Coastguard Worker     bool openEndpoints(bool ptp);
57*ec779b8eSAndroid Build Coastguard Worker 
58*ec779b8eSAndroid Build Coastguard Worker     static int getPacketSize(int ffs_fd);
59*ec779b8eSAndroid Build Coastguard Worker 
60*ec779b8eSAndroid Build Coastguard Worker     bool mCanceled;
61*ec779b8eSAndroid Build Coastguard Worker     bool mBatchCancel;
62*ec779b8eSAndroid Build Coastguard Worker 
63*ec779b8eSAndroid Build Coastguard Worker     std::vector<std::thread> mChildThreads;
64*ec779b8eSAndroid Build Coastguard Worker 
65*ec779b8eSAndroid Build Coastguard Worker     android::base::unique_fd mControl;
66*ec779b8eSAndroid Build Coastguard Worker     // "in" from the host's perspective => sink for mtp server
67*ec779b8eSAndroid Build Coastguard Worker     android::base::unique_fd mBulkIn;
68*ec779b8eSAndroid Build Coastguard Worker     // "out" from the host's perspective => source for mtp server
69*ec779b8eSAndroid Build Coastguard Worker     android::base::unique_fd mBulkOut;
70*ec779b8eSAndroid Build Coastguard Worker     android::base::unique_fd mIntr;
71*ec779b8eSAndroid Build Coastguard Worker 
72*ec779b8eSAndroid Build Coastguard Worker     aio_context_t mCtx;
73*ec779b8eSAndroid Build Coastguard Worker 
74*ec779b8eSAndroid Build Coastguard Worker     android::base::unique_fd mEventFd;
75*ec779b8eSAndroid Build Coastguard Worker     struct pollfd mPollFds[2];
76*ec779b8eSAndroid Build Coastguard Worker 
77*ec779b8eSAndroid Build Coastguard Worker     struct io_buffer mIobuf[NUM_IO_BUFS];
78*ec779b8eSAndroid Build Coastguard Worker 
79*ec779b8eSAndroid Build Coastguard Worker     // Submit an io request of given length. Return amount submitted or -1.
80*ec779b8eSAndroid Build Coastguard Worker     int iobufSubmit(struct io_buffer *buf, int fd, unsigned length, bool read);
81*ec779b8eSAndroid Build Coastguard Worker 
82*ec779b8eSAndroid Build Coastguard Worker     // Cancel submitted requests from start to end in the given array. Return 0 or -1.
83*ec779b8eSAndroid Build Coastguard Worker     int cancelEvents(struct iocb **iocb, struct io_event *events, unsigned start, unsigned end,
84*ec779b8eSAndroid Build Coastguard Worker 		     bool is_batch_cancel);
85*ec779b8eSAndroid Build Coastguard Worker 
86*ec779b8eSAndroid Build Coastguard Worker     // Wait for at minimum the given number of events. Returns the amount of data in the returned
87*ec779b8eSAndroid Build Coastguard Worker     // events. Increments counter by the number of events returned.
88*ec779b8eSAndroid Build Coastguard Worker     int waitEvents(struct io_buffer *buf, int min_events, struct io_event *events, int *counter);
89*ec779b8eSAndroid Build Coastguard Worker 
90*ec779b8eSAndroid Build Coastguard Worker public:
91*ec779b8eSAndroid Build Coastguard Worker     int read(void *data, size_t len) override;
92*ec779b8eSAndroid Build Coastguard Worker     int write(const void *data, size_t len) override;
93*ec779b8eSAndroid Build Coastguard Worker 
94*ec779b8eSAndroid Build Coastguard Worker     int receiveFile(mtp_file_range mfr, bool zero_packet) override;
95*ec779b8eSAndroid Build Coastguard Worker     int sendFile(mtp_file_range mfr) override;
96*ec779b8eSAndroid Build Coastguard Worker     int sendEvent(mtp_event me) override;
97*ec779b8eSAndroid Build Coastguard Worker 
98*ec779b8eSAndroid Build Coastguard Worker     int start(bool ptp) override;
99*ec779b8eSAndroid Build Coastguard Worker     void close() override;
100*ec779b8eSAndroid Build Coastguard Worker 
101*ec779b8eSAndroid Build Coastguard Worker     bool writeDescriptors(bool ptp);
102*ec779b8eSAndroid Build Coastguard Worker 
103*ec779b8eSAndroid Build Coastguard Worker     MtpFfsHandle(int controlFd);
104*ec779b8eSAndroid Build Coastguard Worker     ~MtpFfsHandle();
105*ec779b8eSAndroid Build Coastguard Worker };
106*ec779b8eSAndroid Build Coastguard Worker 
107*ec779b8eSAndroid Build Coastguard Worker struct mtp_data_header {
108*ec779b8eSAndroid Build Coastguard Worker     /* length of packet, including this header */
109*ec779b8eSAndroid Build Coastguard Worker     __le32 length;
110*ec779b8eSAndroid Build Coastguard Worker     /* container type (2 for data packet) */
111*ec779b8eSAndroid Build Coastguard Worker     __le16 type;
112*ec779b8eSAndroid Build Coastguard Worker     /* MTP command code */
113*ec779b8eSAndroid Build Coastguard Worker     __le16 command;
114*ec779b8eSAndroid Build Coastguard Worker     /* MTP transaction ID */
115*ec779b8eSAndroid Build Coastguard Worker     __le32 transaction_id;
116*ec779b8eSAndroid Build Coastguard Worker };
117*ec779b8eSAndroid Build Coastguard Worker 
118*ec779b8eSAndroid Build Coastguard Worker } // namespace android
119*ec779b8eSAndroid Build Coastguard Worker 
120*ec779b8eSAndroid Build Coastguard Worker #endif // _MTP_FFS_HANDLE_H
121*ec779b8eSAndroid Build Coastguard Worker 
122