VMIO10 utility routines
This commit is contained in:
307
sinqhm/vmio_utility.c
Executable file
307
sinqhm/vmio_utility.c
Executable file
@@ -0,0 +1,307 @@
|
|||||||
|
#define ident "1A01"
|
||||||
|
/*
|
||||||
|
** +--------------------------------------------------------------+
|
||||||
|
** | Paul Scherrer Institute |
|
||||||
|
** | Computing Section |
|
||||||
|
** | |
|
||||||
|
** | This software may be used freely by non-profit organizations.|
|
||||||
|
** | It may be copied provided that the name of P.S.I. and of the |
|
||||||
|
** | author is included. Neither P.S.I. nor the author assume any |
|
||||||
|
** | responsibility for the use of this software outside of P.S.I.|
|
||||||
|
** +--------------------------------------------------------------+
|
||||||
|
**
|
||||||
|
** Module Name . . . . . . . . : [...SINQHM]VMIO_UTILITY.C
|
||||||
|
**
|
||||||
|
** Author . . . . . . . . . . : D. Maden
|
||||||
|
** Date of creation . . . . . . : Mar 1997
|
||||||
|
**
|
||||||
|
** Updates:
|
||||||
|
** 1A01 14-Mar-1997 DM Initial version.
|
||||||
|
**---------------------------------------------------------------------------
|
||||||
|
** VMIO_UTILITY.C is a set of routines for setting up and using a VMIO10.
|
||||||
|
**
|
||||||
|
** To compile this program for VxWorks on PSS123, use:
|
||||||
|
**
|
||||||
|
ccvx vmio_utility.c
|
||||||
|
** where
|
||||||
|
ccvx = ccppc -O0 \
|
||||||
|
-mcpu=603 \
|
||||||
|
-I${WIND_BASE}/target/h \
|
||||||
|
-fno-builtin \
|
||||||
|
-fno-for-scope \
|
||||||
|
-nostdinc \
|
||||||
|
-DCPU=PPC603 \
|
||||||
|
-D_GNU_TOOL \
|
||||||
|
-gdwarf -c -Wimplicit
|
||||||
|
|
||||||
|
** and, on the target,
|
||||||
|
**
|
||||||
|
** -> ld < vmio_utility.o
|
||||||
|
**====================================================================
|
||||||
|
*/
|
||||||
|
#include <vxWorks.h>
|
||||||
|
#include <taskLib.h>
|
||||||
|
#include <sysLib.h>
|
||||||
|
#include <vme.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
|
||||||
|
#include "vmio10_def.h"
|
||||||
|
/*
|
||||||
|
**==================== Global Definitions =====================================
|
||||||
|
*/
|
||||||
|
#define NIL 0x00
|
||||||
|
|
||||||
|
#define DFLT_BASE_ADDR 0x1900
|
||||||
|
/*
|
||||||
|
**==================== Global Variables =====================================
|
||||||
|
*/
|
||||||
|
char *VmioBase;
|
||||||
|
char Vme_dummy[256]; /* Dummy array - used only when VME access ..
|
||||||
|
** .. is disabled. */
|
||||||
|
char Null = 0x00;
|
||||||
|
char Bit8 = 0x10;
|
||||||
|
int My_errno;
|
||||||
|
int Go_on;
|
||||||
|
int Signal_has_happened;
|
||||||
|
jmp_buf Trap_env;
|
||||||
|
/*
|
||||||
|
|
||||||
|
**=============================================================================
|
||||||
|
** Local routines.
|
||||||
|
** Forward references ...
|
||||||
|
*/
|
||||||
|
void vmio_byte_send (char bit8, char lobits);
|
||||||
|
void vmio_enable (int ab_enbl, int bc_enbl);
|
||||||
|
void vmio_pol_dir (int a_pol, int a_dir,
|
||||||
|
int b_pol, int b_dir,
|
||||||
|
int c_pol, int c_dir,
|
||||||
|
int d_pol, int d_dir);
|
||||||
|
void vmio_reset ();
|
||||||
|
void vmio_send (char nbytes, char *buff);
|
||||||
|
void vmio_transp_init ();
|
||||||
|
/*
|
||||||
|
**-----------------------------------------------------------------*/
|
||||||
|
void Signal_Handler (int sigint) {
|
||||||
|
/* ==============
|
||||||
|
*/
|
||||||
|
Signal_has_happened = 1;
|
||||||
|
printf ("Got into Signal_Handler\n");
|
||||||
|
longjmp (Trap_env, 1);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
**-----------------------------------------------------------------*/
|
||||||
|
void vmio_byte_send (char bit8, char lobits) {
|
||||||
|
/* ==============
|
||||||
|
** Send a byte (well, 9 bits really) via the VMIO10.
|
||||||
|
*/
|
||||||
|
char aux;
|
||||||
|
|
||||||
|
do { /* Wait for Output Reg. empty */
|
||||||
|
VmioBase[VMIO_AB_CNTL] = 0X09; /* Select Port B status reg .. */
|
||||||
|
aux = VmioBase[VMIO_AB_CNTL]; /* .. and read it. */
|
||||||
|
} while ((aux & 0x08) == 0); /* Test its "empty" bit */
|
||||||
|
|
||||||
|
VmioBase[VMIO_PORT_C] = bit8; /* Send Bit-8 */
|
||||||
|
VmioBase[VMIO_PORT_B] = lobits; /* Output the other bits */
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
**-----------------------------------------------------------------*/
|
||||||
|
void vmio_enable (int ab_enbl, int bc_enbl) {
|
||||||
|
/* ===========
|
||||||
|
** output/input enable for IC6 ,IC7
|
||||||
|
*/
|
||||||
|
VmioBase[VMIO_AB_CNTL] = Z8536_MCCR; /* Select Master Config Control Reg */
|
||||||
|
VmioBase[VMIO_AB_CNTL] = ab_enbl;
|
||||||
|
|
||||||
|
VmioBase[VMIO_CD_CNTL] = Z8536_MCCR;
|
||||||
|
VmioBase[VMIO_CD_CNTL] = bc_enbl;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
**-----------------------------------------------------------------*/
|
||||||
|
void vmio_pol_dir (
|
||||||
|
/* ============ Set Polarity and Direction of VMIO10 Module
|
||||||
|
** A, B, C and D registers.
|
||||||
|
** Polarity bit = 0 for non-inverting.
|
||||||
|
** Direction bit = 0 for output.
|
||||||
|
*/ int a_pol,
|
||||||
|
int a_dir,
|
||||||
|
int b_pol,
|
||||||
|
int b_dir,
|
||||||
|
int c_pol,
|
||||||
|
int c_dir,
|
||||||
|
int d_pol,
|
||||||
|
int d_dir) {
|
||||||
|
|
||||||
|
VmioBase[VMIO_AB_CNTL] = Z8536_DPPR_A; /* Port A %10'0010, Data Path Pol */
|
||||||
|
VmioBase[VMIO_AB_CNTL] = a_pol;
|
||||||
|
VmioBase[VMIO_AB_CNTL] = Z8536_DDR_A; /* Port A %10'0011, Data Direction */
|
||||||
|
VmioBase[VMIO_AB_CNTL] = a_dir;
|
||||||
|
|
||||||
|
VmioBase[VMIO_AB_CNTL] = Z8536_DPPR_B; /* Port B %10'1010, Data Path Pol */
|
||||||
|
VmioBase[VMIO_AB_CNTL] = b_pol;
|
||||||
|
VmioBase[VMIO_AB_CNTL] = Z8536_DDR_B; /* Port B %10'1011, Data Direction */
|
||||||
|
VmioBase[VMIO_AB_CNTL] = b_dir;
|
||||||
|
|
||||||
|
VmioBase[VMIO_CD_CNTL] = Z8536_DPPR_A; /* Port C %10'0010, Data Path Pol */
|
||||||
|
VmioBase[VMIO_CD_CNTL] = c_pol;
|
||||||
|
VmioBase[VMIO_CD_CNTL] = Z8536_DDR_A; /* Port C %10'0011, Data Direction */
|
||||||
|
VmioBase[VMIO_CD_CNTL] = c_dir;
|
||||||
|
|
||||||
|
VmioBase[VMIO_CD_CNTL] = Z8536_DPPR_B; /* Port D %10'1010, Data Path Pol */
|
||||||
|
VmioBase[VMIO_CD_CNTL] = d_pol;
|
||||||
|
VmioBase[VMIO_CD_CNTL] = Z8536_DDR_B; /* Port D %10'0011, Data Direction */
|
||||||
|
VmioBase[VMIO_CD_CNTL] = d_dir;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
**-----------------------------------------------------------------*/
|
||||||
|
void vmio_reset () {
|
||||||
|
/* ==========
|
||||||
|
** Software reset for VMIO10 module
|
||||||
|
*/
|
||||||
|
char aux;
|
||||||
|
/*
|
||||||
|
** Start by forcing the state machine into State 0
|
||||||
|
*/
|
||||||
|
aux = VmioBase[VMIO_AB_CNTL]; /* Read Cntrl to ensure not State 1 */
|
||||||
|
VmioBase[VMIO_AB_CNTL] = NIL; /* Write zero to Cntrl to ensure not in ..
|
||||||
|
** .. "Reset State" */
|
||||||
|
aux = VmioBase[VMIO_AB_CNTL]; /* Read Cntrl to ensure State 0 */
|
||||||
|
|
||||||
|
VmioBase[VMIO_AB_CNTL] = Z8536_MICR; /* Select the Master Int Ctrl Reg */
|
||||||
|
VmioBase[VMIO_AB_CNTL] = 0x01; /* Set the reset bit */
|
||||||
|
VmioBase[VMIO_AB_CNTL] = NIL; /* Then clear it to complete reset */
|
||||||
|
/*
|
||||||
|
** Repeat for the other Z8536-CIO
|
||||||
|
*/
|
||||||
|
aux = VmioBase[VMIO_CD_CNTL];
|
||||||
|
VmioBase[VMIO_CD_CNTL] = NIL;
|
||||||
|
aux = VmioBase[VMIO_CD_CNTL];
|
||||||
|
|
||||||
|
VmioBase[VMIO_CD_CNTL] = Z8536_MICR;
|
||||||
|
VmioBase[VMIO_CD_CNTL] = 0x01;
|
||||||
|
VmioBase[VMIO_CD_CNTL] = NIL;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
**-----------------------------------------------------------------*/
|
||||||
|
void vmio_send (
|
||||||
|
/* ========= Send bytes to the LWL.
|
||||||
|
*/ char nbytes,
|
||||||
|
char *buff) {
|
||||||
|
/*
|
||||||
|
** The bytes are buff[0] to buff[nbytes-1]. buff[0] gives the
|
||||||
|
** headerbit for buff[1]. The remainder are sent with the 9th
|
||||||
|
** bit clear.
|
||||||
|
*/
|
||||||
|
int i;
|
||||||
|
char aux;
|
||||||
|
/*
|
||||||
|
** ---------- loop sending the bytes ---------------
|
||||||
|
*/
|
||||||
|
VmioBase[VMIO_PORT_C] = 0; /* Mode = 0 */
|
||||||
|
|
||||||
|
if (nbytes < 2) return;
|
||||||
|
vmio_byte_send (buff[0], buff[1]); /* 2 bytes define the first "LWL-byte" */
|
||||||
|
|
||||||
|
if (nbytes < 3) return;
|
||||||
|
|
||||||
|
for (i = 2; i < nbytes; i++) { /* The remaining bytes have Bit-8 = 0 */
|
||||||
|
vmio_byte_send (NIL, buff[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
**-----------------------------------------------------------------*/
|
||||||
|
void vmio_transp_init () {
|
||||||
|
/* ================
|
||||||
|
** Initialise VMIO10 ready for transparent
|
||||||
|
** transmission of data.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
** ---------- initialize i/o ---------------
|
||||||
|
*/
|
||||||
|
VmioBase[VMIO_AB_CNTL] = 0x28; /* Port B output port-Mode Spec. Reg */
|
||||||
|
VmioBase[VMIO_AB_CNTL] = 0x80;
|
||||||
|
|
||||||
|
VmioBase[VMIO_AB_CNTL] = 0x29; /* Port B handshake interlock */
|
||||||
|
VmioBase[VMIO_AB_CNTL] = 0x00;
|
||||||
|
}
|
||||||
|
/*==============================================================================
|
||||||
|
|
||||||
|
** Main line program
|
||||||
|
** ------------------
|
||||||
|
**============================================================================*/
|
||||||
|
int vmio_utility (char *base_addr) {
|
||||||
|
/*============================================================================*/
|
||||||
|
STATUS status;
|
||||||
|
int i;
|
||||||
|
char aux;
|
||||||
|
void (* sig_status) (int);
|
||||||
|
/*============================================================================
|
||||||
|
** Perform the initialisation of global variables ...
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
** Get the VME base address of the Test Generator Module.
|
||||||
|
** If the argument "base_addr" is zero, use DFLT_BASE_ADDR.
|
||||||
|
*/
|
||||||
|
if (base_addr == NULL) base_addr = (char *) DFLT_BASE_ADDR;
|
||||||
|
|
||||||
|
#ifdef _NO_VME
|
||||||
|
printf ("VMIO_UTILITY: Warning, VME access disabled.\n");
|
||||||
|
VmioBase = &Vme_dummy[0];
|
||||||
|
#else
|
||||||
|
status = sysBusToLocalAdrs (VME_AM_USR_SHORT_IO, base_addr, &VmioBase);
|
||||||
|
if (status != OK) {
|
||||||
|
printf ("Error status from sysBusToLocalAdrs\n");
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
** See if the module is present
|
||||||
|
*/
|
||||||
|
Signal_has_happened = 0;
|
||||||
|
sig_status = signal (SIGBUS, Signal_Handler); /* Catch machine checks */
|
||||||
|
if (sig_status == SIG_ERR) {
|
||||||
|
printf (" Problem setting up a signal handler!\n");
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
i = setjmp (Trap_env);
|
||||||
|
if (i == 0) aux = VmioBase[VMIO_AB_CNTL];
|
||||||
|
if (Signal_has_happened != 0) {
|
||||||
|
printf ("VMIO10 Module not present -- exiting!\n");
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
** Reset the VMIO10 Module.
|
||||||
|
*/
|
||||||
|
vmio_reset ();
|
||||||
|
/*
|
||||||
|
** Set Ports A, B, C and D to non-inverting and output
|
||||||
|
*/
|
||||||
|
vmio_pol_dir (NIL, NIL, /* Port A */
|
||||||
|
NIL, NIL, /* Port B */
|
||||||
|
NIL, NIL, /* Port C */
|
||||||
|
NIL, NIL); /* Port D */
|
||||||
|
/*
|
||||||
|
** Enable Ports A, B, C and D.
|
||||||
|
*/
|
||||||
|
vmio_enable (0x84, 0x84);
|
||||||
|
|
||||||
|
Go_on = 0;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
for (i=0; i<1000; i++) {}
|
||||||
|
if (Go_on != 0) break;
|
||||||
|
VmioBase[VMIO_PORT_A] = 0xff;
|
||||||
|
VmioBase[VMIO_PORT_A] = 0x00;
|
||||||
|
VmioBase[VMIO_PORT_A] = 0xff;
|
||||||
|
VmioBase[VMIO_PORT_A] = 0x00;
|
||||||
|
VmioBase[VMIO_PORT_A] = 0xff;
|
||||||
|
VmioBase[VMIO_PORT_A] = 0x00;
|
||||||
|
}
|
||||||
|
printf ("Vmio_Utility exiting\n");
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
/*===================================== End of VMIO_UTILITY.C =============*/
|
||||||
Reference in New Issue
Block a user