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 \ |