ADC rápido Sama5d3

Estoy usando Ubuntu 14.04 y el compilador arm-linux-gnueabihf-gcc para compilar proyectos para la placa explicada sama5d3 y usando minicom y zmodem para transferir el código fuente compilado de la máquina ubuntu a la placa de desarrollo. La placa sama5 viene con Poky, la compilación de referencia de yocto linux. Mi objetivo final es acceder y leer registros para los dispositivos ADC y SPI.

He estado leyendo bien la hoja de datos aquí , en la página 1664, detalla el registro de estado del canal ADC; en la ubicación de memoria 0xF8018018. Linux obviamente proporciona una falla de segmentación cada vez que intento recuperar el valor allí. Un tutorial detallado sobre cómo usar mmap para IO mapeado en memoria también sería genial, ya que escuché que esto puede ser una alternativa.

La razón de esto es que puedo leer el ADC a 100 kmuestras/seg. Probablemente no sea posible acceder a las direcciones de memoria desde el espacio del usuario; si lo es, agradecería mucho que me hiciera saber cómo hacerlo. Si no, me gustaría saber cómo haría para crear una aplicación básica que me permitiera hacerlo. Atmel tiene un paquete de software GNU que incluye controladores ADC para el compilador arm-none-eabi-gcc. ¿Cómo haría para configurar esto para compilar y ejecutar programas en esta placa?

Para condensar todo esto:

Tengo:

  • Un escritorio con Ubuntu 14.04

  • la placa de desarrollo sama5d3-xplained

Las preguntas son:

  • ¿Hay alguna forma de acceder al ADC a velocidades >= 100 kmuestras/seg?

  • ¿Hay alguna forma de acceder a los registros desde una ubicación de memoria (como el registro de estado del canal ADC en la ubicación de memoria 0xF8018018) desde el espacio del usuario?

  • ¿Cómo haría para desarrollar una aplicación completa si la respuesta a la pregunta anterior es no?

Gracias por su ayuda y tiempo.

¿Ayuda lo siguiente? Suena similar a lo que busca y tiene un buen ejemplo de mmap: stackoverflow.com/questions/12827948/…

Respuestas (1)

Puede usar el controlador de dispositivo Linux AT91 ADC , pero probablemente no cumplirá con sus requisitos de velocidad (consulte también Uso del controlador AT91 ADC ).

Otra solución podría ser buscar la transferencia DMA para los registros ADC en alguna memoria de espacio de usuario. Esto también podría ser lo suficientemente rápido como para satisfacer 100 ksps. Todavía no he hecho tal cosa, pero podría valer la pena echar un vistazo a esto: Guía de mapeo dinámico de DMA .

Desafortunadamente eso no es de ayuda :/; Estoy bastante convencido de que la forma más fácil es usar mmap para mapear el periférico. ¿Alguna idea sobre cómo hacer eso?