Red de conocimiento informático - Material del sitio web - Cómo modificar USB CDC a un dispositivo de transferencia masiva USB personalizado

Cómo modificar USB CDC a un dispositivo de transferencia masiva USB personalizado

El punto final de un dispositivo USB definido por el proveedor es libre de elegir qué método de transferencia usar (transferencia de control de transacciones, transferencia masiva de transacciones por lotes, transferencia de interrupción de transacciones, transferencia isócrona, transferencia en tiempo real), por supuesto, el punto final de control solo puede usar transferencia de control. Además del punto final de control, la clase de dispositivo estándar solo admite uno de los métodos de transmisión. Por ejemplo, en el ejemplo HID anterior, además del punto final de control, solo admite la transmisión de interrupción. Al interrumpir la transmisión, a veces no puede cumplir con los requisitos de la aplicación, como la velocidad de transmisión, porque el factor determinante es el tiempo de interrupción, y el tiempo de interrupción más rápido es 1 ms, y la transmisión por lotes puede ocurrir en cualquier momento (sujeto a limitaciones de ancho de banda), en teoría. , la velocidad de transmisión se puede utilizar para cumplir con los requisitos de la aplicación, como la velocidad de transmisión. ), la tasa de transferencia puede, en teoría, ser más rápida que la transferencia interrumpida.

Freescale USB Stack 4.1.1 (/usb) ya proporciona controladores de clase de dispositivo estándar. Para implementar un dispositivo de transferencia masiva personalizado, podemos consultar la clase de dispositivo de comunicación CDC existente y modificarla de acuerdo con el código fuente de CDC para implementar rápidamente un dispositivo de transferencia masiva USB personalizado.

1. Modificar el PID y VID del dispositivo

Para diferentes productos que requieren diferentes PID y VID, puede modificar los campos PID y VID en el descriptor del dispositivo. Modifique el descriptor del dispositivo en el archivo usb_descriptor.c:

const uint8 Device_Descriptor[18]=

{

0x12, //bCampo de longitud, longitud del descriptor: 18 bytes

0x01, // campo bDescriptorType, tipo de descriptor: 0x01 indica que el descriptor es un descriptor de dispositivo) 0x00, 0x02, // campo bcdUSB, número de versión de especificación USB (usando código BCD): 2.0

0xFF, //bcampoDeviceClass, código de clase de dispositivo, 0xFF representa una clase de dispositivo personalizada

0x00, //bcampoDeviceSubClass, código de subclase de dispositivo

0x00,/ /bcampoDeviceProtocol, código de protocolo del dispositivo (0x00 indica que no se utiliza el protocolo de clase de dispositivo) 0x20, //bMaxPacketSize0 campo, 0 La longitud máxima del paquete admitida por el punto final:

0xA2, 0x15, //idVendor campo, ID del proveedor (VID)

0x0F, 0xA5, //campo idProduct, ID de producto (PID)

0x00, 0x00, //campo bcdDevice, número de versión del dispositivo (use código BCD)< / p>

0x01, //campo iManufacturer, índice de descriptor de cadena del proveedor: 1

0x02, //campo iProduct, índice de descriptor de cadena del producto: 2

0x03, //iSerialNumber campo, índice de descriptor de cadena del número de serie del dispositivo: 3

0x01 // campo bNumConfigurations, número de configuraciones admitidas por el dispositivo USB: 1

} ;

2 Modificar el descriptor del punto final

El punto final es una interfaz lógica para la transmisión de datos entre el dispositivo y el host. Además de la configuración utilizando el punto final 0 (punto final de control, generalmente un dispositivo solo tiene Todos los puertos unidireccionales son unidireccionales. excepto el puerto bidireccional en un punto final de control. El descriptor de punto final describe el tipo de transferencia de datos, la dirección de transferencia, el tamaño del paquete y el número de punto final (también llamado dirección de punto final).

Además de los puntos finales descritos en el descriptor, cada dispositivo también debe tener un punto final de tipo de control predeterminado con dirección 0, que puede transmitir datos en ambas direcciones y no tiene un descriptor dedicado, solo el descriptor de dispositivo Definido. longitud máxima del paquete. El host envía comandos al dispositivo a través de este punto final, obtiene información sobre varios descriptores del dispositivo y configura el dispositivo a través de él.

/* La estructura contiene detalles de todos los puntos finales utilizados por este dispositivo*/

USB_EP_STRUCT ep[CDC_DESC_ENDPOINT_COUNT] =

{

{

CIC_NOTIF_ENDPOINT,

USB_INTERRUPT_PIPE,

USB_SEND,

CIC_NOTIF_ENDP_PACKET_SIZE

}

,

{{

DIC_BULK_IN_ENDPOINT,

USB_BULK_PIPE,

USB_SEND,

DIC_BULK_IN_ENDP_PACKET_SIZE

}

,

{

DIC_BULK_OUT_ENDPOINT,

USB_BULK_PIPE,

USB_RECV,

DIC_BULK_OUT_ENDP_PACKET_SIZE

}

};

3. Modificar el descriptor de cadena<

El descriptor de cadena es un Descriptor estándar USB opcional que describe información como el fabricante, el nombre del dispositivo o el número de serie. Si el dispositivo no tiene descriptores de cadena, todos los demás descriptores deben tener un valor de índice relativo a la cadena de 0. Las cadenas están codificadas en Unicode.

uint8_t USB_STR_2[USB_STR_2_SIZE USB_STR_DESC_SIZE]

= { sizeof(USB_STR_2),

USB_STRING_DESCRIPTOR, 'B', 0,

' U'.0,

'L', 0,

'K', 0,

' ', 0,

'T', 0,

'R', 0,

'A', 0,

'N', 0,

'S', 0,

'A', 0,

'C', 0

'T', 0,

'I', 0,

'O', 0,

'N', 0

};

4. Modifique el procedimiento de procesamiento USB

Dado que la clase de dispositivo USB personalizada no tiene el procedimiento de estado de la línea de control de configuración CDC, es mejor modificar el procedimiento de procesamiento USB. Modifique la definición de start_transactions en el archivo virtual_com.c para habilitar la transmisión de forma predeterminada o elimine el código de juicio relacionado con la variable start_transactions.

static bool start_transactions = TRUE;

void TestApp_Init(void)

{

......

/* Inicializar interfaz USB*/

g_app_handle = USB_Class_CDC_Init(amp; cdc_config);

g_recv_size = 0

g_send_size= 0 ;

while (TRUE)

{

/* Llamar a la función de tarea periódica*/

USB_CDC_Periodic_Task();

/* Compruebe si la enumeración está completa*/

if((start_app==TRUE) amp; amp; (start_transactions==TRUE))

{

Virtual_Com_App();

}

}/* End while */

}

5. Llame a LibUSB-Win32 para continuar. Comunicación USB

LibUSB-Win32 es un controlador de dispositivo USB universal disponible para los sistemas operativos Windows (Win98SE, WinME, Win2k y WinXP). Este controlador permite a los usuarios acceder a cualquier dispositivo USB en sistemas Windows sin escribir ningún código de controlador principal. Este controlador tiene las siguientes características: Capacidad para comunicarse con cualquier dispositivo USB instalado Puede usarse como controlador para sus propios dispositivos USB desarrollados Admite transferencias masivas e interrumpidas Admite todas las solicitudes de dispositivos estándar definidas en la especificación USB Admite personalizaciones del fabricante de dispositivos USB Solicitud

LibUsb-...Win32 se compone de varios documentos profesionales, documentos de redacción de aplicaciones, artículos profesionales, educación superior, información industrial, vida, ocio y entretenimiento, 75 cómo modificar USB CDC para convertirse en un lote USB grande personalizado capacidad Equipos de transmisión y otros contenidos.