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 17df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#include <android-base/logging.h> 18487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <cutils/properties.h> 19487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <dirent.h> 20487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <errno.h> 21df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#include <fcntl.h> 22487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <linux/usb/ch9.h> 23487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <stdio.h> 24487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <stdlib.h> 25487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <string.h> 26df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#include <sys/stat.h> 27487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <sys/ioctl.h> 28487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <sys/types.h> 29487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <sys/endian.h> 30487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <unistd.h> 31487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 32df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#include "MtpDevHandle.h" 33487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 34df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangnamespace android { 35487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 36df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangconstexpr char mtp_dev_path[] = "/dev/mtp_usb"; 37487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 38487be61fb0a38873aec1d12da92437fba5e728f2Jerry ZhangMtpDevHandle::MtpDevHandle() 39487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang : mFd(-1) {}; 40487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 41487be61fb0a38873aec1d12da92437fba5e728f2Jerry ZhangMtpDevHandle::~MtpDevHandle() {} 42487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 43df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangint MtpDevHandle::read(void *data, size_t len) { 44487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang return ::read(mFd, data, len); 45487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang} 46487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 47df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangint MtpDevHandle::write(const void *data, size_t len) { 48487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang return ::write(mFd, data, len); 49487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang} 50487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 515410756e75fb7567540f13d3813f42f4ac3838a0Jerry Zhangint MtpDevHandle::receiveFile(mtp_file_range mfr, bool) { 52487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang return ioctl(mFd, MTP_RECEIVE_FILE, reinterpret_cast<unsigned long>(&mfr)); 53487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang} 54487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 55487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangint MtpDevHandle::sendFile(mtp_file_range mfr) { 56487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang return ioctl(mFd, MTP_SEND_FILE_WITH_HEADER, reinterpret_cast<unsigned long>(&mfr)); 57487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang} 58487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 59487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangint MtpDevHandle::sendEvent(mtp_event me) { 60487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang return ioctl(mFd, MTP_SEND_EVENT, reinterpret_cast<unsigned long>(&me)); 61487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang} 62487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 6363dac45aa868b9048c028967e9865c90a9ba544dJerry Zhangint MtpDevHandle::start(bool /* ptp */) { 64df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang mFd.reset(TEMP_FAILURE_RETRY(open(mtp_dev_path, O_RDWR))); 65487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang if (mFd == -1) return -1; 66487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang return 0; 67487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang} 68487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 69487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangvoid MtpDevHandle::close() { 70487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang mFd.reset(); 71487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang} 72487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 73df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang} // namespace android 74