1acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood/* 2acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Copyright (C) 2011 The Android Open Source Project 3acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 4acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 5acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * you may not use this file except in compliance with the License. 6acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * You may obtain a copy of the License at 7acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 8acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 9acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 10acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Unless required by applicable law or agreed to in writing, software 11acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 12acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * See the License for the specific language governing permissions and 14acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * limitations under the License. 15acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 16acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 17acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#define LOG_TAG "UsbDeviceConnectionJNI" 18acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 19acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include "utils/Log.h" 20acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 21acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include "jni.h" 22acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include "JNIHelp.h" 23acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include "android_runtime/AndroidRuntime.h" 24acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 25acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include <usbhost/usbhost.h> 26acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 27acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include <stdio.h> 28acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include <sys/types.h> 29acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include <sys/stat.h> 30acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood#include <fcntl.h> 31acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 32acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodusing namespace android; 33acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 34acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jfieldID field_context; 35acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 36acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstruct usb_device* get_device_from_object(JNIEnv* env, jobject connection) 37acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 384838e338129e09a37b8c8ad5e44f85ec5cd3aea1Ashok Bhat return (struct usb_device*)env->GetLongField(connection, field_context); 39acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 40acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 41acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jboolean 42acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_open(JNIEnv *env, jobject thiz, jstring deviceName, 43acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jobject fileDescriptor) 44acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 45a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); 46acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood // duplicate the file descriptor, since ParcelFileDescriptor will eventually close its copy 47acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood fd = dup(fd); 48acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (fd < 0) 494838e338129e09a37b8c8ad5e44f85ec5cd3aea1Ashok Bhat return JNI_FALSE; 50acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 51acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood const char *deviceNameStr = env->GetStringUTFChars(deviceName, NULL); 52acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = usb_device_new(deviceNameStr, fd); 53acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (device) { 544838e338129e09a37b8c8ad5e44f85ec5cd3aea1Ashok Bhat env->SetLongField(thiz, field_context, (jlong)device); 55acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } else { 563762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("usb_device_open failed for %s", deviceNameStr); 57acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood close(fd); 58acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 59acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 60acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood env->ReleaseStringUTFChars(deviceName, deviceNameStr); 614838e338129e09a37b8c8ad5e44f85ec5cd3aea1Ashok Bhat return (device != NULL) ? JNI_TRUE : JNI_FALSE; 62acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 63acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 64acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic void 65acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_close(JNIEnv *env, jobject thiz) 66acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 675baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("close\n"); 68acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 69acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (device) { 70acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood usb_device_close(device); 714838e338129e09a37b8c8ad5e44f85ec5cd3aea1Ashok Bhat env->SetLongField(thiz, field_context, 0); 72acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 73acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 74acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 75acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jint 76acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_get_fd(JNIEnv *env, jobject thiz) 77acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 78acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 79acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (!device) { 803762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("device is closed in native_get_fd"); 81acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return -1; 82acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 83acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return usb_device_get_fd(device); 84acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 85acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 86a88b42d569a91290477d8f5731a2ee43931271daMike Lockwoodstatic jbyteArray 87a88b42d569a91290477d8f5731a2ee43931271daMike Lockwoodandroid_hardware_UsbDeviceConnection_get_desc(JNIEnv *env, jobject thiz) 88a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood{ 89a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood char buffer[16384]; 90a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood int fd = android_hardware_UsbDeviceConnection_get_fd(env, thiz); 91a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood if (fd < 0) return NULL; 92a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood lseek(fd, 0, SEEK_SET); 93a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood int length = read(fd, buffer, sizeof(buffer)); 94a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood if (length < 0) return NULL; 95a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood 96a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood jbyteArray ret = env->NewByteArray(length); 97a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood if (ret) { 98a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood jbyte* bytes = (jbyte*)env->GetPrimitiveArrayCritical(ret, 0); 99a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood if (bytes) { 100a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood memcpy(bytes, buffer, length); 101a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood env->ReleasePrimitiveArrayCritical(ret, bytes, 0); 102a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood } 103a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood } 104a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood return ret; 105a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood} 106a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood 107acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jboolean 108acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_claim_interface(JNIEnv *env, jobject thiz, 1094838e338129e09a37b8c8ad5e44f85ec5cd3aea1Ashok Bhat jint interfaceID, jboolean force) 110acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 111acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 112acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (!device) { 1133762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("device is closed in native_claim_interface"); 1144838e338129e09a37b8c8ad5e44f85ec5cd3aea1Ashok Bhat return JNI_FALSE; 115acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 116acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 117acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood int ret = usb_device_claim_interface(device, interfaceID); 118acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (ret && force && errno == EBUSY) { 119acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood // disconnect kernel driver and try again 120acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood usb_device_connect_kernel_driver(device, interfaceID, false); 121acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood ret = usb_device_claim_interface(device, interfaceID); 122acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 1234838e338129e09a37b8c8ad5e44f85ec5cd3aea1Ashok Bhat return (ret == 0) ? JNI_TRUE : JNI_FALSE; 124acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 125acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 1267531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwoodstatic jboolean 1274838e338129e09a37b8c8ad5e44f85ec5cd3aea1Ashok Bhatandroid_hardware_UsbDeviceConnection_release_interface(JNIEnv *env, jobject thiz, jint interfaceID) 128acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 129acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 130acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (!device) { 1313762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("device is closed in native_release_interface"); 1327531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood return JNI_FALSE; 133acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 134acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood int ret = usb_device_release_interface(device, interfaceID); 135acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (ret == 0) { 136acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood // allow kernel to reconnect its driver 137acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood usb_device_connect_kernel_driver(device, interfaceID, true); 138acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 1397531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood return (ret == 0) ? JNI_TRUE : JNI_FALSE; 1407531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood} 1417531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood 1427531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwoodstatic jboolean 1437531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwoodandroid_hardware_UsbDeviceConnection_set_interface(JNIEnv *env, jobject thiz, jint interfaceID, 1447531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood jint alternateSetting) 1457531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood{ 1467531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 1477531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood if (!device) { 1487531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood ALOGE("device is closed in native_set_interface"); 1497531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood return JNI_FALSE; 1507531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood } 1517531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood int ret = usb_device_set_interface(device, interfaceID, alternateSetting); 1527531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood return (ret == 0) ? JNI_TRUE : JNI_FALSE; 1537531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood} 1547531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood 1557531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwoodstatic jboolean 1567531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwoodandroid_hardware_UsbDeviceConnection_set_configuration(JNIEnv *env, jobject thiz, jint configurationID) 1577531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood{ 1587531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 1597531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood if (!device) { 1607531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood ALOGE("device is closed in native_set_configuration"); 1617531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood return JNI_FALSE; 1627531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood } 1637531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood int ret = usb_device_set_configuration(device, configurationID); 1647531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood return (ret == 0) ? JNI_TRUE : JNI_FALSE; 165acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 166acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 167acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jint 168acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_control_request(JNIEnv *env, jobject thiz, 169acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jint requestType, jint request, jint value, jint index, 1706c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown jbyteArray buffer, jint start, jint length, jint timeout) 171acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 172acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 173acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (!device) { 1743762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("device is closed in native_control_request"); 175acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return -1; 176acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 177acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 178acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jbyte* bufferBytes = NULL; 179acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (buffer) { 1806c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown bufferBytes = (jbyte*)env->GetPrimitiveArrayCritical(buffer, NULL); 181acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 182acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 183acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jint result = usb_device_control_transfer(device, requestType, request, 1846c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown value, index, bufferBytes + start, length, timeout); 185acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 1866c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown if (bufferBytes) { 1876c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown env->ReleasePrimitiveArrayCritical(buffer, bufferBytes, 0); 1886c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown } 189acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 190acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return result; 191acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 192acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 193acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jint 194acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_bulk_request(JNIEnv *env, jobject thiz, 1956c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown jint endpoint, jbyteArray buffer, jint start, jint length, jint timeout) 196acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 197acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 198acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (!device) { 1993762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("device is closed in native_control_request"); 200acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return -1; 201acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 202acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 203acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jbyte* bufferBytes = NULL; 204acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (buffer) { 2056c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown bufferBytes = (jbyte*)env->GetPrimitiveArrayCritical(buffer, NULL); 206acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 207acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 2086c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown jint result = usb_device_bulk_transfer(device, endpoint, bufferBytes + start, length, timeout); 209acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 2106c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown if (bufferBytes) { 2116c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown env->ReleasePrimitiveArrayCritical(buffer, bufferBytes, 0); 2126c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown } 213acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 214acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return result; 215acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 216acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 217acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jobject 218acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_request_wait(JNIEnv *env, jobject thiz) 219acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 220acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 221acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (!device) { 2223762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("device is closed in native_request_wait"); 223acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return NULL; 224acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 225acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 226acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_request* request = usb_request_wait(device); 227acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (request) 228acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return (jobject)request->client_data; 229acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood else 230acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return NULL; 231acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 232acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 233acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic jstring 234acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodandroid_hardware_UsbDeviceConnection_get_serial(JNIEnv *env, jobject thiz) 235acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 236acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood struct usb_device* device = get_device_from_object(env, thiz); 237acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (!device) { 2383762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("device is closed in native_request_wait"); 239acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return NULL; 240acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 241acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood char* serial = usb_device_get_serial(device); 242acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (!serial) 243acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return NULL; 244acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jstring result = env->NewStringUTF(serial); 245acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood free(serial); 246acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return result; 247acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 248acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 249acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodstatic JNINativeMethod method_table[] = { 250acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood {"native_open", "(Ljava/lang/String;Ljava/io/FileDescriptor;)Z", 251acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood (void *)android_hardware_UsbDeviceConnection_open}, 252acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood {"native_close", "()V", (void *)android_hardware_UsbDeviceConnection_close}, 253acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood {"native_get_fd", "()I", (void *)android_hardware_UsbDeviceConnection_get_fd}, 254a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood {"native_get_desc", "()[B", (void *)android_hardware_UsbDeviceConnection_get_desc}, 255acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood {"native_claim_interface", "(IZ)Z",(void *)android_hardware_UsbDeviceConnection_claim_interface}, 256acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood {"native_release_interface","(I)Z", (void *)android_hardware_UsbDeviceConnection_release_interface}, 2577531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood {"native_set_interface","(II)Z", (void *)android_hardware_UsbDeviceConnection_set_interface}, 2587531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood {"native_set_configuration","(I)Z", (void *)android_hardware_UsbDeviceConnection_set_configuration}, 2596c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown {"native_control_request", "(IIII[BIII)I", 260acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood (void *)android_hardware_UsbDeviceConnection_control_request}, 2616c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown {"native_bulk_request", "(I[BIII)I", 262acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood (void *)android_hardware_UsbDeviceConnection_bulk_request}, 263acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood {"native_request_wait", "()Landroid/hardware/usb/UsbRequest;", 264acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood (void *)android_hardware_UsbDeviceConnection_request_wait}, 265acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood { "native_get_serial", "()Ljava/lang/String;", 266acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood (void*)android_hardware_UsbDeviceConnection_get_serial }, 267acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood}; 268acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 269acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodint register_android_hardware_UsbDeviceConnection(JNIEnv *env) 270acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood{ 271acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood jclass clazz = env->FindClass("android/hardware/usb/UsbDeviceConnection"); 272acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (clazz == NULL) { 2733762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find android/hardware/usb/UsbDeviceConnection"); 274acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return -1; 275acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 2764838e338129e09a37b8c8ad5e44f85ec5cd3aea1Ashok Bhat field_context = env->GetFieldID(clazz, "mNativeContext", "J"); 277acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (field_context == NULL) { 2783762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find UsbDeviceConnection.mNativeContext"); 279acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return -1; 280acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 281acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 282acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return AndroidRuntime::registerNativeMethods(env, "android/hardware/usb/UsbDeviceConnection", 283acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood method_table, NELEM(method_table)); 284acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 285