##// END OF EJS Templates
Several bugs corrected on the TC handler (related TMs are now compliant)...
Several bugs corrected on the TC handler (related TMs are now compliant) Spectral Matrices simulator implemented with the timer unit as an IRQ generator Waveforms simulator implemented with the timer unit as an IRQ generator

File last commit:

r0:452a68f7426f default
r3:a7739b90c971 default
Show More
rtems-spwtest-2boards.c
538 lines | 18.2 KiB | text/x-c | CLexer
/ src / rtems-spwtest-2boards.c
/* Simple SpaceWire interface test for 2 boards.
* When using two boards define MULTI_BOARD and
* one of TASK_RX or TASK_TX.
*
* The main SpaceWire example for oe board is rtems-spacewire.
*
* Gaisler Research 2007,
* Daniel Hellstr�m
*
*/
//////
// PLE
#define PRINT_MESSAGES_ON_CONSOLE // enable or disable the printf instructions
#ifdef PRINT_MESSAGES_ON_CONSOLE
#define PRINTF(x) printf(x);
#define PRINTF1(x,y) printf(x,y);
#define PRINTF2(x,y,z) printf(x,y,z);
#else
#define PRINTF(x)
#define PRINTF1(x,y)
#define PRINTF2(x,y,z)
#endif
//
//////
#define CONFIGURE_INIT
#include <bsp.h> /* for device driver prototypes */
rtems_task Init( rtems_task_argument argument); /* forward declaration needed */
/* configuration information */
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_NULL_DRIVER 1
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
#define CONFIGURE_MAXIMUM_TASKS 8
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
#define CONFIGURE_EXTRA_TASK_STACKS (3 * RTEMS_MINIMUM_STACK_SIZE)
#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32
#define CONFIGURE_INIT_TASK_PRIORITY 100
#define CONFIGURE_MAXIMUM_DRIVERS 16
/* #define CONFIGURE_INIT_TASK_INITIAL_MODES (RTEMS_PREEMPT | \ */
/* RTEMS_TIMESLICE | \ */
/* RTEMS_ASR | \ */
/* RTEMS_INTERRUPT_LEVEL(0)) */
//#define RTEMS_PCI_CONFIG_LIB
//#define CONFIGURE_PCI_LIB PCI_LIB_AUTO
#include <rtems/confdefs.h>
/* Configure Driver manager */
#if defined(RTEMS_DRVMGR_STARTUP) && defined(LEON3) /* if --drvmgr was given to configure */
/* Add Timer and UART Driver for this example */
#ifdef CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
#define CONFIGURE_DRIVER_AMBAPP_GAISLER_GPTIMER
#endif
#ifdef CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_DRIVER_AMBAPP_GAISLER_APBUART
#endif
#endif
//#define CONFIGURE_DRIVER_AMBAPP_GAISLER_PCIF /* PCI is for RASTA-IO and GR-701 GRSPW */
//#define CONFIGURE_DRIVER_AMBAPP_GAISLER_GRPCI /* PCI is for RASTA-IO and GR-701 GRSPW */
//#define CONFIGURE_DRIVER_AMBAPP_GAISLER_GRPCI2 /* PCI is for RASTA-IO and GR-701 GRSPW */
//#define CONFIGURE_DRIVER_PCI_GR_RASTA_IO /* GR-RASTA-IO has three GRSPW SpaceWire cores */
//#define CONFIGURE_DRIVER_PCI_GR_701 /* GR-701 has three GRSPW SpaceWire cores */
#ifdef LEON2
/* PCI support for AT697 */
#define CONFIGURE_DRIVER_LEON2_AT697PCI
/* AMBA PnP Support for GRLIB-LEON2 */
#define CONFIGURE_DRIVER_LEON2_AMBAPP
#endif
#define CONFIGURE_DRIVER_AMBAPP_GAISLER_GRSPW /* GRSPW Driver */
#include <drvmgr/drvmgr_confdefs.h>
#include <rtems.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#undef ENABLE_NETWORK
/* Include driver configurations and system initialization */
#include "config.c"
#include <grspw.h>
/* Select GRSPW core to be used in sample application.
* - /dev/grspw0 (First ON-CHIP core)
* - /dev/grspw1 (Second ON-CHIP core)
* - /dev/rastaio0/grspw0 (The GRSPW core on first GR-RASTA-IO board)
* - /dev/rastaio0/grspw1 (The second GRSPW core on first GR-RASTA-IO board)
* - /dev/gr701_0/grspw0 (The first GRSPW core on first GR-701 board)
* - /dev/gr701_1/grspw0 (The first GRSPW core on second GR-701 board)
*/
#define GRSPW_DEVICE_NAME1 "/dev/grspw1"
#define GRSPW_DEVICE_NAME2 "/dev/grspw0"
rtems_task task1(rtems_task_argument argument);
rtems_task task2(rtems_task_argument argument);
void print_config(spw_config *cnf);
void print_statistics(spw_stats *stats);
void check_init_config(spw_config *cnf);
char *link_status(int status);
extern int errno;
char *lstates[6] = {"Error-reset",
"Error-wait",
"Ready",
"Started",
"Connecting",
"Run"
};
rtems_id Task_id[3]; /* array of task ids */
rtems_name Task_name[3]; /* array of task names */
/* =========================================================
initialisation */
rtems_task Init(
rtems_task_argument ignored
)
{
FILE *f; int fd;
rtems_status_code status;
printf("******** Starting RTEMS Spacewire test 2 ********\n");
system_init();
Task_name[1] = rtems_build_name( 'S', 'E', 'N', 'D' );
Task_name[2] = rtems_build_name( 'R', 'E', 'C', 'V' );
status = rtems_task_create(
Task_name[1], 1, RTEMS_MINIMUM_STACK_SIZE * 2,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES, &Task_id[1]
);
status = rtems_task_create(
Task_name[2], 1, RTEMS_MINIMUM_STACK_SIZE * 2,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES, &Task_id[2]
);
#ifdef TASK_TX
PRINTF("start TASK_TX\n")
status = rtems_task_start(Task_id[1], task1, 1);
#endif
#define TASK_RX
#ifdef TASK_RX
PRINTF("start TASK_RX\n")
status = rtems_task_start(Task_id[2], task2, 2);
#endif
status = rtems_task_delete(RTEMS_SELF);
}
unsigned int init1 = 0, init2 = 0;
static char tx_pkt[4096];
static char tx_hpkt[256];
#define NODE_ADR_TX 1
#define NODE_ADR_RX 254
#ifdef TASK_TX
/* =========================================================
sender task */
rtems_task task1(
rtems_task_argument unused
)
{
rtems_status_code status;
rtems_event_set out;
int i;
int j;
int k;
int fd;
int lstatus;
int stat;
int ret;
spw_ioctl_pkt_send *pkt = (spw_ioctl_pkt_send *)malloc(sizeof(spw_ioctl_pkt_send));
spw_stats *statistics = (spw_stats *)malloc(sizeof(spw_stats));
spw_config *config = (spw_config *)malloc(sizeof(spw_config));
spw_ioctl_packetsize *ps = (spw_ioctl_packetsize *)malloc(sizeof(spw_ioctl_packetsize));
PRINTF("**** Transmit test task started ****\n")
printf("\n");
printf("Opening " GRSPW_DEVICE_NAME1 ": ");
j=0;
fd = open(GRSPW_DEVICE_NAME1, O_RDWR);
if ( fd < 0 ){
printf("Failed to open " GRSPW_DEVICE_NAME1 " (%d)\n",errno);
exit(0);
}
printf("opened successfully\n");
printf("**** Checking initial configuration for " GRSPW_DEVICE_NAME1 " ****\n");
printf("\n");
if (ioctl(fd, SPACEWIRE_IOCTRL_GET_CONFIG, config) == -1) {
printf("ioctl failed: SPACEWIRE_IOCTRL_GET_CONFIG \n");
exit(0);
}
print_config(config);
if (ioctl(fd, SPACEWIRE_IOCTRL_SET_NODEADDR, NODE_ADR_TX) == -1) {
printf("ioctl failed: SPACEWIRE_IOCTRL_SET_NODEADDR \n");
exit(0);
}
if (ioctl(fd, SPACEWIRE_IOCTRL_GET_CONFIG, config) == -1) {
printf("ioctl failed: SPACEWIRE_IOCTRL_GET_CONFIG\n");
exit(0);
}
if (ioctl(fd, SPACEWIRE_IOCTRL_SET_TXBLOCK, 1) == -1) {
printf("ioctl failed: SPACEWIRE_IOCTRL_SET_TXBLOCK\n");
exit(0);
}
printf("Trying to bring link up\n");
while(1){
if (ioctl(fd, SPACEWIRE_IOCTRL_START, 0) == -1) {
sched_yield(); /*printf("ioctl failed: SPACEWIRE_IOCTRL_START\n");*/
}else
break;
}
printf("Link is up\n");
printf("Disabling transmitter and receiver\n");
if ( ioctl(fd, SPACEWIRE_IOCTRL_STOP, 0) == -1 ){
printf("ioctl failed: SPACEWIRE_IOCTRL_STOP (%d)\n",errno);
exit(0);
}
printf("Trying to bring link up again\n");
while(1){
if (ioctl(fd, SPACEWIRE_IOCTRL_START, 0) == -1) {
sched_yield(); /*printf("ioctl failed: SPACEWIRE_IOCTRL_START\n");*/
}else
break;
}
printf("Link is up\n");
if (ioctl(fd, SPACEWIRE_IOCTRL_SET_CLKDIV, 0) == -1) {
printf("ioctl failed: SPACEWIRE_IOCTRL_SET_CLKDIV\n");
exit(0);
}
print_config(config);
if (ioctl(fd, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &(lstatus)) == -1) {
printf("ioctl failed: SPACEWIRE_IOCTRL_GET_LINK_STATUS\n");
exit(0);
}
printf("Spacewire link 1 is in %s state\n", link_status(lstatus));
/* printf("Set link error event id and link error irq\n"); */
/* printf("Task Id 2: %i \n", Task_id[1]); */
/* ioctl(fd, SPACEWIRE_IOCTRL_SET_EVENT_ID, Task_id[1]); */
/* ioctl(fd, SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ, 1); */
/* rtems_event_receive(RTEMS_ALL_EVENTS, RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &out); */
/* printf("Got event 1\n"); */
/* ioctl(fd, SPACEWIRE_IOCTRL_SET_DISABLE_ERR, 1); */
/* rtems_event_receive(RTEMS_ALL_EVENTS, RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &out); */
/* printf("Got event 2\n"); */
/* ioctl(fd, SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ, 0); */
/* ioctl(fd, SPACEWIRE_IOCTRL_LINKSTART, 1); */
/* printf("Link error test finished\n"); */
/*config print finished, allow task 2 to print its config*/
i=0;
while(1){
printf("-------------- Sending Initiator ----------------\n");
tx_pkt[0] = NODE_ADR_RX;
tx_pkt[1] = 'G';
tx_pkt[2] = 'A';
tx_pkt[3] = 'I';
tx_pkt[4] = 'S';
tx_pkt[5] = 'L';
tx_pkt[6] = 'E';
tx_pkt[7] = 'R';
tx_pkt[8] = ' ';
tx_pkt[9] = 'S';
tx_pkt[10] = 'P';
tx_pkt[11] = 'W';
tx_pkt[12] = '0'+i;
tx_pkt[13] = 0;
/* Send packet */
if ( (ret=write(fd, tx_pkt, 14)) <= 0 ){
printf("Write failed, errno: %d, ret: %d\n",errno,ret);
}
/* Sleep 5s */
printf("Sleeping 1s\n");
sleep(1);
i++;
if ( i>9 )
i=0;
}
}
#endif
#ifdef TASK_RX
/* =========================================================
receiver task */
rtems_task task2(
rtems_task_argument unused
)
{
rtems_status_code status;
spw_config *config;
spw_stats *statistics = (spw_stats *)malloc(sizeof(spw_stats));
char *rx_pkt;
char *cx_pkt;
char *cx_hpkt;
int fd;
rtems_event_set event0, event1;
int len;
int i;
int j;
int k;
int st;
int lstatus;
int rd;
int tmp;
rx_pkt = (char *)malloc(4096);
cx_pkt = (char *)malloc(4096);
cx_hpkt = (char *)malloc(256);
config = (spw_config *)malloc(sizeof(spw_config));
spw_ioctl_packetsize *ps = (spw_ioctl_packetsize *)malloc(sizeof(spw_ioctl_packetsize));
PRINTF("**** Receive test task started ****\n")
j = 0;
errno =0 ;
PRINTF("Try to open "GRSPW_DEVICE_NAME2"\n")
// OPEN THE SPACEWIRE LINK
fd = open(GRSPW_DEVICE_NAME2, O_RDWR);
if (fd<0) exit(0);
// SPACEWIRE_IOCTRL_SET_RMAPEN
ioctl(fd, SPACEWIRE_IOCTRL_SET_RMAPEN, 1);
if (errno == RTEMS_IO_ERROR) exit(0);
// SPACEWIRE_IOCTRL_START
while(1) {
if (ioctl(fd, SPACEWIRE_IOCTRL_START, 0) == -1) {
PRINTF("ioctl failed: SPACEWIRE_IOCTRL_START\n")
sched_yield();
}
else break;
}
PRINTF("Open "GRSPW_DEVICE_NAME2" successfully\n")
/* Make driver use the default timings as given by HW when reset */
#if 0
/* make driver calculate timings from system clock */
if ( ioctl(fd,SPACEWIRE_IOCTRL_SET_COREFREQ,0) == -1 ){
PRINTF("ioctl failed: SPACEWIRE_IOCTRL_SET_COREFREQ, errno: %d\n",errno)
exit(0);
}
/* make driver calculate timings from 40MHz spacewire clock */
if ( ioctl(fd,SPACEWIRE_IOCTRL_SET_COREFREQ,40000) == -1 ){
PRINTF("ioctl failed: SPACEWIRE_IOCTRL_SET_COREFREQ, errno: %d\n",errno)
exit(0);
}
#endif
if (ioctl(fd, SPACEWIRE_IOCTRL_GET_CONFIG, config) == -1) {
PRINTF("ioctl failed: SPACEWIRE_IOCTRL_GET_CONFIG\n")
exit(0);
}
PRINTF(" Checking initial configuration for Spacewire 2 ****\n")
print_config(config);
PRINTF("config checked\n")
if (ioctl(fd, SPACEWIRE_IOCTRL_SET_NODEADDR, NODE_ADR_RX) == -1) {
PRINTF("ioctl failed: SPACEWIRE_IOCTRL_SET_NODEADDR\n")
exit(0);
}
PRINTF("SPACEWIRE_IOCTRL_SET_NODEADDR\n")
if (ioctl(fd, SPACEWIRE_IOCTRL_SET_RXBLOCK, 1) == -1) {
PRINTF("ioctl failed: SPACEWIRE_IOCTRL_SET_RXBLOCK\n");
exit(0);
}
PRINTF("SPACEWIRE_IOCTRL_SET_RXBLOCK\n")
PRINTF("Trying to bring link up\n")
PRINTF("Link is up, Changing speed\n")
if (ioctl(fd, SPACEWIRE_IOCTRL_SET_CLKDIV, 0) == -1) {
PRINTF("ioctl failed: SPACEWIRE_IOCTRL_SET_CLKDIV\n")
exit(0);
}
if (ioctl(fd, SPACEWIRE_IOCTRL_GET_CONFIG, config) == -1) {
PRINTF("ioctl failed: SPACEWIRE_IOCTRL_GET_CONFIG\n")
exit(0);
}
print_config(config);
if (ioctl(fd, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &(lstatus)) == -1) {
PRINTF("ioctl failed: SPACEWIRE_IOCTRL_GET_LINK_STATUS\n")
exit(0);
}
PRINTF1("Spacewire link 2 is in %s state\n", link_status(lstatus))
while(1){
printf("-------------- Receiving Initiator ----------------\n");
tmp = 500;
len = read(fd, rx_pkt, tmp);
if ( len <= 0 ){
printf("Read Failed, errno: %d, ret: %d\n",errno,len);
sleep(1);
continue;
}
/* handle message */
printf("Got Message of length %d, to address %d\n",len,rx_pkt[0]);
printf("Message data: [ 0x%x 0x%x ...] (%s)\n",rx_pkt[1],rx_pkt[2],&rx_pkt[0]);
}
close(fd);
}
#endif
/* =========================================================
event task */
void print_config(spw_config *cnf)
{
printf("\n");
printf(" ******** CONFIG ******** \n");
printf("Node Address: %i\n", cnf->nodeaddr);
printf("Destination Key: %i\n", cnf->destkey);
printf("Clock Divider: %i\n", cnf->clkdiv);
printf("Rx Maximum Packet: %i\n", cnf->rxmaxlen);
printf("Timer: %i\n", cnf->timer);
printf("Linkdisabled: %i\n", cnf->linkdisabled);
printf("Linkstart: %i\n", cnf->linkstart);
printf("Disconnect: %i\n", cnf->disconnect);
printf("Promiscuous: %i\n", cnf->promiscuous);
printf("RMAP Enable: %i\n", cnf->rmapen);
printf("RMAP Buffer Disable: %i\n", cnf->rmapbufdis);
printf("Check Rmap Error: %i\n", cnf->check_rmap_err);
printf("Remove Protocol ID: %i\n", cnf->rm_prot_id);
printf("Blocking Transmit: %i\n", cnf->tx_blocking);
printf("Disable when Link Error: %i\n", cnf->disable_err);
printf("Link Error IRQ Enabled: %i\n", cnf->link_err_irq);
printf("Link Error Event Task ID: %i\n", cnf->event_id);
printf("RMAP Available: %i\n", cnf->is_rmap);
printf("RMAP CRC Available: %i\n", cnf->is_rmapcrc);
printf("Unaligned Receive Buffer Support: %i\n", cnf->is_rxunaligned);
printf("\n");
}
void print_statistics(spw_stats *stats)
{
printf("\n");
printf(" ******** STATISTICS ******** \n");
printf("Transmit link errors: %i\n", stats->tx_link_err);
printf("Receiver RMAP header CRC errors: %i\n", stats->rx_rmap_header_crc_err);
printf("Receiver RMAP data CRC errors: %i\n", stats->rx_rmap_data_crc_err);
printf("Receiver EEP errors: %i\n", stats->rx_eep_err);
printf("Receiver truncation errors: %i\n", stats->rx_truncated);
printf("Parity errors: %i\n", stats->parity_err);
printf("Escape errors: %i\n", stats->escape_err);
printf("Credit errors: %i\n", stats->credit_err);
printf("Disconnect errors: %i\n", stats->disconnect_err);
printf("Write synchronization errors: %i\n", stats->write_sync_err);
printf("Early EOP/EEP: %i\n", stats->early_ep);
printf("Invalid Node Address: %i\n", stats->invalid_address);
printf("Packets transmitted: %i\n", stats->packets_sent);
printf("Packets received: %i\n", stats->packets_received);
}
void check_init_config(spw_config *cnf)
{
if (cnf->nodeaddr != 254) {
printf("Incorrect initial node address! Expected: %i Got: %i\n", 254, cnf->nodeaddr);
exit(0);
}
if (cnf->destkey != 0) {
printf("Incorrect initial destination key! Expected: %i Got: %i\n", 0, cnf->destkey);
exit(0);
}
if (cnf->rxmaxlen != 1024) {
printf("Incorrect initial Rx maximum packet length! Expected: %i Got: %i\n", 1024 , cnf->rxmaxlen);
exit(0);
}
if (cnf->linkdisabled != 0) {
printf("Incorrect initial linkdisabled value! Expected: %i Got: %i\n", 0, cnf->linkdisabled);
exit(0);
}
if (cnf->linkstart != 1) {
printf("Incorrect initial linkstart value! Expected: %i Got: %i\n", 1, cnf->linkstart);
exit(0);
}
if (cnf->promiscuous != 0) {
printf("Incorrect initial promiscuous mode value! Expected: %i Got: %i\n", 0, cnf->promiscuous);
exit(0);
}
if (cnf->check_rmap_err != 0) {
printf("Incorrect initial check rmap error value! Expected: %i Got: %i\n", 0, cnf->check_rmap_err);
exit(0);
}
if (cnf->rm_prot_id != 0) {
printf("Incorrect initial remove protocol id value! Expected: %i Got: %i\n", 0, cnf->rm_prot_id);
exit(0);
}
if (cnf->tx_blocking != 0) {
printf("Incorrect initial tx blocking! Expected: %i Got: %i\n", 0, cnf->tx_blocking);
exit(0);
}
if (cnf->disable_err != 0) {
printf("Incorrect initial disable when link error value! Expected: %i Got: %i\n", 0, cnf->disable_err);
exit(0);
}
if (cnf->link_err_irq != 0) {
printf("Incorrect initial link error enable value! Expected: %i Got: %i\n", 0, cnf->link_err_irq);
exit(0);
}
if (cnf->event_id != 0) {
printf("Incorrect initial event id! Expected: %i Got: %i\n", 0, cnf->event_id);
exit(0);
}
}
char *link_status(int status)
{
return lstates[status];
}