OpenCores
URL https://opencores.org/ocsvn/vapi/vapi/trunk

Subversion Repositories vapi

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 5 to Rev 6
    Reverse comparison

Rev 5 → Rev 6

/trunk/gpio.c
0,0 → 1,31
/* gpio.c -- test for GPIO, by using VAPI
Copyright (C) 2001, Erez Volk, erez@opencores.org
 
This file is part of OpenRISC 1000 Architectural Simulator.
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
 
#include <stdio.h>
 
unsigned long num_vapi_ids = 8;
 
int vapi_main( void )
{
vapi_write_with_id( 0, 0x01234567 );
if ( vapi_read() != 0x89abcdef )
return -1;
return 0;
}
/trunk/vapi.c
36,8 → 36,10
#include <fcntl.h>
#include <errno.h>
 
#include "vapi.h"
 
int vapi_fd;
unsigned long vapi_id;
unsigned long first_id, last_id;
 
static int vapi_write_stream(int fd, void* buf, int len)
{
227,6 → 229,13
return sock;
}
 
/* Check if a vapi id is "good" */
static inline int good_id (unsigned long id)
{
return ((id >= first_id) && (id <= last_id));
}
 
 
/* Initialize a new connection to the or1k board, and make sure we are
really connected. */
 
233,7 → 242,8
int
vapi_init (char *port_name, unsigned long id)
{
vapi_id = id;
first_id = id;
last_id = id + num_vapi_ids - 1;
/* CZ 24/05/01 - Check to see if we have specified a remote
VAPI interface or a local one. It is remote if it follows
the URL naming convention vapi://<hostname>:<port> */
295,16 → 305,32
}
 
/* Writes an unsigned long to server */
void vapi_write(unsigned long data) {
printf ("WRITE [%08x, %08x]\n", vapi_id, data);
if (write_packet (vapi_id, data))
void vapi_write(unsigned long data)
{
vapi_write_with_id (0, data);
}
 
/* Writes an unsigned long to server with relative ID */
void vapi_write_with_id(unsigned long relative_id, unsigned long data)
{
printf ("WRITE [%08x, %08x]\n", first_id + relative_id, data);
if (write_packet (first_id + relative_id, data))
perror ("write packet");
}
 
/* Reads an unsigned long from server */
unsigned long vapi_read() {
unsigned long id, data;
if(read_packet (&id, &data)) {
unsigned long vapi_read()
{
unsigned long relative_id, data;
vapi_read_with_id (&relative_id, &data);
return data;
}
 
/* Reads an unsigned long and vapi id from server */
void vapi_read_with_id(unsigned long *relative_id, unsigned long *data)
{
unsigned long id;
if(read_packet (&id, data)) {
if(vapi_fd) {
perror("vapi read");
close(vapi_fd);
312,12 → 338,15
}
exit (2);
}
if (id != vapi_id) {
fprintf (stderr, "ERROR: Invalid id %x, expected %x.", id, vapi_id);
if (!good_id (id)) {
if (last_id > first_id)
fprintf (stderr, "ERROR: Invalid id %x, expected %x..%x", id, first_id, last_id);
else
fprintf (stderr, "ERROR: Invalid id %x, expected %x.", id, first_id);
exit (1);
}
printf ("READ [%08x, %08x]\n", id, data);
return data;
printf ("READ [%08x, %08x]\n", id, *data);
*relative_id = id - first_id;
}
 
/* Polls the port if anything is available and if do_read is set something is read from port. */
350,8 → 379,8
int main (int argc, char *argv[]) {
unsigned long id, data;
if (argc != 3) {
printf ("Usage: vapit URL ID\n");
printf ("vapit vapi://localhost:9998 0x12345678\n");
printf ("Usage: %s URL ID\n", argv[0]);
printf ("%s vapi://localhost:9998 0x12345678\n", argv[0]);
return 2;
}
id = atol (argv[2]);
/trunk/Makefile.in
62,9 → 62,10
PACKAGE = @PACKAGE@
VERSION = @VERSION@
 
bin_PROGRAMS = uart
bin_PROGRAMS = uart gpio
 
uart_SOURCES = vapi.c vapi.h uart.c
gpio_SOURCES = vapi.c vapi.h gpio.c
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_CLEAN_FILES =
79,13 → 80,15
uart_LDADD = $(LDADD)
uart_DEPENDENCIES =
uart_LDFLAGS =
gpio_OBJECTS = vapi.o gpio.o
gpio_LDADD = $(LDADD)
gpio_DEPENDENCIES =
gpio_LDFLAGS =
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
DIST_COMMON = COPYING INSTALL Makefile.am Makefile.in aclocal.m4 \
config.guess config.sub configure configure.in install-sh missing \
mkinstalldirs
DIST_COMMON = Makefile.am Makefile.in aclocal.m4 configure configure.in
 
 
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
92,9 → 95,9
 
TAR = gtar
GZIP_ENV = --best
DEP_FILES = .deps/uart.P .deps/vapi.P
SOURCES = $(uart_SOURCES)
OBJECTS = $(uart_OBJECTS)
DEP_FILES = .deps/gpio.P .deps/uart.P .deps/vapi.P
SOURCES = $(uart_SOURCES) $(gpio_SOURCES)
OBJECTS = $(uart_OBJECTS) $(gpio_OBJECTS)
 
all: all-redirect
.SUFFIXES:
159,6 → 162,10
@rm -f uart
$(LINK) $(uart_LDFLAGS) $(uart_OBJECTS) $(uart_LDADD) $(LIBS)
 
gpio: $(gpio_OBJECTS) $(gpio_DEPENDENCIES)
@rm -f gpio
$(LINK) $(gpio_LDFLAGS) $(gpio_OBJECTS) $(gpio_LDADD) $(LIBS)
 
tags: TAGS
 
ID: $(HEADERS) $(SOURCES) $(LISP)
234,7 → 241,7
@for file in $(DISTFILES); do \
d=$(srcdir); \
if test -d $$d/$$file; then \
cp -pr $$d/$$file $(distdir)/$$file; \
cp -pr $$/$$file $(distdir)/$$file; \
else \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
/trunk/vapi.h
1,30 → 1,39
/* vapi.h - Verification API Interface
Copyright (C) 2001, Marko Mlinar, markom@opencores.org
This file is part of OpenRISC 1000 Architectural Simulator.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
 
This file is part of OpenRISC 1000 Architectural Simulator.
/* Writes an unsigned long to server */
void vapi_write(unsigned long data);
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
/* Writes an unsigned long to server with relative ID */
void vapi_write_with_id(unsigned long relative_id, unsigned long data);
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
 
/* Writes an unsigned long to server */
void vapi_write(unsigned long data) {
 
/* Reads an unsigned long from server */
unsigned long vapi_read();
 
/* Reads an unsigned long and vapi id from server */
void vapi_read_with_id(unsigned long *relative_id, unsigned long *data);
 
/* Polls the port if anything is available and if do_read is set something is read from port. */
int vapi_waiting ();
 
/* Main function, actually the testcase, defined by VAPI user. */
extern void vapi_main();
extern int vapi_main();
 
/* Number of consecutive VAPI IDs the user needs */
extern unsigned num_vapi_ids;
/trunk/uart.c
1,400 → 1,403
/* uart.c -- test for uart, by using VAPI
Copyright (C) 2001, Marko Mlinar, markom@opencores.org
 
This file is part of OpenRISC 1000 Architectural Simulator.
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
 
/* UART messages */
#define TX_CMD 0xff000000
#define TX_CMD0 0x00000000
#define TX_CHAR 0x000000ff
#define TX_NBITS 0x00000300
#define TX_STOPLEN 0x00000400
#define TX_PARITY 0x00000800
#define TX_EVENP 0x00001000
#define TX_STICK 0x00002000
#define TX_BREAK 0x00004000
 
/* Send speed */
#define TX_CMD1 0x01000000
#define TX_SPEED 0x0000ffff
 
/* Send receive LCR reg */
#define TX_CMD2 0x02000000
 
/* Send skew */
#define TX_CMD3 0x03000000
 
/* Set break */
#define TX_CMD4 0x04000000
#define TX_CMD4_BREAK 0x00010000
#define TX_CMD4_DELAY 0x0000ffff
 
/* Check FIFO */
#define TX_CMD5 0x05000000
#define TX_CMD5_FIFOFULL 0x0000001
 
#define RX_CMD0 0x00000000
#define RX_PARERR 0x00010000
#define RX_FRAERR 0x00020000
 
/* fails if x is false */
#define ASSERT(x) ((x)?1:fail (__FUNCTION__, __LINE__))
#define MARK() printf ("Passed line %i\n", __LINE__)
#define VAPI_READ(x) {unsigned long r = vapi_read (); printf ("expected 0x%08x, read 0x%08x\n", r, (x)); ASSERT(r == (x));}
 
#ifndef __LINE__
#define __LINE__ 0
#endif
 
void fail (char *func, int line)
{
#ifndef __FUNCTION__
#define __FUNCTION__ "?"
#endif
printf ("Test failed in %s:%i\n", func, line);
exit (1);
}
char str[5000];
 
/* current comm. control bits */
int control, control_rx;
 
void recv_char (char c)
{
unsigned long tmp = vapi_read ();
printf ("expected %08x, read %08x\n", control_rx | c, tmp);
/* test if something is wrong */
ASSERT ((tmp & 0xffffff00) == control_rx);
tmp &= 0xff;
if (tmp) printf ("'%c'\n", (char)tmp);
else printf ("\\0\n");
printf ("expected %02x, read %02x\n", c, tmp);
ASSERT (c == (char)tmp);
}
 
void send_char (char c)
{
vapi_write (c | (control & 0xffffff00));
}
 
char *read_string (char *s)
{
char *t = s;
unsigned long tmp = 1;
while (tmp) {
tmp = vapi_read ();
printf ("%08x, %08x\n", tmp, control_rx);
/* test if something is wrong */
ASSERT ((tmp & 0xffffff00) == control_rx);
tmp &= 0xff;
if (tmp) printf ("'%c'\n", (char)tmp);
else printf ("\\0\n");
*(t++) = (char)tmp;
}
return s;
}
 
 
void compare_string (char *s) {
while (*s) {
unsigned long tmp = vapi_read ();
/* test if something is wrong */
ASSERT (tmp == (control_rx | *s));
tmp &= 0xff;
if (tmp) printf ("'%c'\n", (char)tmp);
else printf ("\\0\n");
s++;
}
}
 
void send_string (char *s)
{
while (*s)
vapi_write (*(s++) | (control & 0xffffff00));
}
 
void init_8n1 ()
{
vapi_write(TX_CMD1 | 2); /* Set tx/rx speed */
control = control_rx = TX_CMD0 | TX_NBITS;
vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
}
 
void test_registers ()
{
/* This test is performed just by cpu, if it is not stopped, we have an error. */
printf ("Testing registers... ");
MARK();
}
 
void send_recv_test ()
{
printf ("send_recv_test\n");
MARK();
read_string (str);
MARK();
printf ("OK\nread: %s\n",str);
ASSERT (strcmp (str, "send_test_is_running") == 0);
send_string ("recv");
MARK();
printf ("OK\n");
}
 
void break_test ()
{
printf ("break_test\n");
/* receive a break */
VAPI_READ (TX_BREAK);
MARK();
vapi_write (control | '*');
MARK();
VAPI_READ (control | '!');
MARK();
/* send a break */
vapi_write (TX_CMD4 | TX_CMD4_BREAK | (0) & TX_CMD4_DELAY);
vapi_write (control | 'b');
MARK();
VAPI_READ (control | '#');
MARK();
vapi_write (TX_CMD4 | (0) & TX_CMD4_DELAY);
vapi_write (control | '$');
MARK();
/* Receive a breaked string "ns<brk>*", only "ns" should be received. */
compare_string ("ns");
VAPI_READ (TX_BREAK);
send_string ("?");
MARK();
 
/* Send a break */
VAPI_READ (control | '#');
vapi_write(TX_CMD4 | TX_CMD4_BREAK | (5 & TX_CMD4_DELAY));
vapi_write (control | 0);
MARK();
#if 0
/* Wait four chars */
send_string ("234");
MARK();
#endif
 
/* FIFO should be empty */
vapi_write(TX_CMD5);
send_string ("5");
/* FIFO should be nonempty and */
vapi_write(TX_CMD5 | TX_CMD5_FIFOFULL);
MARK();
/* it should contain '?' */
VAPI_READ ('?' | control);
/* Reset break signal*/
vapi_write(TX_CMD4 | (0) & TX_CMD4_DELAY);
MARK();
vapi_write ('!' | control);
printf ("OK\n");
}
 
/* Tries to send data in different modes in both directions */
 
/* Utility function, that tests current configuration */
void test_mode (int nbits)
{
unsigned mask = (1 << nbits) - 1;
recv_char ('U' & mask); //0x55
#if DETAILED
recv_char ('U' & mask); //0x55
send_char ('U'); //0x55
#endif
send_char ('U'); //0x55
recv_char ('a' & mask); //0x61
#if DETAILED
recv_char ('a' & mask); //0x61
send_char ('a'); //0x61
#endif
send_char ('a'); //0x61
}
 
void different_modes_test ()
{
int speed, length, parity;
printf ("different modes test\n");
/* Init */
/* Test different speeds */
for (speed = 1; speed < 5; speed++) {
vapi_write(TX_CMD1 | speed); /* Set tx/rx speed */
control_rx = control = 0x03 << 8; /* 8N1 */
vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
test_mode (8);
MARK();
}
MARK();
vapi_write(TX_CMD1 | 1); /* Set tx/rx speed */
MARK();
/* Test all parity modes with different char lengths */
for (parity = 0; parity < 8; parity++)
for (length = 0; length < 4; length++) {
control_rx = control = (length | (0 << 2) | (parity << 3)) << 8;
vapi_write(TX_CMD2 | control_rx);
test_mode (5 + length);
MARK();
}
MARK();
/* Test configuration, if we have >1 stop bits */
for (length = 0; length < 4; length++) {
control_rx = control = (length | (1 << 2) | (0 << 3)) << 8;
vapi_write(TX_CMD2 | control_rx);
test_mode (5 + length);
MARK();
}
MARK();
/* Restore normal mode */
recv_char ('T'); /* Wait for acknowledge */
vapi_write(TX_CMD1 | 2); /* Set tx/rx speed */
control_rx = control = 0x03 << 8; /* 8N1 @ 2*/
vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
send_char ('x'); /* Send a character. It is possible that this char is received unproperly */
recv_char ('T'); /* Wait for acknowledge before ending the test */
MARK();
printf ("OK\n");
}
 
/* Test various FIFO levels, break and framing error interrupt, etc */
 
void interrupt_test ()
{
int i;
vapi_write(TX_CMD1 | 6); /* Set tx/rx speed */
printf ("interrupt_test\n");
/* start interrupt test */
recv_char ('I'); /* Test trigger level 1 */
send_char ('0');
recv_char ('I'); /* Test trigger level 4 */
send_char ('1');
send_char ('2');
send_char ('3');
send_char ('4');
recv_char ('I'); /* Test trigger level 8 */
send_char ('5');
send_char ('6');
send_char ('7');
send_char ('8');
send_char ('9');
recv_char ('I'); /* Test trigger level 14 */
send_char ('a');
send_char ('b');
send_char ('c');
send_char ('d');
send_char ('e');
send_char ('f');
send_char ('g');
 
recv_char ('I'); /* Test OE */
send_char ('h');
send_char ('i');
send_char ('j');
send_char ('*'); /* should not be put in the fifo */
 
recv_char ('I'); /* test break interrupt */
/* send a break */
vapi_write (TX_CMD4 | TX_CMD4_BREAK | (0) & TX_CMD4_DELAY);
vapi_write (control | 'b');
MARK();
recv_char ('B'); /* Release break */
MARK();
vapi_write (TX_CMD4 | (0) & TX_CMD4_DELAY);
vapi_write (control | '$');
MARK();
 
/* TODO: Check for parity error */
/* TODO: Check for frame error */
/* Check for timeout */
recv_char ('I');
send_char ('T'); /* Send char -> timeout should occur */
recv_char ('T'); /* Wait for acknowledge before changing configuration */
MARK ();
/* Restore previous mode */
vapi_write(TX_CMD1 | 2); /* Set tx/rx speed */
control = control_rx = TX_CMD0 | TX_NBITS;
vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
recv_char ('T'); /* Wait for acknowledge before ending the test */
printf ("OK\n");
}
 
/* Test if all control bits are set correctly. Lot of this was already tested
elsewhere and tests are not duplicated. */
 
void control_register_test ()
{
printf ("control_register_test\n");
recv_char ('*');
send_char ('*');
MARK ();
recv_char ('!');
send_char ('!');
MARK ();
recv_char ('1');
recv_char ('*');
send_char ('*');
printf ("OK\n");
}
 
void line_error_test ()
{
vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
recv_char ('c');
vapi_write(TX_CMD1 | 3); /* Set incorrect tx/rx speed */
send_char ('a');
vapi_write(TX_CMD1 | 2); /* Set correct tx/rx speed */
send_char ('b');
MARK ();
#if COMPLETE
recv_char ('*');
control = TX_CMD0 | TX_NBITS;
control_rx = TX_CMD0 | TX_NBITS | TX_STOPLEN;
vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
recv_char ('*');
MARK ();
#endif
}
 
int vapi_main ()
{
/* Test section area */
test_registers ();
init_8n1 ();
// send_recv_test ();
// break_test();
different_modes_test ();
interrupt_test ();
control_register_test ();
line_error_test ();
/* End of test section area */
send_char ('@');
return 0;
}
/* uart.c -- test for uart, by using VAPI
Copyright (C) 2001, Marko Mlinar, markom@opencores.org
 
This file is part of OpenRISC 1000 Architectural Simulator.
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
 
/* UART needs 1 VAPI ID */
unsigned num_vapi_ids = 1;
 
/* UART messages */
#define TX_CMD 0xff000000
#define TX_CMD0 0x00000000
#define TX_CHAR 0x000000ff
#define TX_NBITS 0x00000300
#define TX_STOPLEN 0x00000400
#define TX_PARITY 0x00000800
#define TX_EVENP 0x00001000
#define TX_STICK 0x00002000
#define TX_BREAK 0x00004000
 
/* Send speed */
#define TX_CMD1 0x01000000
#define TX_SPEED 0x0000ffff
 
/* Send receive LCR reg */
#define TX_CMD2 0x02000000
 
/* Send skew */
#define TX_CMD3 0x03000000
 
/* Set break */
#define TX_CMD4 0x04000000
#define TX_CMD4_BREAK 0x00010000
#define TX_CMD4_DELAY 0x0000ffff
 
/* Check FIFO */
#define TX_CMD5 0x05000000
#define TX_CMD5_FIFOFULL 0x0000001
 
#define RX_CMD0 0x00000000
#define RX_PARERR 0x00010000
#define RX_FRAERR 0x00020000
 
/* fails if x is false */
#define ASSERT(x) ((x)?1:fail (__FUNCTION__, __LINE__))
#define MARK() printf ("Passed line %i\n", __LINE__)
#define VAPI_READ(x) {unsigned long r = vapi_read (); printf ("expected 0x%08x, read 0x%08x\n", r, (x)); ASSERT(r == (x));}
 
#ifndef __LINE__
#define __LINE__ 0
#endif
 
void fail (char *func, int line)
{
#ifndef __FUNCTION__
#define __FUNCTION__ "?"
#endif
printf ("Test failed in %s:%i\n", func, line);
exit (1);
}
char str[5000];
 
/* current comm. control bits */
int control, control_rx;
 
void recv_char (char c)
{
unsigned long tmp = vapi_read ();
printf ("expected %08x, read %08x\n", control_rx | c, tmp);
/* test if something is wrong */
ASSERT ((tmp & 0xffffff00) == control_rx);
tmp &= 0xff;
if (tmp) printf ("'%c'\n", (char)tmp);
else printf ("\\0\n");
printf ("expected %02x, read %02x\n", c, tmp);
ASSERT (c == (char)tmp);
}
 
void send_char (char c)
{
vapi_write (c | (control & 0xffffff00));
}
 
char *read_string (char *s)
{
char *t = s;
unsigned long tmp = 1;
while (tmp) {
tmp = vapi_read ();
printf ("%08x, %08x\n", tmp, control_rx);
/* test if something is wrong */
ASSERT ((tmp & 0xffffff00) == control_rx);
tmp &= 0xff;
if (tmp) printf ("'%c'\n", (char)tmp);
else printf ("\\0\n");
*(t++) = (char)tmp;
}
return s;
}
 
 
void compare_string (char *s) {
while (*s) {
unsigned long tmp = vapi_read ();
/* test if something is wrong */
ASSERT (tmp == (control_rx | *s));
tmp &= 0xff;
if (tmp) printf ("'%c'\n", (char)tmp);
else printf ("\\0\n");
s++;
}
}
 
void send_string (char *s)
{
while (*s)
vapi_write (*(s++) | (control & 0xffffff00));
}
 
void init_8n1 ()
{
vapi_write(TX_CMD1 | 2); /* Set tx/rx speed */
control = control_rx = TX_CMD0 | TX_NBITS;
vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
}
 
void test_registers ()
{
/* This test is performed just by cpu, if it is not stopped, we have an error. */
printf ("Testing registers... ");
MARK();
}
 
void send_recv_test ()
{
printf ("send_recv_test\n");
MARK();
read_string (str);
MARK();
printf ("OK\nread: %s\n",str);
ASSERT (strcmp (str, "send_test_is_running") == 0);
send_string ("recv");
MARK();
printf ("OK\n");
}
 
void break_test ()
{
printf ("break_test\n");
/* receive a break */
VAPI_READ (TX_BREAK);
MARK();
vapi_write (control | '*');
MARK();
VAPI_READ (control | '!');
MARK();
/* send a break */
vapi_write (TX_CMD4 | TX_CMD4_BREAK | (0) & TX_CMD4_DELAY);
vapi_write (control | 'b');
MARK();
VAPI_READ (control | '#');
MARK();
vapi_write (TX_CMD4 | (0) & TX_CMD4_DELAY);
vapi_write (control | '$');
MARK();
/* Receive a breaked string "ns<brk>*", only "ns" should be received. */
compare_string ("ns");
VAPI_READ (TX_BREAK);
send_string ("?");
MARK();
 
/* Send a break */
VAPI_READ (control | '#');
vapi_write(TX_CMD4 | TX_CMD4_BREAK | (5 & TX_CMD4_DELAY));
vapi_write (control | 0);
MARK();
#if 0
/* Wait four chars */
send_string ("234");
MARK();
#endif
 
/* FIFO should be empty */
vapi_write(TX_CMD5);
send_string ("5");
/* FIFO should be nonempty and */
vapi_write(TX_CMD5 | TX_CMD5_FIFOFULL);
MARK();
/* it should contain '?' */
VAPI_READ ('?' | control);
/* Reset break signal*/
vapi_write(TX_CMD4 | (0) & TX_CMD4_DELAY);
MARK();
vapi_write ('!' | control);
printf ("OK\n");
}
 
/* Tries to send data in different modes in both directions */
 
/* Utility function, that tests current configuration */
void test_mode (int nbits)
{
unsigned mask = (1 << nbits) - 1;
recv_char ('U' & mask); //0x55
#if DETAILED
recv_char ('U' & mask); //0x55
send_char ('U'); //0x55
#endif
send_char ('U'); //0x55
recv_char ('a' & mask); //0x61
#if DETAILED
recv_char ('a' & mask); //0x61
send_char ('a'); //0x61
#endif
send_char ('a'); //0x61
}
 
void different_modes_test ()
{
int speed, length, parity;
printf ("different modes test\n");
/* Init */
/* Test different speeds */
for (speed = 1; speed < 5; speed++) {
vapi_write(TX_CMD1 | speed); /* Set tx/rx speed */
control_rx = control = 0x03 << 8; /* 8N1 */
vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
test_mode (8);
MARK();
}
MARK();
vapi_write(TX_CMD1 | 1); /* Set tx/rx speed */
MARK();
/* Test all parity modes with different char lengths */
for (parity = 0; parity < 8; parity++)
for (length = 0; length < 4; length++) {
control_rx = control = (length | (0 << 2) | (parity << 3)) << 8;
vapi_write(TX_CMD2 | control_rx);
test_mode (5 + length);
MARK();
}
MARK();
/* Test configuration, if we have >1 stop bits */
for (length = 0; length < 4; length++) {
control_rx = control = (length | (1 << 2) | (0 << 3)) << 8;
vapi_write(TX_CMD2 | control_rx);
test_mode (5 + length);
MARK();
}
MARK();
/* Restore normal mode */
recv_char ('T'); /* Wait for acknowledge */
vapi_write(TX_CMD1 | 2); /* Set tx/rx speed */
control_rx = control = 0x03 << 8; /* 8N1 @ 2*/
vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
send_char ('x'); /* Send a character. It is possible that this char is received unproperly */
recv_char ('T'); /* Wait for acknowledge before ending the test */
MARK();
printf ("OK\n");
}
 
/* Test various FIFO levels, break and framing error interrupt, etc */
 
void interrupt_test ()
{
int i;
vapi_write(TX_CMD1 | 6); /* Set tx/rx speed */
printf ("interrupt_test\n");
/* start interrupt test */
recv_char ('I'); /* Test trigger level 1 */
send_char ('0');
recv_char ('I'); /* Test trigger level 4 */
send_char ('1');
send_char ('2');
send_char ('3');
send_char ('4');
recv_char ('I'); /* Test trigger level 8 */
send_char ('5');
send_char ('6');
send_char ('7');
send_char ('8');
send_char ('9');
recv_char ('I'); /* Test trigger level 14 */
send_char ('a');
send_char ('b');
send_char ('c');
send_char ('d');
send_char ('e');
send_char ('f');
send_char ('g');
 
recv_char ('I'); /* Test OE */
send_char ('h');
send_char ('i');
send_char ('j');
send_char ('*'); /* should not be put in the fifo */
 
recv_char ('I'); /* test break interrupt */
/* send a break */
vapi_write (TX_CMD4 | TX_CMD4_BREAK | (0) & TX_CMD4_DELAY);
vapi_write (control | 'b');
MARK();
recv_char ('B'); /* Release break */
MARK();
vapi_write (TX_CMD4 | (0) & TX_CMD4_DELAY);
vapi_write (control | '$');
MARK();
 
/* TODO: Check for parity error */
/* TODO: Check for frame error */
/* Check for timeout */
recv_char ('I');
send_char ('T'); /* Send char -> timeout should occur */
recv_char ('T'); /* Wait for acknowledge before changing configuration */
MARK ();
/* Restore previous mode */
vapi_write(TX_CMD1 | 2); /* Set tx/rx speed */
control = control_rx = TX_CMD0 | TX_NBITS;
vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
recv_char ('T'); /* Wait for acknowledge before ending the test */
printf ("OK\n");
}
 
/* Test if all control bits are set correctly. Lot of this was already tested
elsewhere and tests are not duplicated. */
 
void control_register_test ()
{
printf ("control_register_test\n");
recv_char ('*');
send_char ('*');
MARK ();
recv_char ('!');
send_char ('!');
MARK ();
recv_char ('1');
recv_char ('*');
send_char ('*');
printf ("OK\n");
}
 
void line_error_test ()
{
vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
recv_char ('c');
vapi_write(TX_CMD1 | 3); /* Set incorrect tx/rx speed */
send_char ('a');
vapi_write(TX_CMD1 | 2); /* Set correct tx/rx speed */
send_char ('b');
MARK ();
#if COMPLETE
recv_char ('*');
control = TX_CMD0 | TX_NBITS;
control_rx = TX_CMD0 | TX_NBITS | TX_STOPLEN;
vapi_write(TX_CMD2 | control_rx); /* Set rx mode */
recv_char ('*');
MARK ();
#endif
}
 
int vapi_main ()
{
/* Test section area */
test_registers ();
init_8n1 ();
// send_recv_test ();
// break_test();
different_modes_test ();
interrupt_test ();
control_register_test ();
line_error_test ();
/* End of test section area */
send_char ('@');
return 0;
}
/trunk/Makefile.am
1,3 → 1,4
bin_PROGRAMS = uart
bin_PROGRAMS = uart gpio
 
uart_SOURCES = vapi.c vapi.h uart.c
gpio_SOURCES = vapi.c vapi.h gpio.c
/trunk/Makefile
62,9 → 62,10
PACKAGE = vapi
VERSION = 1.1
 
bin_PROGRAMS = uart
bin_PROGRAMS = uart gpio
 
uart_SOURCES = vapi.c vapi.h uart.c
gpio_SOURCES = vapi.c vapi.h gpio.c
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_CLEAN_FILES =
79,13 → 80,15
uart_LDADD = $(LDADD)
uart_DEPENDENCIES =
uart_LDFLAGS =
gpio_OBJECTS = vapi.o gpio.o
gpio_LDADD = $(LDADD)
gpio_DEPENDENCIES =
gpio_LDFLAGS =
CFLAGS = -g -O2
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
DIST_COMMON = COPYING INSTALL Makefile.am Makefile.in aclocal.m4 \
config.guess config.sub configure configure.in install-sh missing \
mkinstalldirs
DIST_COMMON = Makefile.am Makefile.in aclocal.m4 configure configure.in
 
 
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
92,9 → 95,9
 
TAR = gtar
GZIP_ENV = --best
DEP_FILES = .deps/uart.P .deps/vapi.P
SOURCES = $(uart_SOURCES)
OBJECTS = $(uart_OBJECTS)
DEP_FILES = .deps/gpio.P .deps/uart.P .deps/vapi.P
SOURCES = $(uart_SOURCES) $(gpio_SOURCES)
OBJECTS = $(uart_OBJECTS) $(gpio_OBJECTS)
 
all: all-redirect
.SUFFIXES:
159,6 → 162,10
@rm -f uart
$(LINK) $(uart_LDFLAGS) $(uart_OBJECTS) $(uart_LDADD) $(LIBS)
 
gpio: $(gpio_OBJECTS) $(gpio_DEPENDENCIES)
@rm -f gpio
$(LINK) $(gpio_LDFLAGS) $(gpio_OBJECTS) $(gpio_LDADD) $(LIBS)
 
tags: TAGS
 
ID: $(HEADERS) $(SOURCES) $(LISP)
234,7 → 241,7
@for file in $(DISTFILES); do \
d=$(srcdir); \
if test -d $$d/$$file; then \
cp -pr $$d/$$file $(distdir)/$$file; \
cp -pr $$/$$file $(distdir)/$$file; \
else \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.