1873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood/* 2873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * Copyright (C) 2010 The Android Open Source Project 3873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * 4873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 5873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * you may not use this file except in compliance with the License. 6873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * You may obtain a copy of the License at 7873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * 8873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 9873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * 10873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * Unless required by applicable law or agreed to in writing, software 11873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 12873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * See the License for the specific language governing permissions and 14873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood * limitations under the License. 15873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood */ 16873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood 17873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#define LOG_TAG "MtpEventPacket" 18873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood 19873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#include <stdio.h> 20873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#include <sys/types.h> 21873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#include <fcntl.h> 22873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#include <sys/ioctl.h> 23873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood 24be9a95ce176e94c54f08454dc19e500546578154Mike Lockwood#ifdef MTP_DEVICE 258065e2056073808716db32136d7acfd50eeab924Mike Lockwood#include <linux/usb/f_mtp.h> 26be9a95ce176e94c54f08454dc19e500546578154Mike Lockwood#endif 27873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood 28873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#include "MtpEventPacket.h" 29873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood 3042d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood#include <usbhost/usbhost.h> 3142d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood 32873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwoodnamespace android { 33873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood 34873871f3e75831bcda6c3f75bb4d53355ca5c53aMike LockwoodMtpEventPacket::MtpEventPacket() 35873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood : MtpPacket(512) 36873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood{ 37873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood} 38873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood 39873871f3e75831bcda6c3f75bb4d53355ca5c53aMike LockwoodMtpEventPacket::~MtpEventPacket() { 40873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood} 41873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood 42873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#ifdef MTP_DEVICE 43873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwoodint MtpEventPacket::write(int fd) { 44873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood struct mtp_event event; 45873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood 46873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize); 47873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_EVENT); 48873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood 49873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood event.data = mBuffer; 50873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood event.length = mPacketSize; 51873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood int ret = ::ioctl(fd, MTP_SEND_EVENT, (unsigned long)&event); 52873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood return (ret < 0 ? ret : 0); 53873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood} 54873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#endif 55873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood 56873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#ifdef MTP_HOST 578a7ffae09a019de7109b30c505561c453910bde1Daichi Hironoint MtpEventPacket::sendRequest(struct usb_request *request) { 5842d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood request->buffer = mBuffer; 5942d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood request->buffer_length = mBufferSize; 608a7ffae09a019de7109b30c505561c453910bde1Daichi Hirono mPacketSize = 0; 618a7ffae09a019de7109b30c505561c453910bde1Daichi Hirono if (usb_request_queue(request)) { 628a7ffae09a019de7109b30c505561c453910bde1Daichi Hirono ALOGE("usb_endpoint_queue failed, errno: %d", errno); 638a7ffae09a019de7109b30c505561c453910bde1Daichi Hirono return -1; 648a7ffae09a019de7109b30c505561c453910bde1Daichi Hirono } 658a7ffae09a019de7109b30c505561c453910bde1Daichi Hirono return 0; 668a7ffae09a019de7109b30c505561c453910bde1Daichi Hirono} 678a7ffae09a019de7109b30c505561c453910bde1Daichi Hirono 688a7ffae09a019de7109b30c505561c453910bde1Daichi Hironoint MtpEventPacket::readResponse(struct usb_device *device) { 698a7ffae09a019de7109b30c505561c453910bde1Daichi Hirono struct usb_request* const req = usb_request_wait(device); 708a7ffae09a019de7109b30c505561c453910bde1Daichi Hirono if (req) { 718a7ffae09a019de7109b30c505561c453910bde1Daichi Hirono mPacketSize = req->actual_length; 728a7ffae09a019de7109b30c505561c453910bde1Daichi Hirono return req->actual_length; 738a7ffae09a019de7109b30c505561c453910bde1Daichi Hirono } else { 748a7ffae09a019de7109b30c505561c453910bde1Daichi Hirono return -1; 758a7ffae09a019de7109b30c505561c453910bde1Daichi Hirono } 76873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood} 77873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood#endif 78873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood 79873871f3e75831bcda6c3f75bb4d53355ca5c53aMike Lockwood} // namespace android 80