LinuxCNC Documentation
This page is 99% translated. Untranslated text is shown in English.

El componente hal_parport es un controlador para el tradicional puerto paralelo de la PC. El puerto tiene un total de 17 pines físicos. El puerto paralelo original dividía esos pines en tres grupos: datos, control y estado. El grupo de datos consta de 8 pines de salida, el grupo de control consta de 4 pines, y el grupo de estado consta de 5 pines de entrada.

A principios de la década de 1990, se introdujo el puerto paralelo bidireccional, el cual permite que el grupo de datos se use para salida o entrada. El controlador HAL admite el puerto bidireccional, y permite al usuario configurar el grupo de datos como entrada o salida. Si se configura como out, un puerto proporciona un total de 12 salidas y 5 entradas. Si se configura como in, proporciona 4 salidas y 13 entradas.

En algunos puertos paralelos, los pines del grupo de control son de colector abierto, que pueden también ser puestos en Bajo por una puerta externa. En una tarjeta con pines de control de colector abierto, si se configura como x, proporciona 8 salidas y 9 entradas.

En otros puertos paralelos, el grupo de control tiene controladores push-pull y no pueden ser utilizados como entrada.

Note
HAL y colectores abiertos

HAL no puede determinar automáticamente si los pines bidireccionales del modo x son efectivamente de colector abierto (OC). Si no lo son, no pueden usarse como entradas, e intentar conducirlos BAJOS desde una fuente externa puede dañar el hardware.

Para determinar si tu puerto tiene pines open collector, carga hal_parport en modo x. Sin un dispositivo conectado, HAL debería leer el pin como VERDADERO. Después, inserta una resistencia de 470 Ω desde uno de los pines de control a GND. Si el voltaje resultante en el pin de control está cerca de 0 V, y HAL ahora lee el pin como FALSO, entonces tienes un puerto OC. Si el voltaje resultante está lejos de 0 V, o HAL no lee el pin como FALSE, entonces tu puerto no puede usarse en el modo x.

El hardware externo que controla los pines de control también debe usar puertas de colector abierto, p. ej. 74LS05.

En algunas computadoras, la configuración del BIOS puede afectar a si el modo x puede ser usado. El modo SPP es el más probable que funcione.

No se admiten otras combinaciones, y no se puede cambiar un puerto de entrada a salida una vez que el controlador está instalado.

El controlador parport puede controlar hasta 8 puertos (definido por MAX_PORTS en hal_parport.c). Los puertos están numerados comenzando en cero.

1. Carga

El controlador hal_parport es un componente en tiempo real, por lo que debe cargarse en el hilo de tiempo real con loadrt. La cadena de configuración describe los puertos paralelo que se utilizarán y (opcionalmente) sus tipos. Si la cadena de configuración no describe al menos un puerto, es un error.

loadrt hal_parport cfg="puerto [tipo] [puerto [tipo] ...]"
Especificación del puerto

Los números inferiores a 16 se refieren a puertos paralelos detectados por el sistema. Esta es la forma más simple de configurar el controlador hal_parport, y coopera con controlador parport_pc de Linux si está cargado. El puerto 0 es el primer puerto paralelo detectado en el sistema, 1 es el siguiente, y así sucesivamente.

Configuración básica

Esto usará el primer puerto paralelo que Linux detecte:

loadrt hal_parport cfg="0"
Usando la dirección del puerto

La dirección del puerto puede especificarse usando la notación hexadecimal con el prefijo 0x.

La cadena de configuración representa la dirección hexadecimal del puerto, opcionalmente seguida por una dirección (sentido), repitiéndose lo mismo para cada puerto. Las direcciones son in, out o x, y determinan la dirección de los pines físicos del 2 al 9 del conector D-Sub 25. Si no se especifica la dirección el grupo de datos se configurará predeterminadamente como salidas. Por ejemplo:

Comando para cargar el módulo de tiempo real hal_parport con la <cadena-de-configuración> adicional para especificar el puerto en donde se encuentra la tarjeta de puerto paralelo.
loadrt hal_parport cfg="0x278 0x378 in 0x20A0 out"

Este ejemplo instala los controladores para un puerto 0x0278, con pines del 2 al 9 como salidas (predeterminadamente, ya que no se especificó in ni out), un puerto 0x0378, con pines del 2 al 9 como entradas y un puerto 0x20A0, con pines del 2 al 9 especificados explícitamente como salidas. Nota que debes conocer la dirección base de los puertos paralelos para configurar correctamente los controladores. Para puertos en bus ISA normalmente no es un problema, ya que los puertos están casi siempre en direcciones bien conocidas, como 0x278 o 0x378, los cuales están típicamente configurados en el BIOS. Las direcciones de tarjetas en bus PCI normalmente se encuentran con lspci -v in una línea I/O ports, o en un mensaje del kernel después de ejecutar sudo modprobe -a parport_pc. No hay dirección predeterminada, así que, si la <cadena-de-configuración> no contiene por lo menos una dirección será un error.

Diagrama de bloques del puerto paralelo
Figure 1. Diagrama de bloques del puerto paralelo
Tipo

Para cada puerto paralelo manejado por el controlador hal_parport se puede especificar opcionalmente un tipo. El tipo es uno de in, out, epp o x.

Table 1. Dirección de puerto paralelo
Pin in out/epp x

1

out

out

in

2

in

out

out

3

in

out

out

4

in

out

out

5

in

out

out

6

in

out

out

7

in

out

out

8

in

out

out

9

in

out

out

10

in

in

in

11

in

in

in

12

in

in

in

13

in

in

in

14

out

out

in

15

in

in

in

16

out

out

in

17

out

out

in

Si el tipo no está especificado, el valor predeterminado es out.

El tipo epp es igual a out, pero el controlador hal_parport pide que el puerto cambie al modo EPP. El controlador hal_parport no usa el protocolo de bus EPP, pero en algunos sistemas el modo EPP cambia las características eléctricas del puerto de una manera que puede hacer que algún hardware marginal funcione mejor. Se sabe que la bomba de carga del Gecko G540 requiere esto en algunos puertos paralelos.

Consulte la Nota anterior sobre el modo x.

Ejemplo con dos puertos paralelos

Esto habilitará dos puertos paralelos detectados por el sistema, el primero en modo de salida y el segundo en modo de entrada:

loadrt hal_parport cfg="0 out 1 in"
Funciones R/W de Parport

También debe indicar a LinuxCNC que ejecute las funciones read y write.

addf parport.0.read base-thread
addf parport.0.write base-thread

2. Dirección del puerto PCI

Entre las buena tarjetas PCI de puerto paralelo están las que contienen el chipset Netmos 9815. Tiene buenas señales de +5 V, y puede venir en puertos únicos o duales.

Para encontrar las direcciones de E/S para tarjetas PCI, abra una ventana de terminal y use el comando que lista pci:

lspci -v

Busque la entrada con "Netmos" en ella. Ejemplo de una tarjeta de 2 puertos:

0000:01:0a.0 Communication controller: \
      Netmos Technology PCI 9815 Multi-I/O Controller (rev 01)
Subsystem: LSI Logic / Symbios Logic 2POS (2 port parallel adapter)
Flags: medium devsel, IRQ 5
I/O ports at b800 [size=8]
I/O ports at bc00 [size=8]
I/O ports at c000 [size=8]
I/O ports at c400 [size=8]
I/O ports at c800 [size=8]
I/O ports at cc00 [size=16]

Por experimentación, se ha encontrado que el primer puerto (el puerto en la tarjeta) usa el la tercera dirección enumerada (c000) y el segundo puerto (la que se conecta con un cable plano) utiliza la primera dirección enumerada (b800). El siguiente ejemplo muestra el puerto paralelo de la placa madre y un puerto paralelo PCI usando la dirección de salida predeterminada.

loadrt hal_parport cfg = "0x378 0xc000"

Tenga en cuenta que sus valores pueden ser diferentes. Las tarjetas Netmos son Plug-N-Play y podrían cambiar su configuración dependiendo de en cuál ranura se inserten, así que si le gusta "meterse debajo del capó" y reorganizar las cosas, asegúrese de verificar estos valores antes de que usted inicie LinuxCNC.

3. Pines

  • parport.<p>.pin-`__<n>__-out` (bit) Maneja un pin de salida física.

  • parport.<p>.pin-`__<n>__-in` (bit) Realiza el seguimiento de un pin de entrada física.

  • parport.<p>.pin-`__<n>__-in-not` (bit) Realiza el seguimiento de un pin de entrada física, pero invertido.

Para cada pin, <p> es el número de puerto, y <n> es el número de pin físico en el conector D-shell de 25 pines.

Para cada pin de salida física, el controlador crea un solo pin HAL, por ejemplo: parport.0.pin-14-out.

Para cada pin de entrada física, el controlador crea dos pines HAL, por ejemplo: parport.0.pin-12-in y parport.0.pin-12-in-not.

El pin HAL -in es VERDADERO si el pin físico es alto, y FALSO si el pin físico es bajo. El pin HAL -in-not está invertido y es FALSO si el pin físico es alto.

4. Parámetros

  • parport.`__<p>__.pin-__<n>__-out-invert` (bit) Invierte un pin de salida.

  • parport.`__<p>__.pin-__<n>__-out-reset` (bit) (solo para pines -out) TRUE si el pin debe reiniciarse cuando se ejecuta la función -reset.

  • parport.`__<p>__.reset-time` (U32) El tiempo (en nanosegundos) entre que un pin se establece mediante`-'write` y se restablece mediante la función -reset si está habilitado.

El parámetro -invert determina si un pin de salida está activo alto o activo bajo. Si -invert es FALSE, establecer el pin HAL -out TRUE lleva al pin físico a alto, y FALSE lo conduce bajo. Si -invert es TRUE, entonces al establecer el pin HAL -out TRUE, el pin físico estará bajo.

5. Funciones

  • parport.`__<p>__.read` (funct) Lee los pines de entrada física del número de puerto <p> y actualiza los pines HAL -in y -in-not.

  • parport.read-all (funct) Lee los pines de entrada física de todos los puertos y actualiza los pines HAL -in y -in-not.

  • parport.`__<p>__.write` (funct) Lee los pines HAL -out del número de puerto <p> y actualiza los pines de salida física del puerto.

  • parport.write-all (funct) Lee los pines HAL -out de todos los puertos y actualiza todos los pines de salida física.

  • parport.`__<p>__.reset` (func) Espera hasta que reset-time halla transcurrido desde la write asociada, luego restablece los pines a los valores indicados por las configuraciones -out-invert y -out-invert. reset debe ser, en el mismo hilo, posterior a write. Si -reset es TRUE, entonces la función reset establecerá el pin al valor de -out-invert. Esta puede usarse junto con doublefreq de stepgen para producir un paso por período. El stepspace de stepgen para ese pin debe establecerse en 0 para habilitar doublefreq.

Las funciones individuales se proporcionan para situaciones en las que un puerto necesita ser actualizado en un hilo muy rápido, pero otros puertos pueden ser actualizados en un subproceso más lento para ahorrar tiempo de CPU. Probablemente no sea una buena idea utilizar una función -all y una función individual al mismo tiempo.

6. Problemas comunes

Si cargando el módulo se informa

insmod: error inserting '/home/jepler/emc2/rtlib/hal_parport.ko':
-1 Device or resource busy

asegúrese de que el módulo de kernel estándar parport_pc no este cargado [1] y que ningún otro dispositivo en el sistema ha reclamado los puertos de E/S.

Si el módulo se carga pero no parece funcionar, entonces el puerto o la dirección puede ser incorrecta.

7. Usando DoubleStep

Para configurar DoubleStep en el puerto paralelo, debe agregar la función parport.n.reset después de parport.n.write y configurar stepspace en 0 y el tiempo de reset deseado. Entonces, ese paso puede verificarse en cada período en HAL y luego desactivarlo por parport después de ser verificado durante el tiempo especificado por parport.`__n__.reset-time`.

Por ejemplo:

loadrt hal_parport cfg="0x378 out"
setp parport.0.reset-time 5000
loadrt stepgen step_type=0,0,0
addf parport.0.read base-thread
addf stepgen.make-pulses base-thread
addf parport.0.write base-thread
addf parport.0.reset base-thread
addf stepgen.capture-position servo-thread
...
setp stepgen.0.steplen 1
setp stepgen.0.stepspace 0

Puede encontrar más información sobre DoubleStep en wiki.

8. probe_parport

En las PCs de ahora los puertos paralelos pueden requerir una configuración plug and play (PNP) para poder usarse. El módulo de kernel probe_parport configura todos los puertos PNP presentes. Debe cargarse antes que hal_parport. En máquinas sin puerto PNP puede cargarse pero no tendrá efecto alguno.

8.1. Instalación de probe_parport

Cuando el módulo de kernel parport_pc se carga con el comando:

sudo modprobe -a parport_pc; sudo rmmod parport_pc

El kernel de Linux emite un mensaje parecido a:

parport: PnPBIOS parport detected.

Entonces probablemente será necesario el uso de este módulo.

Finalmente, los componentes HAL de puerto paralelo deberán ser cargados:

loadrt probe_parport
loadrt hal_parport ...

1. En los paquetes de LinuxCNC para Ubuntu, el archivo /etc/modprobe.d/emc2 generalmente evita que parport_pc se cargue automáticamente.