0

我正在尝试在 Android 2.3 上使用libusb从连接到使用 libusb 和Android NDK的 Android 开发设备的 USB 设备读取数据流。即使我的 Android 版本不支持,开发设备也支持 USB 主机模式。通过串行终端连接,我已授予777权限下的整个树/dev/bus/usb

当我尝试运行以下代码时,我从调用 libusb_bulk_transfer 的行中收到I/O错误(返回 -1)。

struct usb_bus *p;
struct usb_device *q;
struct libusb_device *current_device;
libusb_device_handle *current_handle;
libusb_device **deviceList;
libusb_device *dev;
libusb_context *ctx = NULL;
int result;
unsigned char firmware[31]= {...}
unsigned char reset[2]={1,0};
unsigned char buffer[2*BUFF_SIZE];
int er[10];
unsigned char endpoint=0x08;
unsigned int i,j,k,tlen,startTime,endTime;
unsigned int val1,val2,offset;
unsigned int packetCnt;

libusb_init(&ctx);
libusb_set_debug(ctx,3);
cnt = libusb_get_device_list(NULL, &deviceList);
if (cnt < 0)
    printf("ERROR: %i", (int) cnt);

while ((dev = deviceList[i++]) != NULL) {
    char outputString[255];
    struct libusb_device_descriptor desc;
    int r = libusb_get_device_descriptor(dev, &desc);
    if (r < 0) {
        fprintf(stderr, "failed to get device descriptor");
        return (*env)->NewStringUTF(env, str);
    }

    if (desc.idVendor == 0x4b4 && desc.idProduct == 0x8613) {
        current_device = dev;
        sprintf(outputString, "%04x:%04x (bus %d, device %d)\n",
                desc.idVendor, desc.idProduct,
                libusb_get_bus_number(dev), libusb_get_device_address(dev));
        __android_log_write(ANDROID_LOG_INFO, "usb_device", outputString);
    }
}

if (current_device == NULL) {
    __android_log_write(ANDROID_LOG_INFO, "usb_device", "Could not find a CY7C68013\n\n");
    return (*env)->NewStringUTF(env, str);
}

result = libusb_open(current_device, &current_handle);
result = libusb_open(current_device, &current_handle);

if (result != 0) {
    __android_log_write(ANDROID_LOG_INFO, "usb_device", "Unable to open device\n\n");

    return (*env)->NewStringUTF(env, str);
}

char outputString[255];

libusb_free_device_list(deviceList, 1);

libusb_control_transfer(current_handle, 0x40, 0xa0, 0xE600, 0, reset, 1, 1000);

int actual;
for(i=0;i<31;i+=16)        //LOAD FIRMWARE
{
    tlen = 60-i;
    if(tlen > 16)
        tlen = 16;
    result = libusb_control_transfer(current_handle, 0x40, 0xa0, i, 0, firmware+i, tlen, 1000);

    log_result(result);
}
result = libusb_control_transfer(current_handle, 0x40, 0xa0, 0xE600, 0, reset+1, 1, 1000);
log_result(result);

result = libusb_claim_interface(current_handle, 0);
if (result < 0) {
    __android_log_write(ANDROID_LOG_INFO, "usb_device", "Cannot Claim Interface\n\n");

    return (*env)->NewStringUTF(env, str);
}

result = libusb_bulk_transfer(current_handle, endpoint, buffer, BUFF_SIZE, &actual, 11000);
log_result(result);

libusb_release_interface(current_handle, 0);

libusb_close(current_handle);

libusb_exit(ctx);

到目前为止,一切都成功了,包括执行设备固件的 32 字节控制传输。

我已授予自己对 USB /dev 文件的完全权限,并且我已使用 libusb 检查以确保没有任何内核驱动程序连接到此接口。

我究竟做错了什么?

4

0 回答 0