¿Cómo se comunica AVRDUDE con el programador?

1

Estoy tratando de entender exactamente cómo AVRDUDE se comunica con el programador AVR, por ejemplo, USBtiny o Arduino como programador, para enviar el firmware al microcontrolador.

Como motivación para mi pregunta, supongamos que quiero crear un programador USB en el sistema para un microcontrolador AVR desde cero. Entonces, usando otro microcontrolador, construyo un ISP que puede cargar código al AVR.

Ahora, ¿qué sucede si deseo usar AVRDUDE para enviar a mi ISP algún código para cargar en mi microcontrolador? ¿Qué tipo de protocolo utilizará AVRDUDE para enviar el código a través de USB, de modo que pueda leerlo correctamente y generar el SPI correcto para programar el AVR? ¿Cómo las personas que crearon USBtiny, por ejemplo, sabían (o especificaban) el protocolo que usaría avrdude para enviar los datos a USBtiny, para que pudieran interpretarlos correctamente?

Cualquier ayuda es apreciada!

¡Gracias!

    
pregunta felipeek

2 respuestas

3

Esto es más, pertenece a stackoverflow y está más relacionado con los controladores de dispositivo. Sin embargo,

En la actualidad, los controladores de dispositivos USB están escritos en ring3 en lugar de ring0. En inglés son controladores en modo usuario. Cualquier sistema operativo moderno expone la funcionalidad de nivel de interfaz de la pila USB al modo de usuario por API. Y hay bibliotecas como libusb, winusb para acceder a ellas en modo de usuario, así que en teoría, solo necesitas estudiar cómo usar una biblioteca como libusb.

Entonces, el tipo de AVR, con suficientes permisos, puede acceder a sus puntos finales y escribir y leer desde ellos. Así es como funciona.

Y de la fuente de avrdude, este es el archivo que define la forma de comunicarme con mi programador, (perdón, estoy usando usbasp). enlace

Puedes ver que está usando libusb si está en Linux.

void usbasp_initpgm(PROGRAMMER * pgm)
{
  strcpy(pgm->type, "usbasp");

  /*
   * mandatory functions
   */

  pgm->initialize     = usbasp_initialize;
  pgm->display        = usbasp_display;
  pgm->enable         = usbasp_enable;
  pgm->disable        = usbasp_disable;
  pgm->program_enable = usbasp_spi_program_enable;
  pgm->chip_erase     = usbasp_spi_chip_erase;
  pgm->cmd            = usbasp_spi_cmd;
  pgm->open           = usbasp_open;
  pgm->close          = usbasp_close;
  pgm->read_byte      = avr_read_byte_default;
  pgm->write_byte     = avr_write_byte_default;

  /*
   * optional functions
   */

  pgm->paged_write    = usbasp_spi_paged_write;
  pgm->paged_load     = usbasp_spi_paged_load;
  pgm->setup          = usbasp_setup;
  pgm->teardown       = usbasp_teardown;
  pgm->set_sck_period = usbasp_spi_set_sck_period;

}

Puede ver que cada programador compatible con avrdude tiene que admitir esas funciones, para que pueda comprender esta abstracción y cómo el archivo usbasp.c los convierte en específicos del programador. Le animo a leer el código fuente de su programador. Buena suerte.

FYI: Para su programador usbtiny, la fuente es aquí :

    
respondido por el Standard Sandun
1

Debe leer AVRDude en concierto con la documentación de Atmel en el AVRISP II

AVRDude no programa el AVR MCU, envía comandos / paquetes / bloques al programador a través de un canal en serie en el caso de Arduino como ejemplo.
El programador (en Arduino el gestor de arranque actúa como un AVRISP II) administra la programación (auto) Flash del dispositivo (el ATMega328 en Arduino) mientras deja el cargador de arranque intacto.

De su pregunta no queda claro exactamente qué desea hacer. Sin embargo, usted podría:

  1. Cree su propio gestor de arranque para un AVR MCU, y envíelo datos en serie a través del uart o USB / serial
  2. Cree y programe su propio programador SPI o HV (para que actúe como un AVR ISP II) basado en un AVR MCU y envíe datos en serie (o USB / serie) a ese. Los programadores podrían entonces utilizar ICSP / SPI para programar su dispositivo final.

Para obtener buenas ideas sobre qué hacer para su proyecto, investigue el Esquema nano de Arduino (esto es una implementación basada en el cargador de arranque con USB / datos en serie) o Arduino Esquema UNO que utiliza un AVR AtMega16u2 separado como programador (el ATMega16U2 emula un AVRISP II, USB / serie. Programa el dispositivo final como un número de serie para el cargador de arranque)

    
respondido por el Jack Creasey

Lea otras preguntas en las etiquetas