Manual de instruções do SILICON LABS USB Device Stack

Pilha de dispositivos USB

Especificações

  • Versão USB: 1.5.1
  • Data de lançamento: 21 de julho de 2025
  • Versão do Simplicity SDK: 2025.6.1

Produto acimaview

A pilha de dispositivos USB da Silicon Labs oferece versatilidade e
conectividade USB fácil de usar para projetos de IoT, facilitando
comunicação entre coprocessadores de rede e hosts.

Características

  • Pilha de dispositivos USB eficiente
  • Ideal para projetos de IoT
  • Suporte para comunicação entre coprocessadores de rede e
    anfitriões

Instruções de uso do produto

Configuração do dispositivo USB

Configure as configurações do dispositivo USB de acordo com seu projeto
requisitos consultando a seção Configuração do dispositivo USB
na documentação.

Guia de programação de dispositivos USB

Siga o Guia de programação do dispositivo USB para entender como
programar e interagir com o dispositivo USB para vários
aplicações.

Classes de dispositivos USB

A seção Classes de dispositivos USB fornece uma visão geralview de diferente
classes como CDC ACM, HID, MSC SCSI e Vendor Class. Escolha o
classe apropriada com base na funcionalidade do seu dispositivo.

Solução de problemas de dispositivos USB

Se você encontrar algum problema com o dispositivo USB, consulte o
Seção de solução de problemas de dispositivos USB para soluções e depuração
pontas.

Host USB do sistema operacional Microsoft Windows

Se você estiver usando o dispositivo USB com um sistema operacional Microsoft Windows USB
Anfitrião, certifique-se de seguir as diretrizes fornecidas no
documentação para integração perfeita.

Perguntas frequentes

P: Quais são alguns ex comunsampmenos dispositivos que posso construir usando
esta pilha USB?

R: A pilha USB permite que você crie dispositivos como
Adaptadores USB para serial, mouses ou teclados, armazenamento removível
dispositivos e dispositivos personalizados.

P: Há algum requisito de software específico para usar este
Pilha de dispositivos USB?

R: O software compatível inclui Simplicity SDK, Simplicity
Estúdio, Simplicity Commander, GCC (A Coleção de Compiladores GNU),
IAR Embedded Workbench para ARM e IAR EWARM.

Barramento serial universal USB

Barramento serial universal USB

USB sobreview Sobreview
Notas de versão USB
Especificações e recursos sobreview
Configuração do dispositivo USB sobreview
Guia de programação de dispositivos USBview
Classes de dispositivos USB acimaview Aula de ACM do CDC encerradaview Aula HID encerradaview Classe MSC SCSI encerradaview Classe de fornecedor acimaview
Documentação da API API USB API de dispositivo USB API ACM de dispositivo USB a sl_usbd_cdc_ cm_line_coding_t sl_usbd_cdc_acm_callbacks_t API 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_req_t
uma API HID de dispositivo USB sl_usbd_cl ss_driver_t
sl_usbd_hid_callbacks_t API MSC do dispositivo USB
um sl_usbd_msc_subcl ss_driver_t Dispositivo USB MSC SCSI API
sl_usbd_msc_scsi_callbacks_t

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

1/174

Barramento serial universal USB
um sl_usbd_msc_scsi_lun_ pi
sl_usbd_msc_scsi_lun_info sl_usbd_msc_scsi_lun
API do fornecedor de dispositivos USB sl_usbd_vendor_callbacks_t
Documentação da API Solução de problemas de dispositivos USB
Sobreview Host USB do sistema operacional Microsoft Windows
Sobreview

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

2/174

Sobreview
Sobreview
Dispositivo USB
USB é uma das interfaces de comunicação mais bem-sucedidas na história dos sistemas computacionais e o padrão de fato para conectar periféricos de computador. O conjunto de dispositivos USB da Silicon Labs é um módulo de dispositivo USB projetado especificamente para sistemas embarcados. Desenvolvido do zero com a qualidade, escalabilidade e confiabilidade da Silicon Labs, ele passou por um rigoroso processo de validação para atender à especificação USB 2.0. Esta documentação descreve como inicializar, iniciar e usar o conjunto de dispositivos USB da Silicon Labs. Ela explica os vários valores de configuração e seus usos. Também inclui uma visão geral.view da tecnologia, tipos de possibilidades de configuração, procedimentos de implementação e exampexemplos de uso típico para cada classe disponível.
Para ajudar você a entender os conceitos USB rapidamente, a documentação apresenta muitos exemplosamparquivos de USB com funções básicas. Estes examples fornecerá uma estrutura que permite a construção rápida de dispositivos. Esses exampos incluem:
Adaptador USB para serial (classe de dispositivo de comunicação) Mouse ou teclado (classe de dispositivo de interface humana) Dispositivo de armazenamento removível (classe de armazenamento em massa) Dispositivo personalizado (classe de fornecedor)
O seguinte é o fimview das seções de documentação:
Especificações e recursos Configuração do dispositivo USB Guia de programação do dispositivo USB Classes de dispositivos USB
Classe CDC ACM Classe HID Classe MSC SCSI Classe de fornecedor Solução de problemas de dispositivos USB Host USB do sistema operacional Microsoft Windows

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

3/174

USB
USB

USB Versão 1.5.1 21 de julho de 2025 – Notas de versão
Simplicity SDK versão 2025.6.1
O eficiente conjunto de dispositivos USB da Silicon Labs oferece conectividade USB versátil e fácil de usar, ideal para projetos de IoT, incluindo comunicação entre coprocessadores de rede e hosts. Clique aqui para ver versões anteriores.
Resumo da versão
Principais recursos | Alterações na API | Correções de bugs | Habilitação de chip
Principais características
Somente alterações na plataforma subjacente.
Mudanças na API
Nenhum.
Correções de bugs
Nenhum.
Habilitação de Chip
Nenhum.
Principais características
Novos recursos | Melhorias | Recursos removidos | Recursos obsoletos
Novos recursos
Nenhum.
Melhorias
Somente alterações na plataforma subjacente.
Recursos removidos
Nenhum.
Recursos obsoletos
Nenhum.
Mudanças na API
Novas APIs | APIs modificadas | APIs removidas | APIs obsoletas
Novas APIs

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

4/174

USB
Nenhum.
APIs modificadas
Nenhum.
APIs removidas
Nenhum.
APIs obsoletas
Nenhum.
Correções de bugs
Nenhum.
Habilitação de Chip
Nenhum.
Aplicação Exampas mudanças
Novo examples | Ex modificadoamples | Ex removidoamples | Ex obsoletoampos
Novo exampos
Nenhum.
Ex modificadoampos
Nenhum.
Ex removidoampos
Nenhum.
Ex obsoletoampos
Nenhum.
Impacto das alterações de versão
Declarações de Impacto | Guia de Migração
Declarações de Impacto
Nenhum.
Guia de migração
Nenhum.
Problemas e limitações conhecidos
Nenhum.
Usando esta versão

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

5/174

USB

O que há na versão? | Software compatível | Instalação e uso | Ajuda e feedback

O que há no comunicado?

Aplicação de pilha de dispositivos USB Exampos
Software compatível

Programas
Simplicity SDK Simplicity Studio Simplicity Commander GCC A coleção de compiladores GNU) IAR Embedded Workbench para ARM IAR EWARM

Versão ou variante compatível
2025.6.0 5.11.0 1.18.2 (fornecido com o Simplicity Studio) 12.2.1 (fornecido com o Simplicity Studio) 9.40.1 (fornecido com o Simplicity Studio)

Instalação e uso

Para dar início ao seu desenvolvimento, veja nosso:
Guia de programação de dispositivos USB. Documentação da API.
Para obter informações sobre a integração do Secure Vault, consulte Secure Vault.
Para review Notificações de segurança e consultoria de software e gerencie suas preferências de notificação:
ò Acesse https://community.silabs.com/. ó Faça login com as credenciais da sua conta. ô Clique no seu profissionalfile ícone no canto superior direito da página.
õ Selecione Notificações no menu suspenso. ö Na seção Notificações, vá para a guia Notificações do meu produto paraview Consultoria histórica de segurança e software
notificações
÷ Para gerenciar suas preferências, use a guia Gerenciar notificações para personalizar quais atualizações e avisos de produtos você deseja receber.
receber.
Para configurações recomendadas, veja aqui.
Para saber mais sobre o software nesta versão, consulte nossa documentação online.
Ajuda e Feedback

Entre em contato com o suporte da Silicon Labs. Para usar nossa ferramenta Ask AI e obter respostas, consulte o campo de pesquisa no topo desta página.

Observação: o Ask AI é experimental.

Obtenha ajuda da nossa comunidade de desenvolvedores.
Política de lançamento e manutenção do SDK
Consulte nossa Política de lançamento e manutenção do SDK.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

6/174

Sobreview
Sobreview
Especificações
Em conformidade com a “revisão 2.0 da especificação Universal Serial Bus” Implementa o “Aviso de mudança de engenharia do descritor de associação de interface (ECN)” Tipos de transferência
Controle de interrupção em massa Classes USB Classe de dispositivo de comunicação (CDC) Modelo de controle abstrato (ACM) Dispositivo de interface humana (HID) Classe de armazenamento em massa (MSC) Estrutura de classe específica do fornecedor
Características
Escalável para incluir apenas os recursos necessários para minimizar o consumo de memória Suporta velocidade máxima (12 Mbit/s) Suporta dispositivos compostos (multifuncionais) Suporta dispositivos com múltiplas configurações Suporta funcionalidades de economia de energia USB (suspensão e retomada do dispositivo) Integração completa da classe de armazenamento em massa no sistema operacional Micrium File Módulo de sistema desenvolvido com a camada de abstração CMSIS-RTOS2 para funcionar com diferentes sistemas operacionais. O Silicon Labs GSDK vem com portas para FreeRTOS e Micrium OS.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

7/174

Sobreview
Sobreview

Configuração do dispositivo USB

Esta seção discute como configurar o dispositivo USB da Silicon Labs. Há três grupos de parâmetros de configuração, conforme a seguir:
Configuração do núcleo do dispositivo USB Configuração de informações do dispositivo USB Configuração de hardware do dispositivo USB
Configuração do núcleo do dispositivo USB
O dispositivo USB do Silicon Labs pode ser configurado em tempo de compilação por meio de um conjunto de #defines localizado em sl_usbd_core_config.h file. O dispositivo USB usa #defines sempre que possível, pois permite que o tamanho do código e dos dados seja dimensionado em tempo de compilação com base nos recursos habilitados. Isso permite que os espaços de memória somente leitura (ROM) e memória de acesso aleatório (RAM) do dispositivo USB da Silicon Labs sejam ajustados com base nos requisitos da sua aplicação.
Recomendado: inicie o processo de configuração com os valores padrão (destacados em negrito).
As seções abaixo são organizadas com base na ordem na configuração do modelo file, sl_usbd_core_config.h.
Configuração de classes de configuração de núcleo
Configuração do núcleo
Tabela – Constantes de configuração do núcleo do dispositivo USB

Descrição constante

Valor Padrão

SL_USBD_TA SK_STACK_ TAMANHO

Configura o tamanho da pilha em bytes da tarefa principal USBD

4096

SL_USBD_TA SK_PRIORIDADE

Configura a prioridade da tarefa principal do USBD. Esta é uma prioridade do CMSIS-RTOS2.

osPriorityHigh

SL_USBD_A UTO_START _USB_DEVIC E

Se habilitado, o dispositivo USB será iniciado automaticamente assim que o kernel for iniciado e a tarefa do núcleo USBD for agendada pela primeira vez. Se desabilitado, seu aplicativo precisará chamar sl_usbd_core_start_device() quando estiver pronto para ser detectado pelo host USB.

SL_USBD_C O número total de configurações que serão adicionadas por meio do sl_usbd_add_configuration()

1

Função ONFIGURATI.

ON_QUANTI

TY

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

8/174

Sobreview

Constante
SL_USBD _INTERF ACE_QU ANTIDADE
SL_USBD _ALT_INT ERFACE_ QUANTI
TY
SL_USBD _INTERF ACE_GR
OUP_QU
ANTIDADE
SL_USBD _DESCRI
PTOR_Q
UANTIDADE
SL_USBD _STRING _QUANTI
TY
SL_USBD _OPEN_E NDPOIN TS_QUA NTIDADE

Descrição: O número total de interfaces USB a serem adicionadas para todas as suas configurações. Isso depende muito da(s) classe(s) utilizada(s). Para obter mais informações sobre quantas interfaces uma instância de classe requer, consulte a seção "Necessidades de Recursos do Núcleo" da(s) sua(s) classe(s).
O número total de interfaces USB alternativas a serem adicionadas para todas as suas configurações. Isso depende muito da(s) classe(s) utilizada(s). Este valor deve ser sempre igual ou maior que SL_USBD_INTERFACE_QUANTITY. Para obter mais informações sobre quantas interfaces alternativas uma instância de classe requer, consulte a seção "Necessidades de Recursos do Núcleo" da(s) sua(s) classe(s).
O número total de grupos de interface USB que serão adicionados a todas as suas configurações. Isso depende muito da(s) classe(s) utilizada(s). Para obter mais informações sobre quantos grupos de interface uma instância de classe requer, consulte a seção "Necessidades de Recursos do Núcleo" da(s) sua(s) classe(s).
O número total de descritores de endpoint que serão adicionados a todas as suas configurações. Isso depende muito da(s) classe(s) utilizada(s). Para obter mais informações sobre quantos descritores de endpoint uma instância de classe requer, consulte “Número de endpoints” na seção “Necessidades de Recursos do Núcleo” da(s) sua(s) classe(s). Observe que os endpoints de controle não precisam ser considerados aqui. O número total de strings USB. Definir a quantidade como zero desabilitará o recurso. Desabilitar isso fará com que o dispositivo não armazene nenhuma string de descrição USB passada pelo aplicativo. Isso significa que o host não conseguirá recuperar as strings de descrição (como fabricante e nome do produto). O número total de endpoints abertos por configuração. Um dispositivo requer pelo menos dois endpoints abertos para transferências de controle, mas você também deve adicionar os endpoints da(s) classe(s) utilizada(s). Para obter mais informações sobre quantos endpoints abertos uma instância de classe requer, consulte “Número de endpoints” na seção “Necessidades de Recursos do Núcleo” da(s) sua(s) classe(s).

Valor Padrão
10 10
2
20 30 20

Configuração de classes
As classes têm configurações específicas em tempo de compilação. Consulte Classes de Dispositivos USB para mais informações.
Configuração de informações do dispositivo USB

A configuração sl_usbd_device_config.h file reagrupa #define-s em tempo de compilação para definir informações básicas sobre seu dispositivo, como ID do fornecedor/produto, sequências de caracteres do dispositivo, etc. A tabela abaixo descreve cada configuração de informação definida disponível nesta configuração file.

Tabela – Configurações de informações do dispositivo USB

Constante
SL_USBD_DEVIC E_VENDOR_ID
SL_USBD_DEVIC E_PRODUCT_ID

Descrição: Seu número de identificação de fornecedor, conforme fornecido pelo Fórum de Implementadores USB. Para obter mais informações sobre como obter um ID de fornecedor, consulte http://www.usb.org/developers/vendor/. Seu número de identificação de produto.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

9/174

Sobreview

Constante

Descrição

SL_USBD_DEVICE_RELEASE Número de versão do seu dispositivo. _NUMBER

SL_USBD_DEVICE_MANUFA: String que descreve o fabricante do seu dispositivo. Esta configuração é ignorada quando o

CURADOR_STRING

a configuração SL_USBD_STRING_QUANTITY está definida como 0.

SL_USBD_DEVICE_PRODUC String que descreve seu produto. Esta configuração é ignorada quando a configuração

CADEIA_T

SL_USBD_STRING_QUANTITY está definido como 0.

SL_USBD_DEVICE_SERIAL_N String contendo o número de série do seu dispositivo. Esta configuração é ignorada quando o

CADEIA_NÚMERO

a configuração SL_USBD_STRING_QUANTITY está definida como 0.

SL_USBD_DEVICE_LANGUA Número de identificação do idioma das strings do seu dispositivo. Os valores possíveis são:
GE_ID

– SL_USBD_LANG_ID_ARABIC_SAUDI_ARABIA

– SL_USBD_LANG_ID_CHINÊS_TAIWAN

– SL_USBD_LANG_ID_INGLÊS_EUA

– SL_USBD_LANG_ID_INGLÊS_REINO UNIDO

– SL_USBD_LANG_ID_FRANCÊS

– SL_USBD_LANG_ID_ALEMÃO

– SL_USBD_LANG_ID_GREGO

– SL_USBD_LANG_ID_ITALIANO

– SL_USBD_LANG_ID_PORTUGUÊS

– SL_USBD_LANG_ID_SÂNSCRITO

Esta configuração é ignorada quando a configuração SL_USBD_STRING_QUANTITY é definida como 0.

Configuração de hardware do dispositivo USB

Dependendo do dispositivo Silicon Labs que você estiver usando, você provavelmente terá o pino e a porta GPIO para configurar o sinal USB VBUS Sense. As definições de configuração estão no cabeçalho sl_usbd_hardware_config.h. file.

Constante
SL_USBD_DRIVER_VBUS_SENSE_PORTA SL_USBD_DRIVER_VBUS_SENSE_PIN

Descrição
Porta GPIO para o sinal USB VBUS Sense na sua placa. Pino GPIO para o sinal USB VBUS Sense na sua placa.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

10/174

Sobreview
Sobreview
Guia de programação de dispositivos USB
Esta seção explica como usar o módulo Dispositivo USB.
Configuração inicial do módulo de dispositivo USB
Esta seção descreve as etapas básicas necessárias para inicializar o módulo de dispositivo USB e adicionar, preparar e iniciar um dispositivo. Inicializando o módulo de dispositivo USB Inicializando o núcleo do dispositivo USB Inicializando o(s) aCl ss Adicionando seu dispositivo USB Construindo seu dispositivo USB Adicionando configuração(ões) Adicionando função(ões) USB Iniciando seu dispositivo USB
Funções de gancho de evento
Inicializando o módulo do dispositivo USB
Inicializando o núcleo do dispositivo USB
a US a Comece inicializando o núcleo do módulo do dispositivo B chamando a função sl_usbd_core_init() . O exemplo abaixo mostra a chamada de sl_usbd_core_init() .
Example – Chamando sl_usbd_core_init()
sl_status_t status; status = sl_usbd_core_init(); if (status ! SL_STATUS_OK) { /* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */
}
Inicializando a(s) classe(s)
Após a inicialização do núcleo do módulo do dispositivo USB, você deve inicializar cada classe que pretende usar. Consulte a seção “Guia de Programação” do(s) seu(s) ACL SS para obter mais informações.
Construindo seu dispositivo USB
Adicionando configuração(ões)
Após inicializar seu dispositivo com sucesso, você pode começar a adicionar as funções USB a ele, começando com uma nova configuração. Um dispositivo deve ter pelo menos uma configuração. Para adicionar uma ou mais configurações, chame a função sl_usbd_core_dd_configuration(). Esta função deve ser chamada para cada configuração que você deseja adicionar. O exemploampO abaixo mostra como adicionar uma velocidade máxima.
Example – Adicionando configuração(ões) ao seu dispositivo

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

11/174

Sobreview

sl_status_t status; uint8_t config_nbr_fs;

/* Adicionando uma configuração de velocidade máxima ao dispositivo. */

status = sl_usbd_core_add_configuration(0,

/* Nenhum atributo especial para a configuração. */

100u,

/* Consumo máximo de energia: 100mA.

*/

SL_USBD_DEVICE_SPEED_FULL,

/* Configuração de velocidade máxima.

*/

“Config Adicionar Exampa configuração Full-Speed”,

&config_nbr_fs);

se (status ! SL_STATUS_OK) {

/* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */

}

Adicionando função(ões) USB
Após adicionar com sucesso pelo menos uma configuração ao seu dispositivo, você poderá adicionar as interfaces e os endpoints. Cada classe USB tem suas próprias necessidades em termos de tipo de interface e endpoints, quantidade e outros parâmetros. O Silicon Labs USB Device adiciona interfaces e endpoints às classes que oferece.
No seu aplicativo, você pode instanciar uma classe USB e adicioná-la a uma configuração. Para obter mais informações sobre o conceito de instâncias de classe de dispositivo USB, consulte Classes de Dispositivo USB. Observe que você pode instanciar e adicionar diversas instâncias de classe diferentes a uma configuração para criar um dispositivo multifuncional (composto).
O exampA seguir mostramos como criar uma instância de classe e adicioná-la a uma configuração.
Example – Adicionando uma instância de classe ao seu dispositivo

sl_status_t status; uint8_t número_da_classe;
/* Crie uma instância da classe que você deseja usar.*/ /* Observe que, dependendo da classe, esta função pode ter mais argumentos. */ status = sl_usbd_ _create_instance(&class_nbr); if (status ! SL_STATUS_OK) { /* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */ }
/* Adicione a instância da classe à configuração Full-Speed. */ status = sl_usbd_ _add_to_configuration(class_nbr, /* Número da classe retornado por sl_usbd_ _criar_instância. */
config_nbr_fs); /* Número de configuração retornado por sl_usbd_core_add_configuration(). */ if (status ! SL_STATUS_OK) { /* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */ }
Iniciando seu dispositivo USB
Por padrão, o dispositivo será iniciado automaticamente pela tarefa principal do dispositivo USB após a inicialização do dispositivo e a inicialização do kernel. Para controlar quando o dispositivo é iniciado e se torna visível para o host USB, use a definição de configuração SL_USBD_AUTO_START_USB_DEVICE para desabilitar o recurso de inicialização automática. Quando desabilitado, após compilar/preparar seu dispositivo, você pode iniciá-lo e torná-lo visível para o host USB chamando a função sl_usbd_core_start_device().
O exampO exemplo abaixo mostra como iniciar seu dispositivo usando a função sl_usbd_core_start_device().
Example – Iniciando seu dispositivo

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

12/174

Sobreview

sl_status_t estado;
status = sl_usbd_core_start_device(); if (status ! SL_STATUS_OK) { /* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */ }

Funções de gancho de evento
O módulo principal do dispositivo USB oferece duas funções de gancho fraco que você pode redefinir em sua aplicação. A finalidade delas é notificar quando ocorrem eventos de barramento e configuração.
Tabela – Funções do gancho de evento USB

Evento

Descrição

Ônibus

Chamado quando ocorre um evento de barramento USB

Configuração chamada quando ocorre o evento de configuração USB

Assinatura de Função
vazio sl_usbd_on_bus_event(evento sl_usbd_bus_event_t); vazio sl_usbd_on_config_event(evento sl_usbd_config_event_t, uint8_t config_nbr);

Example – Funções de gancho de evento

void sl_usbd_on_bus_event(sl_usbd_bus_event_t event) { switch (evento) { case SL_USBD_EVENT_BUS_CONNECT:
// chamado quando o cabo USB é inserido em um controlador de host break;
caso SL_USBD_EVENT_BUS_DISCONNECT: // chamado quando o cabo USB é removido de um controlador host break;
case SL_USBD_EVENT_BUS_RESET: // chamado quando o host envia o comando reset break;
case SL_USBD_EVENT_BUS_SUSPEND: // chamado quando o host envia o comando suspend break;
case SL_USBD_EVENT_BUS_RESUME: // chamado quando o host envia comando de ativação break;
padrão: quebrar; } }
void sl_usbd_on_config_event(sl_usbd_config_event_t event, uint8_t config_nbr) { switch (evento) { case SL_USBD_EVENT_CONFIG_SET:
// chamado quando o host define uma quebra de configuração;
case SL_USBD_EVENT_CONFIG_UNSET: // chamado quando uma configuração é desfeita break;
padrão: quebrar; } }

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

13/174

Sobreview

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

14/174

Sobreview
Sobreview

Classes de dispositivos USB

As classes USB disponíveis no Silicon Labs USB Device compartilham algumas características comuns. Esta seção explica essas características e suas interações com a camada central.
Para mais informações sobre uma classe específica, consulte o seguinte:
Classe CDC ACM Classe HID Classe MSC SCSI Classe do fornecedor
Sobre instâncias de classe
As classes USB disponíveis em Dispositivos USB implementam o conceito de instâncias de classe. Uma instância de classe representa uma função dentro de um dispositivo. A função pode ser descrita por uma interface ou por um grupo de interfaces e pertence a uma classe específica.
Cada implementação de classe USB possui algumas configurações e funções em comum, baseadas no conceito de instância de classe. As configurações e funções comuns são apresentadas na tabela abaixo. No título da coluna "Constantes ou Função", o espaço reservado XXXX pode ser substituído pelo nome da classe: CDC, HID, MSC, CDC_ACM ou VENDOR (Vendor para nomes de funções).
Tabela – Constantes e Funções Relacionadas ao Conceito de Instâncias de Múltiplas Classes

Constante ou Função
SL_USBD_XXXX_CL ASS_INS TÂNCIA_QUANTIDADE
SL_USBD_XXXX_CONFIGURAÇÃO_QUANTIDADE
sl_usb d _XXXX_criado _insta nce ()
sl_usbd_XXXX_add_to_conf figuration()

Descrição
Configura o número máximo de instâncias de classe.
Configura o número máximo de configurações. Durante a inicialização da classe, uma instância de classe criada será adicionada a uma ou mais configurações. Cria uma nova instância de classe.
Adiciona uma instância de classe existente à configuração do dispositivo especificada.

Em termos de implementação de código, a classe declarará uma variável global local que contém uma estrutura de controle de classe. Essa estrutura de controle de classe está associada a uma instância de classe e conterá informações específicas para gerenciar a instância de classe.
As figuras a seguir mostram vários cenários de caso. Cada figura inclui um exemplo de códigoample que corresponde ao cenário do caso.
Figura – Instâncias de Classe Múltiplas – Dispositivo FS (1 Configuração com 1 Interface) representa um dispositivo USB típico. O dispositivo é Full-Speed ​​(FS) e contém uma única configuração. A função do dispositivo é descrita por uma interface composta por um par de endpoints para comunicação de dados. Uma instância de classe é criada e permitirá que você gerencie toda a interface com seu endpoint associado.
Figura – Instâncias de múltiplas classes – Configuração do dispositivo FS 1 com 1 interface)

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

15/174

Sobreview

O código correspondente à Figura – Instâncias de Classe Múltiplas – Dispositivo FS (1 Configuração com 1 Interface) é mostrado no exemploampabaixo.
Example – Instâncias de múltiplas classes – Configuração do dispositivo FS 1 com 1 interface)

sl_status_t status; uint8_t classe_0;

void app_usbd_XXXX_enable(uint8_t class_nbr) { /* Manipular evento de ativação de classe. */ }

void app_usbd_XXXX_disable(uint8_t class_nbr) { /* Manipular evento de desativação de classe. */ }

sl_usbd_XXXX_callbacks_t classe_callbacks = {

(1)

.enable = app_usbd_XXXX_enable,

.desativar = app_usbd_XXXX_desativar

};

status = sl_usbd_XXXX_init();

(2)

se (status ! SL_STATUS_OK) {

/* $$$$ Lidar com o erro. */

}

status = sl_usbd_XXXX_create_instance(&retornos_de_chamada_de_classe,

(3)

&class_0);

se (status ! SL_STATUS_OK) {

/* $$$$ Lidar com o erro. */

}

status = sl_usbd_XXXX_add_to_configuration(classe_0, config_0);

(4)

se (status ! SL_STATUS_OK) {

/* $$$$ Lidar com o erro. */

}

(1) Cada classe oferece um conjunto de funções de retorno de chamada para eventos de conexão/desconexão de dispositivos e para eventos específicos da classe. O objeto de estrutura de retorno de chamada é passado como argumento ao criar a instância da classe com sl_usbd_XXXX_create_instance().
função.
(1) Inicialize a classe. Todas as variáveis ​​internas, estruturas e portas da classe serão inicializadas. Observe que a função Init() em algumas classes pode receber outros argumentos.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

16/174

Sobreview
(2) Crie a instância de classe, que é class_0 . A função sl_usbd_XXXX_create_instance() aloca uma estrutura de controle de classe associada a class_0 . Dependendo da classe, sl_usbd_XXXX_create_instance() pode ter parâmetros adicionais além do número da classe que representam informações específicas da classe armazenadas na estrutura de controle de classe. aaa (3) Adicione a instância de classe, class_0 , ao número de configuração especificado, config_0 . sl_usbd_XXXX_add_to_configuration() criará a interface 0 e seus pontos de extremidade IN e OUT associados. Como resultado, a instância de classe abrange a interface 0 e seus pontos de extremidade. Qualquer comunicação feita na interface 0 usará o número da instância de classe, class_0 . Figura – Instâncias de múltiplas classes – Dispositivo FS (2 configurações e múltiplas interfaces) representa uma ex mais complexaample. Um dispositivo de velocidade máxima é composto por duas configurações. O dispositivo possui duas funções que pertencem à mesma classe, mas cada função é descrita por duas interfaces e possui um par de terminais bidirecionais. Neste exemploampPor exemplo, duas instâncias de classe são criadas. Cada instância de classe é associada a um grupo de interfaces, ao contrário da Figura – Múltiplas Instâncias de Classe – Dispositivo FS (1 Configuração com 1 Interface) e da Figura – Múltiplas Instâncias de Classe – Dispositivo FS (2 Configurações e Múltiplas Interfaces), em que a instância de classe foi associada a uma única interface.
Figura – Instâncias de múltiplas classes – Configurações do dispositivo FS 2 e múltiplas interfaces)

O código correspondente à Figura – Instâncias de Classe Múltiplas – Dispositivo FS (2 Configurações e Interfaces Múltiplas) é mostrado no exemploampVeja abaixo. O tratamento de erros foi omitido para maior clareza.
Example – Instâncias de múltiplas classes – Configurações do dispositivo FS 2 e múltiplas interfaces)

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

17/174

Sobreview

sl_status_t status; uint8_t classe_0; uint8_t classe_1;
status = sl_usbd_XXXX_init();
status = sl_usbd_XXXX_create_instance(&class_0); status = sl_usbd_XXXX_create_instance(&class_1);
status = sl_usbd_XXXX_add_to_configuration(classe_0, cfg_0); status = sl_usbd_XXXX_add_to_configuration(classe_1, cfg_0);
status = sl_usbd_XXXX_add_to_configuration(classe_0, cfg_1); status = sl_usbd_XXXX_add_to_configuration(classe_1, cfg_1);

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

(1) Inicialize a classe. Todas as variáveis ​​internas, estruturas e portas de classe serão inicializadas.
(2) Crie a instância de classe, class_0 . A função sl_usbd_XXXX_create_instance() aloca uma estrutura de controle de classe associada a class_0 .
(3) Crie a instância de classe, class_1 . A função sl_usbd_XXXX_create_instance() aloca outra estrutura de controle de classe associada a class_1 .
(4) Adicione a instância de classe, class_0, à configuração cfg_0. sl_usbd_XXXX_add_to_configuration() criará a interface 0, a interface 1, as interfaces alternativas e os pontos de extremidade IN e OUT associados. O número da instância de classe, class_0, será usado para qualquer comunicação de dados na interface 0 ou 1.
(5) Adicione a instância de classe, class_1, à configuração, cfg_0. sl_usbd_XXXX_add_to_configuration() criará a interface 2, a interface 3 e seus respectivos endpoints IN e OUT. O número da instância de classe, class_1, será usado para qualquer comunicação de dados na interface 2 ou 3.
(6) Adicione as mesmas instâncias de classe, class_0 e class_1 , à outra configuração, cfg_1 .
Cada classe define uma estrutura do tipo sl_usbd_XXXX_callbacks_t. Seu objetivo é fornecer a cada classe um conjunto de funções de retorno de chamada a serem chamadas quando um evento ocorrer. Duas funções de retorno de chamada estão presentes em cada classe. Elas são apresentadas na tabela abaixo.
Tabela – Funções de retorno de chamada de classe comuns

Descrição dos campos .enable Chamado quando a instância da classe USB é habilitada com sucesso. .disable Chamado quando a instância da classe USB é desabilitada.

Assinatura da função void app_usbd_XXXX_enable(uint8_t class_nbr); void app_usbd_XXXX_disable(uint8_t class_nbr);

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

18/174

Sobreview
Sobreview
Classe CDC ACM de dispositivo USB
Classe base CDC do dispositivo USB sobreview Recurso de classe CDC ACM do dispositivo USB necessário do núcleo Subclasse CDC ACM do dispositivo USBview Configuração da classe CDC ACM do dispositivo USB Guia de programação da classe CDC ACM do dispositivo USB
Esta seção descreve a classe Communications Device Class (CDC) e a subclasse CDC associada, suportadas pela pilha de dispositivos USB da Silicon Labs. Atualmente, o USB-Device da Silicon Labs suporta a subclasse Abstract Control Model (ACM), comumente usada para emulação serial.
O CDC inclui vários dispositivos de telecomunicações e redes. Os dispositivos de telecomunicações abrangem modems analógicos, telefones analógicos e digitais, adaptadores de terminais ISDN, etc. Por exemploampOs dispositivos de rede contêm modems ADSL e a cabo, adaptadores Ethernet e hubs. O CDC define uma estrutura para encapsular os padrões de serviços de comunicação existentes, como V.250 (para modems em redes telefônicas) e Ethernet (para dispositivos de rede local), usando um link USB. Um dispositivo de comunicação é responsável pelo gerenciamento de dispositivos, pelo gerenciamento de chamadas quando necessário e pela transmissão de dados.
O CDC define sete grupos principais de dispositivos. Cada grupo pertence a um modelo de comunicação, que pode incluir diversas subclasses. Cada grupo de dispositivos possui seu próprio documento de especificação, além da classe base do CDC. Os sete grupos são:
Rede Telefônica Pública Comutada (PSTN), dispositivos que incluem modems de banda de voz, telefones e dispositivos de emulação serial. Dispositivos de Rede Digital de Serviços Integrados (ISDN), incluindo adaptadores de terminal e telefones. Dispositivos de Modelo de Controle Ethernet (ECM), incluindo dispositivos que suportam a família IEEE 802 (ex.: modems a cabo e ADSL, adaptadores WiFi). Dispositivos de Modo de Transferência Assíncrona (ATM), incluindo modems ADSL e outros dispositivos conectados a redes ATM (estações de trabalho, roteadores, switches LAN). Dispositivos de Comunicações Móveis Sem Fio (WMC), incluindo dispositivos de comunicação multifuncionais usados ​​para gerenciar comunicações de voz e dados. Dispositivos de Modelo de Emulação Ethernet (EEM) que trocam dados em quadros Ethernet. Dispositivos de Modelo de Controle de Rede (NCM), incluindo dispositivos de rede de alta velocidade (modems de Acesso a Pacotes de Alta Velocidade, Equipamentos Terminais de Linha).
O CDC e a implementação da subclasse associada estão em conformidade com as seguintes especificações:
Universal Serial Bus, Definições de classe para dispositivos de comunicação, revisão 1.2, 3 de novembro de 2010. Universal Serial Bus, Comunicações, Subclasse para dispositivos PSTN, revisão 1.2, 9 de fevereiro de 2007.
Classe base CDC do dispositivo USB sobreview
Um dispositivo CDC é composto pelas seguintes interfaces para implementar a capacidade de comunicação:
A Interface de Classe de Comunicação (CCI) é responsável pelo gerenciamento do dispositivo e, opcionalmente, pelo gerenciamento de chamadas.
O gerenciamento de dispositivos permite a configuração e o controle gerais do dispositivo, bem como a notificação de eventos ao host. O gerenciamento de chamadas permite o estabelecimento e o encerramento de chamadas. O gerenciamento de chamadas pode ser multiplexado por meio de um DCI. Um CCI é obrigatório para todos os dispositivos CDC. Ele identifica a função CDC especificando o modelo de comunicação suportado pelo dispositivo CDC. A(s) interface(s) após o CCI pode(m) ser qualquer interface de classe USB definida, como Áudio, ou uma interface específica do fornecedor. A interface específica do fornecedor é representada especificamente por um DCI.
A Interface de Classe de Dados (DCI) é responsável pela transmissão de dados. Os dados transmitidos e/ou recebidos não seguem uma estrutura específica.
formato. Os dados podem ser dados brutos de uma linha de comunicação, dados seguindo um formato proprietário, etc. Todos os DCIs que seguem o CCI podem ser vistos como interfaces subordinadas.
Um dispositivo CDC deve ter pelo menos um CCI e zero ou mais DCIs. Um CCI e qualquer DCI subordinado juntos fornecem um recurso ao host. Essa capacidade também é chamada de função. Em um dispositivo composto CDC, você pode ter vários

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

19/174

Sobreview
funções. Portanto, o dispositivo seria composto por vários conjuntos de CCI e DCI(s), conforme mostrado na Figura – Dispositivo Composto CDC.
Figura – Dispositivo Composto CDC

É provável que um dispositivo CDC use a seguinte combinação de pontos de extremidade:
Um par de pontos de extremidade de entrada e saída de controle, denominado ponto de extremidade padrão. Um ponto de extremidade de entrada opcional, em massa ou de interrupção. Um par de pontos de extremidade de entrada e saída em massa ou isócronos. Observe que a pilha de dispositivos USB da Silicon Labs não oferece suporte a pontos de extremidade isócronos no momento.
A tabela abaixo mostra o uso dos diferentes pontos de extremidade e por qual interface do CDC eles são usados.
Tabela – Uso de endpoint do CDC

Ponto final
Controle IN
Controle PARA FORA
Interromper ou em massa EM Massa ou isócrono EM Massa ou isócrono
FORA

Direção
Dispositivo para host
Host para dispositivo
Dispositivo para host
Dispositivo para host
Host para dispositivo

Uso da interface

CCI

Solicitações padrão para enumeração, solicitações específicas de classe, dispositivo

gerenciamento e, opcionalmente, gerenciamento de chamadas.

CCI

Solicitações padrão para enumeração, solicitações específicas de classe, dispositivo

gerenciamento e, opcionalmente, gerenciamento de chamadas.

CCI

Notificação de eventos, como detecção de anel, status da linha serial, status da rede.

DCI

Comunicação de dados brutos ou formatados.

DCI

Comunicação de dados brutos ou formatados.

A maioria dos dispositivos de comunicação utiliza um ponto de interrupção para notificar o host sobre eventos. Pontos de interrupção isócronos não devem ser usados ​​para transmissão de dados quando um protocolo proprietário depende da retransmissão de dados em caso de erros no protocolo USB. A comunicação isócrona pode, inerentemente, perder dados, pois não possui mecanismos de repetição.
Os sete principais modelos de comunicação abrangem diversas subclasses. Uma subclasse descreve a maneira como o dispositivo deve usar o CCI para gerenciar o dispositivo e as chamadas. A tabela abaixo mostra todas as subclasses possíveis e o modelo de comunicação ao qual pertencem.
Tabela – Subclasses do CDC

Subclass
Modelo de Controle de Linha Direta Modelo de Controle Abstrato

Modelo de Comunicação
PSTN
PSTN

Example de dispositivos que usam esta subclasse
Dispositivos de modem controlados diretamente pelo host USB
Dispositivos de emulação serial, dispositivos de modem controlados por meio de um conjunto de comandos seriais

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

20/174

Sobreview

Subclass

Modelo de Comunicação

Example de dispositivos que usam esta subclasse

Modelo de controle telefônico

PSTN

Modelo ISDN de controle multicanal

Modelo de Controle CAPI ISDN

Modelo de controle ECM de rede Ethernet

Rede ATM

caixa eletrônico

Modelo de controle

Modelo de controle de aparelho sem fio

CMM

Gerenciamento de dispositivos WMC

Modelo de Linha Direta Móvel

CMM

OBEX

CMM

Modelo EEM de emulação Ethernet

Modelo de controle de rede

NCM

Dispositivos de telefonia vocal
Adaptadores de terminais de taxa básica, adaptadores de terminais de taxa primária, telefones
Adaptadores de terminal de taxa básica, adaptadores de terminal de taxa primária, telefones, modems a cabo DOC-SIS, modems ADSL que suportam emulação PPPoE, adaptadores Wi-Fi (família IEEE 802.11), adaptadores IEEE 802.3, modems ADSL
Equipamento terminal móvel conectado a dispositivos sem fio
Equipamento terminal móvel conectado a dispositivos sem fio Equipamento terminal móvel conectado a dispositivos sem fio
Equipamentos terminais móveis que se conectam a dispositivos sem fio. Dispositivos que usam quadros Ethernet como a próxima camada de transporte. Não se destinam a dispositivos de roteamento e conectividade com a Internet. Adaptadores IEEE 802.3 que transportam dados de alta velocidade em rede.

Recurso de classe ACM do CDC do dispositivo USB necessário do núcleo

Cada vez que você adiciona uma instância de classe CDC ACM a uma configuração USB por meio de uma chamada para a função sl_usbd_cdc_acm_add_to_configuration() , os seguintes recursos serão alocados do núcleo.

Recurso
Interfaces Interfaces alternativas Pontos de extremidade Grupos de interface

Quantidade
2 2 3 1

Observe que esses números são por configuração. Ao definir os valores de configuração SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY e SL_USBD_DESCRIPTOR_QUANTITY, não se esqueça de levar em consideração quantas configurações a classe será adicionada. Para o valor de configuração SL_USBD_OPEN_ENDPOINTS_QUANTITY, como os endpoints são abertos somente quando uma configuração é definida pelo host, você só precisa levar em consideração o número de endpoints necessários para uma instância de classe.
Subclasse CDC ACM do dispositivo USB sobreview

A classe base CDC é composta por uma Interface de Classe de Comunicação (CCI) e uma Interface de Classe de Dados (DCI), que são discutidas em detalhes em Sobre a Classe Base CDC do Dispositivo USBview Esta seção discute um CCI do tipo ACM. Ele consiste em um endpoint padrão para o elemento de gerenciamento e um endpoint de interrupção para o elemento de notificação. Um par de endpoints em massa é usado para transportar dados não especificados pelo DCI.
A subclasse ACM é usada por dois tipos de dispositivos de comunicação:
Dispositivos que suportam comandos AT (por exemplo, modems de banda de voz). Dispositivos de emulação serial, também chamados de dispositivos de porta COM virtual.
Existem várias solicitações específicas para a subclasse ACM. Elas permitem controlar e configurar o dispositivo. A lista completa e a descrição de todas as solicitações ACM podem ser encontradas na especificação.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

21/174

Sobreview Subclasse para dispositivos PSTN, revisão 1.2, 9 de fevereiro de 2007=, seção 6.2.2.
Desta lista, a subclasse ACM do Silicon Labs9 suporta o seguinte:
Tabela – Solicitações de ACM suportadas pela Silicon Labs

Descrição da solicitação de subclasse

Definir recurso de comunicação Obter recurso de comunicação Limpar recurso de comunicação

O host envia esta solicitação para controlar as configurações de um determinado recurso de comunicação. Não usado para emulação serial.
O host envia esta solicitação para obter as configurações atuais de um determinado recurso de comunicação. Não usado para emulação serial.
O host envia esta solicitação para limpar as configurações de um determinado recurso de comunicação. Não usado para emulação serial.

Definir codificação de linha

O host envia esta solicitação para configurar as configurações do dispositivo ACM: taxa de transmissão, número de bits de parada, tipo de paridade e número de bits de dados. Para uma emulação serial, esta solicitação é enviada automaticamente por um terminal serial sempre que você configura as configurações seriais para uma porta COM virtual aberta.

Obter codificação de linha

O host envia esta solicitação para obter as configurações atuais do ACM (taxa de transmissão, bits de parada, paridade, bits de dados). Para uma emulação serial, os terminais seriais enviam esta solicitação automaticamente durante a abertura da porta COM virtual.

SetControlLineState: O host envia esta solicitação para controlar a portadora para modems half-duplex e indicar se o Equipamento Terminal de Dados (DTE) está pronto ou não. No caso de emulação serial, o DTE é um terminal serial. Para emulação serial, certos terminais seriais permitem que você envie esta solicitação com os controles definidos.

Quebra de conjunto

O host envia esta solicitação para gerar uma interrupção no estilo RS-232. Para uma emulação serial, certos terminais seriais permitem o envio desta solicitação.

A subclasse ACM do Silicon Labs9 usa o ponto final de interrupção IN para notificar o host sobre o estado atual da linha serial. A serial
estado da linha é um bitmap informando o host sobre:

Dados descartados devido a estouro Erro de paridade Erro de enquadramento Estado da detecção do sinal de anel Estado do mecanismo de detecção de interrupção Estado da portadora de transmissão Estado da detecção da portadora do receptor

A implementação da subclasse ACM do Silicon Labs9 está em conformidade com a seguinte especificação:
Universal Serial Bus, Comunicações, Subclasse para Dispositivos PSTN, revisão 1.2, 9 de fevereiro de 2007.
Configuração de classe ACM do CDC do dispositivo USB

Esta seção discute como configurar a Classe ACM (Classe de Dispositivo de Comunicação, Modelo de Controle Abstrato) do CDC. Há dois grupos de parâmetros de configuração:
Configurações específicas de aplicação da classe ACM do CDC do dispositivo USB Configurações de instância da classe ACM do CDC do dispositivo USB
Configurações específicas da aplicação da classe ACM do CDC do dispositivo USB

Classe Base CDC Subclasse ACM
Classe Base do CDC

Primeiro, para usar o módulo de classe CDC do dispositivo USB da Silicon Labs, você precisará ajustar a configuração de tempo de compilação do CDC #define-s de acordo com as necessidades da sua aplicação. Elas são reagrupadas dentro do cabeçalho sl_usbd_core_config.h. file na seção CDC. Sua finalidade é informar ao módulo do dispositivo USB quantos objetos USB CDC alocar.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

22/174

Sobreview

A tabela abaixo descreve cada campo de configuração disponível nesta estrutura de configuração.
Tabela – Definição da configuração do CDC do dispositivo USB

Nome da Configuração
SL_USBD_CDC_CL AS S_INSTANCE_QUANTIDADE
SL_USBD_CDC_CONFIGURAÇÃO_QUANTI
TY
SL_USBD_CDC_DATA _INTERFACE_QUANTI
TY

Descrição
Número de instâncias de classe que você alocará por meio de uma chamada à função
sl_usbd_cdc_acm_create_instance() .
Número de configurações. Instâncias de classe ACM podem ser adicionadas a uma ou mais configurações aaaa via ll para sl_usbd_cdc_acm_add_to_configuration() .
Número total de interfaces de dados (DCI) para todas as funções CDC. Cada função CDC ACM adicionada vi c ll à função sl_usbd_cdc_acm_create_instance() adicionará a interface dt.

Valor Padrão
2
1
2

Subclasse ACM
A subclasse ACM tem uma configuração de tempo de compilação mostrada na tabela abaixo.
Tabela – Configuração do CDC ACM do dispositivo USB Definir

Nome da Configuração
SL_USBD_CDC_ACM_SUBCL ASS_I NSTANCE_QUANTITY

Descrição
Configura o número de instâncias de subclasse que você alocará por meio de uma chamada para
função sl_usbd_cdc_acm_create_instance() .

Valor Padrão
2

Configurações de instância de classe ACM do CDC do dispositivo USB

Esta seção define as configurações relacionadas às instâncias da classe serial CDC ACM. Criação de Instância de Classe, linha, estado, intervalo, gerenciamento de chamadas, recursos, p_acm_callbacks
Criação de instância de classe

Para criar uma instância de classe serial CDC ACM, chame a função T a sl_usbd_cdc_acm_create_instance() . Esta função usa três argumentos de configuração, conforme descrito aqui.

intervalo_de_estado_de_linha
Este é o intervalo (em milissegundos) em que sua instância de classe serial CDC ACM relatará as notificações de estado de linha ao host T aa. Este valor deve ser uma potência de dois (1, 2, 4, 8, 16, etc.).

capacidades_de_gerenciamento_de_chamadas
Bitmap de Recursos de Gerenciamento de Chamadas. Os valores possíveis do bitmap são os seguintes:

Valor (bit)
SL_USBD_ACM_SERIAL_CALL_MGMT_DEV
SL_USBD_ACM_SERIAL_CALL_MGMT_DATA_CCI_DCI

Descrição
O dispositivo gerencia as chamadas por si só. Ele pode enviar/receber informações de gerenciamento de chamadas por meio de uma interface de Classe de Dados.

retornos de chamada p_acm

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

23/174

Sobreview

aa M aa p_acm_callbacks é um ponteiro para uma estrutura do tipo sl_usbd_cdc_acm_callbacks_t. Sua finalidade é fornecer à classe CDC AC um conjunto de funções de retorno de chamada a serem chamadas quando ocorrer um evento CDC ACM. Nem todos os retornos de chamada são obrigatórios e um ponteiro nulo ( NULL ) pode ser passado na variável de estrutura de retornos de chamada quando o retorno de chamada não for necessário. A tabela abaixo descreve cada campo de configuração disponível nesta estrutura de configuração.
Tabela – Estrutura de configuração sl_usbd_cdc_acm _callbacks_t

Campos

Descrição

.habilitar

Chamado quando a instância da classe USB está habilitada

com sucesso.

.desabilitar

Chamado quando a instância da classe USB está desabilitada.

.line_control_changed Chamado quando uma alteração de controle de linha é recebida.

line_coding_changed Chamado quando uma alteração de codificação de linha é recebida.

Assinatura de Função
vazio app_usbd_cdc_acm_enable(uint8_t subclasse_nbr);
vazio app_usbd_cdc_acm_disable(uint8_t subclasse_nbr);
void app_usbd_cdc_acm_line_control_changed(uint8_t subclasse_nbr, uint8_t evento, uint8_t evento_alterado); bool app_usbd_cdc_acm_line_coding_changed(uint8_t subclasse_nbr, subclasse_nbr, sl_usbd_cdc_acm_line_coding_t
*codificação_de_linha_p

Veja a seção Registrando Callbacks de Notificação de Eventos para funções de callback, por exemploampeu.
Guia de programação de classe CDC ACM do dispositivo USB

Esta seção explica como usar a classe CDC Abstract Control Model. Inicializando a Classe CDC ACM do Dispositivo USB. Adicionando uma Instância da Classe CDC ACM do Dispositivo USB ao seu Dispositivo. Comunicando-se com a Classe CDC ACM.
Inicializando a classe CDC ACM do dispositivo USB

Para adicionar a funcionalidade da classe CDC ACM ao seu dispositivo, você deve primeiro inicializar a classe base CDC e a subclasse ACM executando as funções sl_usbd_cdc_init() e sl_usbd_cdc_acm_init() . O exemplo abaixo mostra como executar sl_usbd_cdc_init() e sl_usbd_cdc_acm_init() usando argumentos padrão.

Example – Inicialização da Classe CDC ACM

sl_status_t estado;
status = sl_usbd_cdc_init(); if (status ! SL_STATUS_OK) { /* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */
}
status = sl_usbd_cdc_acm_init(); if (status ! SL_STATUS_OK) { /* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */
}
Adicionando uma instância de classe CDC ACM de dispositivo USB ao seu dispositivo
Para adicionar a funcionalidade da classe CDC ACM ao seu dispositivo, você deve criar uma instância e adicioná-la às configurações do seu dispositivo.
Criando uma instância de classe CDC ACM

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

24/174

Sobreview
Adicionando a instância da classe CDC ACM às configurações do seu dispositivo Registrando retornos de chamada de notificação de eventos
Criando uma instância de classe CDC ACM
aa M aaa Crie uma instância de classe CDC AC chamando a função sl_usbd_cdc_acm_create_instance() . T aaa M aaa O exemplo abaixo mostra como criar uma instância de classe CDC AC via sl_usbd_cdc_acm_create_instance() .
Example – Criando uma função CDC ACM via sl_usbd_cdc_acm_create_instance()

uint8_t subclasse_nbr; sl_status_t status;
status = 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) { /* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */
}
Adicionando a instância da classe CDC ACM às configurações do seu dispositivo
Depois de criar uma instância de classe CDC ACM, você pode adicioná-la a uma configuração chamando a função
sl_usbd_cdc_acm_add_to_configuration() .
O exemplo abaixo mostra como chamar sl_usbd_cdc_acm_add_to_configuration() .
Example – Chamada para USBD ACM sl_usbd_cdc_acm_add_to_configuration()

sl_status_t estado;

status = sl_usbd_cdc_acm_add_to_configuration(subclasse_nbr,

(1)

config_nbr_fs);

(2)

se (status ! SL_STATUS_OK) {

/* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */

}

aaa (1) Número da classe a ser adicionado à configuração retornada por sl_usbd_cdc_acm_create_instance() . (2) Número da configuração (aqui adicionando-o a uma configuração Full-Speed).
Registrando retornos de chamada de notificação de eventos
A classe CDC ACM Serial pode notificar sua aplicação sobre quaisquer alterações no controle de linha ou na codificação por meio de funções de retorno de chamada de notificação. Uma estrutura de funções de retorno de chamada pode ser passada como argumento durante a criação da instância do ACM. Observe que esses retornos de chamada são opcionais. Ex.ample – O Registro de Callbacks do CDC ACM ilustra o uso das funções de registro de callback. Ex.ample – Implementação de retornos de chamada do CDC ACM mostra um example de implementação das funções de retorno de chamada.
Example – Registro de retornos de chamada do CDC ACM

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

25/174

Sobreview

uint8_t subclasse_nbr; sl_status_t status;
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_alterado, app_usbd_cdc_acm_line_coding_alterado, };
status = 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) { /* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */ }
Example – Implementação de retornos de chamada do CDC ACM

bool app_usbd_cdc_acm_line_coding_changed (uint8_t

subclasse_nbr,

sl_usbd_cdc_acm_codificação_de_linha_t *p_codificação_de_linha)

{

uint32_t nova taxa de transmissão;

uint8_t paridade_nova;

uint8_t bits_de_parada_novos;

uint8_t bits_de_dados_novos;

/* TODO Aplicar nova codificação de linha.*/ 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;

retornar (verdadeiro);

(1)

}

void app_usbd_cdc_acm_line_control_changed (uint8_t subclass_nbr, uint8_t evento, uint8_t evento_alterado)
{ bool rts_state; bool rts_state_alterado; bool dtr_state; bool dtr_state_alterado; bool brk_state; bool brk_state_alterado;

/* TODO Aplicar novo controle de linha. */ rts_state = ((event & SL_USBD_CDC_ACM_CTRL_RTS) ! 0) ? true : false; rts_state_changed = ((event_changed & SL_USBD_CDC_ACM_CTRL_RTS) ! 0) ? true : false; dtr_state = ((event & SL_USBD_CDC_ACM_CTRL_DTR) ! 0) ? true : false; dtr_state_changed = ((event_changed & SL_USBD_CDC_ACM_CTRL_DTR) ! 0) ? true : false; brk_state = ((event & SL_USBD_CDC_ACM_CTRL_BREAK) ! 0) ? true : false; brk_state_changed = ((event_changed & SL_USBD_CDC_ACM_CTRL_BREAK) ! 0) ? verdadeiro : falso;
}

(1) É importante retornar falso para esta função se a aplicação da codificação de linha falhar. Caso contrário, retorne verdadeiro.
Comunicação usando a classe CDC ACM
Status serial
Controle de linha de codificação de linha

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

26/174

Sobreview

Comunicação de instância de subclasse de estado de linha
Status serial
Codificação de linha
O host USB controla a codificação de linha (taxa de transmissão, paridade, etc.) do dispositivo CDC ACM. Quando necessário, o aplicativo é responsável por definir a codificação de linha. Há duas funções disponíveis para recuperar e definir a codificação de linha atual, conforme descrito na tabela abaixo.
Tabela – Funções de codificação de linha CDC ACM

Função
sl_usbd_cdc_acm_g e t_line _codificação ()
sl_usbd_cdc_acm_s e t_line _codificação ()

Descrição
Seu aplicativo pode obter as configurações atuais de codificação de linha definidas no host com solicitações SetLineCoding ou com a função sl_usbd_cdc_acm_set_line_coding() .
Seu aplicativo pode definir a codificação de linha. O host pode recuperar as configurações com a solicitação GetLineCoding.

Controle de linha
O host USB controla o controle de linha (pinos RTS e DTR, sinal de interrupção, etc.) do dispositivo CDC ACM. Quando necessário, seu aplicativo é responsável por aplicar os controles de linha. Uma função é fornecida para recuperar e definir os controles de linha atuais, conforme descrito na tabela abaixo.
Tabela – Funções de controle de linha CDC ACM

Função
sl_usb d _cd c_acm_get_line _control_state ()

Seu aplicativo pode obter o estado atual da linha de controle definido pelo host com a solicitação SetControlLineState.

Estado da linha
O host USB recupera o estado da linha em intervalos regulares. Seu aplicativo deve atualizar o estado da linha sempre que ele for alterado. Quando necessário, seu aplicativo é responsável por definir o estado da linha. Duas funções são fornecidas para recuperar e definir os controles de linha atuais, conforme descrito na tabela abaixo.
Tabela – Funções de estado da linha CDC ACM

Função
sl_usb d _cd c_acm_se t _linha _estado _e ve nt()
sl_usbd_cdc_acm_cle ar_line _estado _e ve nt()

Seu aplicativo pode definir qualquer evento de estado de linha. Ao definir o estado da linha, uma interrupção IN é enviada ao host para informar sobre uma alteração no estado da linha serial.
O aplicativo pode limpar dois eventos do estado da linha: detecção da portadora de transmissão e da portadora do receptor. Todos os outros eventos são limpos automaticamente pela subclasse de emulação serial ACM.

Comunicação de instância de subclasse

A subclasse ACM da Silicon Labs oferece as seguintes funções para comunicação com o host. Para mais detalhes sobre os parâmetros functions9, consulte a referência de Funções da Subclasse ACM do CDC.

Nome da função
sl_usb d _cd c_acm_ leia () sl_usb d _cd c_acm_write ()

Operação
Recebe dados do host por meio de um endpoint de saída em massa. Esta função é bloqueante. Envia dados ao host por meio de um endpoint de entrada em massa. Esta função é bloqueante.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

27/174

Sobreview

Tabela – Resumo da API de Comunicação CDC ACM: sl_usbd_cdc_acm_read() e sl_usbd_cdc_acm_write() fornecem comunicação síncrona, o que significa que a transferência está bloqueada. Em outras palavras, ao chamar a função, o aplicativo bloqueia até que a transferência seja concluída, com ou sem erro. Um tempo limite pode ser especificado para evitar esperas eternas. O exemploampo abaixo mostra um exemplo de leitura e escritaample que recebe dados do host usando o ponto de extremidade OUT em massa e envia dados para o host usando o ponto de extremidade IN em massa.
Listagem – Leitura e Escrita Serial Example

__ALINHADO(4) uint8_t rx_buf[2];

__ALINHADO(4) uint8_t tx_buf[2];

uint32_t

xfer_len;

sl_status_t

status;

status = sl_usbd_cdc_acm_read(subclasse_nbr,

(1)

rx_buf,

(2)

2u,

0u,

(3)

&xfer_len);

se (status ! SL_STATUS_OK) {

/* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */

}

status = sl_usbd_cdc_acm_write(subclasse_nbr,

(1)

tx_buf,

(4)

2u,

0u,

(3)

&xfer_len);

se (status ! SL_STATUS_OK) {

/* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */

}

T aaaaa M (1) O número da instância de classe criado com sl_usbd_cdc_acm_create_instance() fornece uma referência interna à subclasse AC para rotear a transferência para o ponto final OUT ou IN em massa apropriado. (2) Seu aplicativo deve garantir que o buffer fornecido à função seja grande o suficiente para acomodar todos os dados. Caso contrário, podem ocorrer problemas de sincronização. (3) Para evitar uma situação de bloqueio infinito, especifique um tempo limite expresso em milissegundos. Um valor de 809 faz a tarefa do aplicativo esperar para sempre. (4) O aplicativo fornece o buffer de transmissão inicializado.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

28/174

Sobreview
Sobreview

Classe HID do dispositivo USB

Classe HID do dispositivo USB acimaview Necessidades de recursos da classe HID do dispositivo USB da configuração principal da classe HID do dispositivo USB Guia de programação da classe HID do dispositivo USB Relatórios periódicos de entrada HID Tarefa
Esta seção descreve a classe de Dispositivo de Interface Humana (HID) suportada pelo Dispositivo USB da Silicon Labs.
A classe HID abrange dispositivos usados ​​por humanos para controlar operações de computador, como teclados, mouses, dispositivos apontadores e dispositivos de jogos.
A classe HID também pode ser usada em um dispositivo composto que contenha controles como botões, interruptores, botões e controles deslizantes. Por exemploampOs controles de volume, mudo e áudio em um fone de ouvido são controlados pela função HID do fone de ouvido. A classe HID permite a troca de dados para qualquer finalidade, utilizando apenas transferências de controle e interrupção.
A classe HID é uma das classes USB mais antigas e amplamente utilizadas. Todos os principais sistemas operacionais host fornecem um driver nativo para gerenciar dispositivos HID, razão pela qual diversos dispositivos específicos de cada fabricante funcionam com a classe HID. Esta classe também inclui vários tipos de itens de saída, como LEDs, áudio, feedback tátil, etc.
A implementação do HID está em conformidade com as seguintes especificações:
Definição de Classe de Dispositivo para Dispositivos de Interface Humana (HID), 27/6/01, Versão 1.11. Tabelas de Uso de HID de Barramento Serial Universal, 28/10/2004, Versão 1.12.
Classe HID do dispositivo USB acimaview
Sobreview
Um dispositivo HID é composto pelos seguintes pontos finais:
Um par de pontos de extremidade de entrada e saída de controle chamado de ponto de extremidade padrão. Um ponto de extremidade de entrada de interrupção. Um ponto de extremidade de saída de interrupção opcional.
A tabela abaixo descreve o uso dos diferentes pontos de extremidade:
Tabela – Uso de endpoints de classe HID

Uso da direção do ponto final

Controle IN
Controlar
FORA
Interromper IN
Interromper
FORA

Dispositivo para host
Host para dispositivo
Dispositivo para host
Host para dispositivo

Solicitações padrão para enumeração, solicitações específicas de classe e comunicação de dados (entrada, relatórios de recursos enviados ao host com a solicitação GET_REPORT). Solicitações padrão para enumeração, solicitações específicas de classe e comunicação de dados (saída, relatórios de recursos recebidos do host com a solicitação SET_REPORT). Comunicação de dados (entrada e relatórios de recursos).
Comunicação de dados (relatórios de saída e recursos).

Relatório

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

29/174

Sobreview

Um host e um dispositivo HID trocam dados usando relatórios. Um relatório contém dados formatados que fornecem informações sobre controles e outras entidades físicas do dispositivo HID. Um controle é manipulável pelo usuário e opera um aspecto do dispositivo. Por exemploampUm controle pode ser um botão de um mouse ou teclado, um interruptor, etc. Outras entidades informam o usuário sobre o estado de determinados recursos do dispositivo. Por exemploampou seja, LEDs em um teclado notificam o usuário sobre o Caps Lock ativado, o teclado numérico ativo, etc.
O formato e o uso dos dados de um relatório são compreendidos pelo host por meio da análise do conteúdo de um descritor de relatório. A análise do conteúdo é feita por um analisador. O descritor de relatório descreve os dados fornecidos por cada controle em um dispositivo. Ele é composto por itens que são informações sobre o dispositivo e consistem em um prefixo de 1 byte e um comprimento variável.
dados. Para mais detalhes sobre o formato do item, consulte
1.11=, seção 5.6 e 6.2.2.
Existem três tipos principais de itens:
O item principal define ou agrupa certos tipos de campos de dados.
O item global descreve as características de dados de um controle.
O item local descreve as características de dados de um controle.
Cada tipo de item é definido por funções diferentes. Uma função de item também pode ser chamada de tagUma função de item pode ser vista como um subitem que pertence a um dos três principais tipos de item. A tabela abaixo fornece uma breve visão geral.view das funções do item9 em cada tipo de item. Para uma descrição completa dos itens em cada categoria, consulte
Tabela – Descrição da função do item para cada tipo de item

Item Tipo de Item Função

Descrição

Entrada principal

Descreve informações sobre os dados fornecidos por um ou mais controles físicos.

Saída principal Descreve os dados enviados ao dispositivo.

Característica principal

Descreve informações de configuração do dispositivo enviadas ou recebidas do dispositivo que influenciam o comportamento geral do dispositivo ou de um de seus componentes.

Itens relacionados ao Grupo de Coleção Principal (Entrada, Saída ou Recurso).

Principal Fim de Fecha uma coleção. Coleção

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

30/174

Sobreview

Item Tipo de Item Função

Descrição

Página de uso global

Identifica uma função disponível no dispositivo.

Lógico Global Define o limite inferior dos valores reportados em unidades lógicas. Mínimo

Lógico Global Define o limite superior dos valores reportados em unidades lógicas. Máximo

Físico Global Define o limite inferior dos valores relatados em unidades físicas, ou seja, o Mínimo Lógico Mínimo expresso em unidades físicas.

Físico Global Define o limite superior dos valores relatados em unidades físicas, ou seja, o Máximo Lógico Máximo expresso em unidades físicas.

Unidade Global

Indica o expoente unitário na base 10. O expoente varia de -8 a +7.

Expoente

Unidade Global

Indica a unidade dos valores relatados. Por exemplo, unidades de comprimento, massa, temperatura, etc.

Tamanho do relatório global

Indica o tamanho dos campos do relatório em bits.

ID do relatório global Indica o prefixo adicionado a um relatório específico.

Contagem de Relatórios Globais

Indica o número de campos de dados para um item.

Empurrão global

Coloca uma cópia da tabela de estado do item global na pilha da CPU.

Pop global

Substitui a tabela de estado do item pela última estrutura da pilha.

Uso local

Representa um índice para designar um Uso específico dentro de uma Página de Uso. Indica o uso sugerido pelo fornecedor para um controle ou grupo de controles específico. Um uso fornece informações ao desenvolvedor do aplicativo sobre o que um controle está realmente medindo.

Uso local

Define o uso inicial associado a uma matriz ou bitmap.

Mínimo

Uso local

Define o uso final associado a uma matriz ou bitmap.

Máximo

Designador Local: Determina a parte do corpo usada para um controle. O índice aponta para um designador no Físico.

Índice

descritor.

Designador Local: Define o índice do designador inicial associado a uma matriz ou bitmap. Mínimo

Designador Local Define o índice do designador final associado a uma matriz ou bitmap. Máximo

Índice de string local

Índice de string para um descritor de string. Permite associar uma string a um item ou controle específico.

Sequência local

Especifica o primeiro índice de string ao atribuir um grupo de strings sequenciais a controles em uma matriz

Mínimo ou bitmap.

Local Local

Máximo de cordas
Delimitador

Especifica o último índice de string ao atribuir um grupo de strings sequenciais a controles em uma matriz ou bitmap.
Define o início ou o fim de um conjunto de itens locais.

Os dados de um controle devem definir pelo menos os seguintes itens:
Entrada, Saída ou Recurso Itens principais Uso Item local Uso Página Item global Mínimo lógico Item global Máximo lógico Item global Tamanho do relatório Item global

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

31/174

Sobreview
Contagem de Relatórios Item global A tabela abaixo mostra a representação do conteúdo de um descritor de Relatório de Mouse da perspectiva de um analisador HID do host. O mouse possui três botões (esquerdo, direito e roda). O código apresentado no exemploampAbaixo está uma implementação de código correspondente a esta representação do descritor de relatório do mouse.
Figura – Conteúdo do descritor de relatório de um analisador HID do host View

(1) A função do item Página de Uso especifica a função geral do dispositivo. Neste exemploample, o dispositivo HID pertence a um
controle genérico de desktop.
(2) A Coleção de Aplicativos agrupa itens principais que têm um propósito comum e podem ser familiares aos aplicativos. No diagrama, o grupo é composto por três itens principais de entrada. Para esta coleção, o uso sugerido para os controles é um mouse, conforme indicado pelo item Uso. (3) Coleções aninhadas podem ser usadas para fornecer mais detalhes sobre o uso de um único controle ou grupo de controles para aplicativos. Neste exemploampA Coleção Física, aninhada na Aplicação de Coleção, é composta pelos mesmos três itens de entrada que formam a Aplicação de Coleção. A Coleção Física é usada para um conjunto de itens de dados que representam pontos de dados coletados em um ponto geométrico. No exemploample, o uso sugerido é um ponteiro, conforme indicado pelo item Uso. Aqui, o uso do ponteiro se refere às coordenadas da posição do mouse e o software do sistema traduzirá as coordenadas do mouse no movimento do cursor da tela. (4) Páginas de uso aninhadas também são possíveis e fornecem mais detalhes sobre um determinado aspecto dentro da função geral do dispositivo. Neste caso, dois itens de Entrada são agrupados e correspondem aos botões do mouse. Um item de Entrada define os três botões do mouse (direito, esquerdo e roda) em termos de número de campos de dados para o item (item Contagem de Relatório), tamanho de um campo de dados (item Tamanho do Relatório) e valores possíveis para cada campo de dados (itens Mínimo e Máximo de Uso, Mínimo Lógico e Máximo). O outro item de Entrada é uma constante de 13 bits que permite que os dados do relatório de Entrada sejam alinhados em um limite de byte. Este item de Entrada é usado apenas para fins de preenchimento. (5) Outra página de uso aninhada, referente a um controle genérico da área de trabalho, é definida para as coordenadas de posição do mouse. Para esta página de uso, o item de entrada descreve os campos de dados correspondentes aos eixos x e y, conforme especificado pelos dois Usos
Unid.
Após analisar o conteúdo anterior do descritor de relatório do mouse, o analisador HID do host é capaz de interpretar os dados do relatório de entrada enviados pelo dispositivo com uma interrupção na transferência ou em resposta a uma solicitação GET_REPORT. Os dados do relatório de entrada correspondentes ao descritor de relatório do mouse são mostrados na Figura – Conteúdo do Descritor de Relatório de um Analisador HID do Host. View is

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

32/174

Sobreview

mostrado na tabela abaixo. O tamanho total dos dados do relatório é de 4 bytes. Diferentes tipos de relatórios podem ser enviados pelo mesmo ponto de extremidade. Para distinguir os diferentes tipos de relatórios, um prefixo de ID de relatório de 1 byte é adicionado ao relatório de dados. Se um ID de relatório foi usado no exemploample do relatório do mouse, o tamanho total dos dados do relatório seria de 5 bytes.
Tabela – Relatório de entrada enviado ao host e correspondente ao estado de um mouse de 3 botões

Deslocamento de bits
0 1 2 3 16 24

Contagem de bits 1 1 1 13 8 8

Descrição Botão 1 (botão esquerdo). Botão 2 (botão direito). Botão 3 (botão de roda). Não utilizado. Posição no eixo X. Posição no eixo Y.

Um descritor físico indica a(s) parte(s) do corpo destinada(s) a ativar um ou mais controles. Um aplicativo pode usar essas informações para atribuir uma funcionalidade ao controle de um dispositivo. Um descritor físico é um descritor opcional específico de classe e a maioria dos dispositivos tem pouco ganho ao utilizá-lo. Consulte
Requisitos de recursos da classe HID do dispositivo USB do núcleo

Cada vez que você adiciona uma instância de classe HID a uma configuração USB por meio de uma chamada para a função sl_usbd_hid_add_to_configuration() , os seguintes recursos serão alocados do núcleo.

Recurso
Interfaces Interfaces alternativas Pontos de extremidade Grupos de interface

Quantidade
1 1 1 (2 se o ponto final de interrupção OUT estiver habilitado) 0

Observe que esses números são por configuração. Ao definir os valores de configuração SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY e SL_USBD_DESCRIPTOR_QUANTITY, não se esqueça de levar em consideração quantas configurações a classe será adicionada. Para o valor de configuração SL_USBD_OPEN_ENDPOINTS_QUANTITY, como os endpoints são abertos somente quando uma configuração é definida pelo host, você só precisa levar em consideração o número de endpoints necessários para uma instância de classe.
Configuração de classe HID do dispositivo USB

Dois grupos de parâmetros de configuração são usados ​​para configurar a classe HID:
Configurações específicas de aplicação da classe HID do dispositivo USB Configurações de instância da classe HID do dispositivo USB
Configurações específicas de aplicação da classe HID do dispositivo USB

Primeiro, para usar o módulo de classe HID do dispositivo USB da Silicon Labs, ajuste as definições de configuração do HID em tempo de compilação de acordo com as necessidades da sua aplicação. Elas são reagrupadas dentro do cabeçalho sl_usbd_core_config.h. file na seção HID. Elas podem ser divididas em duas seções: as configurações de quantidade e as configurações de tarefa HID. A finalidade das configurações de quantidade é informar ao módulo de dispositivo USB quantos objetos HID USB alocar.
A tabela abaixo descreve cada configuração definida.
Tabela – Definição da configuração HID do dispositivo USB

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

33/174

Sobreview

Nome da Configuração
SL_USBD_HID_CL ASS_I NSTANCE_QUANTITY
SL_USBD_HID_CONFIGURAÇÃO_QUANTIDADE
SL_USBD_HID_REPORT_ ID_QUANTIDADE
SL_USBD_HID_PUSH_P OP_ITEM_QUANTIDADE
SL_USBD_HID_TIMER_T ASK_TAMANHÃ_PILHA
SL_USBD_HID_TIMER_T PERGUNTAR_PRIORIDADE

Descrição
Número de instâncias de classe que você alocará por meio de uma chamada à função
sl_usbd_hid_create_instance() .
Número de configurações. Instâncias de classe HID podem ser adicionadas a uma ou mais configurações aaaa, via ll para a função sl_usbd_hid_add_to_configuration(). Configura o número total de IDs de relatório a serem alocados.
Configura o número total de itens Push/Pop a serem alocados.
A tarefa de timer lida com todas as operações HID baseadas em timer. Esta configuração permite definir o tamanho da pilha (em número de bytes). Prioridade da tarefa HID. Esta é uma prioridade CMSIS-RTOS2.

Valor Padrão
2 1 2 0 2048
osPriorityHigh

Configurações de instância de classe HID de dispositivo USB Subclasse de criação de instância de classe
protocolo código_do_país
interval_in e interval_out p_hid_callback Descritor de relatório de classe HID ExampEsta seção define as configurações relacionadas às instâncias da classe HID.
Criação de instância de classe
A criação de uma instância de classe HID é feita chamando a função aaa sl_usbd_hid_create_instance() , que usa vários argumentos de configuração descritos abaixo.
subclass
Código da subclasse HID. Os valores possíveis são:
SL_USBD_HID_SUBCL ASS_NENHUM SL_USBD_HID_SUBCL ASS_BOOT
Um dispositivo HID que utiliza a subclasse de inicialização deve utilizar formatos de relatório padrão. Para obter mais informações sobre os códigos de subclasse, consulte a seção 4.2 da revisão 1.11 da especificação HID.
protocolo
Protocolo utilizado pelo dispositivo HID. Os valores possíveis são:
SL_USBD_HID_PROTOCOL_NENHUM SL_USBD_HID_PROTOCOL_KBD SL_USBD_HID_PROTOCOL_MOUSE
Se a função HID for um mouse, o protocolo deve ser definido como SL_USBD_HID_PROTOCOL_MOUSE. Se for um teclado, o protocolo deve ser definido como SL_USBD_HID_PROTOCOL_KBD. Caso contrário, o protocolo deve ser definido como SL_USBD_HID_PROTOCOL_NONE. Para obter mais informações sobre os códigos de subclasse, consulte a seção 4.3 da revisão 1.11 da especificação HID.
código_do_país
ID do código do país. Os valores possíveis são:
SL_USBD_HID_CÓDIGO_DO_PAÍS_NÃO_SUPORTADO

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

34/174

Sobreview
SL_USBD_HID_CÓDIGO_DO_PAÍS_ÁRABE SL_USBD_HID_CÓDIGO_DO_PAÍS_BELGA SL_USBD_HID_CÓDIGO_DO_PAÍS_CANADENSES_BILÍNGUE SL_USBD_HID_CÓDIGO_DO_PAÍS_CANADENSES_FRANCÊS SL_USBD_HID_CÓDIGO_DO_PAÍS_REPÚBLICA SL_USBD_HID_CÓDIGO_DO_PAÍS_DINAMARQUÊS SL_USBD_HID_CÓDIGO_DO_PAÍS_FINLANDÊS SL_USBD_HID_CÓDIGO_DO_PAÍS_FRANCÊS SL_USBD_HID_CÓDIGO_DO_PAÍS_ALEMÃO SL_USBD_HID_CÓDIGO_DO_PAÍS_GREGO SL_USBD_HID_CÓDIGO_DO_PAÍS_HEBRAICO SL_USBD_HID_CÓDIGO_DO_PAÍS_HUNGRIA SL_USBD_HID_CÓDIGO_DO_PAÍS_INTERNACIONAL SL_USBD_HID_CÓDIGO_DO_PAÍS_ITALIANO SL_USBD_HID_CÓDIGO_DO_PAÍS_JAPÃO_CATAKANA SL_USBD_HID_CÓDIGO_DO_PAÍS_COREANO SL_USBD_HID_CÓDIGO_DO_PAÍS_LATINO_AMERICANO SL_USBD_HID_CÓDIGO_DO_PAÍS_HOLANDÊS SL_USBD_HID_CÓDIGO_DO_PAÍS_NORUEGUÊS SL_USBD_HID_CÓDIGO_DO_PAÍS_PERSA_FARSI SL_USBD_HID_CÓDIGO_DO_PAÍS_POL E SL_USBD_HID_CÓDIGO_DO_PAÍS_PORTUGUÊS SL_USBD_HID_CÓDIGO_DO_PAÍS_RÚSSIA SL_USBD_HID_CÓDIGO_DO_PAÍS_ESLOVÁQUIA SL_USBD_HID_CÓDIGO_DE_PAÍS_ESPANHOL SL_USBD_HID_CÓDIGO_DE_PAÍS_SUECO SL_USBD_HID_CÓDIGO_DE_PAÍS_SUIÇO_FRANCÊS SL_USBD_HID_CÓDIGO_DE_PAÍS_SUIÇO_ALEMÃO SL_USBD_HID_CÓDIGO_DE_PAÍS_SUIÇO E SL_USBD_HID_CÓDIGO_DE_PAÍS_TAIWAN SL_USBD_HID_CÓDIGO_DE_PAÍS_TURCUS_Q SL_USBD_HID_CÓDIGO_DE_PAÍS_REINO UNIDO SL_USBD_HID_CÓDIGO_DE_PAÍS_EUA SL_USBD_HID_CÓDIGO_DE_PAÍS_YUG OSL AVIA SL_USBD_HID_CÓDIGO_DE_PAÍS_TURCUS_F
O código do país identifica para qual país o hardware está localizado. A maioria dos hardwares não está localizada e, portanto, este valor seria SL_USBD_HID_COUNTRY_CODE_NOT_SUPPORTED (0). No entanto, os teclados podem usar o campo para indicar o idioma das teclas.
Para obter mais informações sobre os códigos de país, consulte a seção 6.2.1 da revisão 1.11 da especificação HID.
intervalo_de_entrada e intervalo_de_saída
interval_in e interval_out representam o intervalo de pesquisa do ponto final de interrupção IN e do ponto final de interrupção OUT.
Representa o intervalo de polling do endpoint, em milissegundos. A definição desse valor depende da frequência com que seu dispositivo é suscetível a gerar um novo relatório para o host. Por exemplo, se um relatório for gerado a cada 16 milissegundos, o intervalo deve ser de 16 milissegundos ou menos.
O valor deve ser uma potência de 2 (1, 2, 4, 8, 16, etc.).
um interval_out v lue é ignorado se ctrl_rd_en for definido como true.
p_hid_callback
aaaa p_hid_callback é um ponteiro para uma estrutura do tipo sl_usbd_hid_callbacks_t. Sua finalidade é fornecer à Classe HID um conjunto de funções de retorno de chamada a serem chamadas quando um evento HID ocorrer.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

35/174

Sobreview

Nem todos os retornos de chamada são obrigatórios e um ponteiro nulo ( NULL ) pode ser passado na variável de estrutura "callbacks" quando o retorno de chamada não for necessário. A tabela abaixo descreve cada campo de configuração disponível nesta estrutura de configuração.
Tabela – Estrutura de configuração sl_usbd_hid_callbacks_t

Campos

Descrição

Assinatura de Função

.habilitar .desabilitar .get_report_desc
.get_phy_desc
.set_output_report .get_feature_report .set_feature_report

Chamado quando a instância da classe USB é habilitada com sucesso. Chamado quando a instância da classe USB é desabilitada.
Chamado durante a criação da instância HID para passar seu descritor de relatório. Para cada uma de suas funções HID, você deve fornecer um descritor de relatório. O descritor de relatório indica ao host como o relatório periódico que será enviado pelo dispositivo deve ser analisado. Escrever seu próprio descritor de relatório pode ser desafiador, e é por isso que existem alguns recursos para ajudar. Esta é a única função de retorno de chamada obrigatória. Chamado durante a criação da instância HID para passar seu descritor físico. O descritor físico é um descritor que fornece informações sobre a parte ou partes específicas do corpo humano que estão ativando um controle ou controles. Para obter mais informações sobre descritores físicos, consulte a seção 6.2.3 da revisão 1.11 da especificação HID. O descritor físico é opcional e, na maioria das vezes, ignorado. O buffer passado aqui pode ser definido como NULL e o comprimento definido como 0. Chamado quando o host define um relatório conforme descrito em seu descritor de relatório (quando envia um relatório).
Chamado quando o host solicita um relatório de recurso, conforme descrito no seu descritor de relatório.
Chamado quando o host define um relatório de recurso conforme descrito no seu descritor de relatório.

vazio app_usbd_hid_enable(uint8_t class_nbr); vazio app_usbd_hid_disable(uint8_t class_nbr); vazio app_usbd_hid_get_report_desc(uint8_t class_nbr, const uint8_t *p_report_ptr, uint16_tp_report_len);
vazio app_usbd_hid_get_phy_desc(uint8_t class_nbr, const uint8_t *p_report_ptr, uint16_tp_report_len);
void app_usbd_hid_set_output_report(uint8_t número_da_classe, uint8_t ID_do_relatório, uint8_t *p_buf_do_relatório, uint16_t comprimento_do_relatório); void app_usbd_hid_get_feature_report(uint8_t número_da_classe, uint8_t ID_do_relatório, uint8_t *p_buf_do_relatório, uint16_t comprimento_do_relatório); void app_usbd_hid_set_feature_report(uint8_t número_da_classe, uint8_t ID_do_relatório, uint8_t *p_buf_do_relatório, uint16_t comprimento_do_relatório);

.obter_protocolo

Recupera o protocolo ativo atual.

vazio app_usbd_hid_get_protocol(uint8_t class_nbr, uint8_t *p_protocol);

.set_protocol

Define o protocolo ativo atual.

void app_usbd_hid_set_protocol(uint8_t class_nbr, protocolo uint8_t);

Descritor de relatório de classe HID Example

Classe HID da Silicon Labsampo aplicativo fornece um example de um descritor de relatório para um mouse simples. O exampO exemplo abaixo mostra um descritor de relatório do mouse.
Example – Descritor de Relatório de Mouse

estático uint8_t app_usbd_hid_report_desc[] = {

(1) (2)

SL_USBD_HID_GLOBAL_USAGE_PAGE + 1, SL_USBD_HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS,

SL_USBD_HID_USO_LOCAL + 1, SL_USBD_HID_CA_MOUSE,

(3)

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

36/174

Sobreview

SL_USBD_HID_COLEÇÃO_PRINCIPAL +1, APLICATIVO_COLEÇÃO_SL_USBD_HID,(4)

SL_USBD_HID_USO_LOCAL +1, SL_USBD_HID_CP_POINTER,(5)

SL_USBD_HID_COLEÇÃO_PRINCIPAL +1, SL_USBD_HID_COLEÇÃO_FÍSICA,(6)

SL_USBD_HID_GLOBAL_USAGE_PAGE +1, SL_USBD_HID_USAGE_PAGE_BUTTON,(7)

SL_USBD_HID_LOCAL_USAGE_MIN +1,0 01,

SL_USBD_HID_LOCAL_USAGE_MAX +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_DADOS_PRINCIPAIS |

SL_USBD_HID_VARIÁVEL_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_PRINCIPAL_CONSTANTE,(9)

SL_USBD_HID_PÁGINA_DE_USO_GLOBAL +1, SL_USBD_HID_PÁGINA_DE_USO_GENÉRICO_CONTROLES_DESKTOP,

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_DADOS_PRINCIPAIS |

SL_USBD_HID_VARIÁVEL_PRINCIPAL |

SL_USBD_HID_PRINCIPAL_RELATIVO,

SL_USBD_HID_PRINCIPAL_COLEÇÃO FINAL,(10)

SL_USBD_HID_PRINCIPAL_COLEÇÃO FINAL

(11)};

(1) A tabela que representa um descritor de relatório de mouse é inicializada de forma que cada linha corresponda a um item curto. Este último é formado por um prefixo de 1 byte e um dado de 1 byte. Consulte viewed por um analisador HID host na Figura – Conteúdo do descritor de relatório de um analisador HID host View.
(2) A página de uso genérico da área de trabalho é usada.
(3) Na página de uso genérico da área de trabalho, o uso tag sugere que o grupo de controles serve para controlar um mouse. Uma coleção de mouses normalmente consiste em dois eixos (X e Y) e um, dois ou três botões.
(4) A coleta de ratos é iniciada.
(5) Dentro da coleção de ratos, um uso tag sugere mais especificamente que os controles do mouse pertencem à coleção de ponteiros. Uma coleção de ponteiros é uma coleção de eixos que gera um valor para direcionar, indicar ou apontar as intenções do usuário para um aplicativo.
(6) A coleta de ponteiros é iniciada.
(7) A página de uso dos botões define um item de entrada composto por três campos de 1 bit. Cada campo de 1 bit representa os botões 1, 2 e 3 do mouse, respectivamente, e pode retornar um valor de 0 ou 1.
(8) O item de entrada para a página de uso dos botões é preenchido com outros 13 bits.
(9) Outra página de uso genérico da área de trabalho é indicada para descrever a posição do mouse com os eixos X e Y. O item de entrada é composto por dois campos de 8 bits cujo valor pode estar entre -127 e 127.
(10) A coleção de ponteiros está fechada.
(11) A coleção de ratos está fechada.
Página HID USB.org

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

37/174

Sobreview
O USB Implementers Forum (USB-IF) fornece uma ferramenta chamada “HID Descriptor Tool”, juntamente com outras informações sobre o formato do descritor de relatório. Consulte http://www.usb.org/developers/hidpage/ para obter mais informações.
Guia de programação de classe HID de dispositivo USB
Esta seção explica como usar a classe HID. Inicializando a Classe HID do Dispositivo USB. Adicionando uma Instância da Classe HID do Dispositivo USB ao seu Dispositivo. Comunicando-se usando a Classe HID do Dispositivo USB.
Inicializando a classe HID do dispositivo USB
Para adicionar a funcionalidade da classe HID ao seu dispositivo, você deve primeiro inicializar a classe chamando a função sl_usbd_hid_init() . O exampO exemplo abaixo mostra como chamar sl_usbd_hid_init() usando argumentos padrão. Para obter mais informações sobre os argumentos de configuração a serem passados ​​para sl_usbd_hid_init() , consulte Configurações específicas da aplicação da classe HID do dispositivo USB.
Example – Chamando sl_usbd_hid_init()
sl_status_t estado;
status = sl_usbd_hid_init(); if (status ! SL_STATUS_OK) { /* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */
}
Adicionando uma instância de classe HID de dispositivo USB ao seu dispositivo
Para adicionar a funcionalidade de classe HID ao seu dispositivo, você deve criar uma instância e adicioná-la às configurações do seu dispositivo.
Criando uma instância de classe HID
Crie uma instância de classe HID chamando a função sl_usbd_hid_create_instance() . O exemploampO exemplo abaixo mostra como criar uma função de mouse simples via sl_usbd_hid_create_instance() usando argumentos padrão. Para obter mais informações sobre os argumentos de configuração a serem passados ​​para sl_usbd_hid_create_instance() , consulte Configurações de Instância de Classe HID de Dispositivo USB.
Example – Adicionando uma função de mouse via sl_usbd_hid_create_instance()

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

38/174

Sobreview
/* Constantes globais. */ 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_GENÉRICO_CONTROLES_DE_DESKTOP, SL_USBD_HID_USO_LOCAL + 1, SL_USBD_HID_CA_MOUSE, SL_USBD_HID_COLEÇÃO_PRINCIPAL + 1, SL_USBD_HID_APLICATIVO_DE_COLETA_HID, SL_USBD_HID_USO_LOCAL + 1, SL_USBD_HID_CP_POINTER, SL_USBD_HID_COLEÇÃO_PRINCIPAL + 1, SL_USBD_HID_COLEÇÃO_FÍSICA, SL_USBD_HID_PÁGINA_DE_USO_GLOBAL + 1, SL_USBD_HID_BOTÃO_DE_PÁGINA_DE_USO_HID, SL_USBD_HID_LOCAL_USAGE_MIN + 1, 0 01, SL_USBD_HID_LOCAL_USAGE_MAX + 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_MAIN_INPUT + 1, SL_USBD_HID_MAIN_DATA | SL_USBD_HID_MAIN_VARIABLE | SL_USBD_HID_PRINCIPAL_ABSOLUTO, SL_USBD_HID_CONTAGEM_DE_RELATÓRIO_GLOBAL + 1, 0 01, SL_USBD_HID_TAMANHO_DE_RELATÓRIO_GLOBAL + 1, 0 0D, SL_USBD_HID_ENTRADA_PRINCIPAL + 1, SL_USBD_HID_CONSTANTE_PRINCIPAL, SL_USBD_HID_PÁGINA_DE_USO_GLOBAL + 1, SL_USBD_HID_PÁGINA_DE_USO_GENÉRICO_CONTROLES_DE_DESKTOP, 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_LOG_MIN_GLOBAL + 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 };
/* Variáveis ​​locais.*/ uint8_t class_nbr; sl_status_t status;
sl_usbd_hid_callbacks_t app_usbd_hid_callbacks = { NULO, NULO, app_usbd_hid_get_report_desc, NULO, NULO, NULO, NULO, NULO, NULO };
vazio app_usbd_hid_get_report_desc(uint8_t class_nbr, const uint8_t **p_report_ptr, uint16_t *p_report_len)
{ (vazio)class_nbr;
*p_report_ptr = app_usbd_hid_mouse_report_desc; *p_report_len = tamanho de(app_usbd_hid_mouse_report_desc); }
status = 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, sizeof(Ex_USBD_HID_Mouse_ReportDesc), 2u, 2u, true, &app_usbd_hid_callbacks, &class_nbr);
Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

39/174

Sobreview
/* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */}
Adicionando a instância da classe HID às configurações do seu dispositivo Depois de criar uma instância da classe HID, você pode adicioná-la a uma configuração chamando a função
sl_usbd_hid_add_to_configuration() .
O exampO exemplo abaixo mostra como chamar sl_usbd_hid_add_to_configuration() .
Example – Chamando sl_usbd_hid_add_to_configuration()

sl_status_t estado;

sl_usbd_hid_add_to_configuration(class_nbr,

(1)

config_nbr_fs); (2)

se (status ! SL_STATUS_OK) {

/* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */

}

(1) Número da classe a ser adicionado à configuração retornada por sl_usbd_hid_create_instance(). (2) Número da configuração (aqui adicionando-o a uma configuração Full-Speed).
Comunicação usando a classe HID do dispositivo USB
Comunicação de instância de classe Comunicação síncrona Comunicação de instância de classe A classe HID oferece as seguintes funções para comunicação com o host.
Tabela – Resumo da API de comunicação HID

Nome da função
sl_usb d _hid _ ler _sy nc() sl_usb d _hid _escrever _sy nc()

Operação: Recebe dados do host através do ponto final da interrupção OUT. Esta função é bloqueante. Envia dados ao host através do ponto final da interrupção IN. Esta função é bloqueante.

Comunicação Síncrona: Comunicação síncrona significa que a transferência está bloqueada. Após a chamada da função, o aplicativo bloqueia até que a transferência seja concluída com ou sem erro. Um tempo limite pode ser especificado para evitar esperas eternas. O exemploampO exemplo abaixo mostra uma leitura e gravação que recebe dados do host usando o ponto de extremidade OUT da interrupção e envia dados para o host usando o ponto de extremidade IN da interrupção.
Example – Leitura e gravação HID síncrona

__ALINHADO(4) uint8_t rx_buf[2];

__ALINHADO(4) uint8_t tx_buf[2];

uint32_t

xfer_len;

sl_status_t

status;

status = sl_usbd_hid_read_sync(class_nbr,

(1)

(vazio *)rx_buf,

(2)

2u,

0u,

(3)

&xfer_len);

se (status ! SL_STATUS_OK) {

/* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */

}

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

40/174

Sobreview
status =sl_usbd_hid_read_sync(class_nbr,(1)(void *)rx_buf,(2)2u,0u,(3)&xfer_len);if(status ! SL_STATUS_OK){/* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */}
status =sl_usbd_hid_write_sync(class_nbr,(1)(void *)tx_buf,(4)2u,0u,(3)&xfer_len);if(status ! SL_STATUS_OK){/* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */}
(1) O número de instância de classe criado a partir de sl_usbd_hid_create_instance() fornece uma referência interna para a classe HID rotear a transferência para o ponto final de interrupção OUT ou IN apropriado.
(2) O aplicativo deve garantir que o buffer fornecido à função seja grande o suficiente para acomodar todos os dados. Caso contrário, podem ocorrer problemas de sincronização. Internamente, a operação de leitura é realizada com o ponto de extremidade de controle ou com o ponto de extremidade de interrupção, dependendo do sinalizador de leitura de controle definido ao chamar sl_usbd_hid_create_instance() .
(3) Para evitar uma situação de bloqueio infinito, um tempo limite expresso em milissegundos pode ser especificado. Um valor de 809 faz com que a tarefa do aplicativo espere para sempre.
(4) O aplicativo fornece o buffer de transmissão inicializado.
Tarefa de Relatórios de Entrada Periódica HID
Para economizar largura de banda, o host tem a capacidade de silenciar relatórios de um ponto de extremidade IN de interrupção, limitando a frequência de relatórios. Para isso, o host deve enviar a solicitação SET_IDLE. A classe HID implementada pelo Silicon Labs contém uma tarefa interna que respeita a limitação de frequência de relatórios, que pode ser aplicada a um ou vários relatórios de entrada. A Figura Tarefa de Relatórios de Entrada Periódicos mostra o funcionamento das tarefas de relatórios de entrada periódicos.
Figura – Tarefa Relatórios de Entrada Periódica

(1) O dispositivo recebe uma solicitação SET_IDLE. Esta solicitação especifica uma duração de inatividade para um determinado ID de relatório. Para obter mais detalhes sobre a solicitação SET_IDLE, consulte
(2) Uma estrutura de ID de relatório (alocada durante a fase de inicialização da classe HID) é atualizada com a duração ociosa. Um contador de duração ociosa é inicializado com o valor da duração ociosa. A estrutura de ID de relatório é inserida no final de uma lista encadeada contendo estruturas de ID de relatórios de entrada. O valor da duração ociosa é expresso em unidades de 4 ms, o que resulta em um intervalo de 4 a 1020 ms.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

41/174

Sobreview
Se a duração ociosa for menor que o intervalo de pesquisa do ponto final de interrupção IN, os relatórios serão gerados no intervalo de pesquisa.
(3) A cada 4 ms, a tarefa de relatório de entrada periódica examina a lista de IDs de relatórios de entrada. Para cada ID de relatório de entrada, a tarefa executa uma de duas operações possíveis. A duração do período da tarefa corresponde à unidade de 4 ms usada para a duração ociosa. Se nenhuma solicitação SET_IDLE tiver sido enviada pelo host, a lista de IDs de relatórios de entrada estará vazia e a tarefa não terá nada para processar. A tarefa processa apenas IDs de relatório diferentes de 0 e com duração ociosa maior que 0.
(4) Para um ID de relatório de entrada fornecido, a tarefa verifica se o tempo de inatividade expirou. Caso o tempo de inatividade não tenha expirou, o contador é decrementado e nenhum relatório de entrada é enviado ao host.
(5) Se a duração ociosa tiver decorrido (ou seja, o contador de duração ociosa tiver atingido zero), um relatório de entrada é enviado ao host chamando a função sl_usbd_hid_write_sync() por meio do ponto de extremidade IN de interrupção.
(6) Os dados do relatório de entrada enviados pela tarefa vêm de um buffer de dados interno alocado para cada relatório de entrada descrito no descritor de Relatório. Uma tarefa de aplicativo pode chamar a função sl_usbd_hid_write_sync() para enviar um relatório de entrada. Após o envio dos dados do relatório de entrada, sl_usbd_hid_write_sync() atualiza o buffer interno associado a um ID de relatório de entrada com os dados recém-enviados. Em seguida, a tarefa de relatórios de entrada periódicos sempre envia os mesmos dados de relatório de entrada após cada período de inatividade decorrido e até que a tarefa de aplicativo atualize os dados no buffer interno. Existe um mecanismo de bloqueio para evitar a corrupção dos dados do ID do relatório de entrada no caso de uma modificação ocorrer no momento exato da transmissão realizada pela tarefa de relatório de entrada periódico.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

42/174

Sobreview
Sobreview
Classe MSC de dispositivo USB
Dispositivo USB Classe MSC Acimaview Requisitos de recursos da classe MSC do dispositivo USB da configuração principal da classe MSC do dispositivo USB Guia de programação da classe MSC do dispositivo USB Drivers de armazenamento da classe MSC do dispositivo USB
Esta seção descreve a classe de dispositivo de armazenamento em massa (MSC) suportada pelo Dispositivo USB da Silicon Labs. MSC é um protocolo que permite a transferência de informações entre um dispositivo USB e um host. As informações transferidas são qualquer coisa que possa ser armazenada eletronicamente, como programas executáveis, código-fonte, documentos, imagens, dados de configuração ou outros dados textuais ou numéricos. O dispositivo USB atua como um meio de armazenamento externo para o host, permitindo a transferência de files via arrastar e soltar.
A file sistema define como o files são organizados na mídia de armazenamento. A especificação da classe de armazenamento em massa USB não requer nenhuma especificação específica file sistema para ser usado em dispositivos compatíveis. Em vez disso, ele fornece uma interface simples para ler e gravar setores de dados usando o conjunto de comandos transparentes da Small Computer System Interface (SCSI). Dessa forma, os sistemas operacionais podem tratar a unidade USB como um disco rígido e formatá-la com qualquer file sistema que eles gostam.
A classe de dispositivo de armazenamento em massa USB suporta dois protocolos de transporte, como segue:
Transporte somente em massa (BOT) Controle/em massa/interrupção (CBI) Transporte (usado somente para unidades de disquete)
A classe de dispositivo de armazenamento em massa implementa o conjunto de comandos transparentes SCSI usando apenas o protocolo BOT, o que significa que apenas endpoints em massa serão usados ​​para transmitir dados e informações de status. A implementação MSC suporta múltiplas unidades lógicas.
A implementação do MSC está em conformidade com as seguintes especificações:
Especificação de classe de armazenamento em massa de barramento serial universal sobreview, Revisão 1.3 5 de setembro de 2008. Classe de armazenamento em massa de barramento serial universal, transporte somente em massa, Revisão 1.0 31 de setembro de 1999.
Dispositivo USB MSC aCl ss Overview
Solicitações de classe de pontos de extremidade de protocolo Interface de sistema de computador pequeno (SCSI)
Protocolo
Nesta seção, discutiremos o protocolo Bulk-Only Transport (BOT) da classe Mass Storage. O protocolo Bulk-Only Transport tem três stagé:
O Transporte de Comando O Transporte de Dados O Transporte de Status
Os comandos de armazenamento em massa são enviados pelo host por meio de uma estrutura chamada Command Block Wrapper (CBW). Para comandos que exigem um sistema de transporte de dadostage, o host tentará enviar ou receber o número exato de bytes do dispositivo, conforme especificado pelos campos de comprimento e sinalizador do CBW. Após o transporte de dadostage, o host tenta receber um Command Status Wrapper (CSW) do dispositivo que detalha o status do comando, bem como qualquer resíduo de dados (se

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

43/174

Sobreview
qualquer). Para comandos que não incluem um transporte de dados stage, o host tenta receber o CSW diretamente após o envio do CBW. O protocolo é detalhado na Figura – Protocolo MSC.
Figura – Protocolo MSC

Pontos finais
No lado do dispositivo, em conformidade com a especificação BOT, o MSC é composto pelos seguintes pontos finais: Um par de pontos finais de entrada e saída de controle, denominado ponto final padrão. Um par de pontos finais de entrada e saída em massa.
A tabela abaixo indica os diferentes usos dos pontos de extremidade.
Tabela – Uso do endpoint MSC

Ponto final
Controle de entrada Controle de saída Entrada em massa Saída em massa

Direção
Dispositivo para host Host para dispositivo Dispositivo para host Host para dispositivo

Uso
Enumeração e solicitações específicas de classe MSC Enumeração e solicitações específicas de classe MSC Enviar CSW e dados Receber CBW e dados

Solicitações de classe
Existem duas solicitações de controle definidas para o protocolo MSC BOT. Essas solicitações e suas descrições estão detalhadas na tabela abaixo.

Tabela – Solicitações de classe de armazenamento em massa

Solicitações de classe
Redefinição de armazenamento em massa somente em massa

Descrição
Esta solicitação é usada para redefinir o dispositivo de armazenamento em massa e sua interface associada. Esta solicitação prepara o dispositivo para receber o próximo bloco de comando.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

44/174

Sobreview

Solicitações de classe

Descrição

Obter Máximo. Esta solicitação é usada para retornar o maior número de unidade lógica (LUN) suportado pelo dispositivo. Por exemploample, um

LUN

dispositivo com LUN 0 e LUN 1 retornará um valor de 1. Um dispositivo com uma única unidade lógica retornará 0 ou paralisará o

solicitação. O valor máximo que pode ser retornado é 15.

Interface de Sistema de Computador Pequeno SCSI

No nível da interface de programação, o dispositivo MSC implementa um dos protocolos de comunicação padrão entre mídias de armazenamento, como SCSI e SFF-8020i (ATAPI). A "Interface de Programação" especifica qual protocolo é implementado e auxilia o sistema operacional host a carregar o driver de dispositivo adequado para comunicação com o dispositivo de armazenamento USB. SCSI é o protocolo mais comum usado com dispositivos de armazenamento USB MSC. Fornecemos uma implementação para a subclasse SCSI do MSC que nossos usuários do GSDK podem usar imediatamente.
SCSI é um conjunto de padrões para lidar com a comunicação entre computadores e dispositivos periféricos. Esses padrões incluem comandos, protocolos, interfaces elétricas e interfaces ópticas. Dispositivos de armazenamento que utilizam outras interfaces de hardware, como USB, utilizam comandos SCSI para obter informações do dispositivo/host, controlar a operação do dispositivo e transferir blocos de dados na mídia de armazenamento.
Os comandos SCSI abrangem uma vasta gama de tipos e funções de dispositivos e, como tal, os dispositivos precisam de um subconjunto desses comandos. Em geral, os seguintes comandos são necessários para a comunicação básica:
CONSULTA LEITURA CAPACIDADE(10) LEITURA(10) SOLICITAR DETECÇÃO UNIDADE DE TESTE PRONTA ESCRITA(10)
Requisitos de recursos da classe MSC do dispositivo USB do núcleo

Cada vez que você adiciona uma instância de classe MSC a uma configuração USB por meio da função sl_usbd_msc_add_to_configuration() , os seguintes recursos serão alocados do núcleo.

Recurso
Interfaces Interfaces alternativas Pontos de extremidade Grupos de interface

Quantidade
1 1 2 0

Observe que esses números são por configuração. Ao definir os valores de configuração SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY e SL_USBD_DESCRIPTOR_QUANTITY, não se esqueça de levar em consideração quantas configurações a classe será adicionada. Para o valor de configuração SL_USBD_OPEN_ENDPOINTS_QUANTITY, como os endpoints são abertos somente quando uma configuração é definida pelo host, você só precisa levar em consideração o número de endpoints necessários para uma instância de classe.
Configuração de classe MSC do dispositivo USB

Dois grupos de parâmetros de configuração são usados ​​para configurar a classe MSC:
Configurações específicas de aplicação da classe MSC do dispositivo USB Configuração da unidade lógica da classe MSC do dispositivo USB
Configurações específicas de aplicação da classe MSC do dispositivo USB

Configurações de tempo de compilação de classe Criação de instância de classe

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

45/174

Sobreview

Configurações de tempo de compilação de classe
A classe MSC do dispositivo USB do Silicon Labs e a subclasse SCSI são configuráveis ​​em tempo de compilação por meio de #defines localizados em sl_usbd_core_config.h file.
Tabela – Constantes de Configuração Genéricas

Nome da Configuração

Descrição

SL_USBD_MSC_CLASS_INST Número de instâncias de classe que você alocará por meio de uma chamada à função

QUANTIDADE_ANCE

sl_usbd_msc_scsi_create_instance() .

SL_USBD_MSC_CONFIGURA Número de configuração à qual uma instância de classe pode ser adicionada por meio de uma chamada para

QUANTIDADE_DE_VALORES

função sl_usbd_msc_scsi_add_to_configuration() .

SL_USBD_MSC_LUN_QUANT Número de unidades lógicas por instância de classe que você adicionará por meio de uma chamada para

IDADE

função sl_usbd_msc_scsi_lun_add() .

SL_USBD_MSC_SCSI_64_BIT Habilita ou desabilita o suporte para Endereço de Bloco Lógico (LBA) de 64 bits.
_LBA_PT

SL_USBD_MSC_DATA_BUFF Tamanho do buffer de dados por instância de classe em bytes ER_SIZE

Valor Padrão
2
1
2
0
512

Criação de instância de classe
A criação de uma instância da classe SCSI MSC de um dispositivo USB é feita chamando a função sl_usbd_msc_scsi_create_instance(). Esta função recebe um argumento de configuração descrito abaixo.
retornos de chamada p_scsi
p_scsi_callbacks é um ponteiro para uma estrutura de configuração do tipo sl_usbd_msc_scsi_callbacks_t. Além dos retornos de chamada comuns da classe de dispositivo USB, como conectar/desconectar, ele fornece à classe MSC um conjunto de funções de retorno de chamada opcionais que são chamadas quando um evento ocorre na unidade lógica. Um ponteiro nulo (NULL) pode ser passado para este argumento se nenhum retorno de chamada for necessário.
A tabela abaixo descreve cada campo de configuração disponível nesta estrutura de configuração.
Tabela – Estrutura de configuração sl_usbd_msc_scsi_callbacks_t

Campos

Descrição

.habilitar

Chamado quando a instância da classe USB é habilitada com sucesso.

.disable Chamado quando a instância da classe USB está desabilitada.

.host_eject Função chamada quando uma unidade lógica é ejetada do host.

Assinatura de Função
vazio app_usbd_msc_scsi_enable(uint8_t class_nbr);
vazio app_usbd_msc_scsi_disable(uint8_t classe_nbr); vazio app_usbd_msc_scsi_host_eject(uint8_t classe_nbr, uint8_t lu_nbr);

Configuração da unidade lógica da classe MSC do dispositivo USB

A adição de uma unidade lógica a uma instância de classe MSC é feita chamando a função sl_usbd_msc_lun_add() . Esta função recebe um argumento de configuração descrito abaixo.

p_lu_info

p_lu_info é um ponteiro para uma estrutura do tipo sl_usbd_msc_scsi_lun_info_t . Sua finalidade é fornecer informações sobre a unidade lógica para a classe MSC.
A tabela abaixo descreve cada campo de configuração disponível nesta estrutura de configuração.

Tabela – Estrutura de configuração sl_usbd_msc_scsi_lun_info_t

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

46/174

Sobreview

Campo

Descrição

Campo
.scsi_lun_api_p tr

Descrição
Ponteiro para a API do driver de mídia que manipulará esta unidade lógica. Consulte Drivers de Armazenamento de Classe MSC de Dispositivos USB para obter mais informações sobre drivers de armazenamento.

.ve ndo r_id _ p tr
.id_do_produto_ptr
.nível_de_revisão_do_produto .é_leitura_somente

Ponteiro para uma string que contém a identificação do fornecedor da unidade lógica. O comprimento máximo da string é de 8 caracteres. Ponteiro para uma string que contém a identificação do produto da unidade lógica. O comprimento máximo da string é de 16 caracteres. Nível de revisão do produto.
Sinalizador que indica se a unidade lógica deve ser vista como somente leitura do ponto de vista de view do host ( true ) ou não ( false ).

Guia de programação da classe MSC do dispositivo USB

Esta seção explica como usar a classe MSC.
Inicializando a classe MSC do dispositivo USB Adicionando uma instância da classe SCSI do dispositivo USB MSC ao seu dispositivo Manipulação da unidade lógica da classe MSC do dispositivo USB
Inicializando a classe MSC do dispositivo USB

Para adicionar a funcionalidade da classe MSC SCSI ao seu dispositivo, primeiro inicialize a classe base MSC e a subclasse SCSI chamando as funções sl_usbd_msc_init() e sl_usbd_msc_scsi_init() .
O exampO exemplo abaixo mostra como chamar sl_usbd_msc_init() e sl_usbd_msc_scsi_init() .

Example – Chamando sl_usbd_msc_init() e sl_usbd_msc_scsi_init()

sl_status_t estado;
status = sl_usbd_msc_init(); if (status ! SL_STATUS_OK) { /* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */
}
status = sl_usbd_msc_scsi_init(); if (status ! SL_STATUS_OK) { /* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */
}
Adicionando uma instância de classe SCSI MSC de dispositivo USB ao seu dispositivo
Para adicionar a funcionalidade de classe MSC SCSI ao seu dispositivo, primeiro crie uma instância e, em seguida, adicione-a à(s) configuração(ões) do seu dispositivo. Você precisa adicionar pelo menos uma unidade lógica à sua instância.
Criando uma instância de classe MSC SCSI
Crie uma instância de classe MSC SCSI chamando a função sl_usbd_msc_scsi_create_instance() .
O exampO exemplo abaixo mostra como chamar sl_usbd_msc_scsi_create_instance() usando argumentos padrão. Para obter mais informações sobre os argumentos de configuração a serem passados ​​para sl_usbd_msc_scsi_create_instance() , consulte Configurações Específicas da Aplicação da Classe MSC do Dispositivo USB.
Example – Chamando sl_usbd_ msc_scsi_create_instance()

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

47/174

Sobreview

uint8_t número_da_classe; sl_status_t status;
sl_usbd_msc_scsi_callbacks_t app_usbd_msc_scsi_callbacks = { .enable = NULL, .disable = NULL, .host_eject = NULL };
status = sl_usbd_msc_scsi_create_instance(&app_usbd_msc_scsi_callbacks,0 &class_nbr);
if (status ! SL_STATUS_OK) { /* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */ }
Adicionando a instância da classe MSC às configurações do seu dispositivo
Depois de criar uma instância de classe MSC, você pode adicioná-la a uma configuração chamando a função
sl_usbd_msc_add_to_configuration() .
O exampVeja abaixo como chamar sl_usbd_msc_scsi_add_to_configuration() usando argumentos padrão.
Example – Chamando sl_usbd_ msc_scsi_add_to_configuration()

sl_status_t estado;

status = sl_usbd_msc_scsi_add_to_configuration(class_nbr,

(1)

config_nbr_fs);

(2)

se (status ! SL_STATUS_OK) {

/* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */

}

(1) Número de classe a ser adicionado à configuração retornada por sl_usbd_msc_scsi_create_instance() . (32) Número de configuração (aqui adicionando-o a uma configuração Full-Speed).
Manipulação de Unidade Lógica de Classe MSC de Dispositivo USB
Adicionar uma unidade lógica Anexar/desanexar um meio de armazenamento
Adicionando uma Unidade Lógica
Ao adicionar uma unidade lógica à sua instância de classe SCSI MSC, ela deve ser vinculada a um meio de armazenamento (RAMDisk, cartão SD, memória flash, etc.). A classe MSC usa um driver de armazenamento para se comunicar com a mídia de armazenamento. Este driver precisará ser fornecido ao adicionar a unidade lógica.
O exampO exemplo abaixo mostra como adicionar uma unidade lógica via sl_usbd_msc_scsi_lun_add() .
Example – Adicionando uma Unidade Lógica via sl_usbd_msc_scsi_lun_add()

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

48/174

Sobreview

sl_usbd_msc_scsi_lun_t *lu_object_ptr = NULO;

sl_usbd_msc_scsi_lun_info_t lu_info;

sl_status_t

status;

lu_info.sl_usbd_msc_scsi_lun_api_t = &app_usbd_scsi_storage_block_device_api;

lu_info.vendor_id_ptr

= “Laboratórios de Silício”;

lu_info.id_do_produto_ptr

= “dispositivo de bloco exampele”;

lu_info.nível_de_revisão_do_produto = 0x1000u;

lu_info.é_somente_leitura

= falso;

status = sl_usbd_msc_scsi_lun_add(nº_da_classe, &lu_info, &lu_object_ptr);
if (status ! SL_STATUS_OK) { /* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */ }

Anexando/Desanexando um Meio de Armazenamento
Após a adição da unidade lógica, um meio de armazenamento deve ser anexado para estar disponível no host. A classe MSC oferece duas funções para controlar a associação do meio de armazenamento à unidade lógica: sl_usbd_msc_scsi_lun_attach() e sl_usbd_msc_scsi_lun_detach(). Essas funções permitem emular a remoção de um dispositivo de armazenamento para recuperar o acesso a partir do aplicativo incorporado, se necessário.
O exampO exemplo abaixo mostra como usar as funções sl_usbd_msc_scsi_lun_attach() e sl_usbd_msc_scsi_lun_detach() .
Example – Anexar/Desanexar mídia

sl_status_t estado;

status = sl_usbd_msc_scsi_lun_attach(lu_object_ptr); if (status ! SL_STATUS_OK) { /* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */
}

(1)

status = sl_usbd_msc_scsi_lun_detach(lu_object_ptr); se (status ! SL_STATUS_OK) {
/* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */
}

(2)

status = sl_usbd_msc_scsi_lun_attach(lu_object_ptr) se (status ! SL_STATUS_OK) {
/* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */
}

(3)

(1) A partir deste momento, se o dispositivo MSC estiver conectado a um host, a mídia de armazenamento estará acessível.
(2) Se o dispositivo MSC estiver conectado a um host, a mídia aparecerá como indisponível. Neste momento, as operações podem ser realizadas na mídia a partir do aplicativo incorporado.
(3) Novamente, se o dispositivo MSC estiver conectado ao host, a mídia de armazenamento aparecerá como conectada.
Drivers de armazenamento de classe MSC para dispositivos USB
O dispositivo USB MSC Class precisa de um driver de armazenamento para se comunicar com um meio de armazenamento. No momento, a Silicon Labs não oferece drivers.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

49/174

Sobreview
TPY aa O driver AI é definido pelo typedef sl_usbd_msc_scsi_lun_api_t. Nossa variável sl_usbd_msc_scsi_lun_api_t deve ser incluída na sua variável sl_usbd_msc_scsi_lun_info_t, argumento passado quando você adiciona uma unidade lógica com sl_usbd_msc_scsi_lun_add(). Consulte a seção API USB Device MSC SCSI para obter mais detalhes sobre as estruturas. A implementação do driver de armazenamento pode ser tão simples quanto uma matriz de setores na RAM. O tamanho típico do setor (ou seja, tamanho do bloco) é 512 para dispositivos de armazenamento em massa e 2048 para CD-ROMs.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

50/174

Sobreview
Sobreview
Classe de fornecedor de dispositivo USB
Classe de fornecedor de dispositivo USB acimaview Necessidades de recursos da classe Fornecedor de dispositivos USB da configuração principal da classe Fornecedor de dispositivos USB Guia de programação da classe Fornecedor de dispositivos USB A classe Fornecedor permite que você crie dispositivos específicos do fornecedor que podem implementar um protocolo proprietário. Ela depende de um par de terminais em massa para transferir dados entre o host e o dispositivo. Transferências em massa são convenientes para transferir grandes quantidades de dados não estruturados e fornecem uma troca confiável de dados usando um mecanismo de detecção de erros e repetição. Além dos terminais em massa, a classe Fornecedor também pode usar um par opcional de terminais de interrupção. Qualquer sistema operacional (SO) pode trabalhar com a classe Fornecedor, desde que o SO tenha um driver para lidar com a classe Fornecedor. Dependendo do SO, o driver pode ser nativo ou específico do fornecedor. Por exemplo, no Microsoft Windows®, seu aplicativo interage com o driver WinUSB fornecido pela Microsoft para se comunicar com o dispositivo do fornecedor.
Classe de fornecedor de dispositivo USB acimaview
A Figura – Arquitetura Geral entre o Host Windows e a Classe Vendor mostra a arquitetura geral entre o host e o dispositivo usando a classe Vendor. Neste exemploampo sistema operacional host é o MS Windows.
Figura – Arquitetura geral entre o host do MS Windows e a classe de fornecedor

No MS Windows, o aplicativo se comunica com o dispositivo do fornecedor interagindo com uma biblioteca USB. Bibliotecas, como a libusb, oferecem uma API para gerenciar um dispositivo e seus pipes associados, e para se comunicar com o dispositivo por meio de endpoints de controle, em massa e de interrupção.
No lado do dispositivo, a classe Vendor é composta pelos seguintes pontos de extremidade:
Um par de pontos de extremidade de entrada e saída de controle, denominado ponto de extremidade padrão. Um par de pontos de extremidade de entrada e saída em massa.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

51/174

Sobreview

Um par de pontos de interrupção IN e OUT. Este par é opcional. A tabela abaixo indica o uso dos diferentes pontos de interrupção:
Tabela – Uso de endpoints de classe de fornecedor

Direção do ponto final

Controle IN
Controlar
FORA
Entrada em massa

Dispositivo para host
>Host para dispositivo
Dispositivo para host

Volume OUT
Interromper IN
Interromper
FORA

Host para dispositivo
Dispositivo para host
Host para dispositivo

Uso
Solicitações padrão para enumeração e solicitações específicas do fornecedor.
Solicitações padrão para enumeração e solicitações específicas do fornecedor.
Comunicação de dados brutos. Os dados podem ser estruturados de acordo com um protocolo proprietário.
Comunicação de dados brutos. Os dados podem ser estruturados de acordo com um protocolo proprietário.
Comunicação ou notificação de dados brutos. Os dados podem ser estruturados de acordo com um protocolo proprietário. Comunicação ou notificação de dados brutos. Os dados podem ser estruturados de acordo com um protocolo proprietário.

O aplicativo do dispositivo pode usar endpoints em massa e de interrupção para enviar ou receber dados de ou para o host. Ele só pode usar o endpoint padrão para decodificar solicitações específicas do fornecedor enviadas pelo host. As solicitações padrão são gerenciadas internamente pela camada Core do Silicon Labs USB Device.
Necessidades de recursos da classe de fornecedores de dispositivos USB do núcleo

Cada vez que você adiciona uma instância de classe de fornecedor a uma configuração por meio da função sl_usbd_vendor_add_to_configuration() , os seguintes recursos serão alocados do núcleo.

Recurso
Interfaces Interfaces alternativas Pontos de extremidade Grupos de interface

Quantidade
1 1 2 (4 se você habilitou pontos de interrupção) 0

Observe que esses números são por configuração. Ao definir os valores de configuração SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY e SL_USBD_DESCRIPTOR_QUANTITY, não se esqueça de levar em consideração quantas configurações a classe será adicionada. Para o valor de configuração SL_USBD_OPEN_ENDPOINTS_QUANTITY, como os endpoints são abertos somente quando uma configuração é definida pelo host, você só precisa levar em consideração o número de endpoints necessários para uma instância de classe.
Configuração de classe de fornecedor de dispositivo USB

Dois grupos de parâmetros de configuração são usados ​​para configurar a classe Vendor:
Configurações específicas de aplicativos da classe de fornecedor de dispositivo USB Configurações de instância da classe de fornecedor de dispositivo USB
Configurações específicas de aplicação da classe de fornecedor de dispositivo USB
Primeiro, para usar o módulo de classe Vendor do dispositivo USB do Silicon Labs, ajuste as definições de configuração em tempo de compilação do Vendor de acordo com as necessidades da sua aplicação. Elas são reagrupadas dentro do cabeçalho sl_usbd_core_config.h. file na seção Fornecedor. O objetivo das configurações de quantidade é informar ao módulo de dispositivo USB quantos objetos de Fornecedor USB alocar.
A tabela abaixo descreve cada configuração definida.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

52/174

Sobreview

Tabela – Definição da configuração do fornecedor do dispositivo USB

Nome da Configuração

Descrição

Valor Padrão

SL_USBD_VENDOR_CLASS_INSTANCE_QUANTITY Número de instâncias de classe que você alocará por meio de uma chamada para a função sl_usbd_vendor_create_instance() .

SL_USBD_VENDOR_CONFIGURATION_QUANTITY Número de configurações. Instâncias da classe Vendor podem ser adicionadas a uma ou mais configurações por meio de uma chamada à função sl_usbd_vendor_add_to_configuration().

Configurações de instância de classe de fornecedor de dispositivo USB

Esta seção define as configurações relacionadas às instâncias da classe Vendor.
Criação de instância de classe intr_en intervalo p_vendor_callbacks
Criação de instância de classe

A criação de uma instância da classe Vendor é feita chamando a função sl_usbd_vendor_create_instance() , que recebe três argumentos de configuração descritos abaixo.

intr_en
Booleano que indica se um par de pontos finais de interrupção deve ser adicionado ou não.

Valor
verdadeiro falso

Descrição
Um par de endpoints IN/OUT será adicionado e disponibilizado para o aplicativo incorporado. Nenhum endpoint de interrupção será adicionado. Apenas um par de endpoints IN/OUT em massa estará disponível.

intervalo
Se você definir intr_en como true , poderá especificar o intervalo de polling dos pontos de interrupção (em milissegundos). Se você definir intr_en como false , poderá definir interval como 0, pois ele será ignorado pela classe.
p_vendor_callbacks
p_vendor_callbacks é um ponteiro para uma variável de estrutura de funções de retorno de chamada, que você pode especificar para lidar com solicitações de controle específicas da classe. Se você não usar nenhuma solicitação específica da classe ou precisar habilitar/desabilitar notificações, pode definir isso como NULL.
O exampO exemplo abaixo fornece a assinatura esperada do seu manipulador de solicitações específico de classe.
Example – Assinatura da Função de Solicitação Específica de Classe

vazio app_usbd_vendor_req_handle(uint8_t

classe_nbr, (1)

const sl_usbd_setup_req_t *p_setup_req); (2)

sl_usbd_vendor_callbacks_t app_usbd_vendor_callback_functions =
{
.enable = NULL, .disable = NULL, .setup_req = app_usbd_vendor_req_handle,
};

(1) Número de instância da classe do fornecedor.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

53/174

Sobreview

(2) Ponteiro para uma solicitação de configuração recebida do host.
Guia de programação de classe de fornecedor de dispositivo USB
Esta seção explica como usar a classe Vendor. Inicializando a Classe Vendor do Dispositivo USB. Adicionando uma Instância da Classe Vendor do Dispositivo USB ao seu Dispositivo. Comunicando-se usando a Classe Vendor do Dispositivo USB.
Inicializando a classe de fornecedor do dispositivo USB
Para adicionar uma funcionalidade de Classe de Fornecedor ao seu dispositivo, primeiro inicialize a classe chamando a função USBD_Vendor_Init(). O exemploampO exemplo abaixo mostra como chamar sl_usbd_vendor_init() .
Example – Chamando sl_usbd_vendor_init()

sl_status_t estado;
status = sl_usbd_vendor_init(); if (status ! SL_STATUS_OK) { /* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */ }
Adicionando uma instância de classe de fornecedor de dispositivo USB ao seu dispositivo
Para adicionar a funcionalidade de classe de fornecedor ao seu dispositivo, você deve primeiro criar uma instância e depois adicioná-la às configurações do seu dispositivo.
Criando uma instância de classe de fornecedor Adicionando a instância de classe de fornecedor às configurações do seu dispositivo
Criando uma instância de classe de fornecedor
Crie uma instância da classe Vendor chamando a função sl_usbd_vendor_create_instance() . O exemploampO exemplo abaixo mostra como chamar sl_usbd_vendor_create_instance() usando argumentos padrão. Para obter mais informações sobre os argumentos de configuração a serem passados ​​para sl_usbd_vendor_create_instance() , consulte Configurações de Instância de Classe de Fornecedor de Dispositivo USB.
Example – Chamando sl_usbd_vendor_create_instance()

uint8_t número_da_classe; sl_status_t status;

status = sl_usbd_vendor_create_instance(falso,

(1)

0u,

(2)

funções de retorno de chamada do fornecedor do aplicativo USB, (3)

&class_nbr);

se (status ! SL_STATUS_OK) {

/* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */

}

(1) Nenhum ponto final de interrupção com esta instância de classe. (2) O intervalo é ignorado, pois os pontos finais de interrupção estão desabilitados.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

54/174

Sobreview

(3) Função de retorno de chamada que faz parte do seu aplicativo e lida com solicitações de classe específicas do fornecedor. Consulte Comunicação usando a Classe de Fornecedor do Dispositivo USB para obter mais informações. Adicionando a Instância da Classe de Fornecedor à(s) Configuração(ões) do seu Dispositivo. Após criar uma instância da classe de fornecedor, você pode adicioná-la a uma configuração chamando a função USBD_Vendor_ConfigAdd(). O exemploampO exemplo abaixo mostra como chamar sl_usbd_vendor_add_to_configuration() usando argumentos padrão.
Example – Chamando sl_usbd_vendor_add_to_configuration()

sl_status_t estado;

status = sl_usbd_vendor_add_to_configuration(class_nbr,

(1)

config_nbr_fs);

(2)

se (status ! SL_STATUS_OK) {

/* Ocorreu um erro. O tratamento de erros deve ser adicionado aqui. */

}

(1) Número de classe a ser adicionado à configuração retornada por sl_usbd_vendor_create_instance() . (2) Número de configuração (aqui adicionando-o a uma configuração Full-Speed).
Comunicação usando a classe de fornecedor de dispositivo USB
Comunicação Síncrona Geral Comunicação Assíncrona Solicitação do Fornecedor Geral A classe Vendor oferece as seguintes funções para comunicação com o host. Para mais detalhes sobre os parâmetros da função, consulte a API do Fornecedor de Dispositivos USB.
Tabela – Resumo da API de comunicação do fornecedor

Nome da função
sl_usb d _vendedor ou_ leitura _em massa_sy nc() sl_usb d _vendedor ou_ gravação _em massa_sy nc() sl_usb d _vendedor ou_ leitura _em massa_sy nc() sl_usb d _vendedor ou_ gravação _em massa_sy nc() sl_usb d _vendedor ou_ leitura _em massa_sy nc() sl_usb d _vendedor ou_ gravação _em massa_sy nc() sl_usb d _vendedor ou_ leitura _em massa_sy nc
()
sl_usb d _vendedor_de_gravação _facilidade_de_interrupção
()

Operação Recebe dados do host através do ponto final OUT em massa. Esta função é bloqueadora. Envia dados para o host através do ponto final IN em massa. Esta função é bloqueadora. Recebe dados do host através do ponto final OUT em massa. Esta função é não bloqueadora. Envia dados para o host através do ponto final IN em massa. Esta função é não bloqueadora. Recebe dados do host através do ponto final OUT de interrupção. Esta função é bloqueadora. Envia dados para o host através do ponto final IN de interrupção. Esta função é bloqueadora. Recebe dados do host através do ponto final OUT de interrupção. Esta função é não bloqueadora.
bloqueio.
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 Silicon Laboratories. Todos os direitos reservados.

55/174

Sobreview

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

__ALINHADO(4) uint8_t rx_buf[2];

__ALINHADO(4) uint8_t tx_buf[2];

uint32_t

xfer_len;

sl_status_t

status;

status = sl_usbd_vendor_read_bulk_sync(class_nbr,

(1)

(void *)&rx_buf[0],

(2)

2u,

0u,

(3)

&xfer_len);

se (status ! SL_STATUS_OK) {

/* $$$$ Lidar com o erro. */

}

status = sl_usbd_vendor_write_bulk_sync( class_nbr,

(1)

(void *)&tx_buf[0],

(4)

2u,

0u,

(3)

false,

(5)

&xfer_len);

se (status ! SL_STATUS_OK) {

/* $$$$ Lidar com o erro. */

}

(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) O aplicativo fornece o buffer de transmissão 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.
Comunicação Assíncrona
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 Silicon Laboratories. Todos os direitos reservados.

56/174

Sobreview

void app_usbd_vendor_comm (uint8_t class_nbr)

{

__ALINHADO(4) uint8_t rx_buf[2];

__ALINHADO(4) uint8_t tx_buf[2];

sl_status_t

status;

status = sl_usbd_vendor_read_bulk_async(class_nbr,

(void *)&rx_buf[0],

(2)

2u,

app_usbd_vendor_rx_completed,

NULL);

(4)

se (status ! SL_STATUS_OK) {

/* $$$$ Lidar com o erro. */

}

status = sl_usbd_vendor_write_bulk_async(class_nbr,

(void *)&tx_buf[0],

(5)

2u,

app_usbd_vendor_tx_completed,

NULL

(4)

false);

(6)

se (status ! SL_STATUS_OK) {

/* $$$$ Lidar com o erro. */

}

}

(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)

{

se (status ! SL_STATUS_OK) {

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

} outro {

/* $$$$ Lidar com o erro. */

}

}

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)

{

se (status ! SL_STATUS_OK) {

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

} outro {

/* $$$$ Lidar com o erro. */

}

}

(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 Silicon Laboratories. Todos os direitos reservados.

57/174

Sobreview
(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 Silicon Laboratories. Todos os direitos reservados.

58/174

Sobreview

#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;

padrão:

(6)

// Request is not supported.

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

59/174

Sobreview

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):

typedef estrutura {

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 Silicon Laboratories. Todos os direitos reservados.

60/174

Documentação da API
Documentação da API
Documentação da 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

Descrição
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 Silicon Laboratories. Todos os direitos reservados.

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 Silicon Laboratories. Todos os direitos reservados.

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
Funções

sl_status_t sl_status_t
sl_status_t sl_status_t sl_status_t
sl_status_t
sl_status_t
sl_status_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 Silicon Laboratories. Todos os direitos reservados.

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 Silicon Laboratories. Todos os direitos reservados.

64/174

USB Device ACM API

Tipo
vazio

Direction N/A

Argument Name

MACROS GLOBAL CONSTANTS FUNCTION PROTOTYPES CDC ACM FUNCTIONS

Initialize the CDC ACM serial emulation subclass.
Devoluções

Returns SL_STATUS_OK on success or another SL_STATUS code on failure.

Descrição

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

Descrição

N / D

line_state_interval Line state notification interval in milliseconds (value must

be a power of 2).

N / D

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 / D

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.

Devoluções

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.

Devoluções

Copyright © 2025 Silicon Laboratories. Todos os direitos reservados.

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

Direção

Argument Name

Descrição

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 Instruções
USB Device Stack, Device Stack, Stack

Referências

Deixe um comentário

Seu endereço de e-mail não será publicado. Os campos obrigatórios estão marcados *