J'ai quelques tringles à rideaux électriques Akko - AM82TV. Ce modèle se démarque de ses frères avec l'ensemble d'interfaces de gestion le plus complet. Les rideaux peuvent être commandés par radio, il y a des «contacts secs», un contrôle phase par phase (en court-circuitant les fils de commande au réseau). Il y a une interface RS485 - c'est si vous voulez connecter les rideaux à la «maison intelligente». Vous pouvez également ouvrir / fermer les rideaux simplement en les tirant avec votre main dans la direction souhaitée. «Out of the box» ne manque, peut-être, que l'interface Web, eh bien, et MQTT.
J'ai longtemps eu des tringles à rideaux électriques fonctionnant de manière fiable, mais de temps en temps un désir a commencé à apparaître pour les démonter - par curiosité pour voir ce qu'il y a à l'intérieur et s'il est possible de mettre un ESP8266 (ou ESP32) dedans afin d'ajouter le manquant. Vous pouvez bien sûr tout connecter de l'extérieur, mais il vaut mieux que l'apparence reste la même et que tout soit caché à l'intérieur.
Ne réparez pas ce qui n'est pas cassé - ce n'est pas de moi. Au début, j'ai essayé de me chasser des mauvaises idées, mais avec le temps, les démangeaisons se sont intensifiées et maintenant, le moment est venu où il était déjà impossible de les combattre. J'ai enlevé le moteur de l'avant-toit et l'ai démonté. L'inspection initiale devait donner des réponses à deux questions: y a-t-il de la place pour l'ESP8266 et est-il possible d'utiliser l'alimentation intégrée. Tout a été réglé simplement. Il suffit de dévisser quelques vis des extrémités du moteur. La seule chose est que les fentes des vis ne sont pas faites avec un tournevis, mais avec une clé hexagonale torx. Après cela, vous pouvez extraire le contenu - un moteur collecteur dans un boîtier avec une boîte de vitesses et un capteur d'arbre moteur, une alimentation 24 volts et une carte de commande.
Il y a une place pour l'ESP, l'alimentation est conçue pour un moteur puissant et ne remarquera pas une petite charge supplémentaire. J'ai commencé à considérer la carte de contrôle et les pensées à propos de l'ESP ont commencé à fondre en arrière-plan - le microcontrôleur atmega168 était le cœur de la carte. S'il n'y avait pas de contacts sur la carte pour installer le connecteur ISP (interface de programmation en circuit du microcontrôleur), cela ne m'arrêterait pas, mais ils étaient là. Pour que vous me compreniez bien, je ne suis pas du tout fan de avr. Je n'ai pas de programmeur et je n'ai pas écrit une seule ligne de code pour les microcontrôleurs atmega. J'avais un besoin urgent d'un programmeur pour essayer de lire le firmware, mais c'était le soir et il n'y avait aucun moyen d'acheter quelque chose dans le magasin pour le moment. Afin de ne pas attendre jusqu'au matin, j'ai assemblé le programmeur Gromov. Puis il a soudé le connecteur ISP sur la carte de contrôle, connecté le programmateur et essayé de lire le firmware - et cela a été compté.
Il est impossible d'essayer de comprendre quelque chose dans le firmware du microcontrôleur sans comprendre le schéma de circuit. Par conséquent, sur une carte de circuit imprimé, j'ai restauré le circuit. Je n'ai pas souvent à dessiner de diagrammes. Afin de ne pas dessiner les éléments qui se trouvent sur le tableau, mais pas dans la bibliothèque standard, j'ai dessiné un schéma dans easyeda. Oui, cela ne se révèle pas selon GOST (mais le microcontrôleur est dessiné comme dans la documentation, ce qui est pratique). Un fragment suffit pour comprendre:

Ci-après, la plupart des images sont cliquables.
Si vous le souhaitez, vous pouvez vous familiariser avec le
schéma complet .
Après cela, j'étais prêt à rechercher le firmware. La simple traduction de codes machine en mnémoniques d'assembleur ne suffit pas pour l'analyse. Vous devez voir l'état des registres et de la mémoire à tout moment du programme. Malheureusement, le débogage sur le microcontrôleur lui-même n'est pas possible avec atmega168, mais vous pouvez charger le firmware dans le simulateur. Ce n'est pas très pratique si vous voulez "sentir" le vrai fer du cerclage du microcontrôleur, mais passons à ce que nous avons. Je n'ai pas installé Atmel Studio 7. J'ai décidé qu'un AVR Studio 4 plus compact serait suffisant.En principe, un Studio suffit pour l'analyse, mais il est possible de transférer certaines des opérations de routine vers d'autres logiciels. En mars, l'
outil de rétro-ingénierie
, Ghidra, a été publié. J'avais besoin d'une raison, d'une tâche pratique, pour le connaître. Ce n'est qu'une opportunité. Chaque outil individuellement - AVR Studio 4 et Ghidra, j'ai eu un petit buggy. AVR Studio, avec plusieurs transitions de sous-programme imbriquées, pourrait soudainement cesser d'afficher les adresses de transition correctes dans les commandes (l'adresse est devenue zéro). Ghidra s'est parfois égaré dans son analyse d'indexation. Mais l'utilisation simultanée des deux outils a permis d'identifier rapidement la cause de ces bizarreries.
Creuser sans but dans le firmware n'est pas trop intéressant. C'est mieux s'il y a une tâche spécifique. Sur le coup, curieux peut être l'analyse du protocole d'échange pour RS485 et le protocole de contrôle sur l'air. J'ai décidé de me plonger dans le protocole radio.
Il était une fois, j'avais déjà pris un signal transmis par une télécommande radio et l'ai analysé.
La chaîne radio est à sens unique. Le moteur ne peut recevoir qu'un signal et ne confirme pas la réception d'une commande. Il est impossible d'interroger l'état de la corniche électrique dans l'air. Au niveau physique, il n'y a qu'un récepteur de signal radio. Il n'y a pas d'émetteur dans le moteur. Le signal est transmis par la télécommande radio à une fréquence de 433,92 MHz. Codé par manipulation d'amplitude. La commande se compose d'un bit de démarrage de forme spéciale, d'une adresse + canal et de la commande elle-même. Graphiquement, l'ensemble du signal peut être représenté comme suit:

Un canal peut être considéré comme faisant partie d'une adresse. Si vous transmettez une commande sur le canal zéro, elle sera exécutée par tous les appareils avec une adresse donnée, mais avec des canaux différents. Il est pratique si vous devez transférer immédiatement la commande au groupe de tringles à rideaux électriques.
En savoir plus sur le protocole radio .
Analysant comment la télécommande transmet les commandes, je connaissais déjà les codes des quatre équipes. Pas trop, par rapport aux possibilités de contrôle du rideau électrique via RS485. Je voulais m'assurer que toutes les équipes étaient identifiées et qu'il n'y avait ni «œufs de Pâques» ni équipes de service.
L'approche d'analyse est simple. Le schéma de circuit montre quels ports du microcontrôleur sont connectés aux périphériques physiques. Le fichier du firmware est analysé dans Ghidra. C'est pratique - de nombreuses opérations de routine sont effectuées automatiquement. Après avoir analysé le fonctionnement d'un morceau de code ou d'un sous-programme particulier, on lui attribue un nom significatif. De plus, des extraits de code et des captures d'écran que je vais apporter de Ghidra. Une fois terne, exécutez le code dans le simulateur. Dans des situations particulièrement compliquées, vous devez dessiner des images.
Afin de garantir que les noms des registres périphériques atmega168 s'affichent correctement lors du démontage, j'ai corrigé le fichier avr8.pspec. Dans le bon sens, il faudrait créer un fichier avec un nom différent, mais je n'avais pas besoin de ce fichier dans sa forme originale et j'ai corrigé celui qui était.
Le micrologiciel commence par des vecteurs d'interruption. Le premier est le vecteur de transition vers le début du programme. Cela ressemble à ceci:

La plupart des interruptions ne sont pas utilisées. Si pour une raison quelconque une telle interruption se produit, une commande de retour sera exécutée immédiatement. Outre le traitement des interruptions pour réinitialisation, les interruptions pour dépassement du temporisateur 0, l'achèvement de la réception et la disponibilité à transmettre l'octet de données suivant à USART sont également traitées. L'échange RS485 ne nous intéresse plus maintenant, mais le débordement du temporisateur doit être revu.
Bien sûr, avant que l'interruption du temporisateur ne soit activée, le temporisateur lui-même doit être configuré. Je n'ai pas commencé à chercher dans le code démonté le lieu où l'initialisation a lieu. Dans le simulateur, j'ai défini un point d'arrêt à l'adresse 0x1fc - c'est l'adresse enregistrée dans le gestionnaire d'interruption. J'ai commencé le programme, j'ai eu un pic et j'ai juste regardé ce qui était écrit dans les registres. lock select for timr0 est réglé sur clk / 8. Avec du quartz sur une carte de 8 MHz, des impulsions d'une fréquence de 1 MHz arrivent au temporisateur.
Début du gestionnaire d'interruption:

Graphique des fonctions du gestionnaire d'interruption ornithologique La minuterie déborde toutes les 107 μs. Entre autres choses, le gestionnaire d'interruption traite le signal de la sortie du récepteur de signal radio. Si le signal réussit le test, les données reçues sont écrites dans le tampon à 0x4af. La taille du tampon est de 6 octets. C'est un octet de plus que nécessaire pour recevoir quatre octets de l'adresse + canal et de l'octet de commande. Peut-être que le sixième octet du protocole radio était destiné à la somme de contrôle, mais atrophié. Cela arrive parfois. Peut-être destiné à des données complétant certaines des commandes. Dans le protocole de contrôle de la corniche électrique RS485, il y a une commande pour fermer partiellement les rideaux. Dans ce cas, un octet supplémentaire est transmis avec des données sur le montant de la fermeture en pourcentage. Une équipe similaire pourrait exister dans le protocole radio. Le programme principal est informé de l'état de préparation des données en définissant un indicateur - une unité est écrite à l'adresse 0x4bd.
Ceci termine l'analyse des interruptions et passe au programme principal.
Le graphique des fonctions lors de la navigation vers l'adresse 0x1304 est concis et simple:

Nous devons dans le "principal". Nous avons déjà analysé les interruptions et comprenons que si, pour une raison quelconque, nous revenons soudainement du réseau principal et entrons dans «go_to_sleep», ce rêve sera léthargique - le rideau électrique cessera de faire quelque chose d'utile. Probablement, lors de l'écriture du micrologiciel, un modèle prêt à l'emploi a été utilisé et des artefacts sont restés après.
En général, nous devons trouver l'endroit où le tampon 0x4af est accédé. Vous n'aurez pas à chercher longtemps. Littéralement après quelques commandes, un sous-programme est appelé, en commençant par l'adresse 0x11b3, où ce tampon est copié et traité.
Graphique des fonctions de la procédure rf_signal_buffer_processing (0x11b3):

C'est exactement l'endroit dont nous avons besoin, mais cela semble un peu compliqué. Pour comprendre, j'ai commencé à dessiner des images. Quelque chose comme un organigramme.
La première chose qui se produit ici est que les données du tampon 0x4af sont copiées vers la nouvelle adresse - 0x49f et l'indicateur 0x4bd est réinitialisé:

L'extrait suivant est le plus intéressant:

En fait, il s'agit de la vérification complète de la commande reçue en direct. Bien que cela ne soit pas évident, mais une analyse plus approfondie a montré que la transition vers les branches suivantes est le traitement des commandes radio suivantes si la commande 0xcc a été reçue avant cela - passer en mode paramètres. J'étais intéressé par les nouveaux codes des équipes elles-mêmes. Y a-t-il autre chose que les codes de commande 0x11, 0x33, 0x55 et 0xcc.
Ni ici ni plus loin je n'ai pu trouver le traitement du dernier - sixième octet de la commande. Sur la figure, il est barré en rouge. Ainsi, toutes les équipes se composent de cinq octets. Au moins dans le firmware de l'AM82TV.
La première chose que nous voyons est de vérifier le cinquième octet du tampon - le code de la commande elle-même. Ici, il semble qu'il y ait eu de nouveaux codes de commande - 0xad et 0xda. La commande du tampon réussit le test si le champ d'adresse correspond à l'une des adresses déjà enregistrées dans eeprom, ou si le code de commande est 0xad, ou 0xda et le champ d'adresse == 0xaaaaaaaa.
Eh bien, nous considérerons que nous avons réussi le prochain test. Maintenant, le code de commande se trouve à 0x4bf. Nous devons trouver comment le contenu de cet octet est traité. Il existe plusieurs façons de procéder. La plus simple est une recherche de texte sur du code désassemblé dans Ghidra. Il reste à voir exactement où le contenu de cet octet est lu. Ce n'est pas un moyen garanti de trouver tous les appels, mais dans ce cas particulier, cela fonctionnera. Donc, tout d'abord, nous verrons une lecture d'octets dans la procédure commençant à 0x1262:

L'accès à celui-ci provient d'un seul endroit - une équipe située à 0x5e0.
Graphique de fonction:

C'est dommage, mais tous les codes de commande, à l'exception de ceux déjà connus: 0x11, 0x33, 0x55 et 0xcc sont ignorés dans cette procédure. Même les codes 0xad et 0xda trouvés à l'étape précédente. Au moins je n'ai pas réussi à trouver de nouveaux codes de commandes radio dans le firmware de la corniche électrique AM82TV.
Néanmoins, il y a accès au firmware, il peut être démonté, voir comment les fonctions spécifiques sont implémentées et changer quelque chose par vous-même. Ou même ajouter quelque chose.
Le firmware et le fichier avr8.pspec modifiés pour atmega168 sont publiés sur
GitHub .