banner
Centro de Noticias
Nuestra promesa es ofrecer tecnología experta y soluciones que sean confiables y eficientes.

Analizadores lógicos: aprovechando los secretos de Raspberry Pi

Sep 02, 2023

Hoy, me gustaría destacar una herramienta que lleva tus habilidades de piratería a un nivel completamente nuevo y lo hace sin arruinarte; de ​​hecho, considerando cuánto tiempo de depuración puedes ahorrar, cuántas actividades divertidas puedes desbloquear, y las numerosas funciones que puede agregar, esta podría ser una de las herramientas más baratas que obtendrá. Ya sea depurando problemas extraños, optimizando su código, investigando un dispositivo al que le está aplicando ingeniería inversa o tal vez tratando de comprender la biblioteca de código abierto de alguien, es probable que se esté perdiendo mucho si no tiene un analizador lógico a mano. !

Es desgarrador para mí que algunos piratas informáticos todavía no conozcan el valor que aporta un analizador lógico. Una y otra vez, la aplicación táctica de un analizador lógico me ha ayudado a ver una perspectiva completamente diferente sobre algo que estaba pirateando, y eso es justo lo que me gustaría demostrar hoy.

Un analizador lógico tiene varias entradas digitales y lee continuamente el estado de estas entradas digitales, enviándolas a su computadora o mostrándolas en una pantalla; es como un osciloscopio de solo nivel lógico. Si tiene un bus I2C con una MCU que controla un sensor, conecte un analizador lógico a los pines del reloj y de datos, conecte a tierra, inicie el software del analizador lógico en su computadora y vea qué está sucediendo realmente.

Por ejemplo, ¿alguna vez has notado los pines ID_SC e ID_SD en el conector GPIO de Raspberry Pi? ¿Te preguntas para qué sirven? ¿No quieres comprobar qué sucede realmente en estos pines? ¡Hagámoslo ahora mismo!

Estoy usando un analizador lógico de $10 que puedes conseguir en Aliexpress o Amazon, una computadora portátil y una Raspberry Pi con una tarjeta SD y una fuente de alimentación. Aquí está cableado: solo necesitas tres cables hembra-hembra, dos de señal y uno de tierra. “SD” y “SC” suenan como I2C; la frecuencia típica de I2C suele ser 100 kHz o 400 kHz. Una buena regla general es configurar la frecuencia para que sea tres o cuatro veces mayor que la frecuencia del reloj del flujo de datos que está a punto de capturar. Como tal, planeo configurar la frecuencia de muestreo de mi analizador lógico en 2 MHz. Si resulta demasiado lento para ponerse al día con los datos que se transfieren, puedo aumentar la frecuencia de muestreo y simplemente volver a realizar el muestreo.

El software que estoy usando es Pulseview: es una GUI maravillosa para analizadores lógicos y puede interactuar con una gran variedad de analizadores lógicos. Es de código abierto, compatible con Linux, pirateable y tiene una buena experiencia de usuario, incluso si no se le ha dado mantenimiento recientemente. Puedes instalarlo desde el repositorio de tu distribución o descargar el .exe si estás en Windows. Con el analizador lógico conectado, lo conecto a mi puerto USB, inicio Pulseview, configuro la frecuencia de muestreo y la duración de la lectura, que puede ser infinita, desactivo todos los canales excepto los dos que me interesan, presiono 'Capturar' y conecto el Pi. al poder.

Después de enchufar el Pi, los niveles lógicos en ambos pines aumentan cuando aparece una alimentación de 3,3 V y, después de unos segundos, hay una breve ráfaga de actividad en estos dos pines. Al acercarnos, la actividad realmente se parece a I2C, y en Pulseview, ¡es bastante fácil de decodificar! Presione el botón "Decodificadores de protocolo" en la barra de tareas de configuración, escriba "I2C" en su teclado, seleccione el decodificador I2C, luego haga doble clic en la etiqueta del decodificador a la izquierda y seleccione qué canales son SCL y SDA; es fácil saberlo, SCL se verá. como una señal de reloj con máximos y mínimos iguales, mientras que los intervalos máximos y mínimos en SDA variarán; En la imagen de arriba, D1 es SCL y D0 es SDA. Al acercarnos a los eventos I2C decodificados, podemos ver que esta actividad son solicitudes I2C para leer datos de la dirección 0x50, y estas solicitudes van seguidas de eventos NACK (marcador rojo), lo que significa que no reciben respuesta.

Ahora, si ha analizado el diseño HAT de Raspberry Pi, es posible que ya haya adivinado que estas solicitudes I2C provienen del gestor de arranque de Raspberry Pi, que busca la EEPROM I2C que contiene información del dispositivo HAT, para que Pi pueda cargar el dispositivo. Superponga en árbol los datos y utilice esos datos para configurar cualquier hardware en el HAT conectado. No tiene que depender de la poca información disponible en línea sobre este proceso: con un analizador lógico, puede investigar lo que realmente sucede, encontrar características ocultas y advertencias, de modo que incluso el hardware propietario sea un obstáculo menor para usted. como sea posible.

Este es un ejemplo sencillo de lo que puedes hacer con un analizador lógico y una Raspberry Pi con un encabezado de 40 pines. ¡Vamos a intensificarlo! Solo en la placa Pi, I2C se usa en algunos lugares diferentes: configuración de pantalla HDMI, configuración de cámara Pi, un expansor GPIO en el Pi 3 que compensa la falta de IO en la CPU, hay mucho. Puedes explorar todo esto por diversión, pero logremos un objetivo práctico real.

¿Qué podrías hacer con todo ese I2C? Bueno, aquí hay un problema pequeño pero situacional con las cámaras Raspberry Pi: no se pueden conectar en caliente; y si hay algo que sabemos con certeza es que no siempre es necesario respetar las limitaciones de la tecnología. Es posible que no siempre quieras tener tu cámara Pi colgando de un cable, por ejemplo; eso es un poco deficiente, es justo querer tener la cámara conectada solo si realmente quieres tomar una fotografía. Bueno, ahora podemos verificar lo que está sucediendo en el bus I2C de la cámara, y si ese es el culpable, hacer que sea conectable en caliente suena exactamente como el tipo de cosas que podríamos lograr; además, vamos a luchar contra el firmware propietario en ¡El Pi mientras lo hace!

Técnicamente, el firmware Pi solo reconocerá una cámara Pi si está conectada durante el arranque: el gestor de arranque de código cerrado verifica la presencia de la cámara durante el arranque, lo que ciertamente implica comunicación a través de I2C, tal vez incluso esté configurando algunos registros I2C específicos de la cámara; Si no tienes una cámara conectada durante el arranque, eso no sucederá y necesitarás reiniciar tu Pi para que la cámara funcione. Pero después del arranque, puedes desconectar la cámara y volver a enchufarla, ¡y funcionará bien!

Teniendo en cuenta este acertijo, supongo que realmente no hay ninguna razón por la que una cámara Pi no pueda funcionar si se conecta antes, aparte de la lógica inflexible de detección de arranque. El FPC predeterminado de la cámara tampoco es mecánicamente compatible con conexión en caliente, por lo que voy a solucionar este problema modificando el FPC para que los pines GND hagan contacto primero cuando lo conecte en caliente. Sin embargo, el principal problema persiste: el cargador de arranque Pi es de código cerrado y no podemos modificar la lógica de detección, por lo que solo se ejecuta una vez que el software intenta acceder a una cámara. Sin embargo, podemos piratearlo conectando nuestra propia MCU a ese bus I2C y haciéndola presente como una cámara en el bus I2C.

Aquí está la hoja de ruta: conectamos el analizador lógico al bus I2C de la cámara Pi, vemos qué tipo de actividad ocurre cuando se inicia el Pi, luego agregamos una MCU que conecta los pines I2C de la cámara; un RP2040 funcionará bien, dado que Puede funcionar como un periférico I2C. El hardware necesario para tal truco es mínimo: una placa de microcontrolador y algunos cables de puente, eso es todo.

Después de soldar las resistencias pull-up del bus I2C de la cámara en un Pi Zero, capturé las comunicaciones I2C en el arranque con la cámara v1 conectada, y aquí están mis hallazgos. Se consultan tres direcciones I2C en el arranque: 0x10, 0x1a y 0x36, mi cámara responde a 0x36. Aparentemente, se usa 0x10 para el sensor de la cámara Pi v2, y supongo que 0x1a es la cámara de 12 MP.

Con la cámara v1 de 5 MP que utilicé, no se escribe nada en los registros; parece que solo hay tres transacciones que se leen de los registros del sensor de la cámara, y cada transacción envía primero dos bytes de escritura, que normalmente es una dirección de registro en dichas transacciones. ¡Tener direcciones de registro de dos bytes hace que estas transacciones parezcan un poco raras! Dicho esto, poder desconectar la cámara y volver a enchufarla sin problemas me lleva a creer que no debería ser un problema.

Ahora que sé lo que está sucediendo bajo el capó, desconectaré los tres cables de puente del analizador lógico, los conectaré a una pequeña placa RP2040 que tengo y comenzaré a piratear el lado del software del proyecto. Si puedo poner en marcha el firmware de emulación de periféricos I2C, tendré operativa la conexión en caliente de la cámara Pi v1 para todos los propósitos de construcción de mis dispositivos portátiles. Así, con un analizador lógico y tres cables, hemos descubierto una manera de agregar capacidad de conexión en caliente a la cámara Raspberry Pi, algo que se consideraba imposible hasta que decidimos probarlo.

En este tipo de truco es donde un analizador lógico es la mejor herramienta para el trabajo, y es posible que hayas notado que algunas partes cruciales de este truco, a saber, detectar los datos I2C que se transmiten, no son factibles sin un analizador lógico.

También le brinda información sobre cómo funcionan las cosas patentadas: tanto en el ejemplo de detección de HAT EEPROM como en el ejemplo de detección de cámara, podemos ver que cada transacción fallida se repite tres veces, y no se equivocaría si adivinara que el gestor de arranque de Raspberry Pi El código tiene un contenedor de transacciones I2C que reintenta las transacciones I2C en caso de que una transacción falle falsamente: ¡una buena práctica de principio a fin!

¿Está pensando en adquirir un analizador lógico? Los analizadores son excelentes para lo que son y serán suficientes para la mayoría de las tareas, y cuestan alrededor de $10 en los mercados en línea típicos, más que suficiente para todas las cosas que desee probar. También puede usar un Pi Pico como analizador lógico, aunque encontrará que probablemente tenga que compilar Pulseview y el software interno usted mismo para incluir soporte para eso, algo factible pero menos sencillo que usar uno de los basados ​​en FX2. analizadores con soporte estándar Pulseview.