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í :