Manual de instrucciones de la pila de dispositivos USB de SILICON LABS

Pila de dispositivos USB

Presupuesto

  • USB Versión: 1.5.1
  • Fecha de lanzamiento: 21 de julio de 2025
  • Versión del SDK de Simplicity: 2025.6.1

Producto terminadoview

La pila de dispositivos USB de Silicon Labs ofrece funciones versátiles y
Conectividad USB fácil de usar para proyectos de IoT, lo que facilita
Comunicación entre coprocesadores de red y hosts.

Características

  • Pila de dispositivos USB eficiente
  • Ideal para proyectos de IoT
  • Soporte para la comunicación entre coprocesadores de red y
    anfitriones

Instrucciones de uso del producto

Configuración del dispositivo USB

Configure los ajustes del dispositivo USB según su proyecto
Requisitos consultando la sección Configuración del dispositivo USB
en la documentación.

Guía de programación de dispositivos USB

Siga la Guía de programación de dispositivos USB para comprender cómo
programar e interactuar con el dispositivo USB para varios
aplicaciones.

Clases de dispositivos USB

La sección Clases de dispositivos USB proporciona una descripción generalview de diferentes
Clases como CDC ACM, HID, MSC SCSI y Vendor Class. Elija la
clase apropiada según la funcionalidad de su dispositivo.

Solución de problemas del dispositivo USB

Si tiene algún problema con el dispositivo USB, consulte la
Sección de solución de problemas de dispositivos USB para soluciones y depuración
consejos.

Host USB del sistema operativo Microsoft Windows

Si está utilizando el dispositivo USB con un sistema operativo Microsoft Windows USB
Anfitrión, asegúrese de seguir las pautas proporcionadas en el
Documentación para una integración perfecta.

Preguntas frecuentes

P: ¿Cuáles son algunos ex comunes?ampNúmero de dispositivos que puedo construir usando
¿Esta pila USB?

A: La pila USB le permite construir dispositivos como
Adaptadores USB a serie, ratones o teclados, almacenamiento extraíble
dispositivos y dispositivos personalizados.

P: ¿Existen requisitos de software específicos para utilizar este programa?
¿Pila de dispositivos USB?

A: El software compatible incluye Simplicity SDK, Simplicity
Estudio, Simplicity Commander, GCC (La colección de compiladores GNU),
Banco de trabajo integrado IAR para ARM y IAR EWARM.

Bus serie universal USB

Bus serie universal USB

USB encimaview Encimaview
Notas de la versión USB
Especificaciones y característicasview
Configuración del dispositivo USB terminadaview
Guía de programación de dispositivos USBview
Clases de dispositivos USBview La clase ACM de los CDC ha terminadoview Clase HID terminadaview Clase SCSI MSC terminadaview Clase de proveedor terminadaview
Documentación de la API API de dispositivo USB API de ACM de dispositivo USB a sl_usbd_cdc_ cm_line_coding_t sl_usbd_cdc_acm_callbacks_t API de CDC de dispositivo USB a sl_usbd_cdc_subcl ss_driver_t API principal de dispositivo USB
sl_usbd_device_config_t sl_usbd_setup_r_t
una API HID de dispositivo USB sl_usbd_cl ss_driver_t
sl_usbd_hid_callbacks_t API MSC del dispositivo USB
un dispositivo USB sl_usbd_msc_subcl ss_driver_t API SCSI MSC
sl_usbd_msc_scsi_callbacks_t

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

1/174

Bus serie universal USB
un sl_usbd_msc_scsi_lun_pi
sl_usbd_msc_scsi_lun_info sl_usbd_msc_scsi_lun
API de proveedor de dispositivos USB sl_usbd_vendor_callbacks_t
Documentación de la API Solución de problemas de dispositivos USB
Encimaview Host USB del sistema operativo Microsoft Windows
Encimaview

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

2/174

Encimaview
Encimaview
Dispositivo USB
USB es una de las interfaces de comunicación más exitosas en la historia de los sistemas informáticos y es el estándar de facto para conectar periféricos. La pila de dispositivos USB de Silicon Labs es un módulo de dispositivo USB diseñado específicamente para sistemas embebidos. Desarrollada desde cero con la calidad, escalabilidad y fiabilidad de Silicon Labs, ha superado un riguroso proceso de validación para cumplir con la especificación USB 2.0. Esta documentación describe cómo inicializar, iniciar y utilizar la pila de dispositivos USB de Silicon Labs. Explica los distintos valores de configuración y sus usos. También incluye una descripción general.view de la tecnología, tipos de posibilidades de configuración, procedimientos de implementación y exampArchivos de uso típico para cada clase disponible.
Para ayudarle a comprender rápidamente los conceptos de USB, la documentación incluye muchos ejemplos.ampde USB con funciones básicas. Estos examples proporcionará un marco que le permitirá construir dispositivos rápidamente. Estos ejemplosamples incluyen:
Adaptador USB a serie (clase de dispositivo de comunicaciones) Ratón o teclado (clase de dispositivo de interfaz humana) Dispositivo de almacenamiento extraíble (clase de almacenamiento masivo) Dispositivo personalizado (clase de proveedor)
Lo siguiente es el finalview de las secciones de la documentación:
Especificaciones y características Configuración del dispositivo USB Guía de programación de dispositivos USB Clases de dispositivos USB
Solución de problemas de dispositivos USB de clase CDC ACM, clase HID, clase MSC SCSI, clase de proveedor, host USB del sistema operativo Microsoft Windows

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

3/174

USB
USB

Versión USB 1.5.1 21 de julio de 2025 – Notas de la versión
Versión 2025.6.1 del SDK de Simplicity
La eficiente pila de dispositivos USB de Silicon Labs ofrece una conectividad USB versátil y fácil de usar, ideal para proyectos de IoT, incluyendo la comunicación entre coprocesadores de red y hosts. Haga clic aquí para ver versiones anteriores.
Resumen de lanzamiento
Características principales | Cambios en la API | Corrección de errores | Habilitación de chips
Características principales
Solo cambios en la plataforma subyacente.
Cambios en la API
Ninguno.
Corrección de errores
Ninguno.
Habilitación de chips
Ninguno.
Características principales
Nuevas funciones | Mejoras | Funciones eliminadas | Funciones obsoletas
Nuevas funciones
Ninguno.
Mejoras
Solo cambios en la plataforma subyacente.
Funciones eliminadas
Ninguno.
Funciones obsoletas
Ninguno.
Cambios en la API
Nuevas API | API modificadas | API eliminadas | API obsoletas
Nuevas API

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

4/174

USB
Ninguno.
API modificadas
Ninguno.
API eliminadas
Ninguno.
API obsoletas
Ninguno.
Corrección de errores
Ninguno.
Habilitación de chips
Ninguno.
Aplicación Examplos cambios
nuevo examples | Ex modificadoamples | Eliminado Examples | Ex obsoletoampLos
nuevo exampLos
Ninguno.
Ex modificadoampLos
Ninguno.
Ex eliminadoampLos
Ninguno.
Ex obsoletoampLos
Ninguno.
Impacto de los cambios en la versión
Declaraciones de impacto | Guía de migración
Declaraciones de impacto
Ninguno.
Guía de migración
Ninguno.
Problemas y limitaciones conocidos
Ninguno.
Uso de esta versión

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

5/174

USB

¿Qué incluye la versión? | Software compatible | Instalación y uso | Ayuda y comentarios

¿Qué hay en el comunicado?

Aplicación de pila de dispositivos USB ExampLos
Software compatible

Software
Simplicity SDK Simplicity Studio Simplicity Commander GCC (la colección de compiladores GNU) IAR Embedded Workbench para ARM IAR EWARM

Versión o variante compatible
2025.6.0 5.11.0 1.18.2 (proporcionado con Simplicity Studio) 12.2.1 (proporcionado con Simplicity Studio) 9.40.1 (proporcionado con Simplicity Studio)

Instalación y uso

Para iniciar su desarrollo consulte nuestro:
Guía de programación de dispositivos USB. Documentación API.
Para obtener información sobre la integración de Secure Vault, consulte Secure Vault.
Para volverview Notificaciones de seguridad y asesoramiento sobre software y gestión de sus preferencias de notificación:
ò Vaya a https://community.silabs.com/. ó Inicie sesión con las credenciales de su cuenta. ô Haga clic en su profile icono en la esquina superior derecha de la página.
õ Seleccione Notificaciones en el menú desplegable. ö En la sección Notificaciones, vaya a la pestaña Notificaciones de mi producto para volver aview Aviso histórico de seguridad y software
notificaciones
÷ Para administrar sus preferencias, utilice la pestaña Administrar notificaciones para personalizar qué actualizaciones y avisos de productos desea recibir.
recibir.
Para conocer la configuración recomendada, consulte aquí.
Para obtener más información sobre el software de esta versión, consulte nuestra documentación en línea.
Ayuda y comentarios

Contacta con el soporte de Silicon Labs. Para usar nuestra herramienta Ask AI y obtener respuestas, consulta el campo de búsqueda en la parte superior de esta página.

Nota: Ask AI es experimental.

Obtenga ayuda de nuestra comunidad de desarrolladores.
Política de lanzamiento y mantenimiento del SDK
Consulte nuestra Política de lanzamiento y mantenimiento del SDK.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

6/174

Encimaview
Encimaview
Presupuesto
Cumple con la “revisión 2.0 de la especificación Universal Serial Bus” Implementa el “Aviso de cambio de ingeniería del descriptor de asociación de interfaz (ECN)” Tipos de transferencia
Control de interrupción masiva Clases USB Clase de dispositivo de comunicación (CDC) Modelo de control abstracto (ACM) Dispositivo de interfaz humana (HID) Clase de almacenamiento masivo (MSC) Marco de clases específico del proveedor
Características
Escalable para incluir solo las funciones requeridas para minimizar el uso de memoria Admite velocidad completa (12 Mbit/s) Admite dispositivos compuestos (multifunción) Admite dispositivos de múltiples configuraciones Admite funcionalidades de ahorro de energía USB (suspensión y reanudación del dispositivo) Integración completa de la clase de almacenamiento masivo en Micrium OS File Módulo de sistema desarrollado con la capa de abstracción CMSIS-RTOS2 para su compatibilidad con diferentes sistemas operativos. Silicon Labs GSDK incluye puertos para FreeRTOS y Micrium OS.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

7/174

Encimaview
Encimaview

Configuración del dispositivo USB

Esta sección explica cómo configurar el dispositivo USB de Silicon Labs. Hay tres grupos de parámetros de configuración:
Configuración del núcleo del dispositivo USB Configuración de la información del dispositivo USB Configuración del hardware del dispositivo USB
Configuración del núcleo del dispositivo USB
El dispositivo USB de Silicon Labs se puede configurar en tiempo de compilación a través de un conjunto de #defines ubicados en sl_usbd_core_config.h fileEl dispositivo USB utiliza #defines siempre que sea posible, ya que permiten escalar el tamaño del código y los datos en tiempo de compilación según las funciones habilitadas. Esto permite ajustar el espacio ocupado por la memoria de solo lectura (ROM) y la memoria de acceso aleatorio (RAM) del dispositivo USB de Silicon Labs según los requisitos de la aplicación.
Recomendado: Iniciar el proceso de configuración con los valores predeterminados (resaltados en negrita).
Las secciones siguientes están organizadas según el orden en la configuración de la plantilla. file, sl_usbd_core_config.h.
Configuración de clases de configuración principal
Configuración del núcleo
Tabla: Constantes de configuración del núcleo del dispositivo USB

Descripción constante

Valor predeterminado

SL_USBD_TA SK_STACK_TAMAÑO

Configura el tamaño de la pila en bytes de la tarea principal de USBD

4096

SL_USBD_TA SK_PRIORIT Y

Configura la prioridad de la tarea principal de USBD. Esta es una prioridad de CMSIS-RTOS2.

osPriorityHigh

SL_USBD_AUTO_START_DISPOSITIVO_USB E

Si está habilitado, el dispositivo USB se iniciará automáticamente al iniciarse el kernel y programarse la primera tarea del núcleo USBD. Si está deshabilitado, la aplicación deberá llamar a sl_usbd_core_start_device() cuando esté lista para ser detectada por el host USB.

SL_USBD_C El número total de configuraciones que se agregarán a través de sl_usbd_add_configuration()

1

Función ONFIGURATI.

ON_QUANTI

TY

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

8/174

Encimaview

Constante
CANTIDAD DE INTERFAZ SL_USBD
SL_USBD _ALT_INT ERFACE_ CANTIDAD
TY
SL_USBD_INTERF ACE_GR
OUP_QU
ANTIDAD
SL_USBD_DESCRI
PTOR_Q
UANTIDAD
SL_USBD _STRING _QUANTI
TY
SL_USBD_CANTIDAD_DE_PUNTOS_FINALES_ABIERTOS

Descripción: El número total de interfaces USB que se añadirán a todas sus configuraciones. Esto depende en gran medida de las clases utilizadas. Para obtener más información sobre cuántas interfaces requiere una instancia de clase, consulte la sección "Recursos necesarios del núcleo" de sus clases.
El número total de interfaces USB alternativas que se deben agregar a todas sus configuraciones. Esto depende en gran medida de las clases utilizadas. Este valor siempre debe ser igual o mayor que SL_USBD_INTERFACE_QUANTITY. Para obtener más información sobre cuántas interfaces alternativas requiere una instancia de clase, consulte la sección "Recursos necesarios del núcleo" de sus clases.
El número total de grupos de interfaces USB que se añadirán a todas sus configuraciones. Esto depende en gran medida de las clases utilizadas. Para obtener más información sobre cuántos grupos de interfaces requiere una instancia de clase, consulte la sección "Recursos necesarios del núcleo" de sus clases.
El número total de descriptores de punto final que se añadirán a todas las configuraciones. Esto depende en gran medida de las clases utilizadas. Para obtener más información sobre cuántos descriptores de punto final requiere una instancia de clase, consulte "Número de puntos finales" en la sección "Recursos necesarios del núcleo" de sus clases. Tenga en cuenta que no es necesario considerar los puntos finales de control. El número total de cadenas USB. Si se establece la cantidad en cero, se desactivará la función. Al desactivarla, el dispositivo no almacenará ninguna cadena de descripción USB enviada desde la aplicación. Esto significa que el host no podrá recuperar las cadenas de descripción (como el fabricante y el nombre del producto). El número total de puntos finales abiertos por configuración. Un dispositivo requiere al menos dos puntos finales abiertos para las transferencias de control, pero también debe agregar los puntos finales de las clases utilizadas. Para obtener más información sobre cuántos puntos finales abiertos requiere una instancia de clase, consulte "Número de puntos finales" en la sección "Recursos necesarios del núcleo" de sus clases.

Valor predeterminado
10 10
2
20 30 20

Configuración de clases
Las clases tienen configuraciones específicas en tiempo de compilación. Consulte "Clases de dispositivos USB" para obtener más información.
Configuración de la información del dispositivo USB

La configuración sl_usbd_device_config.h file reagrupa #define-s de tiempo de compilación para establecer información básica sobre su dispositivo, como ID de proveedor/producto, cadenas de dispositivo, etc. La siguiente tabla describe cada definición de configuración de información disponible en esta configuración. file.

Tabla: Definición de la configuración de la información del dispositivo USB

Constante
ID DE PROVEEDOR DEL DISPOSITIVO SL_USBD
SL_USBD_DEVIC E_PRODUCT_ID

Descripción: Su número de identificación de proveedor, tal como lo proporcionó el Foro de Implementadores USB. Para obtener más información sobre cómo obtener un ID de proveedor, consulte http://www.usb.org/developers/vendor/. Su número de identificación de producto.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

9/174

Encimaview

Constante

Descripción

SL_USBD_DEVICE_RELEASE Número de versión de su dispositivo. _NUMBER

SL_USBD_DEVICE_MANUFA Cadena que describe el fabricante de su dispositivo. Esta configuración se ignora cuando...

CADENA DE CTURER

La configuración SL_USBD_STRING_QUANTITY se establece en 0.

SL_USBD_DEVICE_PRODUC Cadena que describe su producto. Esta configuración se ignora cuando la configuración

T_STRING

SL_USBD_STRING_QUANTITY se establece en 0.

SL_USBD_DEVICE_SERIAL_N Cadena que contiene el número de serie de su dispositivo. Esta configuración se ignora cuando...

CADENA DE NÚMEROS

La configuración SL_USBD_STRING_QUANTITY se establece en 0.

SL_USBD_DEVICE_LANGUA Número de identificación del idioma de las cadenas de su dispositivo. Los valores posibles son:
ID de GE

– SL_USBD_LANG_ID_ÁRABE_ARABIA_SAUDITA

– SL_USBD_LANG_ID_CHINO_TAIWÁN

– SL_USBD_LANG_ID_INGLÉS_EE. UU.

– SL_USBD_LANG_ID_INGLÉS_RU

– SL_USBD_LANG_ID_FRANCÉS

– SL_USBD_LANG_ID_ALEMÁN

– SL_USBD_LANG_ID_GREEK

– SL_USBD_LANG_ID_ITALIANO

– SL_USBD_LANG_ID_PORTUGUÉS

– SL_USBD_LANG_ID_SANSKRIT

Esta configuración se ignora cuando la configuración SL_USBD_STRING_QUANTITY se establece en 0.

Configuración del hardware del dispositivo USB

Dependiendo del dispositivo de Silicon Labs que utilice, posiblemente tenga el pin y el puerto GPIO para configurar la señal de detección USB VBUS. La configuración se define en el encabezado sl_usbd_hardware_config.h. file.

Constante
Puerto de detección VBUS del controlador USBD de SL

Descripción
Puerto GPIO para la señal de detección USB VBUS en su placa. Pin GPIO para la señal de detección USB VBUS en su placa.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

10/174

Encimaview
Encimaview
Guía de programación de dispositivos USB
Esta sección explica cómo utilizar el módulo de dispositivo USB.
Configuración inicial del módulo de dispositivo USB
Esta sección describe los pasos básicos para inicializar el módulo del dispositivo USB y para agregar, preparar e iniciar un dispositivo. Inicialización del módulo del dispositivo USB. Inicialización del núcleo del dispositivo USB. Inicialización de los aCl ss. Adición del dispositivo USB. Construcción del dispositivo USB. Adición de configuraciones. Adición de funciones USB. Inicio del dispositivo USB.
Funciones de gancho de eventos
Inicialización del módulo de dispositivo USB
Inicialización del núcleo del dispositivo USB
a US a Comience por inicializar el núcleo del módulo del dispositivo B llamando a la función sl_usbd_core_init() . El ejemplo a continuación muestra la llamada a sl_usbd_core_init() .
Example – Llamando a sl_usbd_core_init()
sl_status_t status; status = sl_usbd_core_init(); if (status ! SL_STATUS_OK) { /* Se produjo un error. Se debe añadir la gestión de errores aquí. */
}
Inicializando la(s) clase(s)
Tras inicializar el núcleo del módulo del dispositivo USB, debe inicializar cada clase que desee utilizar. Consulte la sección "Guía de programación" de sus archivos de estado sólido ACL para obtener más información.
Construyendo su dispositivo USB
Agregar configuraciones
Después de inicializar correctamente su dispositivo, puede empezar a agregarle funciones USB, comenzando con una nueva configuración. Un dispositivo debe tener al menos una configuración. Para agregar una o más configuraciones, llame a la función sl_usbd_core_dd_config tion(). Esta función debe llamarse para cada configuración que desee agregar. El ejemploampA continuación se muestra cómo agregar una velocidad completa.
Example – Agregar configuraciones a su dispositivo

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

11/174

Encimaview

sl_status_t estado; uint8_t config_nbr_fs;

/*Añadiendo una configuración de máxima velocidad al dispositivo. */

estado = sl_usbd_core_add_configuration(0,

/* No hay atributos especiales para la configuración. */

100u,

/* Consumo máximo de energía: 100 mA.

*/

VELOCIDAD DEL DISPOSITIVO SL_USBD_COMPLETA,

/* Configuración de velocidad completa.

*/

“Configurar Agregar Exampla configuración de velocidad completa”,

&nbr_fs_de_configuración);

si (estado ! SL_STATUS_OK) {

/* Se produjo un error. Se debe añadir aquí la gestión de errores. */

}

Agregar funciones USB
Después de agregar correctamente al menos una configuración a su dispositivo, puede agregar las interfaces y los puntos finales. Cada clase USB tiene sus propias necesidades en cuanto al tipo de interfaz y puntos finales, la cantidad y otros parámetros. Silicon Labs USB Device agrega interfaces y puntos finales a las clases que ofrece.
Desde su aplicación, puede instanciar una clase USB y agregarla a una configuración. Para obtener más información sobre el concepto de instancias de clase de dispositivo USB, consulte Clases de dispositivos USB. Tenga en cuenta que puede instanciar y agregar varias instancias de clase diferentes a una configuración para crear un dispositivo multifunción (compuesto).
El exampA continuación se muestra cómo crear una instancia de clase y agregarla a una configuración.
Example – Cómo agregar una instancia de clase a su dispositivo

sl_status_t estado; uint8_t número_de_clase;
/* Crea una instancia de la clase que quieres usar.*/ /* Ten en cuenta que dependiendo de la clase, esta función puede tener más argumentos. */ status = sl_usbd_ _create_instance(&class_nbr); if (status ! SL_STATUS_OK) { /* Se produjo un error. Se debe añadir la gestión de errores aquí. */ }
/* Agrega la instancia de clase a la configuración de velocidad completa. */ status = sl_usbd_ _add_to_configuration(class_nbr, /* Número de clase devuelto por sl_usbd_ _crear_instancia. */
config_nbr_fs); /* Número de configuración devuelto por sl_usbd_core_add_configuration(). */ if (status ! SL_STATUS_OK) { /* Se produjo un error. Se debe añadir la gestión de errores aquí. */ }
Iniciar su dispositivo USB
De forma predeterminada, la tarea principal del dispositivo USB iniciará automáticamente el dispositivo una vez que se complete la inicialización y se inicie el kernel. Para controlar cuándo se inicia el dispositivo y cuándo se vuelve visible para el host USB, utilice la definición de configuración SL_USBD_AUTO_START_USB_DEVICE para desactivar la función de inicio automático. Si está desactivada, después de compilar/preparar el dispositivo, puede iniciarlo y hacerlo visible para el host USB llamando a la función sl_usbd_core_start_device().
El exampA continuación se muestra cómo iniciar su dispositivo utilizando la función sl_usbd_core_start_device().
Example – Iniciar su dispositivo

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

12/174

Encimaview

sl_status_t estado;
status = sl_usbd_core_start_device(); if (status ! SL_STATUS_OK) { /* Se produjo un error. Se debe añadir la gestión de errores aquí. */ }

Funciones de gancho de eventos
El módulo principal del dispositivo USB ofrece dos funciones de enlace débil que puede redefinir en su aplicación. Su propósito es notificar cuando se producen eventos de bus y configuración.
Tabla: Funciones de enlace de eventos USB

Evento

Descripción

Autobús

Se llama cuando ocurre un evento de bus USB

Configuración Se llama cuando ocurre un evento de configuración USB

Firma de función
void sl_usbd_on_bus_event(sl_usbd_bus_event_t evento); void sl_usbd_on_config_event(sl_usbd_config_event_t evento, uint8_t config_nbr);

Example – Funciones de gancho de eventos

void sl_usbd_on_bus_event(sl_usbd_bus_event_t evento) { cambiar (evento) { caso SL_USBD_EVENT_BUS_CONNECT:
// se llama cuando se inserta un cable USB en un controlador host
caso SL_USBD_EVENT_BUS_DISCONNECT: // se llama cuando se quita el cable USB de un controlador host break;
caso SL_USBD_EVENT_BUS_RESET: // se llama cuando el host envía un comando de reinicio break;
caso SL_USBD_EVENT_BUS_SUSPEND: // se llama cuando el host envía el comando de suspensión break;
caso SL_USBD_EVENT_BUS_RESUME: // se llama cuando el host envía un comando de activación break;
predeterminado: break; } }
void sl_usbd_on_config_event(sl_usbd_config_event_t evento, uint8_t config_nbr) { cambiar (evento) { caso SL_USBD_EVENT_CONFIG_SET:
// se llama cuando el host establece una interrupción de configuración;
caso SL_USBD_EVENT_CONFIG_UNSET: // se llama cuando una configuración no está establecida break;
predeterminado: break; } }

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

13/174

Encimaview

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

14/174

Encimaview
Encimaview

Clases de dispositivos USB

Las clases USB disponibles en Silicon Labs USB Device comparten algunas características comunes. Esta sección explica estas características y sus interacciones con la capa central.
Para obtener más información sobre una clase específica, consulte lo siguiente:
Clase CDC ACM Clase HID Clase MSC SCSI Clase de proveedor
Acerca de las instancias de clase
Las clases USB disponibles en el dispositivo USB implementan el concepto de instancias de clase. Una instancia de clase representa una función dentro de un dispositivo. La función puede describirse mediante una interfaz o un grupo de interfaces y pertenece a una clase específica.
Cada implementación de clase USB comparte algunas configuraciones y funciones, basadas en el concepto de instancia de clase. Las configuraciones y funciones comunes se presentan en la tabla a continuación. En la columna "Constantes o Función", el marcador XXXX puede reemplazarse por el nombre de la clase: CDC, HID, MSC, CDC_ACM o VENDOR (Proveedor para nombres de funciones).
Tabla: Constantes y funciones relacionadas con el concepto de múltiples instancias de clase

Constante o Función
SL_USBD_XXXX_CL CANTIDAD DE INSTALACIÓN
SL_USBD_XXXX_CONFIGURACIÓN_CANTIDAD
sl_usb d _XXXX_creó _instancia ()
sl_usbd_XXXX_add_to_config iguration()

Descripción
Configura el número máximo de instancias de clase.
Configura el número máximo de configuraciones. Durante la inicialización de la clase, se añadirá una instancia de clase a una o más configuraciones. Crea una nueva instancia de clase.
Agrega una instancia de clase existente a la configuración del dispositivo especificado.

En cuanto a la implementación del código, la clase declarará una variable global local que contiene una estructura de control de clase. Esta estructura de control de clase está asociada a una instancia de clase y contendrá información específica para gestionarla.
Las siguientes figuras muestran varios escenarios de casos. Cada figura incluye un ejemplo de código.amplo que corresponde al escenario del caso.
Figura: Instancias de clase múltiples: Dispositivo FS (1 configuración con 1 interfaz) representa un dispositivo USB típico. El dispositivo es de velocidad completa (FS) y contiene una única configuración. Su función se describe mediante una interfaz compuesta por un par de puntos finales para la comunicación de datos. Se crea una instancia de clase que permite administrar toda la interfaz con su punto final asociado.
Figura: Instancias de varias clases: Configuración del dispositivo FS 1 con 1 interfaz

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

15/174

Encimaview

El código correspondiente a la Figura – Instancias de Clase Múltiple – Dispositivo FS (1 Configuración con 1 Interfaz) se muestra en el ejemploample abajo.
Example – Instancias de clase múltiple – Configuración del dispositivo FS 1 con 1 interfaz)

sl_status_t estado; uint8_t clase_0;

void app_usbd_XXXX_enable(uint8_t class_nbr) { /* Manejar evento de habilitación de clase. */ }

void app_usbd_XXXX_disable(uint8_t class_nbr) { /* Manejar evento de desactivación de clase. */ }

sl_usbd_XXXX_callbacks_t devoluciones de llamada de clase = {

(1)

.enable = app_usbd_XXXX_enable,

.deshabilitar = app_usbd_XXXX_deshabilitar

};

estado = sl_usbd_XXXX_init();

(2)

si (estado ! SL_STATUS_OK) {

/* $$$$ Manejar el error. */

}

estado = sl_usbd_XXXX_create_instance(&devoluciones_de_llamadas_de_clase,

(3)

&clase_0);

si (estado ! SL_STATUS_OK) {

/* $$$$ Manejar el error. */

}

estado = sl_usbd_XXXX_add_to_configuration(clase_0, config_0);

(4)

si (estado ! SL_STATUS_OK) {

/* $$$$ Manejar el error. */

}

(1) Cada clase ofrece un conjunto de funciones de devolución de llamada para eventos de conexión/desconexión de dispositivos y para eventos específicos de la clase. El objeto de estructura de devolución de llamada se pasa como argumento al crear la instancia de la clase con sl_usbd_XXXX_create_instance().
función.
(1) Inicialice la clase. Se inicializarán todas las variables internas, estructuras y puertos de clase. Tenga en cuenta que la función Init() en algunas clases puede aceptar otros argumentos.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

16/174

Encimaview
(2) Cree la instancia de clase, que es class_0. La función sl_usbd_XXXX_create_instance() asigna una estructura de control de clase asociada con class_0. Dependiendo de la clase, sl_usbd_XXXX_create_instance() puede tener parámetros adicionales, además del número de clase, que representan información específica de la clase almacenada en la estructura de control de clase. aaa (3) Agregue la instancia de clase, class_0, al número de configuración especificado, config_0. sl_usbd_XXXX_add_to_configuration() creará la interfaz 0 y sus extremos IN y OUT asociados. Como resultado, la instancia de clase abarca la interfaz 0 y sus extremos. Cualquier comunicación realizada en la interfaz 0 utilizará el número de instancia de clase, class_0. La Figura: Múltiples instancias de clase: Dispositivo FS (2 configuraciones y múltiples interfaces) representa una ex más compleja.ampUn dispositivo de alta velocidad se compone de dos configuraciones. El dispositivo tiene dos funciones que pertenecen a la misma clase, pero cada función se describe mediante dos interfaces y tiene un par de puntos finales bidireccionales. En este ejemploampSe crean dos instancias de clase. Cada instancia de clase se asocia a un grupo de interfaces, a diferencia de la Figura: Múltiples instancias de clase: Dispositivo FS (1 configuración con 1 interfaz) y la Figura: Múltiples instancias de clase: Dispositivo FS (2 configuraciones y múltiples interfaces), donde la instancia de clase se asociaba a una sola interfaz.
Figura: Instancias de clase múltiple: Configuraciones del dispositivo FS 2 y múltiples interfaces

El código correspondiente a la Figura – Instancias de Clase Múltiple – Dispositivo FS (2 Configuraciones y Múltiples Interfaces) se muestra en el ejemploample abajo. El manejo de errores se omite para mayor claridad.
Example – Instancias de clase múltiples – Configuraciones de dispositivo FS 2 y múltiples interfaces)

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

17/174

Encimaview

sl_status_t estado; uint8_t clase_0; uint8_t clase_1;
estado = sl_usbd_XXXX_init();
estado = sl_usbd_XXXX_create_instance(&clase_0); estado = sl_usbd_XXXX_create_instance(&clase_1);
estado = sl_usbd_XXXX_add_to_configuration(clase_0, cfg_0); estado = sl_usbd_XXXX_add_to_configuration(clase_1, cfg_0);
estado = sl_usbd_XXXX_add_to_configuration(clase_0, cfg_1); estado = sl_usbd_XXXX_add_to_configuration(clase_1, cfg_1);

(1)
(2) (3)
(4) (5)
(6) (6)

(1) Inicialice la clase. Se inicializarán todas las variables internas, estructuras y puertos de clase.
(2) Cree la instancia de clase, class_0. La función sl_usbd_XXXX_create_instance() asigna una estructura de control de clase asociada a class_0.
(3) Cree la instancia de clase, class_1. La función sl_usbd_XXXX_create_instance() asigna otra estructura de control de clase asociada con class_1.
(4) Agregue la instancia de clase, class_0, a la configuración, cfg_0. sl_usbd_XXXX_add_to_configuration() creará las interfaces 0, 1, las interfaces alternativas y los puntos finales de entrada y salida asociados. El número de instancia de clase, class_0, se utilizará para cualquier comunicación de datos en las interfaces 0 o 1.
(5) Agregue la instancia de clase, class_1, a la configuración, cfg_0. sl_usbd_XXXX_add_to_configuration() creará las interfaces 2 y 3, así como sus terminales de entrada y salida asociados. El número de instancia de clase, class_1, se utilizará para cualquier comunicación de datos en las interfaces 2 y 3.
(6) Agregue las mismas instancias de clase, class_0 y class_1 , a la otra configuración, cfg_1 .
Cada clase define una estructura de tipo sl_usbd_XXXX_callbacks_t. Su propósito es proporcionar a cada clase un conjunto de funciones de devolución de llamada que se invocarán cuando se produzca un evento. Cada clase incluye dos funciones de devolución de llamada, que se presentan en la tabla a continuación.
Tabla – Funciones de devolución de llamada de clase comunes

Campos Descripción .enable Se llama cuando la instancia de clase USB se habilita correctamente. .disable Se llama cuando la instancia de clase USB está deshabilitada.

Firma de función void app_usbd_XXXX_enable(uint8_t class_nbr); void app_usbd_XXXX_disable(uint8_t class_nbr);

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

18/174

Encimaview
Encimaview
Dispositivo USB CDC Clase ACM
Dispositivo USB CDC Clase baseview Necesidades de recursos de la clase CDC ACM del dispositivo USB del núcleo Subclase CDC ACM del dispositivo USBview Configuración de la clase ACM de CDC del dispositivo USB Guía de programación de la clase ACM de CDC del dispositivo USB
Esta sección describe la clase de dispositivo de comunicaciones (CDC) y la subclase CDC asociada, compatibles con la pila de dispositivos USB de Silicon Labs. Silicon Labs USB-Device actualmente admite la subclase Modelo de control abstracto (ACM), comúnmente utilizada para la emulación serial.
CDC incluye diversos dispositivos de telecomunicaciones y redes. Los dispositivos de telecomunicaciones abarcan módems analógicos, teléfonos analógicos y digitales, adaptadores de terminal RDSI, etc. Por ejemplo:ampLos dispositivos de red incluyen módems ADSL y de cable, adaptadores Ethernet y concentradores. CDC define un marco para encapsular los estándares de servicios de comunicación existentes, como V.250 (para módems a través de la red telefónica) y Ethernet (para dispositivos de red de área local), mediante un enlace USB. Un dispositivo de comunicación se encarga de la administración de dispositivos, la gestión de llamadas cuando sea necesario y la transmisión de datos.
CDC define siete grupos principales de dispositivos. Cada grupo pertenece a un modelo de comunicación, que puede incluir varias subclases. Cada grupo de dispositivos tiene su propio documento de especificaciones, además de la clase base de CDC. Los siete grupos son:
Red Telefónica Pública Conmutada (RTPC), incluyendo módems de banda vocal, teléfonos y dispositivos de emulación serie. Dispositivos de Red Digital de Servicios Integrados (RDSI), incluyendo adaptadores de terminal y teléfonos. Dispositivos de Modelo de Control Ethernet (ECM), incluyendo dispositivos compatibles con la familia IEEE 802 (p. ej., módems de cable y ADSL, adaptadores Wi-Fi). Dispositivos de Modo de Transferencia Asíncrono (ATM), incluyendo módems ADSL y otros dispositivos conectados a redes ATM (estaciones de trabajo, enrutadores, conmutadores LAN). Dispositivos de Comunicaciones Móviles Inalámbricas (WMC), incluyendo teléfonos multifunción para comunicaciones de voz y datos. Dispositivos de Modelo de Emulación Ethernet (EEM) que intercambian datos en tramas Ethernet. Dispositivos de Modelo de Control de Red (NCM), incluyendo dispositivos de red de alta velocidad (módems de acceso a paquetes de alta velocidad, equipos terminales de línea).
El CDC y la implementación de la subclase asociada cumplen con las siguientes especificaciones:
Bus serie universal, definiciones de clases para dispositivos de comunicaciones, revisión 1.2, 3 de noviembre de 2010. Bus serie universal, comunicaciones, subclase para dispositivos PSTN, revisión 1.2, 9 de febrero de 2007.
Dispositivo USB CDC Clase baseview
Un dispositivo CDC se compone de las siguientes interfaces para implementar la capacidad de comunicación:
La interfaz de clase de comunicaciones (CCI) es responsable de la gestión de dispositivos y, opcionalmente, de la gestión de llamadas.
La gestión de dispositivos permite la configuración y el control general del dispositivo, así como la notificación de eventos al host. La gestión de llamadas permite el establecimiento y la finalización de llamadas. La gestión de llamadas puede multiplexarse ​​mediante una DCI. Una CCI es obligatoria para todos los dispositivos CDC. Identifica la función CDC especificando el modelo de comunicación compatible con el dispositivo. Las interfaces posteriores a la CCI pueden ser cualquier interfaz de clase USB definida, como audio o una interfaz específica del proveedor. La interfaz específica del proveedor se representa específicamente mediante una DCI.
La interfaz de clase de datos (DCI) es responsable de la transmisión de datos. Los datos transmitidos y/o recibidos no siguen un patrón específico.
Formato. Los datos pueden ser datos sin procesar de una línea de comunicación, datos que siguen un formato propietario, etc. Todas las DCI que siguen a la CCI pueden considerarse interfaces subordinadas.
Un dispositivo CDC debe tener al menos un CCI y cero o más DCI. Un CCI y cualquier DCI subordinado proporcionan una función al host. Esta capacidad también se conoce como función. En un dispositivo compuesto CDC, se pueden tener varios.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

19/174

Encimaview
Funciones. Por lo tanto, el dispositivo estaría compuesto por varios conjuntos de CCI y DCI, como se muestra en la Figura: Dispositivo Compuesto CDC.
Figura – Dispositivo compuesto de los CDC

Es probable que un dispositivo CDC utilice la siguiente combinación de puntos finales:
Un par de terminales de entrada y salida de control, denominados terminal predeterminado. Un terminal de entrada opcional, masivo o de interrupción. Un par de terminales de entrada y salida masivos o isócronos. Tenga en cuenta que la pila de dispositivos USB de Silicon Labs no admite actualmente terminales isócronos.
La siguiente tabla muestra el uso de los diferentes puntos finales y mediante qué interfaz del CDC se utilizan.
Tabla: Uso de puntos finales de los CDC

Punto final
Control de entrada
Salida de control
Interrumpir o masivo EN Masivo o isócrono EN Masivo o isócrono
AFUERA

Dirección
Dispositivo a host
Host a dispositivo
Dispositivo a host
Dispositivo a host
Host a dispositivo

Uso de la interfaz

CCI

Solicitudes estándar de enumeración, solicitudes específicas de clase, dispositivo

gestión y, opcionalmente, gestión de llamadas.

CCI

Solicitudes estándar de enumeración, solicitudes específicas de clase, dispositivo

gestión y, opcionalmente, gestión de llamadas.

CCI

Notificación de eventos, como detección de timbre, estado de la línea serial, estado de la red.

DCI

Comunicación de datos sin procesar o formateados.

DCI

Comunicación de datos sin procesar o formateados.

La mayoría de los dispositivos de comunicación utilizan un punto final de interrupción para notificar eventos al host. No se deben utilizar puntos finales isócronos para la transmisión de datos cuando un protocolo propietario depende de la retransmisión de datos en caso de errores del protocolo USB. La comunicación isócrona puede perder datos inherentemente, ya que no cuenta con mecanismos de reintento.
Los siete modelos principales de comunicación abarcan varias subclases. Una subclase describe cómo el dispositivo debe usar la CCI para gestionar la gestión de dispositivos y llamadas. La siguiente tabla muestra todas las subclases posibles y el modelo de comunicación al que pertenecen.
Tabla – Subclases de CDC

Subclase
Modelo de control de línea directa Modelo de control abstracto

Modelo de comunicación
PSTN
PSTN

ExampNúmero de dispositivos que utilizan esta subclase
Dispositivos de módem controlados directamente por el host USB
Dispositivos de emulación en serie, dispositivos de módem controlados a través de un conjunto de comandos en serie

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

20/174

Encimaview

Subclase

Modelo de comunicación

ExampNúmero de dispositivos que utilizan esta subclase

Modelo de control telefónico

PSTN

Modelo ISDN de control multicanal

Modelo de control CAPI ISDN

Modelo de control ECM de redes Ethernet

Redes de cajeros automáticos

cajero automático

Modelo de control

Modelo de control remoto inalámbrico

CMM

Administración de dispositivos WMC

Modelo de línea directa móvil

CMM

ÓBEX

CMM

Modelo EEM de emulación Ethernet

Modelo de control de red

NCM

Dispositivos de telefonía de voz
Adaptadores de terminal de velocidad básica, adaptadores de terminal de velocidad primaria, teléfonos
Adaptadores de terminal de velocidad básica, adaptadores de terminal de velocidad primaria, teléfonos, módems de cable DOC-SIS, módems ADSL que admiten emulación PPPoE, adaptadores Wi-Fi (familia IEEE 802.11), adaptadores IEEE 802.3, módems ADSL
Equipos terminales móviles que se conectan a dispositivos inalámbricos
Equipos terminales móviles que se conectan a dispositivos inalámbricos Equipos terminales móviles que se conectan a dispositivos inalámbricos
Equipos terminales móviles que se conectan a dispositivos inalámbricos. Dispositivos que utilizan tramas Ethernet como siguiente capa de transporte. No están diseñados para dispositivos de enrutamiento y conectividad a Internet. Adaptadores IEEE 802.3 que transportan ancho de banda de datos de alta velocidad en la red.

Necesidades de recursos de la clase CDC ACM del dispositivo USB del núcleo

Cada vez que agrega una instancia de clase CDC ACM a una configuración USB mediante una llamada a la función sl_usbd_cdc_acm_add_to_configuration(), se asignarán los siguientes recursos desde el núcleo.

Recurso
Interfaces Interfaces alternativas Puntos finales Grupos de interfaces

Cantidad
2 2 3 1

Tenga en cuenta que estos números corresponden a cada configuración. Al configurar los valores de SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY y SL_USBD_DESCRIPTOR_QUANTITY, tenga en cuenta cuántas configuraciones se agregarán a la clase. Para el valor de configuración SL_USBD_OPEN_ENDPOINTS_QUANTITY, dado que los endpoints solo se abren cuando el host establece una configuración, solo debe considerar el número de endpoints necesarios para una instancia de clase.
Dispositivo USB CDC ACM Subclase Sobreview

La clase base CDC se compone de una interfaz de clase de comunicaciones (CCI) y una interfaz de clase de datos (DCI), que se analiza en detalle en la sección "Interfaz de clase base CDC del dispositivo USB".view Esta sección describe una CCI de tipo ACM. Consta de un punto final predeterminado para el elemento de gestión y un punto final de interrupción para el elemento de notificación. Se utilizan dos puntos finales masivos para transportar datos no especificados a través de la DCI.
La subclase ACM es utilizada por dos tipos de dispositivos de comunicación:
Dispositivos que admiten comandos AT (por ejemplo, módems de banda vocal). Dispositivos de emulación serie, también denominados dispositivos de puerto COM virtual.
Existen varias solicitudes específicas de subclase para la subclase ACM. Estas permiten controlar y configurar el dispositivo. La lista completa y la descripción de todas las solicitudes ACM se encuentran en la especificación.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

21/174

Encimaview Subclase para dispositivos PSTN, revisión 1.2, 9 de febrero de 2007, sección 6.2.2.
De esta lista, la subclase ACM de Silicon Labs9 admite lo siguiente:
Tabla: Solicitudes de ACM admitidas por Silicon Labs

Descripción de la solicitud de subclase

Establecer función de comunicación Obtener función de comunicación Borrar función de comunicación

El host envía esta solicitud para controlar la configuración de una función de comunicación determinada. No se utiliza para la emulación serie.
El host envía esta solicitud para obtener la configuración actual de una función de comunicaciones determinada. No se utiliza para la emulación en serie.
El host envía esta solicitud para borrar la configuración de una función de comunicaciones determinada. No se utiliza para la emulación serial.

Establecer codificación de línea

El host envía esta solicitud para configurar los ajustes del dispositivo ACM: velocidad en baudios, número de bits de parada, tipo de paridad y número de bits de datos. En una emulación serie, esta solicitud se envía automáticamente mediante un terminal serie cada vez que se configuran los ajustes serie de un puerto COM virtual abierto.

Obtener codificación de línea

El host envía esta solicitud para obtener la configuración actual de ACM (velocidad en baudios, bits de parada, paridad y bits de datos). En una emulación serie, los terminales serie envían esta solicitud automáticamente al abrir el puerto COM virtual.

SetControlLineState: El host envía esta solicitud para controlar la portadora de los módems semidúplex e indicar si el equipo terminal de datos (DTE) está listo. En la emulación en serie, el DTE es un terminal en serie. Para una emulación en serie, algunos terminales en serie permiten enviar esta solicitud con los controles configurados.

SetBreak

El host envía esta solicitud para generar una interrupción tipo RS-232. Para una emulación en serie, algunos terminales en serie permiten enviar esta solicitud.

La subclase ACM de Silicon Labs9 utiliza el punto final de interrupción IN para notificar al host sobre el estado actual de la línea serie. La serie
El estado de la línea es un mapa de bits que informa al host sobre:

Datos descartados por desbordamiento Error de paridad Error de trama Estado de detección de la señal de anillo Estado del mecanismo de detección de ruptura Estado de la portadora de transmisión Estado de detección de la portadora del receptor

La implementación de la subclase ACM de Silicon Labs9 cumple con la siguiente especificación:
Bus serie universal, comunicaciones, subclase para dispositivos PSTN, revisión 1.2, 9 de febrero de 2007.
Configuración de clase ACM CDC del dispositivo USB

Esta sección explica cómo configurar la clase CDC ACM (clase de dispositivo de comunicación, modelo de control abstracto). Hay dos grupos de parámetros de configuración:
Configuraciones específicas de la aplicación de la clase ACM CDC del dispositivo USB Configuraciones de instancia de la clase ACM CDC del dispositivo USB
Configuraciones específicas de la aplicación de la clase CDC ACM del dispositivo USB

Clase base CDC Subclase ACM
Clase base de CDC

Primero, para usar el módulo de clase CDC del dispositivo USB de Silicon Labs, deberá ajustar la configuración de tiempo de compilación de CDC #define-s según las necesidades de su aplicación. Se encuentran dentro del encabezado sl_usbd_core_config.h. file En la sección CDC. Su propósito es informar al módulo del dispositivo USB cuántos objetos CDC USB asignar.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

22/174

Encimaview

La siguiente tabla describe cada campo de configuración disponible en esta estructura de configuración.
Tabla: Definición de la configuración de CDC del dispositivo USB

Nombre de configuración
SL_USBD_CDC_CL COMO CANTIDAD_DE_INSTANCIA
SL_USBD_CDC_CONFIGURACIÓN_CUANTI
TY
INTERFAZ DE DATOS SL_USBD_CDC_CANTIDAD
TY

Descripción
Número de instancias de clase que asignará mediante una llamada a la función
sl_usbd_cdc_acm_create_instance().
Número de configuraciones. Las instancias de la clase ACM se pueden agregar a una o más configuraciones aaaa mediante sl_usbd_cdc_acm_add_to_configuration().
Número total de interfaces de datos (DCI) para todas las funciones CDC. Cada función CDC ACM agregada a la función sl_usbd_cdc_acm_create_instance() agregará una interfaz de datos.

Valor predeterminado
2
1
2

Subclase de ACM
La subclase ACM tiene una configuración de tiempo de compilación que se muestra en la siguiente tabla.
Tabla: Definición de configuración de CDC ACM del dispositivo USB

Nombre de configuración
CANTIDAD DE INSTANCIAS DE ASISTENCIA DE SUBCL. SL_USBD_CDC_ACM

Descripción
Configura la cantidad de instancias de subclase que asignará mediante una llamada a la
función sl_usbd_cdc_acm_create_instance().

Valor predeterminado
2

Configuraciones de instancias de clase ACM CDC de dispositivo USB

Esta sección define las configuraciones relacionadas con las instancias de la clase serial CDC ACM. Creación de instancias de clase, estado de línea, intervalo de llamadas, capacidades de gestión, p_acm_callbacks
Creación de instancias de clase

Para crear una instancia de clase serial CDC ACM, llame a la función T a sl_usbd_cdc_acm_create_instance() . Esta función toma tres argumentos de configuración, como se describe aquí.

intervalo de estado de línea
Este es el intervalo (en milisegundos) en el que su instancia de clase serial CDC ACM informará las notificaciones de estado de línea al host T aa. Este valor debe ser una potencia de dos (1, 2, 4, 8, 16, etc.).

capacidades de gestión de llamadas
Mapa de bits de capacidades de gestión de llamadas. Los valores posibles del mapa de bits son los siguientes:

Valor (bit)
DISPOSITIVO DE GESTIÓN DE LLAMADAS EN SERIE SL_USBD_ACM
DATOS DE GESTIÓN DE LLAMADAS EN SERIE SL_USBD_ACM_CCI_DCI

Descripción
El dispositivo gestiona la gestión de llamadas. Puede enviar y recibir información de gestión de llamadas a través de una interfaz de clase de datos.

devoluciones de llamada p_acm

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

23/174

Encimaview

aa M aa p_acm_callbacks es un puntero a la estructura de tipo sl_usbd_cdc_acm_callbacks_t. Su propósito es proporcionar a CDC AC Cl ss el conjunto de funciones de devolución de llamada que se llamarán cuando se produzca un evento CDC ACM. No todas las devoluciones de llamada son obligatorias y se puede pasar un puntero nulo (NULL) en la variable de estructura de devoluciones de llamada cuando no se necesita la devolución de llamada. La siguiente tabla describe cada campo de configuración disponible en esta estructura de configuración.
Tabla – Estructura de configuración de sl_usbd_cdc_acm _callbacks_t

Campos

Descripción

.permitir

Se llama cuando la instancia de clase USB está habilitada

exitosamente.

.desactivar

Se llama cuando la instancia de clase USB está deshabilitada.

.line_control_changed Se llama cuando se recibe un cambio de control de línea.

line_coding_changed Se llama cuando se recibe un cambio de codificación de línea.

Firma de función
void app_usbd_cdc_acm_enable(uint8_t subclase_nbr);
void app_usbd_cdc_acm_disable(uint8_t subclase_nbr);
void app_usbd_cdc_acm_line_control_changed(uint8_t subclase_nbr, uint8_t evento, uint8_t evento_chngd); bool app_usbd_cdc_acm_line_coding_changed(uint8_t subclase_nbr, subclase_nbr, sl_usbd_cdc_acm_line_coding_t
*p_codificación_de_línea

Consulte la sección Registro de devoluciones de llamadas de notificación de eventos para funciones de devolución de llamada, por ejemploampel.
Guía de programación de la clase CDC ACM del dispositivo USB

Esta sección explica cómo usar la clase del Modelo de Control Abstracto CDC. Inicialización de la clase ACM CDC del dispositivo USB. Adición de una instancia de la clase ACM CDC del dispositivo USB a su dispositivo. Comunicación mediante la clase ACM CDC.
Inicialización de la clase ACM CDC del dispositivo USB

Para agregar la funcionalidad de la clase CDC ACM a su dispositivo, primero debe inicializar la clase base CDC y la subclase ACM ejecutando las funciones sl_usbd_cdc_init() y sl_usbd_cdc_acm_init(). El siguiente ejemplo muestra cómo ejecutar sl_usbd_cdc_init() y sl_usbd_cdc_acm_init() con los argumentos predeterminados.

Example – Inicialización de la clase CDC ACM

sl_status_t estado;
status = sl_usbd_cdc_init(); if (status ! SL_STATUS_OK) { /* Se produjo un error. Se debe añadir aquí la gestión de errores. */
}
status = sl_usbd_cdc_acm_init(); if (status ! SL_STATUS_OK) { /* Se produjo un error. Se debe añadir aquí la gestión de errores. */
}
Cómo agregar una instancia de clase ACM CDC de dispositivo USB a su dispositivo
Para agregar la funcionalidad de clase CDC ACM a su dispositivo, debe crear una instancia y luego agregarla a las configuraciones de su dispositivo.
Creación de una instancia de clase ACM de CDC

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

24/174

Encimaview
Cómo agregar la instancia de clase ACM de CDC a las configuraciones de su dispositivo Cómo registrar devoluciones de llamadas de notificación de eventos
Creación de una instancia de clase ACM de CDC
aa M aaa Cree una instancia de clase CDC AC llamando a la función sl_usbd_cdc_acm_create_instance() . T aaa M aaa El siguiente ejemplo muestra cómo crear una instancia de clase CDC AC mediante sl_usbd_cdc_acm_create_instance() .
Example – Creación de una función ACM CDC mediante sl_usbd_cdc_acm_create_instance()

uint8_t subclase_nbr; sl_status_t estado;
estado = sl_usbd_cdc_acm_create_instance(64u, SL_USBD_ACM_SERIAL_CALL_MGMT_DATA_CCI_DCI | SL_USBD_ACM_SERIAL_CALL_MGMT_DEV, NULL, &subclass_nbr);
if (status ! SL_STATUS_OK) { /* Se produjo un error. Se debe agregar aquí la gestión de errores. */
}
Cómo agregar la instancia de clase ACM de CDC a las configuraciones de su dispositivo
Después de haber creado una instancia de clase CDC ACM, puede agregarla a una configuración llamando a la función
sl_usbd_cdc_acm_add_to_configuration().
El siguiente ejemplo muestra cómo llamar a sl_usbd_cdc_acm_add_to_configuration().
Example – Llamada a USBD ACM sl_usbd_cdc_acm_add_to_configuration()

sl_status_t estado;

estado = sl_usbd_cdc_acm_add_to_configuration(subclase_nbr,

(1)

configuración_nbr_fs);

(2)

si (estado ! SL_STATUS_OK) {

/* Se produjo un error. Se debe añadir aquí la gestión de errores. */

}

aaa (1) Número de clase que se agregará a la configuración devuelta por sl_usbd_cdc_acm_create_instance(). (2) Número de configuración (aquí se agrega a una configuración de velocidad completa).
Registro de devoluciones de llamadas de notificación de eventos
La clase CDC ACM Serial puede notificar a su aplicación sobre cualquier cambio en el control de línea o la codificación mediante funciones de devolución de llamada de notificación. Se puede pasar una estructura de funciones de devolución de llamada como argumento durante la creación de la instancia de ACM. Tenga en cuenta que estas devoluciones de llamada son opcionales. Por ejemplo:ample – El registro de devoluciones de llamadas de CDC ACM ilustra el uso de las funciones de registro de devoluciones de llamadas. Por ejemploample – La implementación de devoluciones de llamadas ACM de CDC muestra un example de implementación de las funciones de devolución de llamada.
Example – Registro de devoluciones de llamadas de CDC ACM

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

25/174

Encimaview

uint8_t subclase_nbr; sl_status_t estado;
sl_usbd_cdc_acm_callbacks_t sli_usbd_cdc_acm_callbacks = { app_usbd_cdc_acm_connect, app_usbd_cdc_acm_disconnect, app_usbd_cdc_acm_line_control_changed, app_usbd_cdc_acm_line_coding_changed, };
estado = sl_usbd_cdc_acm_create_instance(64u, SL_USBD_ACM_SERIAL_CALL_MGMT_DATA_CCI_DCI | SL_USBD_ACM_SERIAL_CALL_MGMT_DEV, &sli_usbd_cdc_acm_callbacks, &subclass_nbr);
if (status ! SL_STATUS_OK) { /* Se produjo un error. Se debe añadir aquí la gestión de errores. */ }
Example – Implementación de devoluciones de llamadas ACM de CDC

bool app_usbd_cdc_acm_codificación_de_línea_cambiada (uint8_t

subclase_nbr,

sl_usbd_cdc_acm_codificación_de_línea_t *p_codificación_de_línea)

{

uint32_t velocidad_en_baudios_nueva;

uint8_t paridad_nueva;

uint8_t bits de parada_nuevos;

uint8_t bits_de_datos_nuevos;

/* TODO Aplicar nueva codificación de línea.*/ baudrate_new = p_line_coding->BaudRate; parity_new = p_line_coding->Parity; stop_bits_new = p_line_coding->StopBits; data_bits_new = p_line_coding->DataBits;

devolver (verdadero);

(1)

}

void app_usbd_cdc_acm_line_control_changed (uint8_t subclase_nbr, uint8_t evento, uint8_t evento_cambiado)
{ bool estado_rts; bool estado_rts_cambiado; bool estado_dtr; bool estado_dtr_cambiado; bool estado_brk; bool estado_brk_cambiado;

/* TODO Aplicar nuevo control de línea. */ rts_state = ((evento & SL_USBD_CDC_ACM_CTRL_RTS) ! 0) ? verdadero : falso; rts_state_changed = ((evento_cambiado & SL_USBD_CDC_ACM_CTRL_RTS) ! 0) ? verdadero : falso; dtr_state = ((evento_cambiado & SL_USBD_CDC_ACM_CTRL_DTR) ! 0) ? verdadero : falso; dtr_state_changed = ((evento_cambiado & SL_USBD_CDC_ACM_CTRL_DTR) ! 0) ? verdadero : falso; brk_state = ((evento & SL_USBD_CDC_ACM_CTRL_BREAK) ! 0) ? verdadero : falso; brk_state_changed = ((evento_cambiado & SL_USBD_CDC_ACM_CTRL_BREAK) ! 0) ? verdadero : falso;
}

(1) Es importante devolver "false" a esta función si falla la codificación de línea. De lo contrario, devolver "true".
Comunicación mediante la clase ACM de CDC
Estado de serie
Codificación de línea Control de línea

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

26/174

Encimaview

Comunicación de instancia de subclase de estado de línea
Estado de serie
Codificación de línea
El host USB controla la codificación de línea (velocidad en baudios, paridad, etc.) del dispositivo CDC ACM. Cuando es necesario, la aplicación se encarga de configurar la codificación de línea. Existen dos funciones para recuperar y configurar la codificación de línea actual, como se describe en la tabla a continuación.
Tabla: Funciones de codificación de línea ACM de CDC

Función
sl_usbd_cdc_acm_get_line_codificación ()
sl_usbd_cdc_acm_set_line_codificación ()

Descripción
Su aplicación puede obtener la configuración de codificación de línea actual establecida desde el host con solicitudes SetLineCoding o con la función sl_usbd_cdc_acm_set_line_coding().
Su aplicación puede configurar la codificación de línea. El host puede recuperar la configuración mediante la solicitud GetLineCoding.

Control de línea
El host USB controla el control de línea (pines RTS y DTR, señal de interrupción, etc.) del dispositivo CDC ACM. Cuando sea necesario, la aplicación se encarga de aplicar los controles de línea. Se proporciona una función para recuperar y configurar los controles de línea actuales, como se describe en la tabla a continuación.
Tabla – Funciones de control de línea del CDC ACM

Función
sl_usb d_cd c_acm_get_line_control_state()

Su aplicación puede obtener el estado de la línea de control actual establecido por el host con la solicitud SetControlLineState.

Estado de línea
El host USB recupera el estado de la línea a intervalos regulares. Su aplicación debe actualizarlo cada vez que cambie. Cuando sea necesario, su aplicación se encarga de configurarlo. Se proporcionan dos funciones para recuperar y configurar los controles de línea actuales, como se describe en la tabla a continuación.
Tabla – Funciones de estado de línea de CDC ACM

Función
sl_usb d _cd c_acm_se t _línea _estado _e ve nt()
sl_usbd_cdc_acm_clear_line_state_e ve nt()

Su aplicación puede configurar cualquier evento de estado de línea. Al configurar el estado de línea, se envía una transferencia de interrupción IN al host para informar sobre un cambio en el estado de la línea serial.
La aplicación puede borrar dos eventos del estado de la línea: detección de portadora de transmisión y de portadora de recepción. La subclase de emulación serial ACM borra automáticamente todos los demás eventos.

Comunicación de instancias de subclase

La subclase ACM de Silicon Labs ofrece las siguientes funciones para comunicarse con el host. Para más detalles sobre los parámetros de functions9, consulte la referencia de funciones de la subclase ACM de CDC.

Nombre de la función
sl_usb d_cd c_acm_ lectura () sl_usb d_cd c_acm_escritura ()

Operación
Recibe datos del host a través de un punto final de salida masivo. Esta función está bloqueando. Envía datos al host a través de un punto final de entrada masivo. Esta función está bloqueando.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

27/174

Encimaview

Tabla: Resumen de la API de comunicación CDC ACM. sl_usbd_cdc_acm_read() y sl_usbd_cdc_acm_write() proporcionan comunicación síncrona, lo que indica que la transferencia está bloqueada. En otras palabras, al llamar a la función, la aplicación se bloquea hasta que la transferencia se completa con o sin error. Se puede especificar un tiempo de espera para evitar una espera eterna.ampA continuación se muestra un ejemplo de lectura y escritura.ample que recibe datos del host mediante el punto final de SALIDA masiva y envía datos al host mediante el punto final de ENTRADA masiva.
Listado – Serie de lectura y escritura Example

__ALINEADO(4) uint8_t rx_buf[2];

__ALINEADO(4) uint8_t tx_buf[2];

uint32_t

xfer_len;

estado_sl_t

estado;

estado = sl_usbd_cdc_acm_read(subclase_nbr,

(1)

rx_buf,

(2)

2u,

0u,

(3)

&xfer_len);

si (estado ! SL_STATUS_OK) {

/* Se produjo un error. Se debe añadir aquí la gestión de errores. */

}

estado = sl_usbd_cdc_acm_write(subclase_nbr,

(1)

tx_buf,

(4)

2u,

0u,

(3)

&xfer_len);

si (estado ! SL_STATUS_OK) {

/* Se produjo un error. Se debe añadir aquí la gestión de errores. */

}

T aaaaa M (1) El número de instancia de clase creado con sl_usbd_cdc_acm_create_instance() proporciona una referencia interna a la subclase AC para enrutar la transferencia al punto final de entrada o salida masivo adecuado. (2) La aplicación debe garantizar que el búfer proporcionado a la función sea lo suficientemente grande como para albergar todos los datos. De lo contrario, podrían surgir problemas de sincronización. (3) Para evitar un bloqueo infinito, especifique un tiempo de espera expresado en milisegundos. Un valor de 809 hace que la tarea de la aplicación espere indefinidamente. (4) La aplicación proporciona el búfer de transmisión inicializado.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

28/174

Encimaview
Encimaview

Dispositivo USB Clase HID

Dispositivo USB HID Clase Overview Necesidades de recursos de la clase HID del dispositivo USB del núcleo Configuración de la clase HID del dispositivo USB Guía de programación de la clase HID del dispositivo USB Tarea de informes de entrada periódicos de HID
Esta sección describe la clase de dispositivo de interfaz humana (HID) compatible con el dispositivo USB de Silicon Labs.
La clase HID abarca los dispositivos utilizados por los humanos para controlar las operaciones de la computadora, como teclados, ratones, dispositivos señaladores y dispositivos de juego.
La clase HID también se puede usar en un dispositivo compuesto que contenga controles como perillas, interruptores, botones y deslizadores. Por ejemplo:ampLos controles de volumen, silencio y desconexión de los auriculares se controlan mediante la función HID. La clase HID puede intercambiar datos para cualquier propósito utilizando únicamente transferencias de control e interrupción.
La clase HID es una de las clases USB más antiguas y utilizadas. Todos los principales sistemas operativos host proporcionan un controlador nativo para administrar dispositivos HID, por lo que diversos dispositivos de distintos fabricantes son compatibles con ella. Esta clase también incluye diversos tipos de elementos de salida, como LED, audio, respuesta táctil, etc.
La implementación de HID cumple con las siguientes especificaciones:
Definición de clase de dispositivo para dispositivos de interfaz humana (HID), 27/6/01, versión 1.11. Tablas de uso de HID para bus serie universal, 28/10/2004, versión 1.12.
Dispositivo USB HID Clase Overview
Encimaview
Un dispositivo HID se compone de los siguientes puntos finales:
Un par de puntos finales de control IN y OUT llamados punto final predeterminado Un punto final de interrupción IN Un punto final de interrupción OUT opcional
La siguiente tabla describe el uso de los diferentes puntos finales:
Tabla: Uso de puntos finales de la clase HID

Uso de la dirección del punto final

Control de entrada
Control
AFUERA
Interrumpir EN
Interrumpir
AFUERA

Dispositivo a host
Host a dispositivo
Dispositivo a host
Host a dispositivo

Solicitudes estándar de enumeración, solicitudes específicas de clase y comunicación de datos (Entrada, Informes de características enviados al host mediante la solicitud GET_REPORT). Solicitudes estándar de enumeración, solicitudes específicas de clase y comunicación de datos (Salida, Informes de características recibidos del host mediante la solicitud SET_REPORT). Comunicación de datos (Entrada e Informes de características).
Comunicación de datos (informes de salida y características).

Informe

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

29/174

Encimaview

Un host y un dispositivo HID intercambian datos mediante informes. Un informe contiene datos formateados que proporcionan información sobre los controles y otras entidades físicas del dispositivo HID. Un control es manipulable por el usuario y opera un aspecto del dispositivo. Por ejemplo:ampPor ejemplo, un control puede ser un botón de un ratón o un teclado, un interruptor, etc. Otras entidades informan al usuario sobre el estado de ciertas funciones del dispositivo. Por ejemplo,ampLos LED de un teclado notifican al usuario cuando la tecla Bloq Mayús está activada, el teclado numérico está activo, etc.
El host comprende el formato y el uso de los datos de un informe analizando el contenido de un descriptor de informe. El análisis del contenido lo realiza un analizador sintáctico. El descriptor de informe describe los datos proporcionados por cada control de un dispositivo. Se compone de elementos que representan información sobre el dispositivo y consisten en un prefijo de 1 byte y una longitud variable.
datos. Para obtener más detalles sobre el formato del elemento, consulte
1.11=, sección 5.6 y 6.2.2.
Hay tres tipos principales de artículos:
El elemento principal define o agrupa ciertos tipos de campos de datos.
El elemento global describe las características de los datos de un control.
El elemento local describe las características de datos de un control.
Cada tipo de elemento se define mediante diferentes funciones. Una función de elemento también se puede llamar tagUna función de elemento puede considerarse como un subelemento que pertenece a uno de los tres tipos principales de elementos. La siguiente tabla ofrece una breve descripción.view de las funciones del elemento 9 en cada tipo de elemento. Para una descripción completa de los elementos de cada categoría, consulte
Tabla: Descripción de la función de cada tipo de artículo

Artículo Tipo de artículo Función

Descripción

Entrada principal

Describe información sobre los datos proporcionados por uno o más controles físicos.

Salida principal Describe los datos enviados al dispositivo.

Característica principal

Describe la información de configuración del dispositivo enviada o recibida desde el dispositivo que influye en el comportamiento general del dispositivo o de uno de sus componentes.

Grupo de colección principal de elementos relacionados (Entrada, Salida o Característica).

Fin principal de Cierra una colección. Colección

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

30/174

Encimaview

Artículo Tipo de artículo Función

Descripción

Página de uso global

Identifica una función disponible dentro del dispositivo.

Lógico global Define el límite inferior de los valores informados en unidades lógicas. Mínimo

Lógico global Define el límite superior de los valores informados en unidades lógicas. Máximo

Global Physical Define el límite inferior de los valores reportados en unidades físicas, es decir el Mínimo Lógico expresado en unidades físicas.

Global Físico Define el límite superior de los valores reportados en unidades físicas, es decir el Máximo Lógico Máximo expresado en unidades físicas.

Unidad Global

Indica el exponente unitario en base 10. El exponente varía de -8 a +7.

Exponente

Unidad Global

Indica la unidad de los valores reportados. Por ejemplo, longitud, masa, unidades de temperatura, etc.

Tamaño del informe global

Indica el tamaño de los campos del informe en bits.

ID de informe global Indica el prefijo agregado a un informe en particular.

Recuento de informes globales

Indica el número de campos de datos de un elemento.

Impulso global

Coloca una copia de la tabla de estado del elemento global en la pila de la CPU.

Pop global

Reemplaza la tabla de estado del elemento con la última estructura de la pila.

Uso local

Representa un índice para designar un uso específico dentro de una página de uso. Indica el uso sugerido por el proveedor para un control o grupo de controles específico. Un uso proporciona información al desarrollador de aplicaciones sobre lo que mide realmente un control.

Uso local

Define el uso inicial asociado con una matriz o un mapa de bits.

Mínimo

Uso local

Define el uso final asociado con una matriz o un mapa de bits.

Máximo

Designador local: determina la parte del cuerpo utilizada para un control. El índice apunta a un designador en el campo físico.

Índice

descriptor.

Designador local Define el índice del designador inicial asociado con una matriz o mapa de bits. Mínimo

Designador local Define el índice del designador final asociado con una matriz o mapa de bits. Máximo

Índice de cadena local

Índice de cadena para un descriptor de cadena. Permite asociar una cadena con un elemento o control específico.

Cadena local

Especifica el primer índice de cadena al asignar un grupo de cadenas secuenciales a controles en una matriz

Mínimo o mapa de bits.

Local Local

Máximo de cadena
Delimitador

Especifica el último índice de cadena al asignar un grupo de cadenas secuenciales a controles en una matriz o mapa de bits.
Define el comienzo o el final de un conjunto de elementos locales.

Los datos de un control deben definir al menos los siguientes elementos:
Entrada, salida o función Elementos principales Uso Elemento local Uso Página Elemento global Mínimo lógico Elemento global Máximo lógico Elemento global Tamaño del informe Elemento global

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

31/174

Encimaview
Elemento global de recuento de informes. La tabla a continuación muestra la representación del contenido del descriptor de un informe de ratón desde la perspectiva de un analizador HID del host. El ratón tiene tres botones (izquierdo, derecho y rueda). El código presentado en el ejemplo...ampA continuación se muestra una implementación de código correspondiente a esta representación del descriptor de informe del mouse.
Figura: Contenido del descriptor de informe de un analizador HID de host View

(1) La función del elemento Página de uso especifica la función general del dispositivo. En este ejemploampes decir, el dispositivo HID pertenece a un
control de escritorio genérico.
(2) La colección de aplicaciones agrupa elementos principales que tienen un propósito común y que pueden resultar familiares para las aplicaciones. En el diagrama, el grupo se compone de tres elementos principales de entrada. Para esta colección, el uso sugerido para los controles es un ratón, como se indica en el elemento de uso. (3) Las colecciones anidadas pueden utilizarse para proporcionar más detalles sobre el uso de un solo control o grupo de controles a las aplicaciones. En este ejemploampEl objeto físico de la colección, anidado en la aplicación de la colección, se compone de los mismos tres elementos de entrada que forman la aplicación de la colección. El objeto físico de la colección se utiliza para un conjunto de elementos de datos que representan puntos de datos recopilados en un punto geométrico. En el ejemploample, el uso sugerido es un puntero como se indica en el elemento de Uso. Aquí el uso del puntero se refiere a las coordenadas de la posición del ratón y el software del sistema traducirá las coordenadas del ratón en el movimiento del cursor de la pantalla. (4) Las páginas de uso anidadas también son posibles y dan más detalles sobre un cierto aspecto dentro de la función general del dispositivo. En este caso, se agrupan dos elementos de Entradas y corresponden a los botones del ratón. Un elemento de Entrada define los tres botones del ratón (derecho, izquierdo y rueda) en términos de número de campos de datos para el elemento (elemento de Conteo de Informes), tamaño de un campo de datos (elemento de Tamaño de Informe) y posibles valores para cada campo de datos (elementos de Uso Mínimo y Máximo, Mínimo Lógico y Máximo). El otro elemento de Entrada es una constante de 13 bits que permite que los datos del informe de Entrada se alineen en un límite de bytes. Este elemento de Entrada se utiliza solo para fines de relleno. (5) Otra página de uso anidada que hace referencia a un control de escritorio genérico se define para las coordenadas de la posición del ratón. Para esta página de uso, el elemento de Entrada describe los campos de datos correspondientes a los ejes x e y según lo especificado por los dos Usos
elementos.
Tras analizar el contenido del descriptor de informe del ratón, el analizador HID del host puede interpretar los datos del informe de entrada enviados por el dispositivo mediante una transferencia de interrupción IN o en respuesta a una solicitud GET_REPORT. Los datos del informe de entrada correspondientes al descriptor de informe del ratón se muestran en la Figura: Contenido del descriptor de informe de un analizador HID del host. View is

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

32/174

Encimaview

Se muestra en la tabla a continuación. El tamaño total de los datos del informe es de 4 bytes. Se pueden enviar diferentes tipos de informes a través del mismo punto final. Para distinguir los diferentes tipos de informes, se añade un prefijo de ID de informe de 1 byte al informe de datos. Si se utilizó un ID de informe en el ejemploampEn el caso del informe del mouse, el tamaño total de los datos del informe sería de 5 bytes.
Tabla: Informe de entrada enviado al host y correspondiente al estado de un mouse de 3 botones

Desplazamiento de bits
0 1 2 3 16 24

Número de bits 1 1 1 13 8 8

Descripción: Botón 1 (botón izquierdo). Botón 2 (botón derecho). Botón 3 (botón de rueda). No utilizado. Posición en el eje X. Posición en el eje Y.

Un descriptor físico indica la parte o partes del cuerpo destinadas a activar uno o más controles. Una aplicación puede usar esta información para asignar una funcionalidad al control de un dispositivo. Un descriptor físico es opcional y específico de la clase, y la mayoría de los dispositivos tienen poca ventaja al usarlo. Consulte
Necesidades de recursos de la clase HID del dispositivo USB del núcleo

Cada vez que agrega una instancia de clase HID a una configuración USB a través de una llamada a la función sl_usbd_hid_add_to_configuration(), se asignarán los siguientes recursos desde el núcleo.

Recurso
Interfaces Interfaces alternativas Puntos finales Grupos de interfaces

Cantidad
1 1 1 (2 si el punto final de interrupción OUT está habilitado) 0

Tenga en cuenta que estos números corresponden a cada configuración. Al configurar los valores de SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY y SL_USBD_DESCRIPTOR_QUANTITY, tenga en cuenta cuántas configuraciones se agregarán a la clase. Para el valor de configuración SL_USBD_OPEN_ENDPOINTS_QUANTITY, dado que los endpoints solo se abren cuando el host establece una configuración, solo debe considerar el número de endpoints necesarios para una instancia de clase.
Configuración de clase HID del dispositivo USB

Para configurar la clase HID se utilizan dos grupos de parámetros de configuración:
Configuraciones específicas de la aplicación de la clase HID del dispositivo USB Configuraciones de instancia de la clase HID del dispositivo USB
Configuraciones específicas de la aplicación de la clase HID del dispositivo USB

Primero, para usar el módulo de clase HID del dispositivo USB de Silicon Labs, ajuste la configuración de compilación de HID según las necesidades de su aplicación. Se encuentran dentro del encabezado sl_usbd_core_config.h. file En la sección HID, se dividen en dos secciones: las configuraciones de cantidad y las configuraciones de tareas HID. El propósito de las configuraciones de cantidad es informar al módulo del dispositivo USB cuántos objetos USB HID asignar.
La siguiente tabla describe cada definición de configuración.
Tabla: Definición de la configuración HID del dispositivo USB

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

33/174

Encimaview

Nombre de configuración
CANTIDAD DE INSTANCIAS DE ASISTENCIA SL_USBD_HID_CL
CANTIDAD DE CONFIGURACIÓN DE SL_USBD_HID
SL_USBD_HID_REPORT_ID_CANTIDAD
SL_USBD_HID_PUSH_P OP_CANTIDAD_DE_ARTÍCULOS
TEMPORIZADOR HID SL_USBD_T PREGUNTAR_TAMAÑO_DE_PILA
TEMPORIZADOR HID SL_USBD_T PREGUNTAR_PRIORIDAD

Descripción
Número de instancias de clase que asignará mediante una llamada a la función
sl_usbd_hid_create_instance().
Número de configuraciones. Se pueden agregar instancias de la clase HID a una o más configuraciones aaaa mediante la función sl_usbd_hid_add_to_configuration(). Configura el número total de ID de informe que se asignarán.
Configura la cantidad total de elementos Push/Pop a asignar.
La tarea del temporizador gestiona todas las operaciones HID basadas en temporizador. Esta configuración permite establecer el tamaño de la pila (en bytes). Prioridad de la tarea HID. Esta es una prioridad de CMSIS-RTOS2.

Valor predeterminado
2 1 2 0 2048
osPriorityHigh

Configuraciones de instancia de clase HID de dispositivo USB Creación de instancia de clase subclase
código de país del protocolo
interval_in y interval_out p_hid_callback Descriptor de informe de clase HID Example Esta sección define las configuraciones relacionadas con las instancias de la clase HID.
Creación de instancias de clase
La creación de una instancia de clase HID se realiza llamando a la función sl_usbd_hid_create_instance(), que utiliza varios argumentos de configuración que se describen a continuación.
subclase
Código de la subclase HID. Los valores posibles son:
SL_USBD_HID_SUBCL AS_NINGUNO SL_USBD_HID_SUBCL AS_ARRANQUE
Un dispositivo HID que utiliza la subclase de arranque debe usar formatos de informe estándar. Para más información sobre los códigos de subclase, consulte la sección 4.2 de la revisión 1.11 de la especificación HID.
protocolo
Protocolo utilizado por el dispositivo HID. Los valores posibles son:
SL_USBD_HID_PROTOCOLO_NINGUNO SL_USBD_HID_PROTOCOLO_KBD SL_USBD_HID_PROTOCOLO_RATÓN
Si su función HID es un ratón, el protocolo debe establecerse en SL_USBD_HID_PROTOCOL_MOUSE. Si es un teclado, debe establecerse en SL_USBD_HID_PROTOCOL_KBD. De lo contrario, el protocolo debe establecerse en SL_USBD_HID_PROTOCOL_NONE. Para más información sobre los códigos de subclase, consulte la sección 4.3 de la revisión 1.11 de la especificación HID.
código de país
ID del código de país. Los valores posibles son:
CÓDIGO DE PAÍS SL_USBD_HID_NO_ADMITIDO

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

34/174

Encimaview
SL_USBD_HID_CÓDIGO DE PAÍS_ÁRABE SL_USBD_HID_CÓDIGO DE PAÍS_BELGA SL_USBD_HID_CÓDIGO DE PAÍS_CANADIENSE_BILINGÜE SL_USBD_HID_CÓDIGO DE PAÍS_CANADIENSE_FRANCÉS SL_USBD_HID_CÓDIGO DE PAÍS_REPÚBLICA_CHECA SL_USBD_HID_CÓDIGO DE PAÍS_DANÉS SL_USBD_HID_CÓDIGO DE PAÍS_FINLANDÉS SL_USBD_HID_CÓDIGO DE PAÍS_FRANCÉS SL_USBD_HID_CÓDIGO DE PAÍS_ALEMÁN SL_USBD_HID_CÓDIGO DE PAÍS_GRIEGO SL_USBD_HID_CÓDIGO DE PAÍS_HEBREO SL_USBD_HID_CÓDIGO DE PAÍS_HUNGRÍA SL_USBD_HID_CÓDIGO DE PAÍS_INTERNACIONAL SL_USBD_HID_CÓDIGO DE PAÍS_ITALIANO SL_USBD_HID_CÓDIGO DE PAÍS_JAPÓN_KATAKANA SL_USBD_HID_CÓDIGO DE PAÍS_COREANO SL_USBD_HID_CÓDIGO DE PAÍS_LATINOAMERICANO SL_USBD_HID_CÓDIGO DE PAÍS_BAJOS_HOLANDÉS SL_USBD_HID_CÓDIGO DE PAÍS_NORUEGO SL_USBD_HID_CÓDIGO DE PAÍS_PERSA_FARSI SL_USBD_HID_CÓDIGO DE PAÍS_POLÍGONO SL_USBD_HID_CÓDIGO DE PAÍS_PORTUGUÉS SL_USBD_HID_CÓDIGO DE PAÍS_RUSIA SL_USBD_HID_CÓDIGO DE PAÍS_ESLOVAQUIA SL_USBD_HID_CÓDIGO DE PAÍS_ESPAÑOL SL_USBD_HID_CÓDIGO DE PAÍS_SUECO SL_USBD_HID_CÓDIGO_DE_PAÍS_SUIZA_FRANCÉS SL_USBD_HID_CÓDIGO_DE_PAÍS_SUIZA_ALEMÁN SL_USBD_HID_CÓDIGO_DE_PAÍS_SUIZA_RL Y SL_USBD_HID_CÓDIGO_DE_PAÍS_TAIWÁN SL_USBD_HID_CÓDIGO_DE_PAÍS_TURCO_Q SL_USBD_HID_CÓDIGO_DE_PAÍS_REINO UNIDO SL_USBD_HID_CÓDIGO_DE_PAÍS_EE. UU. SL_USBD_HID_CÓDIGO_DE_PAÍS_YUG OSL AVIA SL_USBD_HID_CÓDIGO_DE_PAÍS_TURCO_F
El código de país identifica el país para el que está localizado el hardware. La mayoría del hardware no está localizado, por lo que este valor sería SL_USBD_HID_COUNTRY_CODE_NOT_SUPPORTED (0). Sin embargo, algunos teclados pueden usar este campo para indicar el idioma de las teclas.
Para obtener más información sobre los códigos de país, consulte la sección 6.2.1 de la revisión 1.11 de la especificación HID.
intervalo_de_entrada e intervalo_de_salida
interval_in e interval_out representan el intervalo de sondeo del punto final de interrupción IN y del punto final de interrupción OUT.
Esto representa el intervalo de sondeo del endpoint, en milisegundos. La configuración de este valor depende de la frecuencia con la que el dispositivo pueda generar un nuevo informe para el host. Por ejemplo, si se genera un informe cada 16 milisegundos, el intervalo debe ser de 16 milisegundos o menos.
El valor debe ser una potencia de 2 (1, 2, 4, 8, 16, etc.).
Se ignora un valor interval_out si ctrl_rd_en se establece en verdadero.
devolución de llamada p_hid
aaaa p_hid_callback es un puntero a una estructura de tipo sl_usbd_hid_callbacks_t. Su propósito es proporcionar al HID Cl ss el conjunto de funciones de devolución de llamada que se llamarán cuando se produzca un evento HID.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

35/174

Encimaview

No todas las devoluciones de llamada son obligatorias, y se puede pasar un puntero nulo (NULL) en la variable de la estructura de devoluciones de llamada cuando no se necesita. La siguiente tabla describe cada campo de configuración disponible en esta estructura.
Tabla – Estructura de configuración de sl_usbd_hid_callbacks_t

Campos

Descripción

Firma de función

.habilitar .deshabilitar .obtener_informe_desc
.obtener_phy_desc
.establecer_informe_de_salida .obtener_informe_de_funciones .establecer_informe_de_funciones

Se llama cuando la instancia de clase USB se habilita correctamente. Se llama cuando la instancia de clase USB se deshabilita.
Se llama durante la creación de la instancia HID para pasar el descriptor de informe. Para cada una de las funciones HID, debe proporcionar un descriptor de informe. El descriptor de informe indica al host cómo se debe analizar el informe periódico que enviará el dispositivo. Escribir su propio descriptor de informe puede ser un desafío, por lo que existen algunos recursos útiles. Esta es la única función de devolución de llamada obligatoria. Se llama durante la creación de la instancia HID para pasar el descriptor físico. El descriptor físico proporciona información sobre la parte o partes específicas del cuerpo humano que activan uno o más controles. Para obtener más información sobre los descriptores físicos, consulte la sección 6.2.3 de la revisión 1.11 de la especificación HID. El descriptor físico es opcional y, en la mayoría de los casos, se ignora. El búfer que se pasa aquí se puede establecer en NULL y la longitud en 0. Se llama cuando el host establece un informe como se describe en el descriptor de informe (al enviar un informe).
Se llama cuando el host solicita un informe de características como se describe en su descriptor de informe.
Se llama cuando el host establece un informe de características como se describe en su descriptor de informe.

void app_usbd_hid_enable(uint8_t clase_nbr); void app_usbd_hid_disable(uint8_t clase_nbr); void app_usbd_hid_get_report_desc(uint8_t clase_nbr, const uint8_t *p_report_ptr, uint16_tp_report_len);
void app_usbd_hid_get_phy_desc(uint8_t número_de_clase, const uint8_t *p_report_ptr, uint16_tp_report_len);
void app_usbd_hid_set_output_report(uint8_t número_clase, uint8_t id_informe, uint8_t *p_informe_buf, uint16_t longitud_informe); void app_usbd_hid_get_feature_report(uint8_t número_clase, uint8_t id_informe, uint8_t *p_informe_buf, uint16_t longitud_informe); void app_usbd_hid_set_feature_report(uint8_t número_clase, uint8_t id_informe, uint8_t *p_informe_buf, uint16_t longitud_informe);

.obtener_protocolo

Recupera el protocolo activo actual.

void app_usbd_hid_get_protocol(uint8_t número_de_clase, uint8_t *p_protocolo);

.establecer_protocolo

Establece el protocolo activo actual.

void app_usbd_hid_set_protocol(uint8_t clase_nbr, uint8_t protocolo);

Descriptor de informe de clase HID Example

Clases HID de Silicon LabsampLa aplicación proporciona un ejemploampde un descriptor de informe para un ratón simple. El ejemploampA continuación se muestra un descriptor de informe del mouse.
Example – Descriptor de informe del ratón

estático uint8_t app_usbd_hid_report_desc[] = {

(1) (2)

SL_USBD_HID_PÁGINA_DE_USO_GLOBAL + 1, SL_USBD_HID_PÁGINA_DE_USO_CONTROLES_GENÉRICOS_DE_ESCRITORIO,

SL_USBD_HID_USO_LOCAL + 1, SL_USBD_HID_CA_MOUSE,

(3)

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

36/174

Encimaview

SL_USBD_HID_COLLECTION_PRINCIPAL +1, SL_USBD_HID_COLLECTION_APPLICATION,(4)

USO LOCAL SL_USBD_HID +1, PUNTERO CP SL_USBD_HID,(5)

SL_USBD_HID_COLECCIÓN_PRINCIPAL +1, SL_USBD_HID_COLECCIÓN_FÍSICA,(6)

SL_USBD_HID_PÁGINA_DE_USO_GLOBAL +1, BOTÓN_DE_PÁGINA_DE_USO_GLOBAL_SL_USBD_HID,(7)

SL_USBD_HID_USO_LOCAL_MÍNIMO +1,0 01,

SL_USBD_HID_USO_LOCAL_MÁXIMO +1,0 03,

SL_USBD_HID_GLOBAL_LOG_MIN +1,0 00,

SL_USBD_HID_GLOBAL_LOG_MAX +1,0 01,

SL_USBD_HID_GLOBAL_REPORT_COUNT +1,0 03,

SL_USBD_HID_GLOBAL_REPORT_SIZE +1,0 01,

SL_USBD_HID_ENTRADA_PRINCIPAL_+1, SL_USBD_HID_DATOS_PRINCIPALES |

SL_USBD_HID_VARIABLE_PRINCIPAL |

SL_USBD_HID_PRINCIPAL_ABSOLUTO,

SL_USBD_HID_GLOBAL_REPORT_COUNT +1,0 01,(8)

SL_USBD_HID_GLOBAL_REPORT_SIZE +1,0 0D,

SL_USBD_HID_ENTRADA_PRINCIPAL_+1, SL_USBD_HID_CONSTANTE_PRINCIPAL_,(9)

SL_USBD_HID_PÁGINA_DE_USO_GLOBAL +1, SL_USBD_HID_PÁGINA_DE_USO_CONTROLES_GENÉRICOS_DE_ESCRITORIO,

SL_USBD_HID_USO_LOCAL +1, SL_USBD_HID_DV_X,

SL_USBD_HID_USO_LOCAL +1, SL_USBD_HID_DV_Y,

SL_USBD_HID_GLOBAL_LOG_MIN +1,0 81,

SL_USBD_HID_GLOBAL_LOG_MAX +1,0 7F,

SL_USBD_HID_GLOBAL_REPORT_SIZE +1,0 08,

SL_USBD_HID_GLOBAL_REPORT_COUNT +1,0 02,

SL_USBD_HID_ENTRADA_PRINCIPAL_+1, SL_USBD_HID_DATOS_PRINCIPALES |

SL_USBD_HID_VARIABLE_PRINCIPAL |

SL_USBD_HID_PRINCIPAL_RELATIVO,

Colección final principal SL_USBD_HID,(10)

Colección final principal SL_USBD_HID

(11)};

(1) La tabla que representa un descriptor de informe de ratón se inicializa de forma que cada línea corresponde a un elemento corto. Este último se forma a partir de un prefijo de 1 byte y un dato de 1 byte. Consulte viewed por un analizador HID de host en la Figura – Contenido del descriptor de informe de un analizador HID de host View.
(2) Se utiliza la página de uso de escritorio genérico.
(3) Dentro de la página de uso genérico del escritorio, el uso tag Sugiere que el grupo de controles sirve para controlar un ratón. Un conjunto de ratones suele constar de dos ejes (X e Y) y uno, dos o tres botones.
(4) Se inicia la recolección de ratones.
(5) Dentro de la colección de ratones, un uso tag Sugiere más específicamente que los controles del ratón pertenecen a la colección de punteros. Una colección de punteros es un conjunto de ejes que genera un valor para dirigir, indicar o señalar las intenciones del usuario hacia una aplicación.
(6) Se inicia la colección de punteros.
(7) La página de uso de botones define un elemento de entrada compuesto por tres campos de 1 bit. Cada campo de 1 bit representa los botones 1, 2 y 3 del ratón, respectivamente, y puede devolver un valor de 0 o 1.
(8) El elemento de entrada para la página de uso de botones se rellena con otros 13 bits.
(9) Otra página de uso genérico del escritorio está indicada para describir la posición del mouse con los ejes X e Y. El elemento de entrada está compuesto por dos campos de 8 bits cuyo valor puede estar entre -127 y 127.
(10) La colección de punteros está cerrada.
(11) La colección de ratones está cerrada.
Página HID de USB.org

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

37/174

Encimaview
El Foro de Implementadores USB (USB-IF) ofrece una herramienta llamada "Herramienta de Descriptor HID" junto con información sobre el formato del descriptor de informes. Consulte http://www.usb.org/developers/hidpage/ para obtener más información.
Guía de programación de la clase HID del dispositivo USB
Esta sección explica cómo usar la clase HID. Inicialización de la clase HID del dispositivo USB. Adición de una instancia de la clase HID del dispositivo USB a su dispositivo. Comunicación mediante la clase HID del dispositivo USB.
Inicialización de la clase HID del dispositivo USB
Para agregar la funcionalidad de la clase HID a su dispositivo, primero debe inicializar la clase llamando a la función sl_usbd_hid_init() . El ejemploampA continuación se muestra cómo llamar a sl_usbd_hid_init() con los argumentos predeterminados. Para obtener más información sobre los argumentos de configuración que se deben pasar a sl_usbd_hid_init(), consulte Configuraciones específicas de la aplicación de la clase HID del dispositivo USB.
Example – Llamando a sl_usbd_hid_init()
sl_status_t estado;
status = sl_usbd_hid_init(); if (status ! SL_STATUS_OK) { /* Se produjo un error. Se debe añadir aquí la gestión de errores. */
}
Cómo agregar una instancia de clase HID de dispositivo USB a su dispositivo
Para agregar la funcionalidad de clase HID a su dispositivo, debe crear una instancia y luego agregarla a las configuraciones de su dispositivo.
Creación de una instancia de clase HID
Cree una instancia de la clase HID llamando a la función sl_usbd_hid_create_instance() . El ejemploampA continuación se muestra cómo crear una función de ratón sencilla mediante sl_usbd_hid_create_instance() con los argumentos predeterminados. Para obtener más información sobre los argumentos de configuración que se deben pasar a sl_usbd_hid_create_instance(), consulte Configuraciones de instancias de clase HID de dispositivos USB.
Example – Agregar una función de mouse mediante sl_usbd_hid_create_instance()

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

38/174

Encimaview
/* Constantes globales. */ static const uint8_t app_usbd_hid_mouse_report_desc[] = {
SL_USBD_HID_PÁGINA_DE_USO_GLOBAL + 1, SL_USBD_HID_PÁGINA_DE_USO_CONTROLES_GENÉRICOS_DE_ESCRITORIO, SL_USBD_HID_USO_LOCAL + 1, SL_USBD_HID_CA_MOUSE, SL_USBD_HID_COLECCIÓN_PRINCIPAL + 1, SL_USBD_HID_APLICACIÓN_DE_COLECCIÓN, SL_USBD_HID_USO_LOCAL + 1, SL_USBD_HID_PUNTERO_CP, SL_USBD_HID_COLECCIÓN_PRINCIPAL + 1, SL_USBD_HID_COLECCIÓN_FÍSICA, SL_USBD_HID_PÁGINA_DE_USO_GLOBAL + 1, SL_USBD_HID_BOTÓN_DE_PÁGINA_DE_USO, SL_USBD_HID_USO_LOCAL_MÍNIMO + 1, 0 01, SL_USBD_HID_USO_LOCAL_MÁXIMO + 1, 0,03, SL_USBD_HID_REGISTRO_GLOBAL_MÍNIMO + 1, 0,00, SL_USBD_HID_REGISTRO_GLOBAL_MÁXIMO + 1, 0,01, SL_USBD_HID_RECUENTO_INFORME_GLOBAL + 1, 0,03, SL_USBD_HID_TAMAÑO_INFORME_GLOBAL + 1, 0,01, SL_USBD_HID_ENTRADA_PRINCIPAL + 1, SL_USBD_HID_DATOS_PRINCIPALES | SL_USBD_HID_VARIABLE_PRINCIPAL | SL_USBD_HID_PRINCIPAL_ABSOLUTO, SL_USBD_HID_CONTADOR_INFORME_GLOBAL + 1, 0 01, SL_USBD_HID_TAMAÑO_INFORME_GLOBAL + 1, 0 0D, SL_USBD_HID_ENTRADA_PRINCIPAL + 1, SL_USBD_HID_CONSTANTE_PRINCIPAL, SL_USBD_HID_PÁGINA_USO_GLOBAL + 1, SL_USBD_HID_PÁGINA_USO_GENERICO_ESCRITORIO, SL_USBD_HID_USO_LOCAL + 1, SL_USBD_HID_DV_X, SL_USBD_HID_USO_LOCAL + 1, SL_USBD_HID_DV_Y, SL_USBD_HID_REGISTRO_GLOBAL_MIN + 1, 0 81, SL_USBD_HID_GLOBAL_LOG_MAX + 1, 0 7F, SL_USBD_HID_GLOBAL_REPORT_SIZE + 1, 0 08, SL_USBD_HID_GLOBAL_REPORT_COUNT + 1, 0 02, SL_USBD_HID_MAIN_INPUT + 1, SL_USBD_HID_MAIN_DATA | SL_USBD_HID_MAIN_VARIABLE | SL_USBD_HID_MAIN_RELATIVE, SL_USBD_HID_MAIN_ENDCOLLECTION, SL_USBD_HID_MAIN_ENDCOLLECTION };
/* Variables locales.*/ uint8_t class_nbr; sl_status_t estado;
sl_usbd_hid_callbacks_t app_usbd_hid_callbacks = { NULL, NULL, app_usbd_hid_get_report_desc, NULL, NULL, NULL, NULL, NULL, NULL };
void app_usbd_hid_get_report_desc(uint8_t número_de_clase, const uint8_t **p_report_ptr, uint16_t *p_report_len)
{ (void)clase_nbr;
*p_report_ptr = app_usbd_hid_mouse_report_desc; *p_report_len = sizeof(app_usbd_hid_mouse_report_desc); }
estado = sl_usbd_hid_create_instance(SL_USBD_HID_SUBCLASS_BOOT, SL_USBD_HID_PROTOCOL_MOUSE, SL_USBD_HID_COUNTRY_CODE_NOT_SUPPORTED, Ex_USBD_HID_Mouse_ReportDesc, tamaño de (Ex_USBD_HID_Mouse_ReportDesc), 2u, 2u, verdadero, &app_usbd_hid_callbacks, &class_nbr);
Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

39/174

Encimaview
/* Se produjo un error. Se debe añadir aquí la gestión de errores. */}
Cómo agregar la instancia de clase HID a las configuraciones de su dispositivo Después de haber creado una instancia de clase HID, puede agregarla a una configuración llamando a la función
sl_usbd_hid_add_to_configuration() .
El exampA continuación se muestra cómo llamar a sl_usbd_hid_add_to_configuration().
Example – Llamando a sl_usbd_hid_add_to_configuration()

sl_status_t estado;

sl_usbd_hid_add_to_configuration(número_de_clase,

(1)

config_nbr_fs); (2)

si (estado ! SL_STATUS_OK) {

/* Se produjo un error. Se debe añadir aquí la gestión de errores. */

}

(1) Número de clase para agregar a la configuración devuelta por sl_usbd_hid_create_instance(). (2) Número de configuración (aquí agregándolo a una configuración de velocidad completa).
Comunicación mediante la clase HID del dispositivo USB
Comunicación de instancia de clase Comunicación sincrónica Comunicación de instancia de clase La clase HID ofrece las siguientes funciones para comunicarse con el host.
Tabla: Resumen de la API de comunicación de HID

Nombre de la función
sl_usb d _hid _ lectura _sy nc() sl_usb d _hid _escritura _sy nc()

Operación: Recibe datos del host a través del punto final de interrupción de salida. Esta función es bloqueante. Envía datos al host a través del punto final de interrupción de entrada. Esta función es bloqueante.

Comunicación síncrona. La comunicación síncrona implica que la transferencia se bloquea. Al llamar a la función, la aplicación se bloquea hasta que la transferencia se completa con o sin errores. Se puede especificar un tiempo de espera para evitar una espera interminable.ampLa siguiente imagen muestra una lectura y escritura que recibe datos del host utilizando el punto final de interrupción OUT y envía datos al host utilizando el punto final de interrupción IN.
Example – Lectura y escritura HID sincrónica

__ALINEADO(4) uint8_t rx_buf[2];

__ALINEADO(4) uint8_t tx_buf[2];

uint32_t

xfer_len;

estado_sl_t

estado;

estado = sl_usbd_hid_read_sync(clase_nbr,

(1)

(vacío *)rx_buf,

(2)

2u,

0u,

(3)

&xfer_len);

si (estado ! SL_STATUS_OK) {

/* Se produjo un error. Se debe añadir aquí la gestión de errores. */

}

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

40/174

Encimaview
status =sl_usbd_hid_read_sync(class_nbr,(1)(void *)rx_buf,(2)2u,0u,(3)&xfer_len);if(status ! SL_STATUS_OK){/* Se produjo un error. Se debe añadir la gestión de errores aquí. */}
status =sl_usbd_hid_write_sync(class_nbr,(1)(void *)tx_buf,(4)2u,0u,(3)&xfer_len);if(status ! SL_STATUS_OK){/* Se produjo un error. Se debe añadir la gestión de errores aquí. */}
(1) El número de instancia de clase creado a partir de sl_usbd_hid_create_instance() proporciona una referencia interna para que la clase HID enrute la transferencia al punto final de interrupción OUT o IN adecuado.
(2) La aplicación debe garantizar que el búfer proporcionado a la función sea lo suficientemente grande como para albergar todos los datos. De lo contrario, podrían surgir problemas de sincronización. Internamente, la operación de lectura se realiza con el punto final de control o con el punto final de interrupción, según el indicador de lectura de control establecido al llamar a sl_usbd_hid_create_instance().
(3) Para evitar un bloqueo infinito, se puede especificar un tiempo de espera expresado en milisegundos. Un valor de 809 hace que la tarea de la aplicación espere indefinidamente.
(4) La aplicación proporciona el búfer de transmisión inicializado.
Tarea de informes periódicos de entrada de HID
Para ahorrar ancho de banda, el host puede silenciar los informes de un punto final de interrupción IN limitando la frecuencia de los informes. Para ello, el host debe enviar la solicitud SET_IDLE. La clase HID implementada por Silicon Labs contiene una tarea interna que respeta la limitación de frecuencia de los informes, la cual se puede aplicar a uno o varios informes de entrada. La figura "Tarea de Informes de Entrada Periódicos" muestra el funcionamiento de las tareas de informes de entrada periódicos.
Figura – Tarea de informes de entrada periódicos

(1) El dispositivo recibe una solicitud SET_IDLE. Esta solicitud especifica un tiempo de inactividad para un ID de informe determinado. Para más detalles sobre la solicitud SET_IDLE, consulte
(2) Una estructura de ID de informe (asignada durante la fase de inicialización de la clase HID) se actualiza con la duración de inactividad. Se inicializa un contador de duración de inactividad con el valor de la misma. La estructura de ID de informe se inserta al final de una lista enlazada que contiene las estructuras de ID de informes de entrada. El valor de la duración de inactividad se expresa en unidades de 4 ms, lo que da un rango de 4 a 1020 ms.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

41/174

Encimaview
Si la duración de inactividad es menor que el intervalo de sondeo del punto final de interrupción IN, los informes se generan en el intervalo de sondeo.
(3) Cada 4 ms, la tarea de informes periódicos de entrada explora la lista de ID de informes de entrada. Para cada ID de informe de entrada, la tarea realiza una de dos operaciones posibles. La duración del período de la tarea coincide con la unidad de 4 ms utilizada para el tiempo de inactividad. Si el host no ha enviado solicitudes SET_IDLE, la lista de ID de informes de entrada estará vacía y la tarea no tendrá nada que procesar. La tarea solo procesa los ID de informe distintos de 0 y con un tiempo de inactividad mayor que 0.
(4) Para un ID de informe de entrada determinado, la tarea verifica si ha transcurrido el tiempo de inactividad. Si no ha transcurrido, el contador se decrementa y no se envía ningún informe de entrada al host.
(5) Si ha transcurrido el tiempo de inactividad (es decir, el contador de tiempo de inactividad ha llegado a cero), se envía un informe de entrada al host llamando a la función sl_usbd_hid_write_sync() a través del punto final de interrupción IN.
(6) Los datos del informe de entrada enviados por la tarea provienen de un búfer de datos interno asignado para cada informe de entrada descrito en el descriptor de informe. Una tarea de aplicación puede llamar a la función sl_usbd_hid_write_sync() para enviar un informe de entrada. Tras enviar los datos, sl_usbd_hid_write_sync() actualiza el búfer interno asociado a un ID de informe de entrada con los datos recién enviados. Posteriormente, la tarea de informes periódicos de entrada siempre envía los mismos datos después de cada periodo de inactividad y hasta que la tarea de aplicación actualice los datos en el búfer interno. Existe un mecanismo de bloqueo para evitar la corrupción de los datos del ID del informe de entrada en caso de que se produzca una modificación en el momento exacto de la transmisión realizada por la tarea de informes periódicos de entrada.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

42/174

Encimaview
Encimaview
Clase MSC de dispositivo USB
Dispositivo USB MSC Clase Terminadaview Necesidades de recursos de la clase MSC del dispositivo USB del núcleo Configuración de la clase MSC del dispositivo USB Guía de programación de la clase MSC del dispositivo USB Controladores de almacenamiento de la clase MSC del dispositivo USB
Esta sección describe la clase de dispositivo de almacenamiento masivo (MSC) compatible con el dispositivo USB de Silicon Labs. MSC es un protocolo que permite la transferencia de información entre un dispositivo USB y un host. La información transferida es cualquier elemento que pueda almacenarse electrónicamente, como programas ejecutables, código fuente, documentos, imágenes, datos de configuración u otros datos de texto o numéricos. El dispositivo USB se presenta como un medio de almacenamiento externo para el host, lo que permite la transferencia de... files mediante arrastrar y soltar.
A file El sistema define cómo fileLos archivos se organizan en el medio de almacenamiento. La especificación de la clase de almacenamiento masivo USB no requiere ninguna especificación particular. file Sistema para su uso en dispositivos compatibles. En su lugar, proporciona una interfaz sencilla para leer y escribir sectores de datos mediante el conjunto de comandos transparentes SCSI (Interfaz de Sistema de Computadora Pequeña). Por lo tanto, los sistemas operativos pueden tratar la unidad USB como un disco duro y formatearla con cualquier... file sistema que les gusta.
La clase de dispositivo de almacenamiento masivo USB admite dos protocolos de transporte, como se indica a continuación:
Transporte de control/volumen/interrupción (CBI) de transporte solo masivo (BOT) (se utiliza solo para unidades de disquete)
La clase de dispositivo de almacenamiento masivo implementa el conjunto de comandos SCSI transparentes utilizando únicamente el protocolo BOT, lo que significa que solo se utilizarán puntos finales masivos para transmitir datos e información de estado. La implementación de MSC admite múltiples unidades lógicas.
La implementación de MSC cumple con las siguientes especificaciones:
Especificación de la clase de almacenamiento masivo de bus serie universalview, Revisión 1.3 5 de septiembre de 2008. Transporte masivo de solo carga de clase de almacenamiento en serie universal, Revisión 1.0 31 de septiembre de 1999.
Dispositivo USB MSC aCl ss Overview
Protocolo Puntos finales Solicitudes de clase Interfaz de sistema informático pequeño (SCSI)
Protocolo
En esta sección, analizaremos el protocolo de transporte masivo (BOT) de la clase de almacenamiento masivo. El protocolo de transporte masivo consta de tres partes:tages:
El transporte de comandos El transporte de datos El transporte de estado
Los comandos de almacenamiento masivo son enviados por el host a través de una estructura denominada Envoltorio de Bloque de Comandos (CBW). Para los comandos que requieren un transporte de datos...tage, el host intentará enviar o recibir la cantidad exacta de bytes del dispositivo, según lo especificado por los campos de longitud y bandera del CBW. Después del transporte de datos...tage, el host intenta recibir un contenedor de estado de comando (CSW) del dispositivo que detalla el estado del comando así como cualquier residuo de datos (si

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

43/174

Encimaview
cualquiera). Para comandos que no incluyen un transporte de datos stagEl host intenta recibir el CSW directamente después de enviar el CBW. El protocolo se detalla en la Figura: Protocolo MSC.
Figura – Protocolo MSC

Endpoints
En el lado del dispositivo, de acuerdo con la especificación BOT, el MSC se compone de los siguientes puntos finales: un par de puntos finales de control de entrada y salida (punto final predeterminado) y un par de puntos finales de entrada y salida masivos.
La siguiente tabla indica los diferentes usos de los puntos finales.
Tabla: Uso de puntos finales de MSC

Punto final
Control IN Control OUT Entrada masiva Salida masiva

Dirección
Dispositivo a host Host a dispositivo Dispositivo a host Host a dispositivo

Uso
Enumeración y solicitudes específicas de clase MSC Enumeración y solicitudes específicas de clase MSC Enviar CSW y datos Recibir CBW y datos

Solicitudes de clases
Existen dos solicitudes de control definidas para el protocolo MSC BOT. Estas solicitudes y sus descripciones se detallan en la tabla a continuación.

Tabla – Solicitudes de clases de almacenamiento masivo

Solicitudes de clases
Restablecimiento de almacenamiento masivo solo en masa

Descripción
Esta solicitud se utiliza para reiniciar el dispositivo de almacenamiento masivo y su interfaz asociada. Prepara el dispositivo para recibir el siguiente bloque de comandos.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

44/174

Encimaview

Solicitudes de clases

Descripción

Obtener máximo: esta solicitud se utiliza para devolver el número de unidad lógica (LUN) más alto admitido por el dispositivo. Por ejemplo:ample, un

LUN

Un dispositivo con LUN 0 y LUN 1 devolverá un valor de 1. Un dispositivo con una sola unidad lógica devolverá 0 o detendrá el proceso.

Solicitud. El valor máximo que se puede devolver es 15.

Interfaz de sistema de computadora pequeña SCSI

A nivel de interfaz de programación, el dispositivo MSC implementa uno de los protocolos de comunicación estándar para medios de almacenamiento, como SCSI y SFF-8020i (ATAPI). La "Interfaz de Programación" especifica el protocolo implementado y ayuda al sistema operativo host a cargar el controlador de dispositivo adecuado para la comunicación con el dispositivo de almacenamiento USB. SCSI es el protocolo más común en dispositivos de almacenamiento USB MSC. Ofrecemos una implementación para la subclase SCSI de MSC que los usuarios de nuestro GSDK pueden usar de inmediato.
SCSI es un conjunto de estándares para gestionar la comunicación entre ordenadores y dispositivos periféricos. Estos estándares incluyen comandos, protocolos, interfaces eléctricas e interfaces ópticas. Los dispositivos de almacenamiento que utilizan otras interfaces de hardware, como USB, utilizan comandos SCSI para obtener información del dispositivo/host, controlar su funcionamiento y transferir bloques de datos en el medio de almacenamiento.
Los comandos SCSI abarcan una amplia gama de tipos y funciones de dispositivos, por lo que los dispositivos necesitan un subconjunto de estos comandos. En general, los siguientes comandos son necesarios para la comunicación básica:
CONSULTA CAPACIDAD DE LECTURA (10) LECTURA (10) SOLICITUD DE DETECCIÓN PRUEBA UNIDAD LISTA ESCRIBIR (10)
Necesidades de recursos de la clase MSC del dispositivo USB del núcleo

Cada vez que agrega una instancia de clase MSC a una configuración USB a través de la función sl_usbd_msc_add_to_configuration(), se asignarán los siguientes recursos desde el núcleo.

Recurso
Interfaces Interfaces alternativas Puntos finales Grupos de interfaces

Cantidad
1 1 2 0

Tenga en cuenta que estos números corresponden a cada configuración. Al configurar los valores de SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY y SL_USBD_DESCRIPTOR_QUANTITY, tenga en cuenta cuántas configuraciones se agregarán a la clase. Para el valor de configuración SL_USBD_OPEN_ENDPOINTS_QUANTITY, dado que los endpoints solo se abren cuando el host establece una configuración, solo debe considerar el número de endpoints necesarios para una instancia de clase.
Configuración de clase MSC del dispositivo USB

Para configurar la clase MSC se utilizan dos grupos de parámetros de configuración:
Configuraciones específicas de la aplicación de la clase MSC del dispositivo USB Configuración de la unidad lógica de la clase MSC del dispositivo USB
Configuraciones específicas de la aplicación de la clase MSC del dispositivo USB

Configuraciones de tiempo de compilación de clases Creación de instancias de clase

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

45/174

Encimaview

Configuraciones de tiempo de compilación de clases
La clase MSC del dispositivo USB de Silicon Labs y la subclase SCSI se pueden configurar en tiempo de compilación mediante #defines ubicados en sl_usbd_core_config.h file.
Tabla – Constantes de configuración genéricas

Nombre de configuración

Descripción

SL_USBD_MSC_CLASS_INST Número de instancias de clase que asignará mediante una llamada a la función

CANTIDAD DE ANCE

sl_usbd_msc_scsi_create_instance().

SL_USBD_MSC_CONFIGURA Número de configuración a la que se puede agregar una instancia de clase mediante una llamada a la

CANTIDAD DE CCIONES

función sl_usbd_msc_scsi_add_to_configuration().

SL_USBD_MSC_LUN_QUANT Número de unidades lógicas por instancia de clase que agregará mediante una llamada a la

IDAD

función sl_usbd_msc_scsi_lun_add() .

SL_USBD_MSC_SCSI_64_BIT Habilita o deshabilita la compatibilidad con direcciones de bloque lógico (LBA) de 64 bits.
_LBA_ES

SL_USBD_MSC_DATA_BUFF Tamaño del búfer de datos por instancia de clase en bytes ER_SIZE

Valor predeterminado
2
1
2
0
512

Creación de instancias de clase
La creación de una instancia de la clase SCSI MSC de un dispositivo USB se realiza mediante la función sl_usbd_msc_scsi_create_instance(). Esta función acepta un argumento de configuración que se describe a continuación.
devoluciones de llamadas p_scsi
p_scsi_callbacks es un puntero a una estructura de configuración de tipo sl_usbd_msc_scsi_callbacks_t. Además de las devoluciones de llamada comunes de la clase de dispositivo USB (conexión/desconexión), proporciona a la clase MSC un conjunto de funciones de devolución de llamada opcionales que se invocan cuando se produce un evento en la unidad lógica. Se puede pasar un puntero nulo (NULL) a este argumento si no se necesitan devoluciones de llamada.
La siguiente tabla describe cada campo de configuración disponible en esta estructura de configuración.
Tabla – Estructura de configuración de sl_usbd_msc_scsi_callbacks_t

Campos

Descripción

.permitir

Se llama cuando la instancia de clase USB se habilita correctamente.

.disable Se llama cuando la instancia de clase USB está deshabilitada.

Función .host_eject llamada cuando se expulsa una unidad lógica del host.

Firma de función
void app_usbd_msc_scsi_enable(uint8_t clase_nbr);
void app_usbd_msc_scsi_disable(uint8_t número_de_clase); void app_usbd_msc_scsi_host_eject(uint8_t número_de_clase, uint8_t número_de_lu);

Configuración de unidad lógica de clase MSC de dispositivo USB

Para agregar una unidad lógica a una instancia de clase MSC, se llama a la función sl_usbd_msc_lun_add(). Esta función acepta un argumento de configuración que se describe a continuación.

p_lu_info

p_lu_info es un puntero a una estructura de tipo sl_usbd_msc_scsi_lun_info_t. Su propósito es proporcionar información sobre la unidad lógica a la clase MSC.
La siguiente tabla describe cada campo de configuración disponible en esta estructura de configuración.

Tabla – Estructura de configuración de sl_usbd_msc_scsi_lun_info_t

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

46/174

Encimaview

Campo

Descripción

Campo
.scsi_lun_api_p tr

Descripción
Puntero a la API del controlador de medios que gestionará esta unidad lógica. Consulte Controladores de almacenamiento de clase MSC de dispositivos USB para obtener más información sobre los controladores de almacenamiento.

.ve nd o r_id _ p tr
.id_de_producto_ptr
.nivel_de_revisión_del_producto .solo_es_lectura

Puntero a una cadena que contiene la identificación del proveedor de la unidad lógica. La longitud máxima de la cadena es de 8 caracteres. Puntero a una cadena que contiene la identificación del producto de la unidad lógica. La longitud máxima de la cadena es de 16 caracteres. Nivel de revisión del producto.
Bandera que indica si la unidad lógica debe ser vista como de solo lectura desde el punto de view del host (verdadero) o no (falso).

Guía de programación de la clase MSC de dispositivos USB

Esta sección explica cómo utilizar la clase MSC.
Inicialización de la clase MSC del dispositivo USB Adición de una instancia de clase SCSI MSC del dispositivo USB a su dispositivo Manejo de la unidad lógica de la clase MSC del dispositivo USB
Inicialización de la clase MSC del dispositivo USB

Para agregar la funcionalidad de la clase SCSI MSC a su dispositivo, primero inicialice la clase base MSC y la subclase SCSI llamando a las funciones sl_usbd_msc_init() y sl_usbd_msc_scsi_init().
El exampA continuación se muestra cómo llamar a sl_usbd_msc_init() y sl_usbd_msc_scsi_init().

Example – Llamada a sl_usbd_msc_init() y sl_usbd_msc_scsi_init()

sl_status_t estado;
status = sl_usbd_msc_init(); if (status ! SL_STATUS_OK) { /* Se produjo un error. Se debe añadir aquí la gestión de errores. */
}
status = sl_usbd_msc_scsi_init(); if (status ! SL_STATUS_OK) { /* Se produjo un error. Se debe añadir aquí la gestión de errores. */
}
Cómo agregar una instancia de clase SCSI MSC de dispositivo USB a su dispositivo
Para añadir la funcionalidad de clase SCSI MSC a su dispositivo, primero cree una instancia y luego añádala a la(s) configuración(es) del dispositivo. Debe añadir al menos una unidad lógica a la instancia.
Creación de una instancia de clase SCSI MSC
Cree una instancia de clase SCSI MSC llamando a la función sl_usbd_msc_scsi_create_instance().
El exampA continuación se muestra cómo llamar a sl_usbd_msc_scsi_create_instance() con los argumentos predeterminados. Para obtener más información sobre los argumentos de configuración que se deben pasar a sl_usbd_msc_scsi_create_instance(), consulte Configuraciones específicas de la aplicación de la clase MSC de dispositivo USB.
Example – Llamada a sl_usbd_msc_scsi_create_instance()

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

47/174

Encimaview

uint8_t número_de_clase; sl_status_t estado;
sl_usbd_msc_scsi_callbacks_t app_usbd_msc_scsi_callbacks = { .habilitar = NULL, .deshabilitar = NULL, .host_eject = NULL };
estado = sl_usbd_msc_scsi_create_instance(&app_usbd_msc_scsi_callbacks,0 &class_nbr);
if (status ! SL_STATUS_OK) { /* Se produjo un error. Se debe añadir aquí la gestión de errores. */ }
Cómo agregar la instancia de clase MSC a las configuraciones de su dispositivo
Después de haber creado una instancia de clase MSC, puede agregarla a una configuración llamando a la función
sl_usbd_msc_add_to_configuration() .
El exampA continuación se muestra cómo llamar a sl_usbd_msc_scsi_add_to_configuration() usando argumentos predeterminados.
Example – Llamada a sl_usbd_msc_scsi_add_to_configuration()

sl_status_t estado;

estado = sl_usbd_msc_scsi_add_to_configuration(clase_nbr,

(1)

configuración_nbr_fs);

(2)

si (estado ! SL_STATUS_OK) {

/* Se produjo un error. Se debe añadir aquí la gestión de errores. */

}

(1) Número de clase para agregar a la configuración devuelta por sl_usbd_msc_scsi_create_instance() . (32) Número de configuración (aquí agregándolo a una configuración de velocidad completa).
Manejo de unidades lógicas de clase MSC de dispositivos USB
Agregar una unidad lógica Conectar o desconectar un medio de almacenamiento
Agregar una unidad lógica
Al agregar una unidad lógica a la instancia de la clase MSC SCSI, esta debe estar vinculada a un medio de almacenamiento (disco RAM, tarjeta SD, memoria flash, etc.). La clase MSC utiliza un controlador de almacenamiento para comunicarse con el medio. Este controlador deberá proporcionarse al agregar la unidad lógica.
El exampA continuación se muestra cómo agregar una unidad lógica mediante sl_usbd_msc_scsi_lun_add().
Example – Agregar una unidad lógica mediante sl_usbd_msc_scsi_lun_add()

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

48/174

Encimaview

sl_usbd_msc_scsi_lun_t *lu_object_ptr = NULL;

sl_usbd_msc_scsi_lun_info_t lu_info;

estado_sl_t

estado;

lu_info.sl_usbd_msc_scsi_lun_api_t = &app_usbd_scsi_storage_block_device_api;

lu_info.id_del_proveedor_ptr

= “Laboratorios de silicio”;

lu_info.id_del_producto_ptr

= “dispositivo de bloque exampel”;

lu_info.nivel_revisión_producto = 0x1000u;

lu_info.es_de_solo_lectura

= falso;

estado = sl_usbd_msc_scsi_lun_add(clase_nbr, &lu_info, &lu_object_ptr);
if (status ! SL_STATUS_OK) { /* Se produjo un error. Se debe añadir aquí la gestión de errores. */ }

Conexión y desconexión de un medio de almacenamiento
Tras añadir la unidad lógica, se debe conectar un medio de almacenamiento para que esté disponible desde el host. La clase MSC ofrece dos funciones para controlar la asociación del medio de almacenamiento a la unidad lógica: sl_usbd_msc_scsi_lun_attach() y sl_usbd_msc_scsi_lun_detach(). Estas funciones permiten emular la eliminación de un dispositivo de almacenamiento para recuperar el acceso desde la aplicación integrada si es necesario.
El exampA continuación se muestra cómo utilizar las funciones sl_usbd_msc_scsi_lun_attach() y sl_usbd_msc_scsi_lun_detach().
Example – Adjuntar/desconectar medios

sl_status_t estado;

status = sl_usbd_msc_scsi_lun_attach(lu_object_ptr); if (status ! SL_STATUS_OK) { /* Se produjo un error. Se debe añadir aquí la gestión de errores. */
}

(1)

estado = sl_usbd_msc_scsi_lun_detach(lu_object_ptr); si (estado ! SL_STATUS_OK) {
/* Se produjo un error. Se debe añadir aquí la gestión de errores. */
}

(2)

estado = sl_usbd_msc_scsi_lun_attach(lu_object_ptr) si (estado ! SL_STATUS_OK) {
/* Se produjo un error. Se debe añadir aquí la gestión de errores. */
}

(3)

(1) A partir de este momento, si el dispositivo MSC está conectado a un host, el medio de almacenamiento es accesible.
(2) Si el dispositivo MSC está conectado a un host, el medio aparecerá como no disponible. En este momento, se pueden realizar operaciones en el medio desde la aplicación integrada.
(3) Nuevamente, si el dispositivo MSC está conectado al host, el medio de almacenamiento aparecerá como conectado.
Controladores de almacenamiento de clase MSC de dispositivos USB
La clase MSC de dispositivo USB necesita un controlador de almacenamiento para comunicarse con un medio de almacenamiento. Por el momento, Silicon Labs no ofrece controladores.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

49/174

Encimaview
TPY aa la IA del controlador se define mediante la definición de tipo sl_usbd_msc_scsi_lun_api_t. Nuestro ble variable sl_usbd_msc_scsi_lun_api_t debe incluirse en su ble variable sl_usbd_msc_scsi_lun_info_t, que se pasa al argumento s al añadir una unidad lógica con sl_usbd_msc_scsi_lun_add(). Consulte la sección API SCSI MSC de dispositivos USB para obtener más detalles sobre las estructuras. La implementación del controlador de almacenamiento puede ser tan simple como una matriz de sectores en RAM. El tamaño típico de sector (es decir, tamaño de bloque) es de 512 para dispositivos de almacenamiento masivo y de 2048 para CD-ROM.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

50/174

Encimaview
Encimaview
Clase de proveedor de dispositivos USB
Dispositivo USB Proveedor Clase Terminadaview Necesidades de recursos de la clase Proveedor de dispositivos USB de la configuración principal de la clase Proveedor de dispositivos USB Guía de programación de la clase Proveedor de dispositivos USB La clase Proveedor permite crear dispositivos específicos del proveedor que pueden implementar un protocolo propietario. Se basa en un par de puntos finales masivos para transferir datos entre el host y el dispositivo. Las transferencias masivas son convenientes para transferir grandes cantidades de datos no estructurados y proporcionan un intercambio confiable de datos mediante un mecanismo de detección de errores y reintentos. Además de los puntos finales masivos, la clase Proveedor también puede usar un par opcional de puntos finales de interrupción. Cualquier sistema operativo (SO) puede trabajar con la clase Proveedor siempre que el SO tenga un controlador para manejar la clase Proveedor. Dependiendo del SO, el controlador puede ser nativo o específico del proveedor. Por ejemplo, en Microsoft Windows®, su aplicación interactúa con el controlador WinUSB proporcionado por Microsoft para comunicarse con el dispositivo del proveedor.
Dispositivo USB Proveedor Clase Terminadaview
La Figura: Arquitectura general entre el host de Windows y la clase Vendor muestra la arquitectura general entre el host y el dispositivo que utiliza la clase Vendor. En este ejemploampes decir, el sistema operativo anfitrión es MS Windows.
Figura: Arquitectura general entre el host de MS Windows y la clase de proveedor

En MS Windows, la aplicación se comunica con el dispositivo del proveedor mediante una biblioteca USB. Bibliotecas como libusb ofrecen una API para administrar un dispositivo y sus canales asociados, y para comunicarse con él a través de puntos finales de control, lotes e interrupción.
En el lado del dispositivo, la clase Vendor se compone de los siguientes puntos finales:
Un par de terminales de control de entrada y salida (el terminal predeterminado). Un par de terminales de entrada y salida masivos.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

51/174

Encimaview

Un par de puntos finales de entrada y salida de interrupción. Este par es opcional. La siguiente tabla indica el uso de los diferentes puntos finales:
Tabla: Uso de puntos finales de clase de proveedor

Dirección del punto final

Control de entrada
Control
AFUERA
Entrada a granel

Dispositivo a host
>Host a dispositivo
Dispositivo a host

Salida masiva
Interrumpir EN
Interrumpir
AFUERA

Host a dispositivo
Dispositivo a host
Host a dispositivo

Uso
Solicitudes estándar de enumeración y solicitudes específicas del proveedor.
Solicitudes estándar de enumeración y solicitudes específicas del proveedor.
Comunicación de datos sin procesar. Los datos pueden estructurarse según un protocolo propietario.
Comunicación de datos sin procesar. Los datos pueden estructurarse según un protocolo propietario.
Comunicación o notificación de datos sin procesar. Los datos pueden estructurarse según un protocolo propietario. Comunicación o notificación de datos sin procesar. Los datos pueden estructurarse según un protocolo propietario.

La aplicación del dispositivo puede usar terminales de interrupción y de carga masiva para enviar o recibir datos hacia o desde el host. Solo puede usar el terminal predeterminado para decodificar las solicitudes específicas del proveedor enviadas por el host. Las solicitudes estándar son gestionadas internamente por la capa Core del dispositivo USB de Silicon Labs.
Necesidades de recursos de la clase de proveedor del dispositivo USB del núcleo

Cada vez que agrega una instancia de clase de proveedor a una configuración a través de la función sl_usbd_vendor_add_to_configuration(), se asignarán los siguientes recursos desde el núcleo.

Recurso
Interfaces Interfaces alternativas Puntos finales Grupos de interfaces

Cantidad
1 1 2 (4 si habilitó los puntos finales de interrupción) 0

Tenga en cuenta que estos números corresponden a cada configuración. Al configurar los valores de SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY y SL_USBD_DESCRIPTOR_QUANTITY, tenga en cuenta cuántas configuraciones se agregarán a la clase. Para el valor de configuración SL_USBD_OPEN_ENDPOINTS_QUANTITY, dado que los endpoints solo se abren cuando el host establece una configuración, solo debe considerar el número de endpoints necesarios para una instancia de clase.
Configuración de clase de proveedor de dispositivo USB

Para configurar la clase Proveedor se utilizan dos grupos de parámetros de configuración:
Configuraciones específicas de la aplicación de la clase de proveedor de dispositivos USB Configuraciones de instancia de la clase de proveedor de dispositivos USB
Configuraciones específicas de la aplicación de la clase de proveedor de dispositivos USB
Primero, para usar el módulo de clase Vendor del dispositivo USB de Silicon Labs, ajuste la configuración de tiempo de compilación de Vendor según las necesidades de su aplicación. Se encuentran dentro del encabezado sl_usbd_core_config.h. file En la sección Proveedor, la configuración de cantidad sirve para informar al módulo del dispositivo USB cuántos objetos de Proveedor USB asignar.
La siguiente tabla describe cada definición de configuración.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

52/174

Encimaview

Tabla: Definición de la configuración del proveedor del dispositivo USB

Nombre de configuración

Descripción

Valor predeterminado

SL_USBD_VENDOR_CLASS_INSTANCE_QUANTITY Número de instancias de clase que asignará a través de una llamada a la función 2 sl_usbd_vendor_create_instance() .

SL_USBD_VENDOR_CONFIGURATION_QUANTITY Número de configuraciones. Las instancias de la clase Proveedor se pueden agregar a una o más configuraciones mediante una llamada a la función sl_usbd_vendor_add_to_configuration().

Configuraciones de instancias de clase de proveedor de dispositivos USB

Esta sección define las configuraciones relacionadas con las instancias de la clase Vendor.
Creación de instancia de clase intr_en interval p_vendor_callbacks
Creación de instancias de clase

La creación de una instancia de la clase Vendor se realiza llamando a la función sl_usbd_vendor_create_instance(), que toma tres argumentos de configuración que se describen a continuación.

intr_es
Booleano que indica si se debe agregar o no un par de puntos finales de interrupción.

Valor
verdadero falso

Descripción
Se añadirán dos puntos de conexión de entrada/salida, que estarán disponibles para la aplicación integrada. No se añadirá ningún punto de conexión de interrupción. Solo estarán disponibles dos puntos de conexión de entrada/salida en masa.

intervalo
Si establece intr_en como verdadero, puede especificar el intervalo de sondeo de los puntos finales de interrupción (en milisegundos). Si establece intr_en como falso, puede establecer el intervalo como 0, ya que la clase lo ignorará.
devoluciones de llamadas de p_vendor
p_vendor_callbacks es un puntero a una variable de estructura de funciones de devolución de llamada. Puede especificarla para gestionar las solicitudes de control específicas de la clase. Si no utiliza ninguna solicitud específica de la clase o necesita habilitar o deshabilitar notificaciones, puede establecerla en NULL.
El exampA continuación se proporciona la firma esperada del controlador de solicitudes específicas de su clase.
Example – Firma de la función de solicitud específica de la clase

void manejador_de_solicitudes_de_proveedor_usbd_de_aplicación(uint8_t

número de clase, (1)

constante sl_usbd_setup_req_t *p_setup_req); (2)

sl_usbd_vendor_callbacks_t funciones_de_devolución_de_llamada_del_proveedor_usbd_app =
{
.enable = NULL, .disable = NULL, .setup_req = app_usbd_vendor_req_handle,
};

(1) Número de instancia de clase de proveedor.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

53/174

Encimaview

(2) Puntero a una solicitud de configuración recibida del host.
Guía de programación de clases de proveedores de dispositivos USB
Esta sección explica cómo usar la clase Vendor. Inicialización de la clase Vendor del dispositivo USB. Adición de una instancia de la clase Vendor del dispositivo USB a su dispositivo. Comunicación mediante la clase Vendor del dispositivo USB.
Inicialización de la clase de proveedor del dispositivo USB
Para agregar una funcionalidad de clase de proveedor a su dispositivo, primero inicialice la clase llamando a la función USBD_Vendor_Init(). El ejemploampA continuación se muestra cómo llamar a sl_usbd_vendor_init().
Example – Llamando a sl_usbd_vendor_init()

sl_status_t estado;
status = sl_usbd_vendor_init(); if (status ! SL_STATUS_OK) { /* Se produjo un error. Se debe añadir la gestión de errores aquí. */ }
Cómo agregar una instancia de clase de proveedor de dispositivo USB a su dispositivo
Para agregar la funcionalidad de clase de proveedor a su dispositivo, primero debe crear una instancia y luego agregarla a las configuraciones de su dispositivo.
Creación de una instancia de clase de proveedor Agregar la instancia de clase de proveedor a las configuraciones de su dispositivo
Creación de una instancia de clase de proveedor
Cree una instancia de la clase Vendor llamando a la función sl_usbd_vendor_create_instance() . El ejemploampA continuación se muestra cómo llamar a sl_usbd_vendor_create_instance() con los argumentos predeterminados. Para obtener más información sobre los argumentos de configuración que se deben pasar a sl_usbd_vendor_create_instance(), consulte Configuraciones de instancias de la clase de proveedor de dispositivos USB.
Example – Llamada a sl_usbd_vendor_create_instance()

uint8_t número_de_clase; sl_status_t estado;

estado = sl_usbd_vendor_create_instance(falso,

(1)

0u,

(2)

funciones de devolución de llamada del proveedor USB de la aplicación, (3)

&núm. de clase);

si (estado ! SL_STATUS_OK) {

/* Se produjo un error. Se debe añadir aquí la gestión de errores. */

}

(1) No hay puntos finales de interrupción con esta instancia de clase. (2) El intervalo se ignora ya que los puntos finales de interrupción están deshabilitados.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

54/174

Encimaview

(3) Función de devolución de llamada que forma parte de su aplicación y gestiona las solicitudes de clase específicas del proveedor. Consulte Comunicación mediante la clase de proveedor del dispositivo USB para obtener más información. Adición de la instancia de la clase de proveedor a las configuraciones de su dispositivo. Después de crear una instancia de la clase de proveedor, puede agregarla a una configuración llamando a la función USBD_Vendor_ConfigAdd(). El ejemplo...ampA continuación se muestra cómo llamar a sl_usbd_vendor_add_to_configuration() usando argumentos predeterminados.
Example – Llamada a sl_usbd_vendor_add_to_configuration()

sl_status_t estado;

estado = sl_usbd_vendor_add_to_configuration(clase_nbr,

(1)

configuración_nbr_fs);

(2)

si (estado ! SL_STATUS_OK) {

/* Se produjo un error. Se debe añadir aquí la gestión de errores. */

}

(1) Número de clase para agregar a la configuración devuelta por sl_usbd_vendor_create_instance() . (2) Número de configuración (aquí agregándolo a una configuración de velocidad completa).
Comunicación mediante la clase de proveedor de dispositivos USB
Comunicación síncrona general, comunicación asíncrona, solicitud de proveedor. La clase Vendor ofrece las siguientes funciones para comunicarse con el host. Para más detalles sobre los parámetros de la función, consulte la API de proveedor de dispositivos USB.
Tabla: Resumen de la API de comunicación con proveedores

Nombre de la función
sl_usb d _vendedor_lectura_bulk_sy nc() sl_usb d _vendedor_escritura_bulk_sy nc() sl_usb d _vendedor_lectura_bulk_asy nc() sl_usb d _vendedor_escritura_bulk_asy nc() sl_usb d _vendedor_lectura_interrupción_sy nc() sl_usb d _vendedor_escritura_interrupción_sy nc() sl_usb d _vendedor_lectura_interrupción_asy nc
()
sl_usb d _v e nd o r_write _interrupción fácil nc
()

Operación: Recibe datos del host a través del punto final de SALIDA masiva. Esta función es bloqueante. Envía datos al host a través del punto final de ENTRADA masiva. Esta función es bloqueante. Recibe datos del host a través del punto final de SALIDA masiva. Esta función es no bloqueante. Envía datos al host a través del punto final de ENTRADA masiva. Esta función es no bloqueante. Recibe datos del host a través del punto final de SALIDA con interrupción. Esta función es bloqueante. Envía datos al host a través del punto final de ENTRADA con interrupción. Esta función es bloqueante. Recibe datos del host a través del punto final de SALIDA con interrupción. Esta función es no bloqueante.
bloqueo.
Sends data to host through interrupt IN endpoint. This function is non-blocking.

The vendor requests are also another way to communicate with the host. When managing vendor requests sent by the host, the application can receive or send data from or to the host using the control endpoint; you will need to provide an application callback passed as a parameter of sl_usbd_vendor_create_instance() . Synchronous Communication

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

55/174

Encimaview

Synchronous communication means that the transfer is blocking. When a function is called, the application blocks until the transfer completes with or without an error. A timeout can be specified to avoid waiting forever. The example below shows a read and write that receives data from the host using the bulk OUT endpoint and sends data to the host using the bulk IN endpoint.
Example – Synchronous Bulk Read and Write

__ALINEADO(4) uint8_t rx_buf[2];

__ALINEADO(4) uint8_t tx_buf[2];

uint32_t

xfer_len;

estado_sl_t

estado;

status = sl_usbd_vendor_read_bulk_sync(class_nbr,

(1)

(void *)&rx_buf[0],

(2)

2u,

0u,

(3)

&xfer_len);

si (estado ! SL_STATUS_OK) {

/* $$$$ Manejar el error. */

}

status = sl_usbd_vendor_write_bulk_sync( class_nbr,

(1)

(void *)&tx_buf[0],

(4)

2u,

0u,

(3)

false,

(5)

&xfer_len);

si (estado ! SL_STATUS_OK) {

/* $$$$ Manejar el error. */

}

(1) The class instance number created with sl_usbd_vendor_create_instance() provides an internal reference to the Vendor class to route the transfer to the proper bulk OUT or IN endpoint.
(2) The application must ensure that the buffer provided to the function is large enough to accommodate all the data. Otherwise, synchronization issues might happen.
(3) In order to avoid an infinite blocking situation, a timeout expressed in milliseconds can be specified. A value of 809 makes the application task wait forever.
(4) La aplicación proporciona el búfer de transmisión inicializado.
(5) If this flag is set to true , and the transfer length is multiple of the endpoint maximum packet size, the device stack will send a zero-length packet to the host to signal the end of the transfer.
The use of interrupt endpoint communication functions, sl_usbd_vendor_read_interrupt_sync() and sl_usbd_vendor_write_interrupt_sync() , is similar to bulk endpoint communication functions presented in Example – Synchronous Bulk Read and Write.
Comunicación asincrónica
Asynchronous communication means that the transfer is non-blocking. When a function is called, the application passes the transfer information to the device stack and does not block. Other application processing can be done while the transfer is in progress over the USB bus. Once the transfer has completed, a callback function is called by the device stack to inform the application about the transfer completion. The example below shows asynchronous read and write.
Example – Asynchronous Bulk Read and Write

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

56/174

Encimaview

void app_usbd_vendor_comm (uint8_t class_nbr)

{

__ALINEADO(4) uint8_t rx_buf[2];

__ALINEADO(4) uint8_t tx_buf[2];

estado_sl_t

estado;

status = sl_usbd_vendor_read_bulk_async(class_nbr,

(void *)&rx_buf[0],

(2)

2u,

app_usbd_vendor_rx_completed,

NULL);

(4)

si (estado ! SL_STATUS_OK) {

/* $$$$ Manejar el error. */

}

status = sl_usbd_vendor_write_bulk_async(class_nbr,

(void *)&tx_buf[0],

(5)

2u,

app_usbd_vendor_tx_completed,

Nulo

(4)

false);

(6)

si (estado ! SL_STATUS_OK) {

/* $$$$ Manejar el error. */

}

}

(1) (3)
(1) (3)

static void app_usbd_vendor_rx_completed(uint8_t class_nbr,

(3)

void *p_buf,

uint32_t buf_len,

uint32_t xfer_len,

void *p_callback_arg,

sl_status_t status)

{

si (estado ! SL_STATUS_OK) {

/* $$$$ Do some processing. */

} demás {

/* $$$$ Manejar el error. */

}

}

static void app_usbd_vendor_tx_completed(uint8_t class_nbr,

(3)

void *p_buf,

uint32_t buf_len,

uint32_t xfer_len,

void *p_callback_arg,

sl_status_t status)

{

si (estado ! SL_STATUS_OK) {

/* $$$$ Do some processing. */

} demás {

/* $$$$ Manejar el error. */

}

}

(1) The class instance number provides an internal reference to the Vendor class to route the transfer to the proper bulk OUT or IN endpoint. (2) The application must ensure that the buffer provided is large enough to accommodate all the data. Otherwise, there may be synchronization issues. (3) The application provides a callback function pointer passed as a parameter. Upon completion of the transfer, the device stack calls this callback function so that the application can finalize the transfer by analyzing the transfer result. For instance, on completion of a read operation, the application might perform processing on the received data. Upon write completion, the application can indicate if the write was successful and how many bytes were sent.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

57/174

Encimaview
(4) An argument associated with the callback can be also passed. Then in the callback context, some private information can be retrieved. (5) The application provides the initialized transmit buffer. (6) If this flag is set to true , and the transfer length is a multiple of the endpoint maximum packet size, the device stack will send a zero-length packet to the host to signal the end of transfer. The use of interrupt endpoint communication functions, sl_usbd_vendor_read_interrupt_async() and sl_usbd_vendor_write_interrupt_async() , is similar to the bulk endpoint communication functions presented in Example Asynchronous Bulk Read and Write.
Vendor Request
The USB 2.0 specification defines three types of requests: standard, class, and vendor. All standard requests are handled directly by the core layer, while class requests are managed by the proper associated class. Vendor requests can be processed by the vendor class. To process vendor requests, you must provide an application callback as a parameter of sl_usbd_vendor_create_instance() . After a vendor request is received by the USB device, it must be decoded properly. The example below shows vendor request decoding. Certain requests may be required to receive from or send to the host during the data stage of a control transfer. If no data stage is present, you only have to decode the Setup packet. This example shows the three types of data stage management: no data, data OUT and data IN.
Example – Vendor Request Decoding

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

58/174

Encimaview

#define APP_VENDOR_REQ_NO_DATA

0x01u

#define APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST 0x02u

#define APP_VENDOR_REQ_SEND_DATA_TO_HOST 0x03u

#define APP_VENDOR_REQ_DATA_BUF_SIZE

50u

static uint8_t app_vendor_req_buf[APP_VENDOR_REQ_DATA_BUF_SIZE];

static bool app_usbd_vendor_req (uint8_t

class_nbr,

const sl_usbd_setup_req_t *p_setup_req)

(1)

{

bool valid;

sl_status_t estado;

uint16_t req_len;

uint32_t xfer_len;

(void)class_nbr;

switch(p_setup_req->bRequest) { case APP_VENDOR_REQ_NO_DATA: valid = true; break;

(2) (3)

case APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST:

(4)

req_len = p_setup_req->wLength;

if (req_len > APP_VENDOR_REQ_DATA_BUF_SIZE) {

// Not enough room to receive data.

return (false);

}

// Receive data via Control OUT EP. // Wait transfer completion forever. status = sl_usbd_core_read_control_sync((void *)&app_vendor_req_buf[0u],
req_len, 0u, &xfer_len); if (status ! SL_STATUS_OK) { valid = false; } else { valid = true; } break;

case APP_VENDOR_REQ_SEND_DATA_TO_HOST:

(5)

req_len = APP_VENDOR_REQ_DATA_BUF_SIZE;

// Fill buf with a pattern. Mem_Set((void *)&AppVendorReqBuf[0u],
'A',
req_len);

// Send data via Control IN EP. // Wait transfer completion forever. status = sl_usbd_core_write_control_sync((void *)&app_vendor_req_buf[0u],
req_len, 0u, false, &xfer_len); if (status ! SL_STATUS_OK) { valid = DEF_FAIL; } else { valid = DEF_OK; } break;

por defecto:

(6)

// Request is not supported.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

59/174

Encimaview

valid =true;break;
case APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST:(4) req_len = p_setup_req->wLength;if(req_len > APP_VENDOR_REQ_DATA_BUF_SIZE){// Not enough room to receive data.return(false);}// Receive data via Control OUT EP.// Wait transfer completion forever. status =sl_usbd_core_read_control_sync((void *)&app_vendor_req_buf[0u],
req_len,0u,&xfer_len);if(status ! SL_STATUS_OK){ valid =false;}else{ valid =true;}break;
case APP_VENDOR_REQ_SEND_DATA_TO_HOST:(5) req_len = APP_VENDOR_REQ_DATA_BUF_SIZE;// Fill buf with a pattern.Mem_Set((void *)&AppVendorReqBuf[0u],’A’,
req_len);// Send data via Control IN EP.// Wait transfer completion forever. status =sl_usbd_core_write_control_sync((void *)&app_vendor_req_buf[0u],
req_len,0u,false,&xfer_len);if(status ! SL_STATUS_OK){ valid = DEF_FAIL;}else{ valid = DEF_OK;}break;
default:(6)// Request is not supported. valid = DEF_FAIL;break;}return(valid);}

(1) The core will pass the Setup packet content to your application. The structure sl_usbd_setup_req_t contains the same fields as defined by the USB 2.0 specification (refer to section “9.3 USB Device Requests” of the specification for more details):

estructura typedef {

uint8_t bmRequestType; /* Characteristics of request.

*/

uint8_t bRequest; /* Specific request.

*/

uint16_t wValue; /* Varies according to request.

*/

uint16_t wIndex; /* Varies according to request; typically used as index.*/

uint16_t wLength; /* Transfer length if data stage presente.

*/

} sl_usbd_setup_req_t;

(2) Determine the request. You may use a switch statement if you are using different requests. In this example, there are three different requests corresponding to the three types of the data stage: APP_VENDOR_REQ_NO_DATA, APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST, and APP_VENDOR_REQ_SEND_DATA_TO_HOST.
(3) If no data stage is present, you only need to decode the other fields. The presence of a data stage or not is indicated by the field wLength being non-null or null.
(4) If the host sends data to the device, you must call the function sl_usbd_core_read_control_sync() . The buffer provided should be able to contain up to wLength bytes. If any error occurs, return false to the core that will stall the status stage of the control transfer, indicating to the host that the request cannot be processed. true is returned in case of success.
(5) If the host receives data from the device, you must call the function sl_usbd_core_write_control_sync() . If any error occurs, return false to the core that will stall the status stage of the control transfer, indicating to the host that the request cannot be processed. true is returned in case of success.
(6) In this example, all requests not recognized are marked by returning false to the core. This one will stall the data or status stage of the control transfer indicating to the host that the request is not supported.
The host sends vendor requests through a host vendor application. USb libraries, such as libusb, can be used to help you develop your custom host vendor application.

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

60/174

Documentación API
Documentación API
Documentación API
Lista de módulos
USB Device API USB Device ACM API USB Device CDC API USB Device Core API USB Device HID API USB Device MSC API USB Device MSC SCSI API USB Device Vendor API

Descripción
USB Device API USB Device ACM API USB Device CDC API USB Device Core API USB Device HID API USB Device MSC API USB Device MSC SCSI API USB Device Vendor API

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

61/174

USB Device API
USB Device API
USB Device API
USB Device API.
Módulos
USB Device ACM API USB Device CDC API USB Device Core API USB Device HID API USB Device MSC API USB Device MSC SCSI API USB Device Vendor API

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

62/174

USB Device ACM API

USB Device ACM API

USB Device ACM API

USB Device CDC ACM API.
Módulos
a sl_usbd_cdc_ cm_line_coding_t sl_usbd_cdc_acm_callbacks_t
Funciones

sl_status_t sl_status_t
sl_status_t sl_status_t sl_status_t
estado_sl_t
estado_sl_t
estado_sl_t
sl_status_t sl_status_t sl_status_t sl_status_t sl_status_t

a sl_usbd_cdc_ cm_init(void)
GLOBAL VARIABLES.
ssll__uussbbdd__ccddcc__aaccmm__ccraellabtaec_kins_stta*npc_ea(cumin_tc1a6l_lbtalicnkes_,sutaintte8__int t*eprv_saul,bucinlats1s6__nt bcra)ll_mgmt_capabilities,
Add a new instance of the CDC ACM serial emulation subclass.
a a a a sl_usbd_cdc_ cm_ dd_to_configur tion(uint8_t subcl ss_nbr, uint8_t config_nbr)
Add a CDC ACM subclass class instance into USB device configuration.
a a sl_usbd_cdc_ cm_is_en bled(uint8_t subclass_nbr, bool *p_enabled)
Get the CDC ACM serial emulation subclass enable state.
a a a sl_usbd_cdc_ cm_re d(uint8_t subcl ss_nbr, uint8_t *p_buf, uint32_t buf_len, uint16_t timeout, uint32_t
*p_xfer_len) Receive data on the CDC ACM serial emulation subclass.
a a a a sl_usbd_cdc_ cm_re d_ sync(uint8_t subcl ss_nbr, uint8_t *p_buf, uint32_t buf_len, a a a a sl_usbd_cdc_ sync_function_t sync_fnct, void *p_ sync_ rg)
Receive data on the CDC ACM serial emulation subclass asynchronously.
a a sl_usbd_cdc_ cm_write(uint8_t subcl ss_nbr, uint8_t *p_buf, uint32_t buf_len, uint16_t timeout, uint32_t
*p_xfer_len) Send data on the CDC ACM serial emulation subclass.
a a a sl_usbd_cdc_ cm_write_ sync(uint8_t subcl ss_nbr, uint8_t *p_buf, uint32_t buf_len, a a a a sl_usbd_cdc_ sync_function_t sync_fnct, void *p_ sync_ rg)
Send data on the CDC ACM serial emulation subclass asynchronously.
a a a sl_usbd_cdc_ cm_get_line_control_st te(uint8_t subcl ss_nbr, uint8_t *p_line_ctrl)
Return the state of control lines.
a a a sl_usbd_cdc_ cm_get_line_coding(uint8_t subcl ss_nbr, sl_usbd_cdc_ cm_line_coding_t *p_line_coding)
Get the current state of the line coding.
a a a sl_usbd_cdc_ cm_set_line_coding(uint8_t subcl ss_nbr, sl_usbd_cdc_ cm_line_coding_t *p_line_coding)
Set a new line coding.
a a a sl_usbd_cdc_ cm_set_line_st te_event(uint8_t subcl ss_nbr, uint8_t events)
Set a line state event(s).
a a a a sl_usbd_cdc_ cm_cle r_line_st te_event(uint8_t subcl ss_nbr, uint8_t events)
Clear a line state event(s).

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

63/174

USB Device ACM API
Macros
#define SL_USBD_CDC_ACM_NBR_NONE 255u
MÓDULO.
#define SL_USBD_CDC_ACM_PARITY_NONE 0u
PORT SETTINGS DEFINES.
#define SL_USBD_CDC_ACM_PARITY_ODD 1u #define SL_USBD_CDC_ACM_PARITY_EVEN 2u #define SL_USBD_CDC_ACM_PARITY_MARK 3u #define SL_USBD_CDC_ACM_PARITY_SPACE 4u #define SL_USBD_CDC_ACM_STOP_BIT_1 0u #define SL_USBD_CDC_ACM_STOP_BIT_1_5 1u #define SL_USBD_CDC_ACM_STOP_BIT_2 2u #define SL_USBD_CDC_ACM_CTRL_BREAK 0 01u
LINE EVENTS FLAGS DEFINES.
#define SL_USBD_CDC_ACM_CTRL_RTS 0 02u #define SL_USBD_CDC_ACM_CTRL_DTR 0 04u #define SL_USBD_CDC_ACM_STATE_DCD 0 01u #define SL_USBD_CDC_ACM_STATE_DSR 0 02u #define SL_USBD_CDC_ACM_STATE_BREAK 0 04u #define SL_USBD_CDC_ACM_STATE_RING 0 08u #define SL_USBD_CDC_ACM_STATE_FRAMING 0 10u #define SL_USBD_CDC_ACM_STATE_PARITY 0 20u #define SL_USBD_CDC_ACM_STATE_OVERUN 0 40u #define SL_USBD_CDC_ACM_CALL_MGMT_DEV 0 01u
CALL MANAGEMENT CAPABILITIES.
#define SL_USBD_CDC_ACM_CALL_MGMT_DATA_CCI_DCI 0 02u #define SL_USBD_CDC_ACM_CALL_MGMT_DATA_OVER_DCI 0 02u | 0 01u)
Function Documentation
sl_usbd_cdc_acm_init
sl_status_t sl_usbd_cdc_acm_init (void )
GLOBAL VARIABLES. Parameters
Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

64/174

USB Device ACM API

Tipo
vacío

Direction N/A

Argument Name

MACROS GLOBAL CONSTANTS FUNCTION PROTOTYPES CDC ACM FUNCTIONS

Initialize the CDC ACM serial emulation subclass.
Devoluciones

Returns SL_STATUS_OK on success or another SL_STATUS code on failure.

Descripción

sl_usbd_cdc_acm_create_instance

sl_status_t sl_usbd_cdc_acm_create_instance (uint16_t line_state_interval, uint16_t call_mgmt_capabilities, sl_usbd_cdc_acm_callbacks_t * p_acm_callbacks, uint8_t * p_subclass_nbr)

Add a new instance of the CDC ACM serial emulation subclass.
Parámetros

Tipo
uint16_t
uint16_t

Direction Argument Name

Descripción

N / A

line_state_interval Line state notification interval in milliseconds (value must

be a power of 2).

N / A

call_mgmt_capabilities Call Management Capabilities bitmap. OR’ed of the

following flags:

SL_USBD_CDC_ACM_CALL_MGMT_DEV Device handles call management itself. SL_USBD_CDC_ACM_CALL_MGMT_DATA_CCI_DCI Device can send/receive call management information over a Data Class interface.

sl_usbd_cdc_acm_callbacks_t N/A
*

uint8_t *

N / A

p_acm_callbacks p_subclass_nbr

Optional pointers to callback functions to be called on various events.
Param to variable that will receive CDC ACM serial emulation subclass instance number.

Devoluciones

Return SL_STATUS_OK on success or another SL_STATUS code on failure.

sl_usbd_cdc_acm_add_to_configuration

sl_status_t sl_usbd_cdc_acm_add_to_configuration (uint8_t subclass_nbr, uint8_t config_nbr)

Add a CDC ACM subclass class instance into USB device configuration.
Parámetros

Tipo
uint8_t uint8_t

Direction N/A N/A

Argument Name
subclass_nbr config_nbr

Description CDC ACM serial emulation subclass instance number. Configuration index to add new test class interface to.

Devoluciones

Copyright © 2025 Laboratorios de Silicio. Reservados todos los derechos.

65/174

USB Device ACM API
Returns SL_STATUS_OK on success or another SL_STATUS code on failure.

sl_usbd_cdc_acm_is_enabled

sl_status_t sl_usbd_cdc_acm_is_enabled (uint8_t subclass_nbr, bool * p_enabled)

Get the CDC ACM serial emulation subclass enable state.
Parámetros

Tipo

Dirección

Argument Name

Descripción

uint8_t N/A

subclass_nbr CDC ACM serial emulation subclass instance number.

bool * N/A

p_enabled

Boolean to a variable that will receive enable status. The variable is set to true, CDC ACM serial emulation is enabled. The va

Documentos / Recursos

SILICON LABS USB Device Stack [pdf] Manual de instrucciones
USB Device Stack, Device Stack, Stack

Referencias

Deja un comentario

Su dirección de correo electrónico no será publicada. Los campos obligatorios están marcados *