Acceso a memoria asignada a Dispositivos de E/S

Bueno antes que nada saludos, espero me puedas ayudar en este problema que tengo.
Hay alguna manera de acceder a las localidades de memoria que están en el rango de espacio asignado a Dispositivos de E/S?
Se trata de una tarjeta que recibe la hora en un formato (IRIG-B) de un reloj GPS vía coaxial y la tarjeta esta (TCR1000) decodifica la hora de tal manera que pueda ser leída por medio de acceso a localidades de memoria asignada al dispositivo, esta memoria es la que el BIOS asigna dinámicamente a cada dispositivo al arrancar el sistema, entonces no se que onda si se pueda hacer directamente el acceso porque también en el manual de la tarjeta habla de llevar a cabo un Driver Request.
Espero haber sido claro y también que me puedas ayudar.

1 respuesta

Respuesta
1
Primero se debería aclarar si en verdad la tarjeta mapea en memoria RAM sus registros internos, esto es muy poco frecuente ya que la mayoría de periféricos ponen sus registros en direcciones de entrada/salida y no en memoria.
Sin embargo la tarjeta TCR1000 debe venir con sus drivers e inclusive con su kit de desarrollo que es el que se debería usar para el desarrollo, por favor explicame por que no usas dicho kit.
Si no se piensa usar dicho kit de desarrollo, las cosas dependen mucho del tipo de protocolo que tenga la tarjeta (lo siento pero no conozco dicha tarjeta). Pues el protocolo puede requerir atención a interrupciones o cumplir con ciertos tiempos en el momento de hacer entrada/salida. Esto sin contar si se trata de PCI, PCMCIA etc.
Bueno suponiendo que es una tarjeta que simplemente usa direcciones de entrada / salida para enviar sus datos, en C se puede usar la directiva:
- int inp(unsigned portid);
- U otras como inpw, inport que son similares.
Estas funcionan tanto en dos como windows y linux.
Portid es el numero del puerto que correspondería a la dirección de entrada /salida. Por ejemplo si quieres leer el status del puerto paralelo se podría hacer:
A=Inp(0x379) // 0x379 es la direccion de status del
// puerto paralelo
Si este es el caso me imagino que la documentación de la tarjeta tiene la dirección en donde esta la E/S de la misma. Es importante tener en cuenta que si la E/S es más compleja que esto es probable que sea necesario escribir un driver (repito si el mismo no viene con la tarjeta), no tengo experiencia en drivers de windows pero si en drivers de linux
Finalmente si definitivamente la tarjeta mapea su E/S a la RAM del equipo, esta se puede acceder definiendo direcciones de memoria absolutas. PERO ESTO NO ES POSIBLE EN SISTEMAS OPERATIVOS COMO WINDOWS O LINUX, por que ellos impiden que programas accedan a direcciones de memoria que no tienen destinadas. Así que en este caso DEFINITIVAMENTE habría que escribir un driver.
Por favor, explicame:
- ¿Qué sistema operativo vas a usar?
- No tienes un driver para la tarjeta en esa plataforma, ¿no tienes un kit de desarrollo?
Gracias, por tomarte la molestia de contestarme, bueno primero que nada déjame aclararte que se trata de una tarjeta PCI, la cual viene en efecto con sus drivers y kit de desarrollo, sin embargo, la intención es que la aplicación interrogue a la tarjeta en la plataforma de QNX, y dado que el kit de desarrollo incluye funciones que hacen uso de la API de windows no será posible implementarlo tal cual en QNX, ahora bien en la documentación aparecen las direcciones de memoria a las que se accede y dice que de acuerdo a la dirección que se esté accediendo, la tarjeta identificará por medio de su driver(donde supongo que driver se trata de un chip, puesto que esa documentación va dirigida a los que no emplearán el kit de desarrollo) si se trata de escritura/lectura. Esto me indica que la tarjeta mapea su E/S en RAM.
Encontré una función en el sitio de QNX:
//------------------------------------------------
mmap_device_memory()
Map a device's physical memory into a process's address space
//------------------------------------------------
Esta pinta como que será la que utilizaré.
Saludos y mil Gracias por la molestia que te tomas en contestar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas