Связь с Nexus-4 с использованием libusb в режиме обновления прошивки

Я пытаюсь разработать простую программу для связи с загрузчиком Nexus-4 в режиме обновления прошивки. Nexus -4 имеет три интерфейса USB. Интерфейс-1 имеет две 2 конечных точки - 2 и 131.

Я написал программу для записи команды get-device-info через конечную точку 2 и прослушивания ответа в конечной точке 131. (Я перепробовал все перестановки интерфейсов и конечных точек!).

Программа успешно записывает команду на устройство, но с устройства ничего не читается.

Формат команды: флаг (0x7e): CMD: данные (переменная длина): CRC-16: флаг (0x7e)

Команда get-device-info-info: 0x7e 0x00 0x78 0xf0 0x7e

Ниже приводится программа.

#include <stdio.h>
#include <stdlib.h>
#include <libusb-1.0/libusb.h>

#define INTERFACE 1
#define EP_OUT 2
#define EP_IN 131

int main() {

        libusb_device **devs; // retrieve a list of devices
    libusb_device_handle *dev_handle; // device handler
    libusb_context *ctx = NULL; //a libusb session

    int r, r2, i; 
    ssize_t cnt; //holding number of devices in list

    unsigned char data[30],read_data[512]; //data to write

    data[0]=0x7e;data[1]=0x00;data[2]=0x78;data[3]=0xf0;data[4]=0x7e; // get-device-info command in HLDC format

    int actual,read_actual; 

    r = libusb_init(&ctx); 

    if(r < 0) {
        printf("Init Error\n");
        return 1;
    }

    libusb_set_debug(ctx, 3); 

    cnt = libusb_get_device_list(ctx, &devs); //get the list of devices

    if(cnt < 0) {
        printf("Get Device Error\n");
        return 1;
    }
    printf("%d Devices in list\n",(int)cnt);

    dev_handle = libusb_open_device_with_vid_pid(ctx, 4100, 25371); //these are vendorID and productID I found for Nexus-4 firmware update

    if(dev_handle == NULL)
        printf("Cannot open device\n");
    else
        printf("Device opened\n");

    libusb_free_device_list(devs, 0); //free the device list


    if(libusb_kernel_driver_active(dev_handle, INTERFACE) == 1) { //find out if kernel driver is attached
        printf("Kernel Driver Active\n");
        if(libusb_detach_kernel_driver(dev_handle, INTERFACE) == 0) //detach it
            printf("Kernel Driver Detached!\n");
    }

    r = libusb_claim_interface(dev_handle, INTERFACE); //claim interface 1 Nexus-5/4 FUM
    if(r < 0) {
        printf("Cannot Claim Interface\n");
        printf("%s\n",libusb_error_name(r));
        return 1;
    }
    printf("Claimed Interface\n");

    printf("Data to be send -> %s\n",data); //just to see the data that we are writing 
    printf("Writing Data...\n");

    r = libusb_bulk_transfer(dev_handle, (EP_OUT | LIBUSB_ENDPOINT_OUT), data, 5, &actual, 0); 

    if(r == 0 && actual == 5){ //we wrote successfully 5 bytes to the device
        printf("Writing Successful!\n");

        printf("Waiting to read from device!\n");
        r2 = libusb_bulk_transfer(dev_handle, (EP_IN | LIBUSB_ENDPOINT_IN), read_data, 512, &read_actual, 5000); 

        if (r2 >=0){
            if (read_actual > 0){
                printf("Data received by bulk transfer\n");

                printf("Data is ");
                for (i=0; i<read_actual; i++)
                    printf("%x ",read_data[i]);
                printf("\n");
            }
            else{
                printf(stderr, "No data received in bulk transfer (%d)\n", r2);
                return -1;
            }
        }
        else{   
            fprintf(stderr, "Error receiving data via bulk transfer %d\n", r2);
            return r2;                                                      
        }
    }
    else
        printf("Write Error\n");

    r = libusb_release_interface(dev_handle, INTERFACE); //release the claimed interface
    if(r!=0) {
        printf("Cannot Release Interface\n");
        return 1;
    }
    printf("Released Interface\n");

    libusb_close(dev_handle); 
    libusb_exit(ctx); 

    return 0;
}

Программа может успешно отправить команду на телефон, но не может получить ответ от телефона. Когда я запускаю программу, я получаю следующий вывод:


10 устройств в списке

Устройство открыто

Драйвер ядра активен

Драйвер ядра отключен!

Заявленный интерфейс

Данные для отправки -> ~

Запись данных...

Запись успешна!

Ожидание чтения с устройства!

Ошибка при получении данных с помощью массовой передачи -7


Я не уверен, что причина не получить ответ из-за неправильной структуры команд или из-за реализации программы?

0 ответов

Другие вопросы по тегам