From 56118b5b385adad0ff301f67be2cf601432d94ba Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Tue, 11 May 2010 17:16:59 -0400 Subject: Checkpoint work on MTP and PTP investigation. This change includes work in progress on a C++ library for both host and device MTP and PTP support. Currently the makefile builds two test programs: mtptest - a command line test program that implements a small subset of device side MTP. Requires a kernel driver that has not been checked in yet. ptptest - a host tool to test USB host support for detecting and communicating with digital cameras over PTP. Runs on Linux host. Later this will be reformulated as a native library that will be used in the media process. Change-Id: I81aab279975b600b59d99013ab97f9adf0b58da7 Signed-off-by: Mike Lockwood --- media/mtp/MtpClient.cpp | 136 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 media/mtp/MtpClient.cpp (limited to 'media/mtp/MtpClient.cpp') diff --git a/media/mtp/MtpClient.cpp b/media/mtp/MtpClient.cpp new file mode 100644 index 0000000..5e4adb4 --- /dev/null +++ b/media/mtp/MtpClient.cpp @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed 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 +#include +#include +#include +#include +#include +#include + +#include + +#include "MtpClient.h" +#include "MtpDebug.h" +#include "MtpStringBuffer.h" + +MtpClient::MtpClient(struct usb_endpoint *ep_in, struct usb_endpoint *ep_out, + struct usb_endpoint *ep_intr) + : mEndpointIn(ep_in), + mEndpointOut(ep_out), + mEndpointIntr(ep_intr), + mSessionID(0), + mTransactionID(0) +{ + +} + +MtpClient::~MtpClient() { +} + + +bool MtpClient::openSession() { +printf("openSession\n"); + mSessionID = 0; + mTransactionID = 0; + MtpSessionID newSession = 1; + mRequest.reset(); + mRequest.setParameter(1, newSession); + if (!sendRequest(MTP_OPERATION_OPEN_SESSION)) + return false; + MtpResponseCode ret = readResponse(); + if (ret == MTP_RESPONSE_SESSION_ALREADY_OPEN) + newSession = mResponse.getParameter(1); + else if (ret != MTP_RESPONSE_OK) + return false; + + mSessionID = newSession; + mTransactionID = 1; + return true; +} + +bool MtpClient::getDeviceInfo() { + mRequest.reset(); + if (!sendRequest(MTP_OPERATION_GET_DEVICE_INFO)) + return false; + if (!readData()) + return false; + MtpResponseCode ret = readResponse(); + if (ret == MTP_RESPONSE_OK) { + MtpStringBuffer string; + + // fill in device info + printf("MTP standard version: %d\n", mData.getUInt16()); + printf("MTP Vendor Extension ID: %d\n", mData.getUInt32()); + printf("MTP vendor extension version: %d\n", mData.getUInt16()); + mData.getString(string); + printf("vendor extension desc %s\n", (const char *)string); + + return true; + } + return false; +} + +bool MtpClient::closeSession() { + return true; +} + +bool MtpClient::sendRequest(MtpOperationCode operation) { + printf("sendRequest: %s\n", MtpDebug::getOperationCodeName(operation)); + mRequest.setOperationCode(operation); + if (mTransactionID > 0) + mRequest.setTransactionID(mTransactionID++); + int ret = mRequest.write(mEndpointOut); + mRequest.dump(); + return (ret > 0); +} + +bool MtpClient::sendData(MtpOperationCode operation) { + printf("sendData\n"); + mData.setOperationCode(mRequest.getOperationCode()); + mData.setTransactionID(mRequest.getTransactionID()); + int ret = mData.write(mEndpointOut); + mData.dump(); + return (ret > 0); +} + +bool MtpClient::readData() { + int ret = mData.read(mEndpointIn); + printf("readData returned %d\n", ret); + if (ret >= MTP_CONTAINER_HEADER_SIZE) { + mData.dump(); + return true; + } + else { + printf("readResponse failed\n"); + return false; + } +} + +MtpResponseCode MtpClient::readResponse() { + printf("readResponse\n"); + int ret = mResponse.read(mEndpointIn); + if (ret >= MTP_CONTAINER_HEADER_SIZE) { + mResponse.dump(); + return mResponse.getResponseCode(); + } + else { + printf("readResponse failed\n"); + return -1; + } +} + -- cgit v1.1