////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
//
|
//
|
// Filename: wbregs.cpp
|
// Filename: wbregs.cpp
|
//
|
//
|
// Project: CMod S6 System on a Chip, ZipCPU demonstration project
|
// Project: CMod S6 System on a Chip, ZipCPU demonstration project
|
//
|
//
|
// Purpose: To give a user access, via a command line program, to read
|
// Purpose: To give a user access, via a command line program, to read
|
// and write wishbone registers one at a time. Thus this program
|
// and write wishbone registers one at a time. Thus this program
|
// implements readio() and writeio() but nothing more.
|
// implements readio() and writeio() but nothing more.
|
//
|
//
|
// Creator: Dan Gisselquist, Ph.D.
|
// Creator: Dan Gisselquist, Ph.D.
|
// Gisselquist Technology, LLC
|
// Gisselquist Technology, LLC
|
//
|
//
|
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
//
|
//
|
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
|
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
|
//
|
//
|
// This program is free software (firmware): you can redistribute it and/or
|
// This program is free software (firmware): you can redistribute it and/or
|
// modify it under the terms of the GNU General Public License as published
|
// modify it under the terms of the GNU General Public License as published
|
// by the Free Software Foundation, either version 3 of the License, or (at
|
// by the Free Software Foundation, either version 3 of the License, or (at
|
// your option) any later version.
|
// your option) any later version.
|
//
|
//
|
// This program is distributed in the hope that it will be useful, but WITHOUT
|
// This program is distributed in the hope that it will be useful, but WITHOUT
|
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
|
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
// for more details.
|
// for more details.
|
//
|
//
|
// You should have received a copy of the GNU General Public License along
|
// You should have received a copy of the GNU General Public License along
|
// with this program. (It's in the $(ROOT)/doc directory, run make with no
|
// with this program. (It's in the $(ROOT)/doc directory, run make with no
|
// target there if the PDF file isn't present.) If not, see
|
// target there if the PDF file isn't present.) If not, see
|
// <http://www.gnu.org/licenses/> for a copy.
|
// <http://www.gnu.org/licenses/> for a copy.
|
//
|
//
|
// License: GPL, v3, as defined and found on www.gnu.org,
|
// License: GPL, v3, as defined and found on www.gnu.org,
|
// http://www.gnu.org/licenses/gpl.html
|
// http://www.gnu.org/licenses/gpl.html
|
//
|
//
|
//
|
//
|
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
//
|
//
|
//
|
//
|
//
|
//
|
//
|
//
|
#include <stdio.h>
|
#include <stdio.h>
|
#include <stdlib.h>
|
#include <stdlib.h>
|
#include <unistd.h>
|
#include <unistd.h>
|
#include <strings.h>
|
#include <strings.h>
|
#include <ctype.h>
|
#include <ctype.h>
|
#include <string.h>
|
#include <string.h>
|
#include <signal.h>
|
#include <signal.h>
|
#include <assert.h>
|
#include <assert.h>
|
|
|
#include "devbus.h"
|
#include "devbus.h"
|
|
|
#ifdef SIMPLE_DEPPBUS
|
#ifdef SIMPLE_DEPPBUS
|
# include "deppbus.h"
|
# include "deppbus.h"
|
#else
|
#else
|
# include "llcomms.h"
|
# include "llcomms.h"
|
# include "deppi.h"
|
# include "deppi.h"
|
# include "ttybus.h"
|
# include "ttybus.h"
|
|
|
#endif
|
#endif
|
|
|
// #include "port.h"
|
// #include "port.h"
|
#include "regdefs.h"
|
#include "regdefs.h"
|
|
|
#ifdef SIMPLE_DEPPBUS
|
#ifdef SIMPLE_DEPPBUS
|
# define FPGAOPEN(SN) new DEPPBUS(SN);
|
# define FPGAOPEN(SN) new DEPPBUS(SN);
|
#else
|
#else
|
# define FPGAOPEN(SN) new FPGA(new DEPPI(SN))
|
# define FPGAOPEN(SN) new FPGA(new DEPPI(SN))
|
#endif
|
#endif
|
|
|
FPGA *m_fpga;
|
FPGA *m_fpga;
|
void closeup(int v) {
|
void closeup(int v) {
|
m_fpga->kill();
|
m_fpga->kill();
|
exit(0);
|
exit(0);
|
}
|
}
|
|
|
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
int skp=0;
|
int skp=0;
|
|
|
skp=1;
|
skp=1;
|
for(int argn=0; argn<argc-skp; argn++) {
|
for(int argn=0; argn<argc-skp; argn++) {
|
if (argv[argn+skp][0] == '-') {
|
if (argv[argn+skp][0] == '-') {
|
// switch(argv[argn+skp][j]) {
|
// switch(argv[argn+skp][j]) {
|
// default:
|
// default:
|
// break;
|
// break;
|
// }
|
// }
|
skp++; argn--;
|
skp++; argn--;
|
} else
|
} else
|
argv[argn] = argv[argn+skp];
|
argv[argn] = argv[argn+skp];
|
} argc -= skp;
|
} argc -= skp;
|
|
|
signal(SIGSTOP, closeup);
|
signal(SIGSTOP, closeup);
|
signal(SIGHUP, closeup);
|
signal(SIGHUP, closeup);
|
|
|
if ((argc < 1)||(argc > 2)) {
|
if ((argc < 1)||(argc > 2)) {
|
// usage();
|
// usage();
|
printf("USAGE: wbregs address [value]\n");
|
printf("USAGE: wbregs address [value]\n");
|
exit(-1);
|
exit(-1);
|
}
|
}
|
|
|
const char *nm;
|
const char *nm;
|
unsigned address = addrdecode(argv[0]), value;
|
unsigned address = addrdecode(argv[0]), value;
|
nm = addrname(address);
|
nm = addrname(address);
|
if (nm == NULL)
|
if (nm == NULL)
|
nm = "no name";
|
nm = "no name";
|
|
|
char szSel[64];
|
char szSel[64];
|
strcpy(szSel, "SN:210282768825");
|
strcpy(szSel, S6SN);
|
m_fpga = FPGAOPEN(szSel);
|
m_fpga = FPGAOPEN(szSel);
|
|
|
if (argc < 2) {
|
if (argc < 2) {
|
FPGA::BUSW v;
|
FPGA::BUSW v;
|
try {
|
try {
|
unsigned char a, b, c, d;
|
unsigned char a, b, c, d;
|
v = m_fpga->readio(address);
|
v = m_fpga->readio(address);
|
a = (v>>24)&0x0ff;
|
a = (v>>24)&0x0ff;
|
b = (v>>16)&0x0ff;
|
b = (v>>16)&0x0ff;
|
c = (v>> 8)&0x0ff;
|
c = (v>> 8)&0x0ff;
|
d = (v )&0x0ff;
|
d = (v )&0x0ff;
|
printf("%08x (%8s) : [%c%c%c%c] %08x\n", address, nm,
|
printf("%08x (%8s) : [%c%c%c%c] %08x\n", address, nm,
|
isgraph(a)?a:'.', isgraph(b)?b:'.',
|
isgraph(a)?a:'.', isgraph(b)?b:'.',
|
isgraph(c)?c:'.', isgraph(d)?d:'.', v);
|
isgraph(c)?c:'.', isgraph(d)?d:'.', v);
|
} catch(BUSERR b) {
|
} catch(BUSERR b) {
|
printf("%08x (%8s) : BUS-ERROR\n", address, nm);
|
printf("%08x (%8s) : BUS-ERROR\n", address, nm);
|
}
|
}
|
} else {
|
} else {
|
value = strtoul(argv[1], NULL, 0);
|
value = strtoul(argv[1], NULL, 0);
|
m_fpga->writeio(address, value);
|
m_fpga->writeio(address, value);
|
printf("%08x (%8s)-> %08x\n", address, nm, value);
|
printf("%08x (%8s)-> %08x\n", address, nm, value);
|
}
|
}
|
|
|
if (m_fpga->poll())
|
if (m_fpga->poll())
|
printf("FPGA was interrupted\n");
|
printf("FPGA was interrupted\n");
|
delete m_fpga;
|
delete m_fpga;
|
}
|
}
|
|
|
|
|