pci-software tool kit - pci-tools.de · usuario obtiene un acceso al hardware de pci-proto lab y...

68
PCI-Software Tool KIT Manual de instrucciones HK Messsysteme GmbH Koepenicker Str. 325 12555 Berlín/Alemania Julio 2005

Upload: hoangque

Post on 16-Oct-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

PCI-Software Tool KIT

Manual de instrucciones

HK Messsysteme GmbH Koepenicker Str. 325

12555 Berlín/Alemania

Julio 2005

2

3

Indice

1 INTRODUCCIÓN......................................................................................................................................... 5

2 DRIVERS...................................................................................................................................................... 7

2.1 LA BIBLIOTECA DE FUNCIONES EN C PARA MS-DOS ................................................................................. 7 2.2 EL DRIVERS DEVICE VIRTUAL PROTOLAB.VXD PARA WINDOWS95 .................................................... 13 2.3 EL KERNEL DRIVER PPLNT.SYS PARA WINDOWS NT ........................................................................... 17

3 EJEMPLO DE APLICACIÓN .................................................................................................................... 20

3.1 LA ENTRADA Y SALIDA DE DATOS A TRAVÉS DE DIRECCIONES DE PUERTAS ............................................. 20 3.2 USO DEL PCI BUSMASTER TRANSFER PARA TRANSMISIÓN RÁPIDA DE DATOS ......................................... 22

APÉNDICE A FUNCIONES DRIVER INDEPENDIENTES DEL SISTEMA OPERATIVO ........................... 27

APÉNDICE B FUNCIONES ESPECIALES DE LA BIBLIOTECA C PARA MS-DOS.................................... 44

APÉNDICE C FUNCIONES ESPECIALES DEL DRIVER VXD PARA WINDOWS95.................................. 47

APÉNDICE D FUNCIONES ESPECIALES DEL KERNEL DRIVERS PARA WINDOWS NT ...................... 59

APÉNDICE E GRÁFICOS DE FIFO-DIRECT READ ........................................................................................ 62

APÉNDICE F GRÁFICOS DE FIFO-BUSMASTER POLLING .......................................................................... 63

APÉNDICE G GRÁFICOS DEL FIFO-BUSMASTER INTERRUPT................................................................... 64

APÉNDICE H DESCRIPCIÓN DE CIRCUITO POR EJEMPLO FIFO-BUSMASTER TRANSFER.................. 66

APÉNDICE I PROVEEDORES / DIRECCIONES DEL WEB ........................................................................... 67

4

5

1 Introducción

Gracias por la compra del PCI-Software Tool KIT, el cual representa el software base del PCI-Proto LAB de HK Messsysteme para desarrollar hardware. Todo el software necesario para los sistemas operativos DOS, Windows 95 y Windows NT están incluidos, con el cual el usuario obtiene un acceso al hardware de PCI-Proto LAB y con esto le permite elaborar programas y pruebas de uso propio. El PCI-Software Tool KIT se diseño para apoyar el PCI-Control S5933 de la firma AMCC. Las funciones de los drivers incluidos en el PCI-Software Tool KIT posibilitan el acceso a todos los registros de las interfaz Add-On, incluidas Pass-Thru-(Micro Processor Unit), FIFO, Mailbox, Interrupt y EEPROM de este PCI-Control. Una segunda tarea de los drivers consiste en reconocer y poner a disposición los resources del sistema, que se le asigna al hardware-prototipo, a través del PCI-BIOS cuando se botea la computadora. Los procedimientos y rutinas de inicialización del sistema PCI-bus que ocurren cuando se hace partir una computadora son diferentes, dependiendo de la platina principal (Motherboard). En sistemas viejos, se asignan los resources en el SETUP de la platina principal a determinados PCI-slots; con esto se quiere evitar conflictos con componentes de la computadora que no apoyan la tecnología Plug-and-Play (PnP) , como por ejemplo cartas para el sistema ISA-bus. Mientras más moderna es la computadora, se puede rutear en forma más flexible los resource durante el boteo del sistema PCI-bus. En todo caso permanece responsabilidad del usuario el asignar en forma fija algunos resources (IRQs, I/O direcciones) para las cartas del sistema ISA-bus y el resto de los resources dejarlos libres para una administración dinámica a través de los componentes que apoyan la tecnología Plug-and-Play (PnP). Solamente cuando se botea la computadora y PCI-BIOS reconoce los resources como libres, se pueden poner a disposición los valores deseados. El software para la PCI-Devices no debe por lo tanto utilizar ni direcciones ni IRQs fijos, sino debe permitir el otorgar resources en forma flexible. Para que una carta en el sistema PCI-bus se pueda encontrar y obtener su resource correspondiente, ella posee ( todos los aparatos conectados al PCI-bus) un Vendor-ID y un Device-ID. El Vendor-ID fue otorgado a través del PCI-SIG a AMCC y no se le debe alterar. La Device-ID fue otorgada especialmente para PCI-Proto LAB. Los drivers del PCI-Software Tool KIT buscan los siguientes Ids en la PCI-Proto LAB: Vendor-ID: 10E8h Device-ID: 8170h A continuación pueden ser leídos y cargados los resources que están a disposición.

6

El usuario de PCI-Proto LAB puede solicitar a AMCC un Device-ID propio para su aplicación, así se puede garantizar una identificación única en el PCI-bus. El formulario correspondiente se encuentra en el manual del PCI-Control. Los drives para Windows 95 y Windows NT, con exepción de las interrupciones, son de validez general. El uso especifico tiene que estar situado Interrupt-Service-Routine. Esta rutina cumple con: • reiniciar el estado de interrupción y registro de control del AMCC S5933, • cargar el Master-Write-Transfer-Counter-Register (MWTC) con el número de Bytes que se van a transferir,

• cargar el Master-Write-Address-Register (MWAR) con la dirección de destinación física para la transferencia y

• inicializa la transferencia del bus master. Además de los drivers y la librería de funciones el PCI-Software Tool KIT contiene dos ejemplos de aplicación. Ellos posibilitan el inicio en forma fácil del PCI-Proto LAB en diferentes sistemas operativos. Como también se incluyen los códigos fuentes en el PCI-Software Tool KIT, estos sirven de base para desarrollos futuros. En el primer ejemplo se demuestra el acceso en modo Pass-Thru al hardware Add-On. Las direcciones de las puertas se ponen a disposición en la forma acostumbrada para la entrada/salida de datos desde/hacia la periferia. El ejemplo es apoyado por el hardware de la PCI-Proto LAB y por eso puede ser ejecutado en cualquier sistema operativo. En el segundo ejemplo se usa para la transferencia de datos desde la PCI-Proto LAB (periferia) hacia la memoria del computadora la interfaz FIFO del AMCC S5933. Esta interfaz esta diseñada para la transferencia rápida de bloques grandes. El AMCC S5933 puede funcionar como PCI-busmaster y tomar el control del PCI-bus durante la transferencia. Nuestras mediciones verifican una rapidez de transmisión mayor a 106 Mbytes/s. El valor teórico de 132 Mbytes/s se obtiene al multiplicar la frecuencia del PCI-bus 33 Mhz por el ancho del bus 4 Bytes. Este valor teórico no se puede obtener en la práctica porque el PCI-bus no puede ser accedido exclusivamente para una transferencia en forma continua durante todo el tiempo. El hardware para el segundo ejemplo no esta incluido en forma standard en el prototipo, pero puede ser agregado en forma fácil por el usuario. El PCI-Software Tool KIT contiene además del programa ejecutable y su código fuente un circuito probado con una descripción completa.

7

2 Drivers

2.1 La biblioteca de funciones en C para MS-DOS

Bajo el sistema operativo DOS hemos renunciado en forma consecuente al uso de drivers TSR, con ello se pueden mantener transparente los procesos. Es por esto que hemos incluido una biblioteca de funciones en C, que el usuario puede utilizar en sus programas. Con esto es posible seguir en forma individual cada acceso al hardware. La biblioteca de funciones esta dividida en grupos de funciones. Ella contiene los módulos siguientes: PCI_BIOS.CPP, PCI_EEPR.CPP, PCI_PT.CPP, PCI_FIFO.CPP, PCI_IRQ.CPP, PCI_MAIL.CPP, PCI_REG.CPP. Los nombres de los módulos se refieren a su funcionalidad. PCI_BIOS.CPP:

Este módulo define la interfaz hacia PCI_BIOS. Él contiene las funciones que trabajan directamente junto con el PCI_BIOS en el software de interrupción 1Ah. Es por esto que siempre se debe primero que nada verificar con

pci_bios_present

si el PCI_BIOS existe y es accesible.

La función find_pci_device

será inmediatamente ejecutada por el interrupción-software del PCI_BIOS. Esta es necesaria para conocer las “coordenadas” del hardware. Estas coordenadas son: el número del bus, el número de la Device de la PCI-Device en ese bus y número de la función de la Device. Si se trata de de una multifunción Device. Una single funtion Device (como el AMCC S5933) tiene siempre el número de función 0. Ya que en un sistema PCI-bus pueden existir hasta 256 buses, los números de buses son de un largo de 8 Bit. En cada bus pueden contener hasta 32 Devices (5 Bit) y cada Device puede tener hasta 8 funciones (3 Bit). El número de Device y el número de función serán combinados en un Byte como Device&Function. Recién con estos valores se puede acceder al espacio de configuración PCI del PCI-Proto LAB a través de los comandos:

8

read_configuration_dword

write_configuration_dword

A través de estas funciones pueden ser leídas desde el espacio de configuración la dirección de partida de las direcciones asignadas de regiones y configuraciones IRQ otorgadas. Especialmente la dirección base para el mismo S5933 esta en el registro del espacio de configuración 10h como la dirección de región 0.

PCI_ERRPR.CPP:

En éste módulo están resumidas las funciones de acceso al On-board-EEPROM. El EEPROM contiene el programa POST y el requerimiento de resources, como por ejemplo cantidad, tipo y tamaño necesario a reservar de direcciones de regiones. Estas funciones pueden ser solo utilizadas después que el PCI-BIOS fue ejecutado y la PCI-Device fue identificada como así también el número del bus y la Device&Function. Además se debe leer en el espacio de configuración la dirección base ( dirección región 0) del S5933. El acceso al EEPROM se realiza en varios ciclos. Primero se escribe la dirección deseada en el EEPROM con : write_address_eeprom

Después se debe esperar la respuesta del EEPROM wait_for_ready_eeprom

Ahora se puede acceder a escribir y/o leer write_byte_eeprom

read_byte_eeprom

Y para esperar la finalización del acceso wait_for_ready_eeprom

Las funciones write_eeprom_area

read_eeprom_area

realizan una repetición del procedimiento anterior todas las veces que sea necesario. Se recomienda en general trabajar con los comandos write_eeprom_area y read_eeprom_area, que la complexidad del procedimiento de accesos al EEPROM se limita. Una exepción en este contexto es la función: read_eeprom_size

9

ya que esta no accede al EEPROM si no que accede al XROM del registro de operación del AMCC S5933.

PCI_PT.CPP: En este módulo se ponen a disposición funciones para el acceso en modo Pass-Thru.

Después de la identificación de las direcciones básicas acordadas para las regiones I/O, se pueden acceder a éstas en forma clásica, como direcciones de puertas. Las direcciones individuales de puertas se deben entender como Offset de las direcciones base correspondientes. La posibilidad, de acordar varias regiones se puede utilizar para realizar diferentes hardware en una carta. Es así por ejemplo que en la PCI-Proto LAB puede existir una región de 32 Bit de ancho para operaciones I/O junto a regiones para periferia de 8 Bit con diferentes velocidades de acceso. Para escribir/leer datos de 8 Bit hacia/desde un prototipo con 8 Bit I/O se usa: write_Passthru_byte

read_Passthru_byte

Y para el acceso de 32 Bit a una periferia de 32 Bit, se utiliza write_Passthru_dword

read_Passthru_dword

Para evitar errores el usuario se debe preocupar que coincidan el formato de los datos y la región de destinación.

PCI_FIFO.CPP:

Este módulo contiene las funciones que permiten programar la interfaz FIFO, que trabaja en forma sincrónica con la frecuencia del bus, del AMCC S5933. Esta interfaz permite un transferencia DMA desde/hacia una carta adicional para/desde el RAM de la computadora. Add-On hacia PCI significa escribir en el RAM de la computadora, PCI hacia Add-On significa leer desde el RAM de la computadora. El control posibilita tres modos de uso de la interfaz FIFO: • Leer/escribir directamente desde/hacia el registro del FIFO, aquí se leerá/escribirá directamente en la puerta 20h del FIFO

• A través del Polling se controla la transferencia del bus master(escribir/leer). Aquí se leerá/escribirá un bloque de datos de un tamaño determinado en una dirección física determinada. Después que la cantidad de datos deseados ha sido transferido y el Master-Write/Read-Transfer-Count(MW/RTC)-Register tiene el valor 0, se finaliza el acceso al bus Master y el control se le devuelve al PCI-Host-Bridge. A

10

través de un requerimiento al MW/RTC-Register (Polling) se puede verificar si le transferencia está finalizada o no.

• A través de interrupciones se controla la transferencia del bus master(escribir/leer). Aquí ocurre lo que se describió en el punto anterior, con la diferencia que para la vuelta cero del MW/RTC-Register se activa una interrupción. El servicio de rutina de interrupción puede entonces reorganizar y reiniciar servicio del bus Master.

Para la programación del servicio del bus Master se debe antes que todo prohibir explícitamente el servicio del bus Master, para que durante la reinicialización éste no parte por accidente. Esta regla de seguridad se consigue con los comandos: disable_fifo_read_master

disable_fifo_write_master

Y para resetar los FIFOS utilice: reset_ado_2_pci_fifo_flags

reset_pci_2_ado_fifo_flags

Con esto los valores que contenían los FIFOS se pierden, y los flags que indican el estado del FIFO (lleno/vacío) se borran. Se debe fijar la prioridad del bus Master (escribir antes que leer o leer antes que escribir). Hay que acordar a partir de cuando el FIFO exige el servicio del bus Master, por ejemplo cuando el FIFO está lleno con 4 palabras dobles. La función ini_fifo_mastering

ejecuta esta inicialización para una escritura (write) bus Master a través de la programación del Bus-Master-Control/Status(MCSR)- Registers. A continuación tiene dar a conocer fuente y dirección de destinación y la cantidad a transmitir de Bytes (no palabras dobles) a el MWTC/MRTC-Registerdel AMCC S5933. Para ello se utilizan: set_write_target_address o set_read_source_address

set_write_transfer_count o set_read_transfer_count

Después se puede hacer partir el transferencia del bus Master con las funciones: enable_fifo_read_master o enable_fifo_write_master

Se recomienda utilizar para control de la transferencia del bus Master (Polling) las funciones siguentes: fifo_masterwrite_transfer

fifo_masterread_transfer

11

Para la transferencia controlada a través de interrupciones falta aún la programación del Interrupt-Control/Status-Register (INTCSR)

PCI_IRQ.CPP: Este módulo pone a disposición las funciones para el uso de interrupciones.

Antes que se accione una interrupción se debe validar el nuevo servicio de rutina de las interrupciones, esto se realiza con el comando siguente: set_new_int_handler

Con esto se instala un sistema de interrupciones, como en DOS. Los números otorgados a los IRQ deben ser leídos desde el espacio de configuración. Para poder realizar transferencias controladas por interrupciones, hay que programar el INTCSR. Aquí hay que borrar los indicadores de los interrupciones colocando los Bits 16...19 y dependiendo de el modo de uso, el Bit 14 para Interrupt-On-Busmaster-Write o el Bit 15 para Interrupt-On-Busmaster-Read-Complete con las funciones: get_interrupt_register

set_interrupt_register

se tiene el acceso correspondiente. En el servicio de rutina de interrupción hay que organizar nuevamente le transferencia del bus Master. (mire PCI_FIFO.CPP)

PCI_MAIL.CPP:

Este módulo pone a disposición las funciones para el acceso a la interfaz Mailbox del AMCC S5933 write_mailbox

read_mailbox

read_mailboxstatus

reset_mailbox_flags.

PCI_REG.CPP:

Este módulo contiene solamente dos funciones, que permiten el acceso general al registro de operaciones del AMCC S5933 write_operation_register

read_operation_register

Aquí se debe dar en forma explícita la dirección base del AMCC S5933 y el Offset del registro concreto. A base de estas dos funciones se construyeron los otros módulos, que tienen acceso al registro de operaciones del AMCC S5933.

12

En el apéndice B se encuentra una descripción acabada de la biblioteca de funciones de C++ para el sistema operativo MS-DOS. El apéndice A contiene funciones que son independientes del sistema operativo. Además se incorporaron a el PCI-Software Tool KIT todas las fuentes C++ de los diferentes módulos. Para el uso propio de estas fuentes se deben procesar en la forma acostumbrada en Borland-C++.

13

2.2 El Drivers Device virtual PROTOLAB.VXD para Windows95

Los drivers para Windows95 consisten, en los drivers de devices virtuales dinámicos cargables PROTOLAB.VXD y la biblioteca de funciones PROTALAB.DLL. Bajo Windows95 el acceso al hardware de la computadora es más complejo que bajo DOS. Por motivos de seguridad del sistema y porque un sistema multi tasking no permite el acceso directo de las aplicaciones al hardware. A cambio se incorporan niveles de privilegios. Estos determinan a que datos y a que comandos de un programa se puede acceder. La mayoría de los componentes del sistema operativo de Windows95 son ejecutados en el nivel de privilegios más alto (ring-0). Programas de aplicación corren en el nivel más bajo (ring-3). En ese sentido son: Kernel, User y GDI de Windows 3.1/3.11, aplicaciones (ring-3), las cuales no tienen un privilegio mayor que otras aplicaciones. Un papel principal juega en el concepto de Windows95 la idea de las maquinas virtuales (VM) especialmente el manager de maquinas virtuales (VMM), el cual representa el sistema operativo. Windows95 utiliza las maquinas virtuales para administrar, entre las diferentes aplicaciones, el procesador y otros recursos que existen físicamente solo una vez en el sistema. Aquí se trata que un software, que puede simular para cada aplicación la existencia de un hardware real; es decir que el hardware que solo existe una vez, es virtualizado. Solo de esta forma pueden ser ejecutados simultáneamente varias aplicaciones en una computadora. Con esto es también posible producir por ejemplo una interfaz MS-DOS standard (la maquina virtual DOS) que alcanza una compatibilidad entre aplicaciones viejas de Windows y programas DOS. Esta se pueden usar casi sin limites. Esencialmente el sistema operativo Windows95 es una colección de drivers de maquinas virtuales (virtual device driver, VxD), que virtualizan el hardware existente y lo ponen a disposición de las aplicaciones. También en VMM es en el fondo un VxD. En la figura 1 se visualiza la construcción principal de Windows95. En interese de una solución moderna nosotros nos hemos decididos por la integración de PCI-Proto LAB bajo Windows95 por una VxD. Con esto evitamos el tener que operar desde la maquina virtual DOS. Las ventajas del sistema operativo de 32 Bits serán usadas en forma consecuente desde el ring-0-(Driver) hasta el ring-3 (Aplicaciones).

14

Figura 1: Construcción de Windows95

El driver de la maquina virtual PROTOLAB.VXD será inicializado por las aplicación correspondientes. Él virtualiza el hardware del la PCI-Proro LAB y garantiza el acceso al más alto nivel (ring-0). La interrupción otorgada por el PCI-BIOS durante el boteo, será integrado en el sistema de interrupciones de Windows95. (virtualización de las interrupciones) y con esto se puede utilizar en las aplicaiones. El acceso al driver (VxD) en el ring-0 no es cómodo. Por eso se realizo un ring-3-DLL, el cual realiza el acceso directo al VxD. Con esto se pone a disposición del diseñador una poderosa biblioteca de funciones para los trabajos de desarrollo con PCI-Proto LAB. Para instalar los drivers se tienen que copiar los archivos PROTOLAB.VXD y PROTOLAB.DLL en el directorio \Sistema de su sistema Windows. Para no sobrecargar su sistema hemos renunciado a los archivos *.ini y otras entradas en los registros. La registración de el hardware del PCI-Proto LAB y PCI-Software Tool KIT se realiza solamente durante el proceso PnP de boteo de la computadora bajo la Subkey del PCI-bus: HKEY_LOCAL_MACHINE\Enum\PCI con la subkey: \VEN1080&DEV8170 El aviso a través del sistema operativo Windows, que ha encontrado hardware nuevo, se deben ignorar pues los drivers se deben copiar “a mano”. En el campo Sistema de SystemControl, en el panel DeviceManager, ha generado Windows 95 un icono con un

Hardware fisicamente existente

Virtueller Maschinen Manager (VMM) / Virtual Device Driver (VxDs)

32-Bit-Windows95 Aplicaciones

Windows 3.1/3.1 *.DRV - Drivers

MS-DOS und CONFIG.SYS -Drivers

Windows 3.1/3.11 KERNEL, USER GDI-Module

Windows 3.2/3.11 Aplicaciones

MS-DOS Aplicaciones

Maquina Virtual DOS-: V86

ring-3

ring-0

15

signo de interrogación y el directorio Otros Componentes. Como subdirectorio existe PCI-Card, después del clic en la tecla propiedades encuentra Ud. los resources que el PCI-BIOS le otorgo a PCI-Proto LAB. ¿Como se pueden utilizar las funciones DLL? • Al elaborar una aplicación se usan las funciones DLL a través de la vinculación de la libre-ría PROTOLAB.LIB (para MS VisualC++), o PPLBC.LIB (Borland C++ y WATCOM C)

• El archivo handler PPLDLL.H, que contiene la definición de las funciones, se da a conocer en las aplicación a través del comando #include.

El acceso al prototipo es solamente posible, después que fue cargado exitosamente el dynamic virtual device driver para la PCI-Proto LAB en el sistema operativo Windows 95. Para este objetivo sirve la función: load_driver La diferencia con las aplicaciones en MS-DOS, es que las interrupciones de software del PCI-BIOS no están a disposición. En las DDL existen las funciones: get_last_busnumber

find_pci_to_pci_bridge

find_pci_device

get_class_code

read_configuration_space_register

write_configuration_space_register

con estas funciones pueden las aplicaciones encontrar el PCI-Proto LAB en el PCI-bus y pueden leer el espacio de configuración y los resources reservados. La administración y realización de funciones especiales para los drivers de Windows95 se utilizan: virtualize_irq

unvirtualize_irq

get_irq

alloc_physical_memory

free_physical_memory

get_apm_size

get_apm_addr

set_amcc_base

get_amcc_base

Como ya se menciono anteriormente, el IRQ, que fue otorgado a la carta por el PCI.bus, se tiene que virtualizar para ser usado bajo Windoews95. El driver realiza esta tarea después que se le haga un requerimiento. Recién después que la aplicación encontró la carta y conoce los recursos del hardware, entonces puede a través de driver con el comando virtualize_irq virtualizar el IRQ. Antes de finalizar la aplicación se debe dejar libre la interrupción con el comando unvirtualize_irq. Pues para un nuevo arranque del driver de la IRQ no estaría a disposición.

16

En el VxD hay funciones que permiten el exigir la memoria física existente y obtener la dirección de partida física (alloc_physical_memory), como así también dejarla libre (free_physical_memory). Ya que Windows95 trabaja usando mucha memoria, se puede usar bloques de memoria fisicos a partir de 32 MB RAM. Las funciones get_apm_size y get_apm_addr obtienen la información necesaria donde se localiza la memoria física. Estas informaciones son necesarias para que se pueda programar el AMCC S5933 en el busmaster modo. Para la transferencia DMA se necesita una dirección física y un bloque de memoria física continuo. Las funciones set_amcc_base y get_amcc_base se necesitan para control de interrupciones en el modo transferencia busmaster. Con esto se da a conocer en la servicio de rutina de interrupción la dirección base del S5933. En el apéndice C encuentra Ud. una descripción completa de las funciones especiales de los drivers -VxD para Windows95. En el apéndice A contiene las funciones, que se pueden utilizar en forma independiente del sistema operativo.

17

2.3 El Kernel Driver PPLNT.SYS para Windows NT

El sistema operativo Windows NT le da gran importancia a la estabilidad del sistema, por lo tanto la autorización para el acceso a datos, memoria, códigos y hardware, es más estricta. Programas diferentes corren en niveles de privilegio diferentes. Se puede simplificar pero a la vez diferenciar entre programas (drivers) que corren al más alto nivel de privilegios (Kernel Mode) y otros que corren en niveles inferiores de priviligios (User Mode) (ver figura 2).

Figura 2: El Kernel de Windows NT Kernel Mode - User Mode - Model (MSDN-Library) Cuando el sistema se botea el hardware debe ser reconocido, inicializado e integrado al sistema operativo. Estas tareas las efectua el Kernel Driver *.SYS (Device Driver bajo I/O-Manager). Para acceder a la PCI-Proto LAB se implemento el Kernel Driver PPLNT.SYS. De acuerdo con el standard Windows NT, durante el proceso de partida de los driver (después que la PCI-Proto LAB fue encontrada) los resources otorgados por el PCI-bus son registrados en el sistema y reservados para la carta adicional. Areas de direcciones y IRQs serán mapeados por Windows NT en los espacios de resources correspondientes. Estas se pueden acceder después solamente a través de PPLNT.SYS. Como la comunicación con el Kernel Driver no es especialmente cómoda, se desarrolló una biblioteca de funciones como DLL, que corre en User Mode. La PROTOLAB.DLL ofrece una gran cantidad de funciones que permiten el acceso al hardware de la carta adicional. Para instalar los drivers se tiene que copiar el archivo PPLNT.DLL en el directorio \Systema32 y el archivo PROTOLAB.DLL en el directorio \Sistema32\drives de su sistema Windows. Para no sobrecargar su sistema hemos renunciado a los archivos *.ini y otras entradas en los registros. La única excepción es el archivo PPLNT.INI, este sirve para actualizar la inscripción de driver en Windows NT.

User Mode

Kernel Mode

Kernel

1st_over

Executive

Security

Reference

Monitor

(servers)

ProtectedSubsystems

OS/2

Subsystem

POSIX

Subsystem

Security

Subsystem

Hardware Abstraction Layer

Hardware

Configuration Process

Structure

I/O Manager Memory

Manager

System Services

ManagerFileSystem,

Intermediate,

and Device

Drivers

Win32Subsystem

LANManager

Executive

Support

Object

Manager

Local

Procedure

Call

18

En caso que exista Windows NT DDK en su computadora, se puede ejecutar una vez el comando regini pplnt.ini

y éste permite dar a conocer el driver (antes de la primera partida) en el espacio de Windows NT y al mismo tiempo proveerlo con valores de inicialización. Si no es el caso se debe ejecutar el comando regedit.exe y la llave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Pplnt con los valores Type = REG_DWORD 0x00000001 Start = REG_DWORD 0x00000003 Group = Extended base ErrorControl = REG_DWORD 0x00000001 como así HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Pplnt\Parameters VendorID = REG_DWORD 0x000010E8 DeviceID = REG_DWORD 0x00008170 Index = REG_DWORD 0x00000001 El valor de partida (Start) 3 significa, que el Kernel Driver se carga en forma manual, después de hacer partir el sistema, con el comando net start pplnt y éste se puede finalizar con net stop pplnt Si desea cargar automáticamente el driver durante el boteo del sistema, entonces tiene que cambiar por mano el valor de partida (Start) con el programa REGEDIT.EXE. Con el valor Start = 0 carga el driver el NTLDR o OSLOADER ( ¡atención! posiblemente los resources que se necesiten aún no existen); con Start = 1 se carga a través del manager I/O y con el valor Start = 2 lo hace el Service-Control-Maneger. Importante es que el driver este cargado cuendo se inicia una aplicación que quiera acceder al éste. Si no es el caso se lee un mensaje de error. Si el driver debe apoyar una carta con otro VendorID y DeviceID, entoces se tienen que cambiar los valores correspondientes en el registro. Así se utilizan las funciones DLL: • Al producir una aplicación se adhieren las funciones del DLL a través de linken de las librerías PROTOLAB.LIB (MS VisualC++), o PPLBC.LIB (Borland C++, WATCOM C)

• El archivo principal PPLDLL.H, que contiene las definición de las funciones, se da a conocer a las aplicaciones con el comando #include

19

Una aplicación puede acceder a la carta prototipo, depués que el Kernel Driver PPLNT.SYS fue abierto para el acceso. Para esto sirve la función: load_driver() ;

Hay que recordar nuevamente, que el driver tiene que estar cargado en el sistema operativo. Para cerrar el driver al finalizar una aplicación se usa el comando: unload_driver() ; En el apéndice D se encuentra una descripción completa de las funciones especiales del Windows NT Kernel Driver. En el apéndice A contiene las funciones, que se pueden utilizar en forma independiente del sistema operativo.

20

3 Ejemplo de aplicación

3.1 La entrada y salida de datos a través de direcciones de puertas

El objetivo de este ejemplo es, leer datos desde una puerta paralela en el lado Add-On de la carta prototipo o escribir datos en esa puerta. Para esto fueron diseñadas en el EEPROM de la PCI-Proto-LAB cuatro direcciones de regiones. El PCI-BIOS las asigna durante el boteo a direcciones físicas de entrada y salida. Region 0 - sirve para el acceso de los registros de AMCC S5933 Region 1 - Region de 8 Bit con 64 direcciones reservadas para I/O- Region 2 - Region de 8 Bit con 64 direcciones reservadas para I/O- Region 3 - Region de 32 Bit con 64 direcciones reservadas para I/O- Con la Region 1 se demuestra, como se puede realizar el acceso a una periferia lenta (en comparación con el PCI-bus) con un ancho de datos de 8 Bits. También con la Region 2 se considero el acceso de 8 Bits, pero se trabaja sin estados wait La Region 3 es para el acceso de 32 Bits, en todo caso sin estados wait. Por el lado del hardware se apoya el leer y escribir en la dirección Offset 0 de ambas Regiones de 8 Bits. Para apoyar los desarrollos de pruebas se pone a disposición operaciones iterativas y sequenciales ( de 1 paso) para ambos ancho de acceso ( 8 y 32 Bits). Al leer un ancho de datos de 32 Bits, estando con latches solamente los primeros 8 Bits (0...7), se lee ciertamente en el vacio los bits 8..31 en el Add-On-bus, por esto una comparación de datos leídos y escritos no tiene sentido. Para estos accesos se utilizo el proceso lento Pass-Thru del AMCC S5933. Indicaciones de uso: Se parte la aplicación con en doble clic en el icono correspondiente o con el comando PASSTHRU.EXE. Bajo Windows NT se debe primeramente hacer partir el Kernel Driver PPLNT.SYS como se describió anteriormente, y después se hace partir la aplicación. Los elementos de control y avisos se resumen en forma funcional: Address Region Con este boton el grupo de funciones se predefine las regiones de acceso

slow 8-Bit selecciona la Region 1, que está diseñada para un acceso de de periferia lenta de 8 Bit

fast 8-Bit selecciona la Region 2, que fue diseñada para el acceso de periferia rápida de 8-Bit

fast 32-Bit selecciona la Region 3, que fue diseñada para el acceso de periferia rápida de 32-Bit

21

Direcciones Offset: Con estos botones se selecciona la dirección Offset en la Region elegida (número de puerta). Las regiones de 8 Bit estan a disposición 8 direciones de puertas (0...7) mientras que para las regiones de 32 Bits se puede elegir solamente 2 direcciones de puertas ( 0 y 4). La puerta de 8 Bits en el ejemplo de aplicación se fijo en la dirección de puerta 0. Accesos I/O: En la parte inferior a los campos de selección de direcciones, hay dos botones con los cuales se realiza el acceso. Después de haber seleccionado la Region aparece en los botones las expresiones correspondientes, es decir :Write BYTE/DWORD o Read BYTE/DWORD. Bajo el botón que inicia la escritura se ubica el campo de entrada de datos, donde se escribiran los datos en la dirección de la puerta seleccionada. Este campo acepta solamente valores decimales y considerando cual es la Region elegida 8 Bits o 32 Bits limita un valor máximo (255 o 4294967294).

Figura 3: PASSTHRU.EXE Ventana de la aplicaciüon para Windows95 y Windows NT.

Bajo el botón Read hay un campo de salida de datos leídos.

22

Control del programa: Bajo los botones de acceso y campos de entrada hay dos campos de selección para el control del programa. Write-Read-Data Cuando se activa este campo se escribirá durante un

acceso el primer valor en la puerta, después se leerá y se muestra el la pantalla.

Loop Aquí se activa un loop (iteración) para realizar en forma continua un acceso de leer/escribir; una herramienta extremadamente útil para pruebas

A la derecha de la ventana se muestra el contenido de cada uno de los registros del espacio de configuración. A través del menú comando Display Configuration Space se leerán nuevamente los registros y los avisos se actualizarán. Con el menú comando Dislay EEPROM data se leerá el contenido del EEPROM del PCI-Proto LAB y lo muestra en una nueva ventana. En la barra de estados se muestran los valores encontrados para el Vendor-ID y el Device-ID, la Region seleccionada para I/O, la direción Offset y la dirección base. Bajo MS-DOS después de ejecutar el comando PASSTHRU.EXE aparece una ventana con símbolos alfanuméricos que se aclaran por si mismos. Para usos avanzados están a disposición las fuentes de C++ para los tres sistemas operativos. Fundamentalmente la vinculación de las funciones de los Driver VxD y Kernel Driver serán más transparentes.

3.2 Uso del PCI Busmaster Transfer para transmisión rápida de datos

El segundo ejemplo de aplicación utiliza la interfaz FIFO del AMCC S5933 para transmitir bloques grandes de datos, a través de esto se activa el PCI-Control como Busmaster. La rapidez efectiva de transmisión será determinada por el sistema del PCI-bus y por la configuración de Chips en la platina principal. Como fuente de datos utilizamos en nuestra prueba un convertidor A/D rápido, que pone a disposición datos con la frecuencia del PCI-bus. Así realizamos nosotros en el PCI-bus velocidades de transmisión de 106 Mbytes/s. En la aplicación se puede elegir entre tres modos de transmisión. La forma más lenta consiste en leer las directamente en puertas del FIFO del AMCC S5933. Aquí se leerá en la puerta DWORD por DWORD y se escribirá en un Buffer. El modo Busmaster no se usa. Antes que se pueda iniciar la transmisión, el usuario debe preparar un buffer para datos. La memoria física que aquí se requiere debe estar ordenada en forma continua, el tamaño de la memoria será limitado por tamaño del RAM de la computadora. Además se usarán solamente bloques de memoria, que sean del tamaño de una página (1000h) o un múltiplo de ella. Esto será

23

verificado en forma automática por el programa, así que es posible que el tamaño de la memoria final sea diferente al que fue requerido. El segundo modo de uso, fue realizado en Polling: e.d. la transmisión de bloques de datos mediante la transferencia del Busmaster. A el S5933 se le darán la cantidad de datos a transmitir como así la dirección física de la memoria. A través de la programación del Busmaster-Control/Status se activa la transferencia de datos. Si el Master-Write-Count-Register es cero, entonces los datos fueron ya transmitidos. La tercera y forma más rápida de transmitir datos es la: control de interrupción del Busmaster. Aquí se procede como en la segunda forma de transmisión, el AMCC S5933 toma las funciones del Busmaster. Cuando el Master-Write-Transfer-Count-Register es cero, entonces el AMCC S5933 activa una interrupción. El servicio de rutina de interrupción reinicializa la transmisión y repite ésta. Esta forma de uso se usa el PCI-bus en forma máxima, esto tiene por consequencia p.ej. que la salida de graficas en la pantalla se demora. Indicaciones de uso: Se parte la aplicación con en doble clic en el icono correspondiente o con el comando FIFOBUSM.EXE. Bajo Windows NT se debe primeramente hacer partir el Kernel Driver PPLNT.SYS como se describió anteriormente, y después hacer partir la aplicación. Los elementos de control y avisos se resumen en forma funcional: Modo FIFO transfer: El uso de estos botones define el modo de transmición: Direct read lectura directa desde la puerta del FIFO del AMCC S5933 Busmaster polling transferencia controlada del Busmaster a través de polling

Busmaster interrupt transferencia controlada a traves de interrupciones del Busmaster El segundo modo de uso, fue realizado en Polling: e.d. la transmisión de bloques de datos mediante la transferencia del Busmaster. A el S5933 se le darán la cantidad de datos a transmitir como así la dirección de la memoria fisica. A través de la programación del Busmaster-Control/Status se activa la transferencia de datos. Si el Master-Write-Count-Register es cero, entonces los datos fueron ya transmitidos. La tercera y forma más rápida de transmitir datos es la: control de interrupción del Busmaster. Aquí se procede como en la segunda forma de transmisión, el AMCC S5933 toma las funciones del Busmaster. Cuando el Master-Write-Transfer-Count-Register es cero, entonces el AMCC S5933 activa una interrupción. El servicio de rutina de interrupción reinicializa la transmisión y repite ésta. Esta forma de uso se usa el PCI-bus en forma máxima, esto tiene por consequencia p.ej. que la salida de graficas en la pantalla se demora.

24

Figura 4: FIFOBUSM.EXE ventana de uso para Windows95 y Windows NT.

Indicaciones de uso: Se activa la aplicación con en doble clic en el icono correspondiente o con el comando FIFOBUSM.EXE. Bajo Windows NT primero se debe hacer partir el Kernel Driver PPLNT.SYS como se describió anteriormente, y después hacer partir la aplicación. Los elementos de control y avisos se resumieron en forma funcional: FIFO transfer: read datos son leídos write datos son escritos Mode:

25

Direct datos son leídos/escritos desde/hacia el FIFO Busmaster polling transferencia controlada del Busmaster a través de polling Busmaster interrupt transferencia controlada a traves de interrupciones del Busmaster Control del programa: Buffer Size (bytes) En este campo se puede definir el tamaño de la memoria

física del Buffer. El Buffer debe existir antes de comenzar a trasmitir datos. El Buffer se configurara en su tamaño como un múltiplo del tamaño físico de una página.

Loop La selección de éste campo permite que la forma deseada de

transmisión se ejecuta en un loop. Reset Se reinicia el programa, todas las actividades son abortadas y se

Libera la memoria reservada Exit Se termina le ejecución del programa Action: Start Acciona el modo de transmisión seleccionado con las

configuraciones establecidas. Stop Se terminan las transaciones( sólo en Loop y en Interrupt) Buffer Manager

Set configura un Buffer en una memoria física existente con

direcciones sucesivas. En caso de que no sea posible se obtiene un aviso de error. Se puede repetir la reserva de memoria con un valor más pequeño. El valor posible más pequeño es de 4096 Byte (el tamaño de una Memory Page)

Fill Se llene el buffer cion una muestra, esta option solo se activa para write

Durante una transmisión los datos escritos en el RAM de la computadora serás leídos desde el Buffer y mostrados en el campo correpondiente. En el lado derecho de la ventana se mostrará el contenido de la configuración del espacio de registro de configuraciones. Por menú comando Display Configuration Space se leeran nuevamente los registros correspondientes y el aviso se actualizará. Con otro menú comando Display EEPROM data se leera el contenido de del EEPROM de la PCI-Proto LAB y un una ventana que se abrirá, se mostraran los datos.

26

En la barra de estados se muestran los valores encontrados para en Vendor-ID, el vector interrupción, la dirección de partida física del drivers del Daten Buffer y la dirección linal (lógica) de la aplicación del data Buffer. Bajo MS-DOS después de ejecutar el comando FIFOBUSM.EXE aparece una ventana con símbolos alfanuméricos que se aclaran por si mismos. Para usos avanzados están a disposición las fuentes de C++ para los tres sistemas operativos. Fundamentalmente la vinculación de las funciones de los Driver VxD y Kernel Driver serán más transparentes.

27

Apéndice A Funciones Driver independientes del sistema operativo

Funciones para leer/escribir un registro en el espacio de configuración de una device PCI. read_configuration_space_register

write_configuration_space_register

Funciones para el acceso a cualquier dirección de una I/O Región, que haya sido ruteada por el PCI-BIOS (solo para Windows95 y WindowsNT):

inport_byte

inport_word

inport_dword

outport_byte

outport_word

outport_dword

Funciones para leer/escribir datos desde/hacia los registros de operaciones del AMCC S5933 write_operation_register

read_operation_register

Con estas funciones se puede programar totalmente el AMCC S5933. Para facilitar el acceso a un determinado servicio del control, se ponen también a disposición funciones complejas - Funciones para leer/escribir desde/hacia el Pass-Thru-Region del AMCC S5933

write_passthru_byte

read_passthru_byte

write_passthru_word

read_passthru_word

write_passthru_dword

read_passthru_dword

- Funciones para el acceso a la interfaz del FIFO

ini_fifo_write_mastering

ini_fifo_read_mastering

fifo_masterwrite_transfer

fifo_masterread_transfer

reset_ado_2_pci_fifo_flags

reset_pci_2_ado_fifo_flags

disable_fifo_read_master

enable_fifo_read_master

disable_fifo_write_master

enable_fifo_write_master

read_fifo_port

write_fifo_port

set_transfer_count

get_transfer_count

- Funciones para leer/escribir en el Mailboxes

write_mailbox

read_mailbox

read_mailboxstate

reset_mailboxflags

28

- Funciones para leer/escribir la interrupción -Control/Status-Register

get_interrupt_register

set_interrupt_register

Syntax para el llamado de las funciones: ****************************************************************************************** Syntax: BYTE read_configuration_space_register( DWORD register_address,

DWORD *register_data).

Input: DWORD register_address ,Dirección del registro a leer. Output: DWORD *register_data ,Contenido del registro.

Descripción: Con esta función se lee un registro del espacio de configuración de una PCI-Device. Y para

utilizarla en forma efectiva, se debe primero que todo usar la función find_pci_device la cual averigua los parametros que se necesitan para que se pueda leer un registro en el espacio de configuración. Hay que tomar en cuenta, que la dirección contiene los siguentes valores:

- los 8-Bit del número del bus, en el cual esta la Device, - los 5-Bit con el número de la Device-Nummer en el PCI-Bus,

- los 3-Bit número de función del Multi-Function-Device y - los 6-Bit número del registro del espaciode configuración de la PCI-Device

con el siguiente syntax :

31 15 10 8 2 0 | | | | | | 1000 0000 BBBB BBBB NNNN NFFF RRRR RR00

BBBB BBBB - 8 Bit el número del PCI-Bus. El primer Bus tirne el número 0. NNNN N - 5 Bit el númro de la Device en un Bus. FFF - 3 Bit el número de la función en una Multi-Function-Device.

Una Single-Function-Device tiene el número de función 0. RRRR RR - 6 Bit el número del registro a leer en el espacio de configuración.

Los últimos dos registros tienen que ser 0, ya que tienen el largo del registro DWORD y por

eso tienen solamente direcciones divisibles por 4. En total la memoria reservada para el espacio de configuración tiene un tamaño de 256 Bytes, de los cuales solo son definidos por la norma PCI los primeros 64 Bytes en 16 DWORD-Registern.

El Bit 31 tiene que ponerse 1, para la Configuration Circles (siehe PCI Spec.) del PCI-Bus.

Bajo MS-DOS hay que usar la read_configuration_dword.

Valor de retorno: BYTE SUCCESS - ejecución sin error, valor válido en el Output-Buffer. DRIVER_ERROR - Error durante el llamado del driver. Verificar, si el driver está

activo.

29

****************************************************************************************** Syntax: BYTE write_configuration_space_register( DWORD register_address,

DWORD register_data).

Input: DWORD register_address ,Dirección del registro deseado.

DWORD register_data ,Datos, que se deben escribir en el registro.

Output: ninguno

Descripción: Esta función excribe datos en formato DWORD en un registro del espacio de configuración de una PCI-Divice. Algunos registros del espacio de configuración pueden ser escritos mientras la aplicación corre, para obtener información adicional. Cuando por ejemplo en la dirección de registro base se escriben Unos (ALL-ONES), asi se lee posteriormente en este registro el tamaño del espacio (en Bytes) de direcciones reservadas. Para el syntax del registro de direcciones vea read_configuration_space_register. En MS-DOS se usa la función write_configuration_dword.

Retorno: BYTE

SUCCESS - Ejecución de la función sin errores. DRIVER_ERROR - Error durante el llamado del Driver.

****************************************************************************************** Syntax: BYTE outport_byte( DWORD address,

BYTE data).

Input: DWORD address ,Dirección de la puerta, auf die geschrieben werden soll.

BYTE data ,Datos de salida. Output: ninguna Descripción:

Esta función escribe en la dirección de la puerta correspondiente un Data-Byte.

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del drivers.

****************************************************************************************** Syntax: BYTE outport_word( DWORD address,

WORD data).

Input: DWORD address ,dirección de la puerta, en la cual se debe escribir.

WORD data ,Datos de salida. Output: ninguna Descripción:

Esta función escribe un Data-WORD (2 Byte) en la dirección dada. La dirección tiene que ser par (16-Bit-Port Addresse ).

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

30

****************************************************************************************** Syntax: BYTE outport_dword( DWORD address,

DWORD data).

Input: DWORD address ,Dirección de la puerta, en la cual se debe escribir.

DWORD data ,Datos de salida. Output: ninguna Descripción:

Esta función escribe en la dirección de la puerta dada un Data-DWORD (4 Byte). La dirección tiene que ser divisible por 4 (32-Bit-Port Adresse).

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

****************************************************************************************** Syntax: BYTE inport_byte( DWORD address,

BYTE *data).

Input: DWORD address ,Dirección de la puerta que debe ser leída. Output: BYTE *data ,puntero a los datos leídos. Descripción:

Esta función lee en la dirección de la puerta dada un Data-Byte.

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

****************************************************************************************** Syntax: BYTE inport_word( DWORD address,

WORD *data).

Input: DWORD address ,Dirección de la puerta que debe ser leída. Output: WORD *data ,puntero a los datos leídos. Descripción:

Esta función lee en la dirección de la puerta dada un Data-WORD (2 Byte). La dirección tiene que ser par (16-Bit-Port Addresse ).

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

****************************************************************************************** Syntax: BYTE inport_dword( DWORD address,

DWORD *data).

Input: DWORD address ,Dirección de la puerta que debe ser leída. Output: DWORD *data ,puntero a los datos leídos.

31

Descripción: Esta función leede la dirección de la puerta dada un Data-DWORD (4 Byte). La dirección tiene que ser divisible por 4 (32-Bit-Port Adresse).

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

Funciones para el uso de la interfaz del FIFO ****************************************************************************************** Syntax: BYTE ini_fifo_write_mastering(struct HW_state *address).

Input: struct HW_state* address ,puntero a la estructura con la dirección del Hardware.

Output: ninguna Descripción:

A través de esta función se inicializa la interfaz del FIFO-Busmaster para escribir. Para ello se ejecutaran con el Master-Control/Status-Register (MCSR) del AMCC S5933 las acciones siguientes. - Prohibir modo Busmaster a través del borrado del Bit 10 del MCSR, - resetear el Busmaster Add-On-to-PCI-FIFO a través de poner el Bit 26 en el MCSR, - resetear el Busmaster PCI-to-Add-On-FIFO a través de poner el Bit 25 en el MCSR, - poner la prioridad del Add-On-to-PCI-FIFO a través de poner el Bit 8 en el MCSR, - requerir el Busmaster, cuando el FIFO esta lleno con por lo menos 4 DWORD, a través de poner el Bit 9 en el MCSR,

- Inscribir la dirección base del S5933s en el driver VxD.

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

****************************************************************************************** Syntax: BYTE ini_fifo_read_mastering(struct HW_state *address).

Input: struct HW_state* address , puntero a la estructura con la dirección del Hardware.

Output: ninguna Descripción:

A través de esta función se inicializa para la lectura la interfaz del FIFO-Busmaster. Para ello se ejecutaran las acciones siguientes con el Master-Control/Status-Register (MCSR) del AMCC S5933: - prohibir modo Busmaster a través del borrado del Bit 10 del MCSR, - reseteo del Busmaster Add-On-to-PCI-FIFO a través deponer el Bit 26 en el MCSR, - reseteo del Busmaster PCI-to-Add-On-FIFO a través de poner el Bit 25 en el MCSR, - poner la prioridad del Add-On-to-PCI-FIFO a través de poner el Bit 12 en el MCSR, - requerir el Busmaster, cuando el FIFO tiene por o menos 4 espacios DWORD libres, a través de poner el Bit 13 en el MCSR,

- Inscribir la dirección base del S5933s en el driver VxD.

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

32

****************************************************************************************** Syntax: BYTE fifo_masterwrite_transfer( struct HW_state *address

DWORD target_address).

Input: struct HW_state* address ,puntero a la direción del Hardware del AMCC S5933. DWORD target_address ,dirección de partida física, en la cual se deben escribir los datos.

Output: ninguna

Descripción: A través de esta función se activa el Busmaster-Write-Transfer desde el FIFO del AMCC

S5933 en el RAM de la computadora. Durante el modo Busmaster se escribe a través del valor del Master-Write-Transfer-Counter-Register (MWTC) un determinado número de Bytes en DWORD-Format (con el ancho total del bus, 4 Byte) desde el FIFO en la región de memoria, que comienza con la dirección del destinatario. Durante la transmisión se decrementa el valor del MWTC-Register. El valor 0 en el MWTC-Register indica, que la transferencia finalizo exitosamente y que el número requerido de Bytes fue escrito en el RAM.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

******************************************************************************************

Syntax: BYTE fifo_masterread_transfer(struct HW_state *address

DWORD target_address).

Input: struct HW_state* address ,Puntero a la dirección del Hardware del AMCC S5933. DWORD target_address ,dirección física de partida, a partir de la cual se leen los datos.

Output: ninguna

Descripción: A través de esta función se activa el Busmaster-Read-Transfer desde RAM de la computadora

en el FIFO del AMCC S5933. Durante el modo Busmaster se lee a través de los valores en el Master-Read-Transfer-Counter-Register (MRTC) el número determinado de bytes en formato DWORD (con el ancho total del bus, 4 Byte) desde el sector de memoria, que comienza con la dirección del destinatario, en el FIFO. Durante la transferencia se decrementa el valor del MRTC-Registers. El valor 0 en el MRTC-Register indica, que la transferencia finalizo exitosamente y que el número total de bytes exigidos en el FIFO fueron leídos.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

******************************************************************************************

Syntax: BYTE reset_ado_2_pci_fifo_flags(struct HW_state *address).

Input: struct HW_state* address ,puntero a la dirección del Hardware del AMCC S5933.

Output: ninguna

Descripción: Con el valor 1 en el Bit 26 del MSCR se desactiva el flag ADD-ON-TO-PCI-FIFO-FULL y se activa el flag ADD-ON-TO-PCI-FIFO-EMPTY. La ADD-ON-TO-PCI-FIFO puede ser escrita de nuevo totalmente. Los valores anteriores se desechan.

33

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

******************************************************************************************

Syntax: BYTE reset_pci_2_ado_fifo_flags(struct HW_state *address).

Input: struct HW_state* address ,puntero a la dirección del Hardware del AMCC S5933.

Output: ninguna

Descripción: A través del valor en el Bit 25 del MSCR se desactiva el flag PCI-TO-ADD-ON-FIFO-FULL y se activa el flag PCI-TO-ADD-ON-FIFO-EMPTY. La PCI-TO-ADD-ON-FIFO puede ser escrita de nuevo totalmente. Los valores anteriores se desechan.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

****************************************************************************************** Syntax: BYTE disable_fifo_read_master(struct HW_state *address).

Input: struct HW_state* address ,puntero a la dirección del Hardware del AMCC S5933.

Output: ninguna Descripción:

A través de esta función se prohibe el modo Busmaster de la PCI-to-Add-On del AMCC S5933. Para ello se desactiva el Bit 14 del MCSR-Register.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

****************************************************************************************** Syntax: BYTE enable_fifo_read_master(struct HW_state *address).

Input: struct HW_state* address ,puntero a la dirección del Hardware del AMCC S5933.

Output: ninguna Descripción:

A través de esta función se permite el modo Busmaster de la PCI-to-Add-On del AMCC S5933. Para ello se desactiva el Bit 14 des MCSR-Registers.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

****************************************************************************************** Syntax: BYTE disable_fifo_write_master(struct HW_state *address).

Input: struct HW_state* address ,puntero a la dirección del Hardware del AMCC S5933.

34

Output: ninguna Descripción:

A través de esta función se prohibe el modo Busmaster de la Add-On-to-PCI del AMCC S5933. Para ello de desactiva el Bit 10 del MCSR-Registers.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

****************************************************************************************** Syntax: BYTE enable_fifo_write_master(struct HW_state *address).

Input: struct HW_state* address ,puntero a la dirección del Hardware del AMCC S5933.

Output: ninguna Descripción:

A través de esta función se permite el modo Busmaster del Add-On-to-PCI del AMCC S5933. Se activa el Bit 10 del MCSR-Registers.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

****************************************************************************************** Syntax: BYTE read_fifo_port( struct HW_state *address

DWORD *data,

DWORD *state).

Input: struct HW_state* address ,puntero a la dirección del Hardware del AMCC S5933.

Output: DWORD *data ,puntero a los datos, que se leen en la puerta del FIFO.

DWORD *state ,estado del FIFO: vacio o lleno. Descripción:

Esta función lee directamente un Daten-DWORD (4 Bytes) desde la puerta del FIFO. La transferencia de datos no se realiza en modo Busmaster.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. FIFO_EMPTY_ERROR - FIFO esta vacio, Datos no son accesibles.

****************************************************************************************** Syntax: BYTE write_fifo_port( struct HW_state *address

DWORD data,

DWORD *state).

Input: struct HW_state* address ,Puntero a la dirección del Hardware del AMCC S5933.

DWORD data ,datos, que deben ser escritos en la puerta del FIFO.

Output: DWORD *state ,estado del FIFO: lleno o vacio.

Descripción: Esta función escribe directo un Daten-DWORD (4 Bytes) la puerta del FIFO. La transferencia de datos no se realiza en modo Busmaster.

35

Retorno: BYTE

SUCCESS - - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. FIFO_NOT_EMPTY_ERROR - FIFO esta lleno, Datos no se pueden escribir.

Funciones para utilizar la interfaz MAILBOX ****************************************************************************************** Syntax: BYTE write_mailbox( struct HW_state *address,

BYTE boxnumber,

DWORD data).

Input: struct HW_state* address ,Puntero a la dirección del Hardware del AMCC S5933

BYTE boxnumber ,número del Mailbox, en el cual se debe escribir. DWORD data ,Datos, que se deben escribir en el Mailbox.

Output: ninguna

Descripción:

Un dato-DWORD (4 Bytes) se escribe en el Outgoing Mailbox dado. Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. PARAMETER_ERROR - número del Mailbox es desconocido.

****************************************************************************************** Syntax: BYTE read_mailbox( struct HW_state *address,

BYTE boxnumber,

DWORD *data).

Input: struct HW_state* address ,Puntero a la dirección del Hardware del AMCC S5933

BYTE boxnumber ,Mailbox, que debe ser leído. Output: DWORD *data ,Puntero a los datos, que se leyeron desde el Mailbox .

Descripción:

Un dato-DWORD (4 Bytes) se lee desde el Incomming Mailbox dado. Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. PARAMETER_ERROR - número del Mailbox desconocido.

****************************************************************************************** Syntax: BYTE read_mailboxstate(struct HW_state *address

DWORD *status).

Input: struct HW_state* address ,Puntero a la dirección del Hardware del AMCC S5933

Output: DWORD *status ,contenido Mailbox-Empty-Full/Status-Registers (MBEF).

Descripción: Se lee el Mailbox-Empty-Full/Status-Register MBEF-Register del AMCC S5933 y el valor

encontrado se depocita en el daten buffer (DWORD *status) correspondiente. El estado es un

36

DWORD, en el cual se los Bit 0...15 (LOWWORD) indican estado de el Outgoing Mailbox y los Bit 16...31 (HIGHWORD) indican el estado del Incomming Mailbox.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

****************************************************************************************** Syntax: BYTE reset_mailboxflags( struct HW_state *address).

Input: struct HW_state* address ,Puntero a la dirección del Hardware del AMCC S5933.

Output: ninguna

Descripción:

Esta función desactiva el Mailbox-Status-Flags. Para esto se pone el Bit 27 del MCSR-Registers.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

Funciones para el acceso Pass-Thru ****************************************************************************************** Syntax: BYTE write_passthru_byte( struct HW_state *address,

DWORD offset,

BYTE region,

BYTE data).

Input: struct HW_state* address ,Puntero a la dirección del Hardware de la carta prototipo.

DWORD offset ,dirección Offset dentro de una Region. BYTE region ,número de la Region, en la cual se escribe. BYTE data ,datos a escribir.

Output: ninguna

Descripción: Un Data-Byte se escribe en una dirección Byte

Las direcciones de Regiones son reconocidas al partir la computadora, durante el boteo del PCI-BIOS se les otorga una dirección de partida y son inscritas en el registro base de direcciones correspondiente del espacio de configuración de la PCI-Device. Las direcciones concretas se dan a conocer recién después del boteo de la computadora y pueden ser diferentes de computadora a computadora. Para poder leer/escribir una de estas direcciones, el driver necesita el número de la Region y la dirección Offset dentro de la Region. Con estos datos se configura la dirección correcta de la puerta. El usuario se tiene que fijar, que la forma de acceso (8-Bit, 16-Bit o 32-Bit) con el tipo de dirección estén de acuerdo, e.d. acceso de 8-Bit a Region de 8-Bit, acceso de 16-Bit a Region de 16-Bit, acceso de 32-Bit a Region de 32-Bit. Una Region de 8-Bit consiste de periferia de 8-Bit, una Region de 32-Bit consiste de una periferia de 32-Bit. También las direcciones de la Regiones tienen direcciones que coinciden con el tipo de datos: en Region de 8-Bit todas las direcciones son válidas con el Offset 0,1,2.. (hasta el limite de la Region), mientras que en la Region de 32-Bit solo son posibles direcciones que sean divisibles por 4.

37

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. PARAMETER_ERROR - dirección de la Region desconocida.

****************************************************************************************** Syntax: BYTE write_passthru_word( struct HW_state *address,

DWORD offset,

BYTE region,

WORD data).

Input: struct HW_state* address ,Puntero a la dirección del Hardware de la carta prototipo. DWORD offset ,dirección dentro de la Region. BYTE region ,número de la Region, en la cual se escribe. WORD data ,datos a escribir.

Output: ninguna

Descripción: Un dato-Word se escribe en una dirección Word. Para más detalles vea write_passthru_byte.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. PARAMETER_ERROR - dirección de la Region desconocida.

****************************************************************************************** Syntax: BYTE write_passthru_dword( struct HW_state *address,

DWORD offset,

BYTE region,

DWORD data).

Input: struct HW_state* address ,Puntero a la dirección del Hardware de la carta adicional. DWORD offset ,Dirección Offset dentro de la Region. BYTE region ,Número de la Region, en la que se escribe. DWORD data ,datos a escribir.

Output: ninguna

Descripción: Un Data-DWORD se escribe en una Dword-Adresse. Para más detalles vea write_passthru_byte.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. PARAMETER_ERROR - dirección de la Region desconocida.

****************************************************************************************** Syntax: BYTE read_passthru_byte( struct HW_state *address,

DWORD offset,

BYTE region,

BYTE *data).

Input: struct HW_state* address ,Puntero a la dirección del Hardware de la carta prototipo. DWORD offset ,Dirección Offset dentro de la Region.

38

BYTE region ,número de la Region, desde donde se lee.

Output: BYTE *data ,puntero a los datos leídos. Descripción: Un dato Byte es leído por un dirección Byte Para más detalles vea write_passthru_byte.

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. PARAMETER_ERROR - dirección de la Region desconocida.

****************************************************************************************** Syntax: BYTE read_passthru_word( struct HW_state *address,

DWORD offset,

BYTE region,

WORD *data).

Input: struct HW_state* address ,Puntero a la dirección del Hardware de la carta adicional. DWORD offset ,Dirección Offset dentro de la Region. BYTE region ,Número de la Region, desde la cual se lee.

Output: WORD *data ,puntero a los datos leídos.

Descripción: Un dato-Word es leído por una dirección Word Para más detalles vea write_passthru_byte.

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. PARAMETER_ERROR - dirección de la Region desconocida.

****************************************************************************************** Syntax: BYTE read_passthru_dword( struct HW_state *address,

DWORD offset,

BYTE region,

DWORD *data).

Input: struct HW_state* address ,Puntero a la dirección del Hardware de la carta adicional. DWORD offset ,Dirección Offset dentro de la Region. BYTE region ,Número de la Region, desde la cual se lee.

Output: DWORD *data ,puntero a los datos leídos.

Descripción: Un data-DWORD es leído por un dirección Dword. Para más detalles vea write_passthru_byte.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. PARAMETER_ERROR - dirección de la Region desconocida.

39

Funciones generales para el acceso a los registros operativos del AMCC S5933 ****************************************************************************************** Syntax: BYTE write_operation_register( struct HW_state *address,

DWORD regnumber,

DWORD data).

Input: struct HW_state* address ,Puntero a la dirección del Hardware del AMCC S5933 DWORD regnumber ,Offset registro a escribir. DWORD data ,datos a escribir.

Output: ninguna Descripción:

Con esta función se pueden escribir cada uno de los 16 registros operacionales del AMCC S5933 en formato DWORD. El usuario tiene que dar la dirección Offset del registro, al cual se desea acceder. Además él debe conocer el efecto de un acceso directo a cada uno de los registros. Se recomienda la utilización de funciones especiales a determinados registros.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

****************************************************************************************** Syntax: BYTE read_operation_register( struct HW_state *address,

DWORD regnumber,

DWORD *data).

Input: struct HW_state* address ,Puntero a la dirección del Hardware del AMCC S5933 DWORD regnumber ,Offset del registro operacional a leer.

Output: DWORD *data ,puntero a los datos leídos.

Descripción:

Con esta función se puede leer en cada uno de los registros operacionales del AMCC S5933 en formato DWORD. El usuario para esto tiene que dar la dirección Offset del registro al cual él quiere acceder. Además él debe conocer el efecto del acceso directo a cada uno de los registros. Se recomienda el uso de funciones especiales para registros específicos.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

Funciones para el acceso al On-Board-EEPROM (nvram) ****************************************************************************************** Syntax: BYTE read_eeprom_size( BYTE bus_number,

BYTE device_and_function,

WORD *size).

Input: BYTE bus_number ,número del PCI-bus, en el cual se encuentra la Device. BYTE device_and_function ,número de Device en el PCI-Bus 5 Bit superiores, número

de Function de los 3 Bit inferiores.

Output: WORD *size ,puntero al tamaño averiguado EEPROM

40

Descripción. Esta función averigua el tamaño del On-Board-Expansion-ROM (EEPROM, nvram). Cuando

se escribe ALL-ONES (todos 1) en la Expansion-ROM-Base-Address-Register del espacio de configuración se condiciona el Register, para que en el próximo acceso de lectura de a conocer el tamaño del EEPROM en Byte.

Los parámetros de entrada bus_number y device_and_function los envía en forma precisa con la syntax correspondiente la función find_pci_device.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - error durante el llamado del driver. NO_SUCH_DEVICE - Device no existe. NO_EXPANSION_ROM - EEPROM no existe. UNEXPECTED_ERROR - error desconocido.

****************************************************************************************** Syntax: BYTE write_start_read_eeprom( struct HW_state *address).

Input: struct HW_state* address ,Puntero a la dirección del Hardware del AMCC S5933;

Output: ninguna

Descripción: Esta función escribe el comando “Start” para leer el EEPROM.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

****************************************************************************************** Syntax: BYTE write_start_write_eeprom( struct HW_state *address).

Input: struct HW_state ,Puntero a la dirección del Hardware del AMCC S5933

Output: ninguna

Descripción: Esta función escribe el comando “Start” para escribir en el EEPROM.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

****************************************************************************************** Syntax: BYTE write_inactive_eeprom( struct HW_state *address).

Input: struct HW_state ,Puntero a la dirección del Hardware del AMCC S5933

Output: ninguna Descripción: Esta función escribe el comando“Inactivo” en el EEPROM.

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

41

******************************************************************************************

Syntax: BYTE wait_for_ready_eeprom( struct HW_state *address).

Input: struct HW_state ,Puntero a la dirección del Hardware del AMCC S5933.

Output: ninguna

Descripción: Esta función espera, hasta que el Ready-Flag se pone en el NVRAM-COMMAND-Register. Este flag indica si una acción determinada finalizo exitosamente.

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. TIMEOUT_ERROR - Ready-Flag no fue puesta.

****************************************************************************************** Syntax: BYTE write_byte_eeprom( struct HW_state *address,

BYTE data).

Input: struct HW_state ,puntero hacia la dirección del Hardware del AMCC S5933.

BYTE data ,datos a escribir.

Output: ningunae

Descripción: Esta función escribe un Byte en el EEPROM. La dirección, a la cual se debe escribir, se tiene

que poner con la función write_address_eeprom.

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. TIMEOUT_ERROR - no se puso Ready-Flag durante el tiempo de espera.

****************************************************************************************** Syntax: BYTE read_byte_eeprom( struct HW_state *address,

BYTE *data).

Input: struct HW_state ,Puntero a la dirección del Hardware del AMCC S5933. Output: BYTE *data ,puntero a los datos leídos.

Descripción: Esta función lee un Byte desde EEPROM. La dirección, que debe ser leída, tubo que ser puesta

con la función write_address_eeprom.

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. TIMEOUT_ERROR - no se puso Ready-Flag durante el tiempo de espera.

****************************************************************************************** Syntax: BYTE write_address_eeprom( struct HW_state *address,

WORD eeprom_offset).

Input: struct HW_state ,Puntero a la dirección del Hardware del AMCC S5933

42

eeprom_offset ,Dirección Offset en el EEPROM, al que se debe acceder.

Output: ninguna

Descripción: Pone la dirección correcta para el acceso al área del EEPROM.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. TIMEOUT_ERROR - no se puso Ready-Flag durante el tiempo de espera

****************************************************************************************** Syntax: BYTE write_eeprom_area( struct HW_state *address,

WORD eeprom_offset

BYTE *data,

WORD count).

Input: struct HW_state ,Puntero a la dirección del Hardware del AMCC S5933 eeprom_offset ,la primera dirección del EEPROM, que se debe escribir BYTE *data ,puntero al Daten buffer con los datos a escribir en el EEPROM. WORD count ,cantidad de Bytes a escribir

Outputs: ninguna

Descripción:

Esta función escribe una área continua de “count”-Bytes en el EEPROM.

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. TIMEOUT_ERROR - no se puso Ready-Flag durante el tiempo de espera

****************************************************************************************** Syntax: BYTE read_eeprom_area( struct HW_state *address,

WORD eeprom_offset

BYTE *data,

WORD count).

Input: struct HW_state*address ,Puntero a la dirección del Hardware del AMCC S5933 eeprom_offset ,primera dirección en el EEPROM, que se debe leer WORD count ,cantidad de Bytes a leer

Output: BYTE *data ,puntero a los datos buffer con los datos leídos.

Descripción:

Esta función lee en área continua de “count”-Bytes del EEPROMen un daten buffer.

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. TIMEOUT_ERROR - no se puso Ready-Flag durante el tiempo de espera

43

Funciones para el acceso al Interrupt-Control/Status-Register del AMCC S5933 ******************************************************************************************

Syntax: BYTE get_interrupt_register( struct HW_state* address,

DWORD *intreg).

Input: struct HW_state *address ,Puntero a la dirección del Hardware del AMCC S5933.

Output: DWORD *intreg ,puntero a los contenidos de el Interrupt-Register.

Descripción: Esta función lee el contenido del Interrupt-Control/Status-Registers del AMCC S5933.

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

******************************************************************************************

Syntax: BYTE set_interrupt_register( struct HW_state* address,

DWORD intreg).

Input: struct HW_state *address ,Puntero a la dirección del Hardware del AMCC S5933. DWORD intreg ,Datos, que deben ser escritos en los Interrupt-Register.

Output:

Descripción: Esta función escribe un DWORD en el Interrupt-Control/Status-Registers del AMCC S5933.

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

44

Apéndice B Funciones especiales de la biblioteca C para MS-DOS

Para encontrar una PCI-Device y para leer el espacio de configuración PCI usando el PCI-BIOS se ponen a disposición las siguientes funciones: pci_bios_present

find_pci_device

read_configuration_dword

write_configuration_dword

Descripción de las funciones ****************************************************************************************** Syntax: int pci_bios_present( byte *hw_mechanismus,

word *interface_level_version,

byte *last_psi_bus_number).

Input: ninguna Output: byte * hw_mechanismus ,puntero al mecanismo del Hardware. word *interface_level_version ,número de Version. byte *last_psi_bus_number) ,número del último bus. Descripción: Esta función verifica, si el PCI-BIOS existe. El mecanismo del Hardware puede tomar los

valores siguientes: Bit 0 : Mecanismo #1apoyado, Bit 1 : Mecanismo #2 apoyado. Además se dan a conocer el número de version y el número del último PCI-bus en el sistema. Retorno: INT SUCCESSFUL - PCI-BIOS existente NOT_SUCCESSFUL - PCI-BIOS no fue encontrado. ****************************************************************************************** Syntax: int find_pci_device( word device_id,

word vendor_id,

word index,

byte *bus_number,

byte *dev_and_func);

Inputs: word Device ID ,Device ID de el PCI-Device deseado Word vendor_id ,Vendor ID de el PCI-Device deseado word index ,el número de la Device (0... (N-1)) que se debe encontrar

Output: byte *bus_number ,PCI-Bus en el cual se encontró el device byte *dev_and_func ,Device-Nummer en los 5 Bits superiores, Function-Nummer en los

3 Bits inferiores Descripción:

Esta función busca una PCI-Device, que esta determinada a través del Device-ID, Vendor-ID e Index. El primer Device que se encuentra se especifica con Index 0, el segundo con 1 etc..

Retorno: INT

SUCCESSFUL - Device encontrada. NOT_SUCCESSFUL - BIOS Error.

45

DEVICE_NOT_FOUND - Device no encontrado. BAD_VENDOR_ID - Vendor ID (0xffff) ilegal.

****************************************************************************************** Syntax: int read_configuration_dword( byte bus_number,

byte device_and_function,

byte register_number,

dword *dword_read);

Input: byte bus_number ,PCI-Bus, con los datos de configuración que se leerán.

byte dev_and_func ,Device-Nummer situada 5 Bit superiores, Function-Nummer in situada en 3 Bi inferiores.

byte register_number ,Registro del espacio de configuración, que debe ser leído.

Output: dword *dword_read ,puntero a los datos, que fueron leídos. Descripción:

Esta función lee un DWORD desde el espacio de configuración de la PCI-Device especificada (reemplaza read_configuration_space_register).

Retorno: INT SUCCESSFUL - Device encontrada. NOT_SUCCESSFUL - BIOS-Error. BAD_REGISTER_NUMBER - número de Registro invalido.

****************************************************************************************** Syntax: int write_configuration_dword( byte bus_number,

byte device_and_function,

byte register_number,

dword dword_read);

Input: byte bus_number , PCI-Bus, con los datos de configuración que se leerán.

byte dev_and_func , Device-Nummer situada 5 Bit superiores, Function-Nummer in situada en 3 Bi inferiores

byte register_number , Registro del espacio de configuración, que debe ser escrito. dword *dword_read ,datos a escribir.

Output: ninguna Descripción:

Esta función escribe un DWORD en el espacio de configuración de la PCI-Device especificada (reemplaza write_configuration_space_register).

Retorno: INT SUCCESSFUL - Device encontrada. NOT_SUCCESSFUL - BIOS-Error. BAD_REGISTER_NUMBER - número de registro invalido.

46

Estructuras y constantes en la biblioteca de funciones:

El retorno de las funciones de la biblioteca C++ para MS-DOS son siempre del tipo int. El código de errores tiene el contenido siguiente:

SUCCESSFUL 0x00 NOT_SUCCESSFUL 0x01 FUNC_NOT_SUPPORTED 0x81 BAD_VENDOR_ID 0x83 DEVICE_NOT_FOUND 0x86 BAD_REGISTER_NUMBER 0x87

La estructura para los parámetros de Hardware: struct HW_state

{

DWORD baseaddress_0; // region 0 Basisadresse, dirección base del AMCC S5933 DWORD baseaddress_1; // region 1 dirección base. DWORD baseaddress_2; // region 2 dirección base. DWORD baseaddress_3; // region 3 dirección base. DWORD baseaddress_4; // region 4 dirección base. DWORD baseaddress_5; // region 5 dirección base. BYTE irq; // IRQ-Nummer del PCI-Bus. BYTE bus_nummer; // Bus, en el cual se instalo el PCI-Proto LAB. BYTE device_and_function; // Device&Function-Nummer para el bus concreto. DWORD eeprom_basis; // Tamaño del EEPROM. DWORD transfer_count; // cantidad de bytes que se transmiten en un ciclo del

// Busmaster };

47

Apéndice C Funciones especiales del driver VxD para Windows95

Para la administración se usan:

load_driver

unload_driver

get_drv_handle

get_drv_version

set_amcc_base

get_amcc_base

Funciones para encontrar una PCI-Device y para leer la PCI Configuration Space:

get_last_busnumber

find_pci_to_pci_bridge

find_pci_device

get_class_code

get_io_region_base_address

get_mem_region_base_address

get_io_region_size

get_mem_region_size

map_memory_region

Ya que el PCI-BIOS con su software de interrupciones bajo Windows95 no esta a disposición, se accederá a leer o escribir con las funciones read_configuration_space_register y write_configuration_space_register directamente en las direcciones CF8h (CONFIG_ADDRESS) y CFCh (CONFIG_DATA) . Funciones para el tratamiento especial de las interrupciones en Windows95:

virtualize_irq

unvirtualize_irq

get_vxd_irq

Funciones para proveer y administrar memoria física:

alloc_physical_memory

free_physical_memory

get_apm_size

get_apm_addr

set_transfer_count

get_transfer_count

Syntax del llamado de funciones ****************************************************************************************** Syntax: BYTE load_driver(void) Input: ninguna Output: ninguna

48

Descripción: Haga partir el driver dinámico virtual PROTOLAB.VXD para el acceso a PCI-Proto LAB.

Después de la ejecución exitosa de esta función se puede acceder bajo Windows95 a el Hardware del prototipo.

Retorno: BYTE

SUCCESS - el driver partió en forma exitosa. DRIVER_ERROR - el driver no se pudo hacer partir. ****************************************************************************************** Syntax: BYTE unload_driver(void) Input: ninguna Output: ninguna Descripción: Termino del virtual dinámico Device driver PROTOLAB.VXD para el acceso a la PCI-Proto

LAB. Los resources que están reservados serán dados libres por el driver. Retorno: BYTE

SUCCESS - el driver fue finalizado exitosamente. DRIVER_ERROR - el driver no se pudo hacer partir. ****************************************************************************************** Syntax: HANDLE get_drv_handle(void) Input: ninguna Output: ninguna Descripción:

esta función entrega el HANDLE, con el cual el virtual Driver Device bajo Windows95 está registrado. Aplicaciones pueden probar con esta función, si el driver fue cargado o si se puede acceder al driver.

Retorno: HANDLE

NULL - el Device driver no fue cargado. INVALID_HANDLE_VALUE - El Device driver no puede ser cargado. ****************************************************************************************** Syntax: BYTE get_drv_version( BYTE *major_version

BYTE *minor_version).

Input: ninguna

Output: BYTE *major_version ,puntero a un buffer para el número mayor de versión del driver.

BYTE *minor_version ,puntero a un buffer para el número menor de versión del driver

Descripción: Esta función da el número de Versión de el Device driver.

Retorno: BYTE SUCCESS - si la función se ejecuta sin errores. DRIVER_ERROR - el driver no puede ser accedido. UNEXPECTED_ERROR - ocurre un error desconocido. ******************************************************************************************

49

Syntax. BYTE set_amcc_base(DWORD baseaddress)

Input: DWORD baseaddress ,AMCC S5933 dirección base.

Output: ninguna

Descripción:

A través de esta función se da la dirección base del AMCC S5933 al Device driver virtual. Una aplicación tiene que leer durante la inicialización, lo que el sistema PCI-bus fijó en la region de direcciones del espacio de configuración para la carta prototipo. La Region0 esta reservada siempre para el AMCC S5933 y se usa como dirección base para el acceso del PCI-Control. Con “Basisadresse + Offset” se forma la dirección completa de un registro. El VxD necesita este valor exclusivamente, para poder acceder con el Interrupt-Service-Routine en el AMCC S5933.

Retorno: BYTE

SUCCESS - ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver.

******************************************************************************************

Syntax. BYTE get_amcc_base(DWORD *baseaddress)

Input: ninguna

Output: DWORD *baseaddress ,puntero a la dirección base del AMCC S5933.

Descripción: A través de esta función se lee desde el Device driver virtual la dirección base del AMCC S5933. Esta dirección tiene que ser leída primero con set_amcc_base. Una aplicación tiene que leer durante la inicialización, lo que el sistema PCI-bus fijo en la region de direcciones del espacio de configuración para la carta prototipo. La Region0 esta reservada siempre para el AMCC S5933 y se usa como dirección base para el acceso del PCI-Control. Con “Basisadresse + Offset” se forma la dirección completa de un registro. El VxD necesita este valor exclusivamente, para poder acceder con el Interrupt-Service-Routine en el AMCC S5933.

Retorno: BYTE

SUCCESS - ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver.

****************************************************************************************** Syntax: BYTE get_last_busnumber( BYTE *last_bus)

Input: ninguna

Output: BYTE *last_bus ,puntero al número del último bus del sistema PCI-bus.

Descripción: Determina el número de buses del sistema PCI-bus. Para este el número del bus subordinado

del PCI-TO-PCI-Bridg será leído desde el Bus 0. El número del último bus es el número máximo de buses subordinados.

50

Retorno: BYTE SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. UNEXPECTED_ERROR - ocurre un error desconocido.

****************************************************************************************** Syntax: BYTE find_pci_to_pci_bridge ( BYTE busnumber,

BYTE *dev_func).

Input: BYTE busnumber ,número del bus, que debe ser buscado en el bridge.

Output: BYTE *dev_func ,puntero al PCI-Device-Nummer del Bridge.

Descripción: Esta función busca en el PCI-Bus un PCI-TO-PCI-Bridge y entrega el número encontrado

Device&Function-Nummer de este bridge. Si no se encuentra un Bridg, se retorna un error de código. Esta función se necesita, para buscar un PCI-Device con un determinado Device-ID y Vendor-ID en un sistema con varios sistemas de PCI-Bus.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver. NO_SUCH_DEVICE - PCI-TO-PCI-Brigde no fue encontrado.

****************************************************************************************** Syntax: BYTE find_pci_device( WORD vendor_id,

WORD device_id,

WORD index,

BYTE *bus_number,

BYTE *device_and_function)

Input: WORD device_id ,Device-ID del PCI-Device buscado. WORD vendor_id ,Vendor-ID del PCI-Device buscado. WORD index ,número del PCI-Device buscado.

Output: BYTE *bus_number ,puntero al número del PCI-Busses,en la cual se encontró la

Device. BYTE *device_and_function ,Device-Nummer en los5 Bit superiores Function-Nummer en los 3 Bit inferiores.

Descripción: Esta función busca la aparición x de un PCI-Device con un determinado Vendor- y Device-ID.

Index = 1 significa la primera aparición, index = 2 la segunda etc.. Se averigua el número del bus y el Device&Function-Nummer de esta Device. Con estos valores es posible calcular la dirección correcta para leer y escribir desde/hacia el espacio de configuración de registros.

(vea read_configuration_space_register).

Retorno: BYTE SUCCESS - Ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver. NO_SUCH_DEVICE - Device no fue encontrado. UNEXPECTED_ERROR - Error desconocido.

51

****************************************************************************************** Syntax: BYTE get_class_code( DWORD register_address,

DWORD *class_code).

Input: DWORD register_address ,dirección de la Class-Code-Register.

Output: DWORD *class_code ,contenido de la Class-Code-Register.

Descripción: Lee el contenido del DWORD-Registers, desecha los Bytes más bajos, que están en el número de revisión de la Device y otorga en los 3 Byte superiores a la Class-Code de la Device. Para el Syntax de la dirección de Registros vea read_configuration_space_register.

Retorno: BYTE

SUCCESS - Ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver.

**********************************************************************************************

Syntax: BYTE get_io_region_base_address( struct HW_State *hw,

BYTE region)

Descripción:

Esta función lee durante el boteo desde el PCI-Bus la dirección física deseada en la Region IO-.

Input: BYTE bRegion ,número de la region deseada. HW_State *hw ,puntero a la HW_State-Estructura, en la cual la dirección

se debe inscribir.

Output: Ninguna.

Retorno: BYTE SSUCCESS - Ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver. INVALID_REGION - Region invalida. NO_IO_REGION - no fue hallada una dirección IO para esta Region.

**********************************************************************************************

Syntax: BYTE get_mem_region_base_address( struct HW_State *hw,

BYTE region)

Descripción:

Esta función lee durante el boteo desde el PCI-Bus la direción física deseada de una memoria

Input: BYTE bRegion , número de la region deseada. HW_State *hw , puntero a la HW_State-Estructura, en la cual la dirección

se debe inscribir.

Output: Ninguna.

Retorno: BYTE SSUCCESS - Ejecución correcta DRIVER_ERROR - Error durante el llamado del driver. INVALID_REGION - Region invalida NO_MEM_REGION - no fue hallado dirección de memoria para la Region.

******************************************************************************************

Syntax: BYTE get_io_region_size( struct HW_State *hw,

BYTE region,

52

DWORD *size)

Descripción:

Esta función lee durante el boteo desde el PCI-Bus la cantidad de direcciones-IO que están a disposición

Input: BYTE region , número de la region deseada.

HW_State *hw , puntero a la HW_State-Estructura, en la cual la dirección se debe inscribir.

DWORD *size ,tamaño de la Region.

Output: Ninguna.

Retorno: BYTE SSUCCESS - Ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver. INVALID_REGION - Region invalida. NO_IO_REGION - no fue hallado dirección de memoria para la Region.

******************************************************************************************

Syntax: BYTE get_mem_region_size( struct HW_State *hw,

BYTE region,

DWORD *size)

Descripción:

Esta función lee durante el boteo desde el PCI-Bus la cantidad de direcciones que están a disposición en la memoria de direcciones

Input: BYTE region , número de la region deseada.

HW_State *hw , puntero a la HW_State-Estructura, en la cual la dirección se debe inscribir.

DWORD *size , tamaño de la Region.

Output: Ninguna.

Retorno: BYTE SSUCCESS - Ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver. INVALID_REGION - Region invalida. NO_MEM_REGION - no fue hallado dirección de memoria para la Region.

******************************************************************************************

Syntax: BYTE map_mem_region( struct HW_State *hw,

BYTE region,

DWORD size)

Descripción:

Esta función convierte la dirección física de la region de memoria en la dirección lineal (virtual) del área des sistema operativo. Las direcciones lineales otorgadas son durante una sesión Windows95 invariablemente válidas.

Input: BYTE region , número de la region deseada.

HW_State *hw , puntero a la HW_State-Estructura, en la cual la dirección se debe inscribir.

DWORD size ,tamaño de los bloques de direcciones a convertir.

Output: Ninguna.

53

Retorno: BYTE SSUCCESS -. Ejecución correcta DRIVER_ERROR - Error durante el llamado del driver. INVALID_REGION - Region inválida. NO_MEM_REGION - no fue hallado dirección de memoria para la Region ADDRESS_NOT_MAPPED - la dirección no se pudo convertir.

******************************************************************************************

Syntax: BYTE get_vxd_irq( WORD* irq)

Input: ninguna

Output: WORD* irq ,IRQ de la carta prototipo.

Descripción La función lee el IRQ otorgado a la carta prototipo por el Device driver virtual.

Retorno: BYTE

SUCCESS - Ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver.

******************************************************************************************

Syntax: BYTE virtualize_irq( WORD irq)

Input: WORD irq , IRQ que se debe virtualizar.

Output: None. Descripción: Para poder acceder bajo Windows95 a una interrupción de HW, este tiene que ser virtualizado,

e.d.. el tiene que estar inscrito y reservado en el sistema de interrupciones de Windows95. Para ello se vincula un vector interruptor con el Interrupt-Service-Routine. El IRQ, se debe dar como parámetro, tiene que leerse primero con get_vxd_irq.

Retorno: BYTE

SUCCESS - ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver. PRAMETER_ERROR - IRQ inválido. IRQ_ERROR - IRQ no se pudo virtualizar.

******************************************************************************************

Syntax: BYTE unvirtualize_irq( void)

Input: ninguna

Output: ninguna

Descripción: Se da libre la interrupción reservada anteriormente con virtualize_irq.

Retorno: BYTE

SUCCESS - Ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver.

54

******************************************************************************************

Syntax: BYTE alloc_physical_memory( DWORD size

DWORD *addresses)

Input: DWORD size ,tamaño de la memoria a en “Physical Pages”.

Output: DWORD *addresses ,puntero hacia un Buffer para las direcciones.

Addresses[0] ,dirección en el espacio de dirección lineal. Addresses[1] ,dirección en el espacio de dirección físico.

Descripción: Se intenta reservar, memoria física continuada del tamaño dado. El tamaño de la memoria tiene

que ser un múltiplo de una “Physical Page Size” (4096 Byte). Si la memoria se puede poner a disposición, entonces en el buffer de direcciones addresses se inscribiran las direcciones lineales y físicas en el espacio de direcciones. En aplicaciones se debe usar solo la dirección lineal. La dirección física se pone a disposición exclusivamente para información. Ella se le entrega durante transferencia FIFO-Busmaster a el AMCC S5933.

Retorno: BYTE

SUCCESS - Ejecución correcta. NO_PHYS_MEM_ALLOC - memoria no reservada. DRIVER_ERROR - Error durante el llamado del driver.

******************************************************************************************

Syntax: BYTE free_physical_memory(DWORD dwLinADDr) Input: DWORD dwLinADDr ,dirección del espacio de dirección lineal que debe ser liberado.

Output: ninguna

Descripción:

Con esta función se da libre la memoria reservada con alloc_physical_memory. Si la memoria no se deja libre al finalizar una aplicación, entonces ella permanece bloqueada.

Retorno: BYTE

SUCCESS - Ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver.

***************************************************************************

Syntax: BYTE get_apm_size( DWORD *size)

Input: ninguna

Output: DWORD *size ,tamaño de la memoria física continua reservada.

Descripción: Esta función da el tamaño de la memoria que fue reservada anteriormente con get_physical_memory.

Retorno: BYTE

SUCCESS - Ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver.

******************************************************************************************

Syntax: BYTE get_apm_addr( DWORD *linear_addr,

DWORD *physic_addr)

55

Input: ninguna

Output: DWORD *linear_addr ,direcciones en el espacio de direcciones lineales.

DWORD *physic_addr ,direcciones en el espacio de direcciones físico.

Descripción: Esta función da las direcciones lineal y física de la memoria que fue anteriormente reservada

con alloc_physical_memory. Si no se reservo memoria, retorna 0.

Retorno: BYTE SUCCESS - Ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver.

******************************************************************************************

Syntax: BYTE set_transfer_count( DWORD tc)

Input: DWORD tc ,Cantidad de los Bytes que se deben transmitir en modo Busmaster.

Output: ninguna

Descripción: La función determina la cantidad de bytes a trasmitir en modo Busmastertransfer. Este valor será entregado durante una transmisión FIFO-Busmaster a el AMCC S5933.

Retorno: BYTE

SUCCESS - Ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver.

******************************************************************************************

Syntax: BYTE get_transfer_count( DWORD *tc)

Inputs: ninguna

Output: DWORD *size ,cantidad de Bytes a transmitir.

Descripción:

La función lee el número de Bytes a transmitir que fue escrito por la función set_transfer_count.

Retorno: BYTE SUCCESS - Ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver.

******************************************************************************************

56

Estructuras y constantes para PROTOLAB.DLL y PROTOLAB.VXD TIMEOUT 0x01000 Código de errores SUCCESS 0x00 UNEXPECTED_ERROR 0x10 DRIVER_ERROR 0x11 FUNCTION_ERROR 0x12 PARAMETER_ERROR 0x13 NO_SUCH_DEVICE 0x14 NO_EXPANSION_ROM 0x15 TIMEOUT_ERROR 0x16 FIFO_EMPTY_ERROR 0x17 FIFO_NOT_EMPTY_ERROR 0x18 IRQ_ERROR 0x19 NO_PHYS_MEM_ALLOC 0x20 NO_MEMORY_FREED 0x21 NO_DMA_REGION 0x23 INVALID_REGION 0x24 NO_IO_REGION 0x25 NO_MEM_REGION 0x26 ADDRESS_NOT_MAPPED 0x27 EEPROM IDs COMAND_HIGH_ADDRESS 0xA0 COMAND_LOW_ADDRESS 0x80 COMAND_INACTIVE 0x00 COMAND_START_WRITE 0xC0 COMAND_START_READ 0xE0 STATE_EEPROM_READY 0x80 Offsets del AMCC S5933 Operation Register AMCC_OP_REG_OMB1 0x00 outgoing mailboxes AMCC_OP_REG_OMB2 0x04 AMCC_OP_REG_OMB3 0x08 AMCC_OP_REG_OMB4 0x0c AMCC_OP_REG_IMB1 0x10 incomming mailboxes AMCC_OP_REG_IMB2 0x14 AMCC_OP_REG_IMB3 0x18 AMCC_OP_REG_IMB4 0x1c AMCC_OP_REG_FIFO 0x20 I/O-access to bidirectional FIFO AMCC_OP_REG_MWAR 0x24 Master Write Address Register AMCC_OP_REG_MWTC 0x28 Master Write Transfer Count AMCC_OP_REG_MRAR 0x2c Master Read Address Register AMCC_OP_REG_MRTC 0x30 Master Read Transfer Count AMCC_OP_REG_MBEF 0x34 Mailbox Empty/Full Status Register AMCC_OP_REG_INTCSR 0x38 Interrupt Control/Status Register AMCC_OP_REG_MCSR 0x3c Bus Master Control/Status Register AMCC_OP_REG_MCSR_NVDATA 0x3e data in byte 2 AMCC_OP_REG_MCSR_NVCMD 0x3f command in byte 3 Mascara de registros para el FIFO Mastermode (Add-On-to-PCI) del AMCC S5933 EN_MWTC_INT 0x00004000 enable Interrupt if MWTC zero EN_MRTC_INT 0x00008000 enable Interrupt if MRTC zero REQ_PCI_4DW_FULL 0x00000200 PCI-Request if FIFO full

57

WR_FIFO_PRIOR 0x00000100 add-on to PCI FIFO priorized RD_FIFO_PRIOR 0x00001000 PCI to add-on FIFO hat priorized DIS_ADO_2_PCI_MASTER 0xFFFFFBFF disable add-on to PCI FIFO busmaster. EN_ADO_2_PCI_MASTER 0x00000400 en. add-on to PCI FIFO busmaster DIS_PCI_2_ADO_MASTER 0xFFFFBFFF disable PCI to add-on FIFO busmaster. EN_PCI_2_ADO_MASTER 0x00004000 en. PCI to add-on FIFO busmaster RESET_PCI_TO_ADO_FLAGS 0x02000000 reset fifo-state-flags in MCSR RESET_ADO_TO_PCI_FLAGS 0x04000000 reset fifo-state-flags in MCSR RESET_FIFO_FLAGS 0x06000000 reset fifo-state-flags in MCSR DIS_FIFO_MWT 0xFFFFFBFF disable busmaster write transfer (AND-m) Sucesos de Interrupciones AMCC_INT 0x00800000 Interrupt asserted MWTC_INT 0x00040000 Master Write Transfer Count Zero MRTC_INT 0x00080000 Master Read Transfer Count became zero OGMBOX_INT 0x00010000 OutGoing MailBox became empty ICMBOX_INT 0x00020000 InComming MailBox became full MASTER_ABORT_INT 0x00100000 Transferinterrupt by Master TARGET_ABORT_INT 0x00200000 Transferinterrupt by Target Disable-Masken para diferentes fuentes de interrupciones (AND-Masken): DIS_IRQ_WTC_ZERO 0x0FFFFBFFF disable write transfer counter zero interrupt. DIS_IRQ_RTC_ZERO 0x0FFFF7FFF disable read transfer counter zero interrupt. DIS_IRQ_MBOX 0x0EF disable mailbox interrupt CLEAR_SRC_MBOX 0x0F3 clear interrupt source box CLAER_SCR_MBOX_BYTE 0x0FC clear interrupt source byte CLEAR_ALL_IRQ 0x003F0000 clear all interrupt requests (OR-mask) Componentes en el espacio de configuración de direcciones: PCI_REG_NEXT_BUS 0x00010000 offset to next bus number PCI_REG_NEXT_DEV 0x00000800 offset to next device number PCI_REG_NEXT_FUN 0x00000100 offset to next function (if m/f) PCI_REG_NEXT_REG 0x00000004 offset to next register number PCI-Device Class Codes Masks: PCI_TO_PCI_BRIDGE_CLASS 0x06040000 PCI Configuration Space Register PCI_CS_VENDOR_DEVICE 0x00 PCI_CS_CLASS_CODE 0x02 register contains the class codes PCI_CS_HEADER_TYPE 0x03 register contains the header type PCI_CS_INTERRUPT 0x0F register contains the interrupt values PCI_CS_BASE_ADDRESS_0 0x04 1. reserved address region PCI_CS_BASE_ADDRESS_1 0x05 2. reserved address region PCI_CS_BASE_ADDRESS_2 0x06 3. reserved address region PCI_CS_BASE_ADDRESS_3 0x07 4. reserved address region PCI_CS_BASE_ADDRESS_4 0x08 5. reserved address region PCI_CS_BASE_ADDRESS_5 0x09 6. reserved address region PCI_CS_EEPROM 0x0C address of expansion ROM PCI Configuration Space Register für PCI_TO_PCI_BRIDGE PCI_CS_BUSNUMBER 0x06 register contains the busnumbers PCI Configuration Space Registermasken

58

PCI_MULTI_FUNCTION_DEVICE 0x00800000 bit 23 indicates multi-function PCI_INTERRUPT_LINE 0x000000FF bit 0...7 gets the interrupt line PCI_INTERRUPT_PIN 0x0000FF00 bit 8...15 gets the interrupt pin PCI_CLASS_CODE 0xFFFFFF00 bit 8...31 gets the class codes PCI_BUSNUMBERS 0x00FFFFFF bit 0...23 gets the busnumbers struct HW_state

{

DWORD baseaddress_0; // region 0 base address DWORD baseaddress_1; // region 1 base address DWORD baseaddress_2; // region 2 base address DWORD baseaddress_3; // region 3 base address DWORD baseaddress_4; // region 4 base address DWORD baseaddress_5; // region 5 base address BYTE irq; // IRQ-number BYTE bus_nummer; // number of the bus contains the PCI-device BYTE device_and_function; // device&function num. of the desired device BYTE Reserved, // reserved DWORD eeprom_basis; // Port address of EEPROM

DWORD transfer_count; // transfered dwords during busmaster transfer };

Estructura del espacio de configuración PCI struct config_space

{

WORD vendorid; // PCI-Bus vendor ID WORD deviceid; // PCI-Bus device ID WORD command; // command register WORD status; // status register byte revision; // revision number of the device byte devclass[3]; // class code of the device byte cachesize; // cach line size byte latency; // latency timer byte hdrtype; // header type byte bist; // built-in self-test DWORD baseadr[6]; // registers for the 6 address regions DWORD cis; // CardBus CIS pointer WORD subvendor; // subsystem vendor ID WORD subsystem; // subsystem DWORD romadr; // expansion ROM base address DWORD reserved[2]; // reserved byte irq; // interrupt line byte ipin; // interrupt pin byte min_gnt; // min. burst on 33 MHz bus (1/4 µs units) byte max_lat; // max. latency on 33 MHz bus (1/4 µs units) byte device_field[196]; // device-specific information

};

59

Apéndice D Funciones especiales del Kernel Drivers para Windows NT

Las funciones load_driver(void)

unload_driver(void);

tienen otro significado que en Windows95. Ellas abren bzw. cierran el acceso a los drivers en una aplicación. El driver PPLNT.SYS mismo no se cargo o termina Especificación: Una función para buscar PCI-Devices no se incluye, porque el driver fue desarrollado especialmente para el hardware de el PCI-Proto LAB bajo Windows NT. El driver apoya solamente cartas prototipo, que tienen el Vendor-ID 10E8h y el Device-ID 8170h. Si la carta no se encuentra, entonces el driver no será cargado. Las funciones para leer y escribir los registros del espacio de configuración (como bajo Windows 95) están a disposición. El acceso al espacio de configuración se realiza bajo Windows NT a tráves de funciones del sistema y no como en Window 95 directamente por las direcciones CF8h y CFCh. Las exigencias de seguridad de sistema de Windows NT significa, que las aplicaciones no pueden acceder en áreas de memoria donde los driver del Kernel están almacenados. Es por esto que la interacción entre los drivers y las aplicaciones es compleja. Se necesita una función, que la gran cantidad de datos existentes en un driver buffer sean copiados en la memoria de la aplicación. Para esta tarea se escribieron estas funciones: alloc_physical_memory

read_driver_buffer Bajo Windows NT no se puede trabajar directo con los valores del espacio de configuración PCI. Las direcciones son mapeadas en el espacio de direcciones de Windows NT. Con estas nuevas direcciones se pueden implementar las operaciones de I/O. Y para poder leer nuevos valores, se ponen a disposición las siguentes funciones:

*************************************************************************** Syntax: BYTE get_base_address ( DWORD nRegion

DWORD *pBase,

DWORD *pCount,

DWORD *pType).

Input: DWORD nRegion ,número de la dirección del área que fué acordado en el espacio de

configuración

Output: DWORD *pBase ,Puntero auf die Startadresse der Region. DWORD *pCount ,Puntero a el tamaño de la región. DWORD *pType ,Puntero a el tipo de memoria: memoria o I/O.

Descripción: A través de esta función se conoce para la region deseada: la dirección en el espacio de

direcciones de Windows NT, el tamaño de la region a reservar y el tipo de la region. Bajo Windows NT el sistema puede mapear, si es necesario, I/O-direcciones requeridas en el espacio de memoria. Tipo = 0 para direcciones en el espacio de memorias y el tipo = 1 para direcciones, que fueron mapeadas en el espacio I/O. El driver controla en forma automatica el tipo de memoria, con lo cual el usuario se despreocupa de esta tarea.

Retorno: BYTE

SUCCESS - Ejecución sin errores. DRIVER_ERROR - Error durante el llamado del driver.

60

La función get_amcc_base entrega la dirección que fue mapeada en el espacio de direcciones de Windows NT, mientras que set_amcc_base no altera la dirección base. ******************************************************************************************

Syntax: BYTE alloc_physical_memory( DWORD *logic_addr,

DWORD *phys_addr,

DWORD *size)

Input: DWORD *size ,Puntero a el tamaño de la memoria a reservar en Bytes.

Output: DWORD *logic_addr ,dirección en el espacio de direcciones lineal.

DWORD *phys_addr ,dirección en el espacio de direcciones fisico. Descripción: Se intenta reservar memoria en forma de corrida en el tamaño deseado. El tamaño de la

memoria tiene que ser un multiplo de la “Physical Page Size” (4096 Byte). Si la memoria pudo ser reservada entonces se retorna las direcciones lineales y físicas en el espacio de direcciones. Las direcciones seran puestas a disposición exclusivamente para informar. La dirección física será dada a el AMCC S5933 durante una transferencia FIFO-Busmaster. A la direción lógica solo tiene acceso el Kernel Driver. Si una aplicación intenta acceder a esta dirección directamente para leer o escribir, entonces Windows NT anuncia un error de acceso. Datos que deben ser escritos en un buffer por el AMCC S5933 durante una transferencia Busmaster, tienen que ser leidos con read_driver_buffer en un espacio de memoria que pueda ser accedido por la aplicación. Despues de esta procedura estan los datos a disposición para otros procesamientos.

Retorno: BYTE

SUCCESS - Ejecución correcta. NO_PHYS_MEM_ALLOC - Speicher nicht reserviert. DRIVER_ERROR - Error durante el llamado del driver.

****************************************************************************************** Syntax: BYTE read_driver_buffer( DWORD *appl_buffer,

DWORD count)

Input: DWORD *appl_buffer ,dirección de la memoria, ven la cual se deben copiar los datos. DWORD count ,cantidad de Byte que se deben copiar en la memoria de aplicación.

Output: DWORD *appl_buffer ,en la memoria de aplicación estan los datos leidos.

Descripción: La función lee datos desde la memoria del Kernel Driver en una área de memoria, en la cual la

aplicacion ppueda acceder. El driver_buffer tiene que haber sido instalado previamente con alloc_physical_memory.

Retorno: BYTE

SUCCESS - Ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver.

******************************************************************************************

Syntax: BYTE map_mem_region( DWORD region,

61

DWORD *address)

Descripción:

Esta función convierte la dirección física de la region de memoria en la dirección lineal (virtual) del del espacio de direcciones del sistema operativo. Las direcciones virtuales obtenidas son solamente válidas en el espacio de direciiones de la aplicación. Ejemplo: DWORD dwSize = 1; DWORD dwAddress; BYTE *pBoardAddress; BYTE bRead; if(map_memory_region(dwRegion, &dwAddress)!=SSUCCESS) return; pBoardAddress = (BYTE *)dwAddress; pBoardAddress[0] = 0x55; bRead = *pBoardAddress;

Input: DWORD region ,número de la region interesada.

DWORD *address ,Puntero a esta dirección.

Output: Ninguna.

Retorno: BYTE SSUCCESS - Ejecución correcta. DRIVER_ERROR - Error durante el llamado del driver. INVALID_REGION - Region invalida. NO_MEM_REGION - no fue encontrada una dirección de memoria válida en esta region.

Estructuras y constantes para PPLNT.SYS y PROTOLAB.DLL son identicas a las que tiene Windows95: vea APÉNDICE C.

62

Apéndice E Gráficos de FIFO-Direct Read

WRFULL

Este gráfico muestra la señal WRFULL del AMCC S5933. Con el estado LOW se indica, que se pueden tomar datos en el FIFO, e.d. en ese instante se pudo por lo menos vaciar un espacio de memoria en el FIFO y llenarlo nuevamente. Se realiza una transmisión de datos que se encuentran en el FIFO a través del bus PCI en dirección del computador Host, entoces se pone a disposición un espacio de memoria para nuevos datos. Esto se indica cuando el AMCC S5933 su WRFULL-Pin lo pone en LOW. La periferia conectada puede ocupar este espacio de memoria, hasta que con WRFULL = HIGH se indica que el FIFO esta lleno. En nuestro ejemplo se lee repetidamente el FIFO, del Control PCI, mediante una iteración de accesos únicos. La recarga de datos nuevos en el FIFO se reconocen en el gráfico, en los estados LOW del WRFULL. El tiempo entre dos accesos son necesitados por el software y el acceso mismo. Efectivamente logramos obtener con el acceso único descrito transferencias de hasta 442kBytes/s.

63

Apéndice F Gráficos de FIFO-Busmaster Polling

WRFULL

Éste gráfico muestra la señal WRFULL del AMCC S5933. En nuestro ejemplo fueron transmitidos 102400 Bytes del AMCC S5933 en modo Busmaster transfer. El inicio de la transmisión comienza con el primer flag que cae del WRFULL, con él cual el FIFO indica que los datos pueden ser tomados. La transmisión se interrumpe (WRFULL = High), cuando los datos no se pueden transmitir en forma suficientemente rápida a través del PCI bus. Motivo para esta situación puede ser por ejemplo: otros integrantes del Bus, RAM-Caches llenos o generales Bus Service Time. Los 102400 Bytes de nuestro ejemplo fueron transmitidos en un tiempo efectivo de 964 µs, e.d. con una rapidez de transmisión de 106 Mbytes/s. Después que la transmisión de datos se inició, se prueba en la aplicación a través de un requerimiento del MTCR, cuando la transferencia finaliza (MTCR es 0). Despúes se finaliza la trasnmisión y el bus no se utiliza, hasta que un nuevo comando se activa (WRFULL permanece HIGH).

64

Apéndice G Gráficos del FIFO-Busmaster Interrupt

WRFULL

INTA

Este gráfico equivale a él del Apéndice F. del Busmaster transfers. Una diferencia fundamental es que al final de un ciclo de transmisión se activa una interrupción, esta se reconoce en la señal INTA del AMCC S5933. En la señal WRFULL no se puede reconocer el inicio o fin de un bloque de datos.

WRFULL

INTA

65

El segundo gráfico del osciloscopio se escogió por eso con una definición más exacta, de tal forma que las interrupciones de transmisión son visibles durante el Interrupt-Service-Time (INTA es LOW, aprox. 5µs) La rapidez de transmisión alcanzados en el modo de interrupciones controladas hemos obtenidos valores parecidos a los obtenidos en el modo polling controlados del Busmaster transfer. Pero como el ciclo próximo sigue inmediatamente al que acaba de terminar, se pueden transmitir en total, para el mismo intervalo de tiempo más datos. El bus del computador será utilizado en forma muy intensiva. Él esta prácticamente todo el tiempo ocupado, lo que afecta por ejemplo a la carta gráfica. La pantalla se refresca raramente.

66

Apéndice H Descripción de circuito por ejemplo FIFO-Busmaster transfer

Los ejemplos contenidos en el PCI-Software Tool KIT deben servir para que el usuario aprenda a usar la interfaz rápida del FIFO del control S5933. Generalmente se puede usar esta interfaz en forma sincrónica o asincrónica. La configuración se puede efectuar a través del bit 5 ubicado en 45h en el Boot EEPROM. En nuestro ejemplo de aplicación hemos utilizado el modo sincrónico, e.d. los datos se envían sincrónicos con el PCI cloc(BCLK) a el FIFO del AMCC S5933. Este modo permite la rapidez de transmisión más alta.

Para demostrar la capacidad de transferencia de datos a través del bus PCI, usando la interfaz del FIFO; se implementó en el ejemplo de aplicación, la conexión de un ADC rápido ( TDA7803 de Philips) a la interfaz de el Add-On. Con este circuito es posible tactear, señales de tensión alterna con un sample rate de 33Mhz y los valores digitalizados se envían a través del PCI bus a la memoria del computador Host. En el lado de entradas se le antepone un circuito a el ADC, este circuito entrega un valor medio que lo determina a través del los valores Top y Bottom, así el ADC tiene un punto de trabajo fijo. La señal de entrada se acopla a un condensador(C6).

En el lado digital están conectados los datos de salida del convertidor ADC con los conductores del Add-On del Control PCI del AMCC S5933. Los conductores de control del FIFO WRFULL y /WRFIFO son controlados a través de un circuito simple. Con WRFULL indica el S5933 su disposición de leer datos del FIFO. Esta señal conecta -con LOW- la salida del ADC activa y después de algunos µs también puede ser usada como el comando para escribir (/WRFIFO). Mientras el S5933 este con WRFIFO = LOW pida datos para llenar el FIFO, los datos se pueden escribir con cada LH-flag del BCLK. Si cambia WRFIFO hacia HIGH (FIFO lleno), entonces el ADC desconecta sus salidas y da el Add-On data bus. El comando para escribir /WRFIFO se inactiva. Después del transporte de datos a través del PCI-bus comienza un nuevo ciclo, que comienza con un HL-flag de WRFIFO.

Naturalmente que el ADC también produce datos; aún cuando no existe un comando en ese sentido (WRFULL = HIGH). Estos no serán leídos en el FIFO y se pierden. Para no perder estos datos, se tiene que interconectar un FIFO externo con gran capacidad de almacenamiento, que durante las pausas de transmisión almacene éstos. Ya que nuestro ejemplo prioriza el demostrar las capacidades de transmisión rápida del S5933, hemos simplificado y renunciamos a un FIFO externo:

La amplitud de tensión alterna de alimentación no debe exceder el valor de 1,7V (Peak to Peak), pues la entrada análoga del ADU puede ser dañada. , entre las diferentes aplicaciones

67

Apéndice I Proveedores / Direcciones del WEB

Nuestra Hotline HK Messsysteme GmbH Teléfono: ++49 30 65762346 Koepeniker Str. 325 Fax: ++49 30 65762348 12555 Berlín eMail: [email protected] Alemania WEB http://www.pci-tools.de http://www.pci-tools.com Para nuestros clientes en el extranjero:

HKM USA Tateno-Dennou Inc. 80 Lancaster Dr. ASO bldg., 5-955 Baigo Tewksbury, MA 01876 USA Oume-city, Tokyo, 198-0063 Japan Fax: ++1-978-863-0069 Teléfono: ++81-428-77-7000 Contact Person: Ilse Seichter Fax: ++81-428-77-7010 E-Mail: [email protected] Email: [email protected]

Bentech Computer & Systems Corp. Gerhard Kassner 7F-3, No.23 Lane 169, Kang-Ning Str. Servicios de comunicación His Chih Chen, Taipei Hsien, Paseo Vergara, 9, 4-4M Taiwan, R.O.C. 28250 Torrelodones (Madrid) /Spain Teléfono:886-2-2695-8906 Teléfono/Fax: ++34-91-8590 797 Fax: 886-2-2695-8911 Contact Person: Gerhard Kassner Contact Person: Benjamin Chu Email: [email protected] Email: [email protected]

Dong AH Trade Corporation Ximax Technologies PVT. LTD. 371-7 Hwagok 7-Dong, 106, Annexure Bldg., Kodandarama Kangso-Gu. 157-017, Complex, Gandhi Bazaar Main Road, Seoul, Korea Basavanagudi, Teléfono:82-2-2065-3311, 82-2-2608-8161 56004 Karnataka, Bangalore, India Fax: 82-2-2608-8160 Teléfono: 91-80-2660 8679 / 9628 Contact Person: H.J. Lee Contact Person: Rajesh K Email: [email protected] Email: [email protected]

68

Productor de S9533Qx PCI Matchmaker AMCC Teléfono: ++1 619 4509333 Applied Micro Circuits Corporation Fax: ++1 619 4509885 6195 Lusk Boulevard WEB http://www.amcc.com San Diego, CA 92121-2793 USA Direcciones WEB

http://www.amcc.com http://www.pcisig.com/news_room http://www.pcisig.com/news_room/faqs http://www.pcisig.com/maillist.html