Valkertown Home

2007-02-01-actualizacic3b3n at90usb1282c y lecturas adicionales

Bien, una buena noticia ya tengo completamente funcional el sistema USB, luego de resolver una serie de problemas.

EL código de ejemplo de ATMEL para GCC tiene problemas de impementación, el motivo es el siguiente, en el código de ATMEL se definen los "descriptors" de la siguiente forma:

struct usb_XXX_descriptor {
    U8 length,
    U8 type,
    ...
};
code struct usb_XXX_descriptor USB_xxx_descriptor_flash = {
  ... //Inicialización
};

Luego para retomar los valores de la flash:

code * pbuff;
...
pbuff=&(USB_xxx_descriptor_flash.size);
...
byte=pgm_read_byte_near(*pbuff++);
...

Aparentemente GCC tiene problemas para calcular la posición de memoria en flash si se trata de esta forma la estructura, luego de hacer unos experimentos llegue a que la mejor forma para tratar este problema:

struct S_usb_XXX_descriptor {
  U8 length,
  U8 type,
  ...
};

union PS_usb_XXX_descriptor{
   struct S_usb_XXX_descriptor desc;
   char ptr[sizeof(PS_usb_XXX_descriptor)];
}

...

code union  PS_usb_XXX_descriptor USB_xxx_descriptor_flash = { /* Importante!! */
  ... //Inicialización
};

...

pbuff=USB_xxx_descriptor_flash.ptr;

De esta forma GCC si calcula bien las direcciones en flash para los "descriptors", en el código de ATMEL existen dos referencias explícitas a este problema, marcadas con #warning, sin embargo existen otros más que es imperativo corregir.

De aqui en adelante he de modificar completamente el funcionamiento, pues HID no es adecuado para mi aplicación.

Algunas lecturas muy interesantes escritas por Eric S. Raymond's, uno de mis autores favoritos.

Eso es todo por ahora.

EOP

comments powered by Disqus

© 2008-2012 Carlos A. Perilla deepspawn at valkertown dot org | Based on original design by Andreas Viklund