Xlera8Name

Dispositivos de interface humana: embalagem para o roubo do descritor

Começamos com descobrindo descritores HID há uma semanae mostrei como enviar pacotes HID brutos usando um fork MicroPython. Ainda temos a tarefa pela frente – fabricar um dispositivo touchscreen. Para isso, vamos fornecer as ferramentas para capturar um descritor existente em uma tela sensível ao toque e, em seguida, mostrar como ajustá-lo e como ele fica no final.

Fazendo as malas para o assalto

Quando se trata deste tipo de aventura, não podemos ficar sem ferramentas e armas – pode ser perigoso! Sem eles, você poderia até abandonar seu projeto no meio do caminho! Aqui estão ferramentas e munições de alta precisão suficientes para superar quaisquer obstáculos que você possa encontrar. Exceto pelas ferramentas baseadas na web, essas ferramentas são para Linux, mas lembre-se de que você sempre pode usar uma máquina virtual ou Raspberry Pi. De qualquer maneira, ninguém usaria o Windows para um assalto, com toda essa telemetria e tal.

A primeira ferramenta é para ler descritores – precisamos de uma para aprender, é como um cartão-chave que você pode mostrar a um guarda de segurança e digitalizar na entrada do cofre. É claro que, com RFID, você deseja ter exemplos suficientes, comparar bits entre alguns cartões e tudo mais. Por enquanto, os descritores HID não possuem verificações de autenticidade, mas parece isso pode mudar no futuro. Deixe que a Apple e a Microsoft os adicionem, como de costume. No Linux, ver os descritores é simples – como root, entre /sys/bus/usb/devices/, encontre seu dispositivo pelo lsusb caminho da árvore do dispositivo e siga o diretório com o VID/PID nele. Esse diretório conterá um report_descriptor Arquivo - hexdump isto. O comando inteiro poderia ficar assim:

sudo hexdump -v -e '/1 "%02X "' /sys/bus/usb/devices/3-6.2/3-6.2:1.1/0003:0C40:8000.0022/report_descriptor`

Novamente, você pode precisar de root para encontrar esse caminho, então use sudo -i se você precisar. A string de formato no hexdump O comando fornece uma saída amigável ao analisador. Especificamente, para análise, eu uso esta página – é maravilhoso adicionar até mesmo guias que delineiam diferentes seções do descritor, tornando sua saída ainda mais legível! Você também pode salvar esta página localmente, é uma ferramenta muito interessante. Fora isso, você pode tentar outras ferramentas locais como este!

Agora, você tem um descritor para um dispositivo cujo comportamento deseja imitar e pode analisá-lo para ver o que o faz funcionar. Maravilhoso! Mas não é algo que você possa entender à primeira vista, ainda não? O descritor por si só não se presta à construção de um mapa mental, pode conter vários IDs de relatório e alguns descritores serão genéricos o suficiente para serem confusos. Por exemplo, muitos dispositivos têm descritores que são, na verdade, terminais para atualizações de firmware, portanto, você pode perder tempo imaginando quando o descritor nunca é realmente usado. Vamos dar uma olhada no que nosso dispositivo realmente envia quando interagimos com ele, com qual ID de relatório devemos aprender – e o mais importante, como um sistema operacional Linux o interpreta.

Para isso, precisamos apenas de VID e PID. Como root novamente, vá para /sys/kernel/debug/hid/, encontre um diretório com seu VID e PID e, em seguida, cat Está events arquivo. Lá, você encontrará uma descrição bem impressa e legível para humanos de cada evento obtido em seu dispositivo, assim que ele aparecer. Às vezes, o processo de impressão falha e para no meio do evento – pode ser algo relacionado ao modo como está sendo cat'ed, mas geralmente não é uma grande perda. Esta é uma maneira maravilhosa de ver o que realmente acontece quando o seu dispositivo HID está ativo. O primeiro byte é o ID do relatório, depois o pacote é impresso da forma como foi recebido e, depois disso, vemos os resultados da análise do SO. É simplesmente uma ferramenta incrível de se ter! Aqui está um exemplo de linha de comando:

sudo cat /sys/kernel/debug/hid/0003:2E8A:0005.0029/events

Por último, mas não menos importante, você desejará ver os eventos à medida que as camadas de entrada do seu sistema operacional os interpretam. Sim, isso é diferente – se um pacote chega, ele não é necessariamente convertido em um evento de entrada no nível do sistema operacional, às vezes é descartado porque não atende a uma determinada condição. Por exemplo, em algum momento, meus pacotes de tela sensível ao toque foram descartados porque eu estava apenas enviando coordenadas e omiti uma parte crucial informando ao sistema operacional que uma tela sensível ao toque está transmitindo um evento de toque válido, em oposição a um toque espúrio. Essa parte está na frente e no centro do 'Appnotes' da Microsoft sobre construção de digitalizadores, e ver que meu sistema operacional não 'absorveu' meus eventos construídos foi o empurrão que eu precisava para dar uma olhada no appnote e verificar o que meu pacote pode estar faltando.

Para isso, tenho meu próprio pequeno script Python que imprime eventos à medida que são recebidos pelas camadas da biblioteca de entrada, e esse script tem me servido há uma década. Basta baixá-lo e executá-lo – você precisará instalar a biblioteca `evdev` do Python, mas ela está disponível nos repositórios Debian/Ubuntu e também no `pip`. Você também precisa executar este como root, mas isso acontece quando você o executa como `./listen_keys.py` automaticamente.

Eu prefiro executar todos esses comandos diferentes em tmux, diferentes pequenos painéis para diferentes tarefas em andamento – aqui está meu espaço de trabalho quando eu estava desenvolvendo e depurando o código da tela sensível ao toque, onde a) mostra a impressão bruta de eventos HID, b) mostra a impressão do descritor HID e c) mostra o código de exibição do evento de entrada.

Um disfarce perfeito

Com essas ferramentas, construir uma tela sensível ao toque foi uma tarefa árdua. Eu tinha as coordenadas da biblioteca XPT2046 que estava usando, então tudo que precisei fazer foi construir um descritor. Inicialmente, pensei em reutilizar o descritor de “posição absoluta do mouse” fornecido por [] com o código, mas o script de impressão do evento de entrada me mostrou que mesmo os pressionamentos do botão do mouse nesse script não foram captados pela UI - e embora Os eventos MOUSE_ABS apareceram, eles não afetaram minha área de trabalho de forma alguma.

Depurar o trabalho do descritor do mouse não pareceu divertido, especialmente porque eu nem tenho um mouse funcional para aprender! Em vez disso, decidi reconstruir o descritor absoluto do mouse em um descritor de digitalizador, já que tenho tanto o descritor de digitalizador quanto os pacotes! O descritor absoluto do mouse foi exposto de forma útil nas fontes do MicroPython separadamente e também está pronto para ajustes! Alterando a USAGE e USAGE_PAGE apenas categorias àquelas do descritor da tela sensível ao toque USB fizeram meu sistema operacional reconhecer minha placa RP2040 como um digitalizador.

As mudanças reais não foram complicadas – a biblioteca XPT2046 forneceu duas coordenadas inteiras, então copiei uma estrutura de um descritor que descrevia um valor X e um valor Y, cada um com 16 bits de comprimento e, portanto, dividido em dois bytes cada, assim como minha tela sensível ao toque USB. Com a ajuda do mecanismo de impressão de depuração de pacotes HID, pude perceber rapidamente quando meus bytes superior e inferior foram trocados, porque meu sistema operacional não estava interpretando as coordenadas corretamente. Tendo corrigido isso, meus pacotes seriam analisados ​​corretamente, mas não apareciam entre os eventos de entrada, e comparando os pacotes da tela sensível ao toque USB feitos de fábrica com os pacotes construídos à mão da minha tela sensível ao toque DIY, pude notar que um bit de “toque válido” estava faltando. Adicionar isso fez com que o dispositivo se comportasse como uma tela sensível ao toque para todos os efeitos!

Agora, eu tenho uma tela sensível ao toque DIY conectada por USB, e bastou roubar um descritor HID de uma tela sensível ao toque diferente e imitá-lo de perto. Além disso, sempre que eu quiser, posso mudar minha tela sensível ao toque para o modo touchpad, fazendo com que ela envie pacotes com um ID de relatório diferente que corresponda ao descritor do mouse do firmware – faltam apenas dois botões do mouse para ser um touchpad de laptop completo! Dado que estou usando isso para criar um protótipo de um display vestível, será imensamente útil.

Dentro e fora, garantimos as mercadorias

No estado em que se encontra, a recém-batizada tela sensível ao toque USB precisa de alguma filtragem e calibração, mas essas são pequenas correções – provavelmente também poderiam roubar alguns algoritmos de filtragem dos drivers Linux XPT2046! É plug&play, fácil de usar e hackeável – não é mais a tela sensível ao toque SPI que deveria ser. Acima de tudo, é um ótimo exemplo de que, se você deseja construir um dispositivo HID um pouco maluco, não é nem de longe difícil fazê-lo, e o Linux oferece um kit de ferramentas poderoso que ajuda você a perceber qualquer problema de HID, não importa o quão longe você queira. ir.

Há muitas coisas que você pode fazer se entender o HID. Por exemplo, você pode construir um display Braille compatível entre si, sem se preocupar com números de série USB-UART. Sobre no Hackaday Discord, [mupf] está hackeando um dispositivo compatível com o XBox Adaptive Controller que usa um magnetômetro e um giroscópio para enviar o sistema operacional, com o descritor HID fortemente informado por um descritor descartado de um Xbox Adaptive Controller original. A especificação HID descreve um grande número de coisas, até mesmo exibições de caracteres conectadas por USB e coisas como – você pode enviar quaternions com a ajuda de HID, entre todas as coisas!

O suporte a HID torna seu dispositivo de entrada amigável e o ajuda a interagir melhor com o mundo do software. HID é, em sua essência, uma linguagem compreendida por todos os principais sistemas operacionais, e fornecer ao seu dispositivo uma interface HID permite evitar a adição de uma camada de linguagem proprietária entre o seu dispositivo e qualquer tipo de software com o qual você deseja interagir. E, claro, o HID é uma ótima ferramenta de hacker – só esta ferramenta de automação de smartphone irá testemunhar!

Da próxima vez, gostaria de mostrar mais sobre I2C HID – envio de pacotes e descritores HID por I2C, sem a necessidade de uma porta USB e usando apenas uma conexão I2C, que agora é bastante onipresente! Nesse contexto, mostrarei como reutilizar um touchpad de laptop Framework, que usa I2C-HID para suas comunicações. Espero modificar o QMK para que possamos praticar a adição de touchpads I2C a qualquer teclado controlado por QMK, mas podemos simplesmente decidir modificar o KMK, que é equivalente ao QMK, mas em CircuitPython. Também mostrarei como você pode conectar rapidamente um dispositivo I2C-HID a um SBC Linux seu – é mais fácil do que você imagina! E, se as estrelas se alinharem e o suporte ao modo periférico I2C no RP2040 MicroPython for estável o suficiente, poderíamos até construir nosso próprio periférico I2040C HID com RP2 como sobremesa.

Fale Conosco

Olá! Como posso ajudá-lo?