Eu tenho algumas barras de cortina elétricas da Akko - AM82TV. Esse modelo se destaca de seus irmãos com o conjunto mais completo de interfaces de gerenciamento. As cortinas podem ser controladas por rádio, existem "contatos secos", controle fase a fase (fazendo um curto-circuito nos fios de controle da rede). Existe uma interface RS485 - isto é, se você deseja conectar as cortinas à “casa inteligente”. Você também pode abrir / fechar as cortinas simplesmente puxando-as com a mão na direção desejada. Talvez esteja ausente “pronto para uso”, apenas a interface baseada na Web, bem, e o MQTT.
Há muito tempo, hastes de cortina elétricas funcionam de maneira confiável, mas, de tempos em tempos, um desejo começa a parecer desmontá-las - por curiosidade de ver o que há dentro e se é possível colocar um ESP8266 (ou ESP32) nele para adicionar os desaparecidos. É claro que você pode conectar tudo de fora, mas é melhor que a aparência permaneça a mesma e tudo oculto por dentro.
Não repare o que não está quebrado - isso não é sobre mim. No começo, tentei afastar as más idéias de mim mesma, mas com o tempo a coceira se intensificou e agora chegou a hora em que já era impossível combatê-la. Tirei o motor dos beirais e o desmontei. A inspeção inicial deveria dar respostas a duas perguntas: existe espaço para o ESP8266 e é possível usar a fonte de alimentação embutida? Tudo foi resolvido de forma simples. Basta desaparafusar alguns parafusos das extremidades do motor. A única coisa é que os slots dos parafusos não são feitos com uma chave de fenda, mas com uma chave sextavada torx. Depois disso, você pode extrair o conteúdo - um motor coletor em uma carcaça com uma caixa de velocidades e um sensor de eixo do motor, uma fonte de alimentação de 24 volts e uma placa de controle.
Há um local para ESP, a fonte de alimentação foi projetada para um motor potente e não notará uma pequena carga adicional. Comecei a considerar o painel de controle e os pensamentos sobre o ESP começaram a desaparecer em segundo plano - o microcontrolador atmega168 era o coração do painel. Se não houvesse contatos na placa para instalar o conector ISP (interface de programação em circuito do microcontrolador), isso não me impediria, mas eles estavam lá. Para que você me entenda corretamente, não sou fã de avr. Eu não tenho um programador e não escrevi uma única linha de código para microcontroladores atmega. Eu precisava urgentemente de um programador para tentar ler o firmware, mas era à noite e não havia como comprar algo na loja no momento. Para não esperar até de manhã, montei o programador Gromov. Em seguida, ele soldou o conector do provedor na placa de controle, conectou o programador e tentou ler o firmware - e foi contado.
É impossível tentar entender algo no firmware do microcontrolador sem entender o diagrama de circuitos. Portanto, em uma placa de circuito impresso, restaurei o circuito. Não tenho muitas vezes que desenhar diagramas. Para não desenhar os elementos que estão no quadro, mas não na biblioteca padrão, desenhei um diagrama no easyeda. Sim, verifica-se que não está de acordo com GOST (mas o microcontrolador é desenhado como na documentação, o que é conveniente). Um fragmento é suficiente para entender:

A seguir, a maioria das imagens é clicável.
Se desejar, você pode se familiarizar com o
esquema completo .
Depois disso, eu estava pronto para pesquisar o firmware. Simplesmente traduzir códigos de máquina em mnemônicos montadores não é suficiente para análise. Você precisa ver o status dos registradores e da memória em qualquer ponto do programa. Infelizmente, a depuração no próprio microcontrolador não é possível com o atmega168, mas você pode carregar o firmware no simulador. Não é muito conveniente se você quiser "sentir" o ferro real do cintador do microcontrolador, mas vamos seguir com o que temos. Não instalei o Atmel Studio 7. Decidi que seria suficiente um AVR Studio mais compacto 4. Em princípio, um Studio é suficiente para análise, mas é possível transferir algumas das operações de rotina para outro software. Em março, a
ferramenta de engenharia reversa
, Ghidra, foi publicada. Eu precisava de um motivo, alguma tarefa prática, para conhecê-lo. Esta é apenas uma oportunidade. Cada ferramenta individualmente - AVR Studio 4 e Ghidra, fiquei um pouco buggy. O AVR Studio, com várias transições aninhadas de subprogramas, pode parar subitamente de exibir os endereços de transição corretos nos comandos (o endereço se tornou zero). Ghidra às vezes se desviava em sua análise de indexação. Mas o uso de ambas as ferramentas ao mesmo tempo tornou possível identificar rapidamente a causa dessas esquisitices.
Cavar sem rumo no firmware não é muito interessante. É melhor se houver alguma tarefa específica. Por outro lado, curioso pode ser a análise do protocolo de troca do RS485 e do protocolo de controle no ar. Eu decidi me aprofundar no protocolo de rádio.
Era uma vez, eu já havia captado um sinal transmitido por um controle remoto via rádio e analisado.
O canal de rádio é unidirecional. O motor só pode receber um sinal e não confirma o recebimento de um comando. É impossível interrogar o estado da cornija elétrica pelo ar. No nível físico, há apenas um receptor de sinal de rádio. Não há transmissor no motor. O sinal é transmitido pelo controle remoto via rádio a uma frequência de 433,92 MHz. Codificado por manipulação de amplitude. O comando consiste em um bit de início de forma especial, endereço + canal e o próprio comando. Graficamente, todo o sinal pode ser representado da seguinte maneira:

Um canal pode ser considerado como parte de um endereço. Se você transmitir um comando no canal zero, ele será executado por todos os dispositivos com um determinado endereço, mas com canais diferentes. É conveniente se você precisar transferir o comando imediatamente para o grupo de hastes de cortina elétricas.
Leia mais sobre o protocolo de rádio .
Analisando como o controle remoto transmite comandos, eu já conhecia os códigos das quatro equipes. Não é demais, quando comparado com as possibilidades de controle da cortina elétrica via RS485. Eu queria ter certeza de que todas as equipes fossem identificadas e que não houvesse "ovos de Páscoa" ou equipes de serviço.
A abordagem de análise é simples. O diagrama de circuitos mostra quais portas do microcontrolador estão conectadas a dispositivos físicos. O arquivo de firmware é analisado no Ghidra. Isso é conveniente - muitas operações de rotina são realizadas automaticamente. Depois de analisar a operação de um trecho de código ou subprograma específico, ele recebe um nome significativo. Além disso, trechos de código e capturas de tela que trarei de Ghidra. Quando estiver sem brilho, execute o código no simulador. Em situações especialmente complicadas, você precisa desenhar.
Para garantir que os nomes dos registros periféricos atmega168 sejam exibidos corretamente durante a desmontagem, corrigi o arquivo avr8.pspec. De uma maneira boa, seria necessário criar um arquivo com um nome diferente, mas eu não precisava desse arquivo em sua forma original e corrigi o que era.
O firmware começa com vetores de interrupção. O primeiro é o vetor de transição para o início do programa. É assim:

A maioria das interrupções não é usada. Se, por algum motivo, ocorrer uma interrupção, um comando de retorno será executado imediatamente. Além de processar interrupções para redefinição, também são processadas interrupções para o transbordamento do timer 0, conclusão da recepção e disponibilidade para transmitir o próximo byte de dados ao USART. A troca RS485 não nos interessa agora, mas o excesso de temporizador precisa ser revisto.
Obviamente, antes que a interrupção do timer seja ativada, o próprio timer deve ser configurado. Não comecei a procurar no código desmontado o local onde a inicialização ocorre. No simulador, defino um ponto de interrupção no endereço 0x1fc - este é o endereço registrado no manipulador de interrupções. Comecei o programa, peguei um pico e apenas observei o que estava escrito nos registros. A seleção de bloqueio para timr0 está definida como clk / 8. Com o quartzo em uma placa de 8 MHz, pulsos com uma frequência de 1 MHz chegam ao timer.
Início do manipulador de interrupção:

Gráfico das funções do manipulador de interrupção do birdwatch O temporizador transborda a cada 107 μs. Entre outras coisas, o manipulador de interrupção processa o sinal da saída do receptor de sinal de rádio. Se o sinal for aprovado no teste, os dados recebidos serão gravados no buffer em 0x4af. O tamanho do buffer é de 6 bytes. Esse é um byte a mais do que o necessário para receber quatro bytes do endereço + canal e byte de comando. Talvez o sexto byte do protocolo de rádio tenha sido destinado à soma de verificação, mas atrofiado. Às vezes acontece. Talvez destinado a dados que complementem alguns dos comandos. No protocolo de controle da cornija elétrica RS485, há um comando para fechar parcialmente as cortinas. Nesse caso, um byte adicional é transmitido com dados sobre a quantidade de fechamento em porcentagem. Uma equipe semelhante poderia existir no protocolo de rádio. O programa principal é informado sobre a prontidão dos dados, configurando um sinalizador - uma unidade é gravada no endereço 0x4bd.
Isso completa a análise de interrupções e prossegue para o programa principal.
O gráfico de funções ao navegar para o endereço 0x1304 é conciso e simples:

Precisamos no "principal". Já analisamos as interrupções e entendemos que, por algum motivo, de repente, voltamos do main e entramos em "go_to_sleep", então esse sonho será letárgico - a cortina elétrica deixará de fazer algo útil. Provavelmente, ao escrever o firmware, um modelo pronto foi usado e os artefatos permaneceram após ele.
Principalmente, precisamos encontrar o local onde o buffer 0x4af é acessado. Você não precisa procurar por muito tempo. Literalmente após alguns comandos, uma sub-rotina é chamada, começando com o endereço 0x11b3, onde esse buffer é copiado e processado.
Gráfico das funções do procedimento rf_signal_buffer_processing (0x11b3):

Este é exatamente o lugar que precisamos, mas parece um pouco complicado. Para entender, comecei a desenhar. Algo como um fluxograma.
A primeira coisa que acontece aqui é que os dados do buffer 0x4af são copiados para o novo endereço - 0x49f e o sinalizador 0x4bd é redefinido:

O seguinte snippet é o mais interessante:

De fato, esta é a verificação completa do comando recebido pelo ar. Embora isso não seja óbvio, mas análises posteriores mostraram que a transição para as próximas ramificações é o processamento dos seguintes comandos de rádio se o comando 0xcc foi recebido antes disso - alternando para o modo de configurações. Eu estava interessado nos novos códigos das próprias equipes. Existe algo além dos códigos de comando 0x11, 0x33, 0x55 e 0xcc.
Não foi possível encontrar aqui nem mais o processamento do último sexto byte do comando. Na figura, está riscado em vermelho. Portanto, todas as equipes consistem em cinco bytes. Pelo menos no firmware da AM82TV.
A primeira coisa que vemos é verificar o quinto byte do buffer - o código do próprio comando. Aqui, ao que parece, havia novos códigos de comando - 0xad e 0xda. O comando do buffer passa no teste com êxito se o campo de endereço corresponder a um dos endereços já registrados no eeprom ou se o código de comando for 0xad ou 0xda e o campo de endereço == 0xaaaaaaaa.
Bem, consideraremos que passamos com sucesso no próximo teste. Agora o código de comando está localizado em 0x4bf. Precisamos descobrir como o conteúdo desse byte é processado. Existem várias maneiras de fazer isso. O mais simples é uma pesquisa de texto no código desmontado em Ghidra. Resta ver exatamente onde o conteúdo deste byte é lido. Esta não é uma maneira garantida de encontrar todas as chamadas, mas, neste caso específico, funcionará. Então, primeiro, veremos uma leitura de byte no procedimento começando em 0x1262:

Acesso ao qual vem de um único local - uma equipe localizada em 0x5e0.
Gráfico de funções:

É uma pena, mas todos os códigos de comando, exceto os já conhecidos: 0x11, 0x33, 0x55 e 0xcc são descartados neste procedimento. Até os códigos 0xad e 0xda encontrados na etapa anterior. Pelo menos não consegui encontrar novos códigos de comandos de rádio no firmware da cornija elétrica AM82TV.
No entanto, existe acesso ao firmware, ele pode ser desmontado, ver como funções específicas são implementadas e alterar algo por si mesmo. Ou até adicione algo.
O firmware e o arquivo avr8.pspec modificado para atmega168 são postados no
GitHub .