2018-05-03 13:47:57 +00:00
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
2022-08-26 01:01:39 +00:00
|
|
|
// SCSI Target Emulator RaSCSI Reloaded
|
2018-05-03 13:47:57 +00:00
|
|
|
// for Raspberry Pi
|
|
|
|
//
|
|
|
|
// Powered by XM6 TypeG Technology.
|
2020-07-04 14:57:44 +00:00
|
|
|
// Copyright (C) 2016-2020 GIMONS
|
2018-05-03 13:47:57 +00:00
|
|
|
//
|
2020-07-06 03:56:25 +00:00
|
|
|
// [ GPIO-SCSI bus ]
|
2018-05-03 13:47:57 +00:00
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
#include <sys/mman.h>
|
|
|
|
#include <sys/ioctl.h>
|
|
|
|
#include <sys/time.h>
|
2022-09-10 21:40:24 +00:00
|
|
|
#include "hal/gpiobus.h"
|
2022-10-25 00:21:40 +00:00
|
|
|
#include "hal/systimer.h"
|
2022-11-10 06:44:06 +00:00
|
|
|
#include "shared/config.h"
|
|
|
|
#include "shared/log.h"
|
2022-09-25 21:49:24 +00:00
|
|
|
#include <array>
|
2022-10-04 15:23:42 +00:00
|
|
|
#ifdef __linux__
|
2022-09-25 21:49:24 +00:00
|
|
|
#include <sys/epoll.h>
|
|
|
|
#endif
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
using namespace std;
|
2022-09-25 21:49:24 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
#ifdef __linux__
|
2018-05-03 13:47:57 +00:00
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
2022-11-09 07:40:26 +00:00
|
|
|
// imported from bcm_host.c
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
static uint32_t get_dt_ranges(const char *filename, uint32_t offset)
|
|
|
|
{
|
|
|
|
uint32_t address = ~0;
|
|
|
|
if (FILE *fp = fopen(filename, "rb"); fp) {
|
|
|
|
fseek(fp, offset, SEEK_SET);
|
|
|
|
if (array<uint8_t, 4> buf; fread(buf.data(), 1, buf.size(), fp) == buf.size()) {
|
|
|
|
address = (int)buf[0] << 24 | (int)buf[1] << 16 | (int)buf[2] << 8 | (int)buf[3] << 0;
|
|
|
|
}
|
|
|
|
fclose(fp);
|
|
|
|
}
|
|
|
|
return address;
|
|
|
|
}
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
uint32_t bcm_host_get_peripheral_address()
|
|
|
|
{
|
|
|
|
uint32_t address = get_dt_ranges("/proc/device-tree/soc/ranges", 4);
|
|
|
|
if (address == 0) {
|
|
|
|
address = get_dt_ranges("/proc/device-tree/soc/ranges", 8);
|
|
|
|
}
|
|
|
|
address = (address == (uint32_t)~0) ? 0x20000000 : address;
|
|
|
|
return address;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef __NetBSD__
|
|
|
|
// Assume the Raspberry Pi series and estimate the address from CPU
|
|
|
|
uint32_t bcm_host_get_peripheral_address()
|
|
|
|
{
|
|
|
|
array<char, 1024> buf;
|
|
|
|
size_t len = buf.size();
|
|
|
|
uint32_t address;
|
|
|
|
|
|
|
|
if (sysctlbyname("hw.model", buf.data(), &len, NULL, 0) ||
|
|
|
|
strstr(buf, "ARM1176JZ-S") != buf.data()) {
|
|
|
|
// Failed to get CPU model || Not BCM2835
|
|
|
|
// use the address of BCM283[67]
|
|
|
|
address = 0x3f000000;
|
|
|
|
} else {
|
|
|
|
// Use BCM2835 address
|
|
|
|
address = 0x20000000;
|
|
|
|
}
|
|
|
|
printf("Peripheral address : 0x%lx\n", address);
|
|
|
|
return address;
|
|
|
|
}
|
|
|
|
#endif
|
2018-05-03 13:47:57 +00:00
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
bool GPIOBUS::Init(mode_e mode)
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
// Save operation mode
|
|
|
|
actmode = mode;
|
|
|
|
|
|
|
|
#if defined(__x86_64__) || defined(__X86__)
|
|
|
|
return true;
|
|
|
|
#else
|
|
|
|
int i;
|
|
|
|
#ifdef USE_SEL_EVENT_ENABLE
|
|
|
|
epoll_event ev = {};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// Get the base address
|
|
|
|
baseaddr = (uint32_t)bcm_host_get_peripheral_address();
|
|
|
|
|
|
|
|
// Open /dev/mem
|
|
|
|
int fd = open("/dev/mem", O_RDWR | O_SYNC);
|
|
|
|
if (fd == -1) {
|
|
|
|
LOGERROR("Error: Unable to open /dev/mem. Are you running as root?")
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Map peripheral region memory
|
|
|
|
void *map = mmap(NULL, 0x1000100, PROT_READ | PROT_WRITE, MAP_SHARED, fd, baseaddr);
|
|
|
|
if (map == MAP_FAILED) {
|
|
|
|
LOGERROR("Error: Unable to map memory")
|
|
|
|
close(fd);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Determine the type of raspberry pi from the base address
|
|
|
|
if (baseaddr == 0xfe000000) {
|
|
|
|
rpitype = 4;
|
|
|
|
} else if (baseaddr == 0x3f000000) {
|
|
|
|
rpitype = 2;
|
|
|
|
} else {
|
|
|
|
rpitype = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// GPIO
|
|
|
|
gpio = (uint32_t *)map;
|
|
|
|
gpio += GPIO_OFFSET / sizeof(uint32_t);
|
|
|
|
level = &gpio[GPIO_LEV_0];
|
|
|
|
|
|
|
|
// PADS
|
|
|
|
pads = (uint32_t *)map;
|
|
|
|
pads += PADS_OFFSET / sizeof(uint32_t);
|
|
|
|
|
|
|
|
// System timer
|
|
|
|
SysTimer::Init(
|
|
|
|
(uint32_t *)map + SYST_OFFSET / sizeof(uint32_t),
|
|
|
|
(uint32_t *)map + ARMT_OFFSET / sizeof(uint32_t));
|
|
|
|
|
|
|
|
// Interrupt controller
|
|
|
|
irpctl = (uint32_t *)map;
|
|
|
|
irpctl += IRPT_OFFSET / sizeof(uint32_t);
|
|
|
|
|
|
|
|
// Quad-A7 control
|
|
|
|
qa7regs = (uint32_t *)map;
|
|
|
|
qa7regs += QA7_OFFSET / sizeof(uint32_t);
|
|
|
|
|
|
|
|
// Map GIC memory
|
|
|
|
if (rpitype == 4) {
|
|
|
|
map = mmap(NULL, 8192,
|
|
|
|
PROT_READ | PROT_WRITE, MAP_SHARED, fd, ARM_GICD_BASE);
|
|
|
|
if (map == MAP_FAILED) {
|
|
|
|
close(fd);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
gicd = (uint32_t *)map;
|
|
|
|
gicc = (uint32_t *)map;
|
|
|
|
gicc += (ARM_GICC_BASE - ARM_GICD_BASE) / sizeof(uint32_t);
|
|
|
|
} else {
|
|
|
|
gicd = NULL;
|
|
|
|
gicc = NULL;
|
|
|
|
}
|
|
|
|
close(fd);
|
|
|
|
|
|
|
|
// Set Drive Strength to 16mA
|
|
|
|
DrvConfig(7);
|
|
|
|
|
|
|
|
// Set pull up/pull down
|
|
|
|
#if SIGNAL_CONTROL_MODE == 0
|
|
|
|
int pullmode = GPIO_PULLNONE;
|
|
|
|
#elif SIGNAL_CONTROL_MODE == 1
|
|
|
|
int pullmode = GPIO_PULLUP;
|
|
|
|
#else
|
|
|
|
int pullmode = GPIO_PULLDOWN;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// Initialize all signals
|
|
|
|
for (i = 0; SignalTable[i] >= 0; i++) {
|
|
|
|
int j = SignalTable[i];
|
|
|
|
PinSetSignal(j, OFF);
|
|
|
|
PinConfig(j, GPIO_INPUT);
|
|
|
|
PullConfig(j, pullmode);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set control signals
|
|
|
|
PinSetSignal(PIN_ACT, OFF);
|
|
|
|
PinSetSignal(PIN_TAD, OFF);
|
|
|
|
PinSetSignal(PIN_IND, OFF);
|
|
|
|
PinSetSignal(PIN_DTD, OFF);
|
|
|
|
PinConfig(PIN_ACT, GPIO_OUTPUT);
|
|
|
|
PinConfig(PIN_TAD, GPIO_OUTPUT);
|
|
|
|
PinConfig(PIN_IND, GPIO_OUTPUT);
|
|
|
|
PinConfig(PIN_DTD, GPIO_OUTPUT);
|
|
|
|
|
|
|
|
// Set the ENABLE signal
|
|
|
|
// This is used to show that the application is running
|
|
|
|
PinSetSignal(PIN_ENB, ENB_OFF);
|
|
|
|
PinConfig(PIN_ENB, GPIO_OUTPUT);
|
|
|
|
|
|
|
|
// GPFSEL backup
|
|
|
|
gpfsel[0] = gpio[GPIO_FSEL_0];
|
|
|
|
gpfsel[1] = gpio[GPIO_FSEL_1];
|
|
|
|
gpfsel[2] = gpio[GPIO_FSEL_2];
|
|
|
|
gpfsel[3] = gpio[GPIO_FSEL_3];
|
|
|
|
|
|
|
|
// Initialize SEL signal interrupt
|
|
|
|
#ifdef USE_SEL_EVENT_ENABLE
|
|
|
|
// GPIO chip open
|
|
|
|
fd = open("/dev/gpiochip0", 0);
|
|
|
|
if (fd == -1) {
|
|
|
|
LOGERROR("Unable to open /dev/gpiochip0. Is RaSCSI already running?")
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Event request setting
|
|
|
|
strcpy(selevreq.consumer_label, "RaSCSI");
|
|
|
|
selevreq.lineoffset = PIN_SEL;
|
|
|
|
selevreq.handleflags = GPIOHANDLE_REQUEST_INPUT;
|
|
|
|
#if SIGNAL_CONTROL_MODE < 2
|
|
|
|
selevreq.eventflags = GPIOEVENT_REQUEST_FALLING_EDGE;
|
|
|
|
#else
|
|
|
|
selevreq.eventflags = GPIOEVENT_REQUEST_RISING_EDGE;
|
|
|
|
#endif // SIGNAL_CONTROL_MODE
|
|
|
|
|
|
|
|
//Get event request
|
|
|
|
if (ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, &selevreq) == -1) {
|
|
|
|
LOGERROR("Unable to register event request. Is RaSCSI already running?")
|
|
|
|
close(fd);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Close GPIO chip file handle
|
|
|
|
close(fd);
|
|
|
|
|
|
|
|
// epoll initialization
|
|
|
|
epfd = epoll_create(1);
|
|
|
|
ev.events = EPOLLIN | EPOLLPRI;
|
|
|
|
ev.data.fd = selevreq.fd;
|
|
|
|
epoll_ctl(epfd, EPOLL_CTL_ADD, selevreq.fd, &ev);
|
|
|
|
#else
|
|
|
|
// Edge detection setting
|
|
|
|
#if SIGNAL_CONTROL_MODE == 2
|
|
|
|
gpio[GPIO_AREN_0] = 1 << PIN_SEL;
|
|
|
|
#else
|
|
|
|
gpio[GPIO_AFEN_0] = 1 << PIN_SEL;
|
|
|
|
#endif // SIGNAL_CONTROL_MODE
|
|
|
|
|
|
|
|
// Clear event
|
|
|
|
gpio[GPIO_EDS_0] = 1 << PIN_SEL;
|
|
|
|
|
|
|
|
// Register interrupt handler
|
|
|
|
setIrqFuncAddress(IrqHandler);
|
|
|
|
|
|
|
|
// GPIO interrupt setting
|
|
|
|
if (rpitype == 4) {
|
|
|
|
// GIC Invalid
|
|
|
|
gicd[GICD_CTLR] = 0;
|
|
|
|
|
|
|
|
// Route all interupts to core 0
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
|
|
gicd[GICD_ICENABLER0 + i] = 0xffffffff;
|
|
|
|
gicd[GICD_ICPENDR0 + i] = 0xffffffff;
|
|
|
|
gicd[GICD_ICACTIVER0 + i] = 0xffffffff;
|
|
|
|
}
|
|
|
|
for (i = 0; i < 64; i++) {
|
|
|
|
gicd[GICD_IPRIORITYR0 + i] = 0xa0a0a0a0;
|
|
|
|
gicd[GICD_ITARGETSR0 + i] = 0x01010101;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set all interrupts as level triggers
|
|
|
|
for (i = 0; i < 16; i++) {
|
|
|
|
gicd[GICD_ICFGR0 + i] = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// GIC Invalid
|
|
|
|
gicd[GICD_CTLR] = 1;
|
|
|
|
|
|
|
|
// Enable CPU interface for core 0
|
|
|
|
gicc[GICC_PMR] = 0xf0;
|
|
|
|
gicc[GICC_CTLR] = 1;
|
|
|
|
|
|
|
|
// Enable interrupts
|
|
|
|
gicd[GICD_ISENABLER0 + (GIC_GPIO_IRQ / 32)] =
|
|
|
|
1 << (GIC_GPIO_IRQ % 32);
|
|
|
|
} else {
|
|
|
|
// Enable interrupts
|
|
|
|
irpctl[IRPT_ENB_IRQ_2] = (1 << (GPIO_IRQ % 32));
|
|
|
|
}
|
|
|
|
#endif // USE_SEL_EVENT_ENABLE
|
|
|
|
|
|
|
|
// Create work table
|
|
|
|
MakeTable();
|
|
|
|
|
|
|
|
// Finally, enable ENABLE
|
|
|
|
// Show the user that this app is running
|
|
|
|
SetControl(PIN_ENB, ENB_ON);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
#endif // ifdef __x86_64__ || __X86__
|
|
|
|
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
2021-07-26 18:33:36 +00:00
|
|
|
void GPIOBUS::Cleanup()
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2020-08-07 19:25:05 +00:00
|
|
|
#if defined(__x86_64__) || defined(__X86__)
|
2022-11-09 07:40:26 +00:00
|
|
|
return;
|
2020-08-07 19:25:05 +00:00
|
|
|
#else
|
2022-11-09 07:40:26 +00:00
|
|
|
// Release SEL signal interrupt
|
2020-07-04 14:57:44 +00:00
|
|
|
#ifdef USE_SEL_EVENT_ENABLE
|
2022-11-09 07:40:26 +00:00
|
|
|
close(selevreq.fd);
|
|
|
|
#endif // USE_SEL_EVENT_ENABLE
|
|
|
|
|
|
|
|
// Set control signals
|
|
|
|
PinSetSignal(PIN_ENB, OFF);
|
|
|
|
PinSetSignal(PIN_ACT, OFF);
|
|
|
|
PinSetSignal(PIN_TAD, OFF);
|
|
|
|
PinSetSignal(PIN_IND, OFF);
|
|
|
|
PinSetSignal(PIN_DTD, OFF);
|
|
|
|
PinConfig(PIN_ACT, GPIO_INPUT);
|
|
|
|
PinConfig(PIN_TAD, GPIO_INPUT);
|
|
|
|
PinConfig(PIN_IND, GPIO_INPUT);
|
|
|
|
PinConfig(PIN_DTD, GPIO_INPUT);
|
|
|
|
|
|
|
|
// Initialize all signals
|
|
|
|
for (int i = 0; SignalTable[i] >= 0; i++) {
|
|
|
|
int pin = SignalTable[i];
|
|
|
|
PinSetSignal(pin, OFF);
|
|
|
|
PinConfig(pin, GPIO_INPUT);
|
|
|
|
PullConfig(pin, GPIO_PULLNONE);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set drive strength back to 8mA
|
|
|
|
DrvConfig(3);
|
2020-08-07 19:25:05 +00:00
|
|
|
#endif // ifdef __x86_64__ || __X86__
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
2021-07-26 18:33:36 +00:00
|
|
|
void GPIOBUS::Reset()
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2020-08-07 19:25:05 +00:00
|
|
|
#if defined(__x86_64__) || defined(__X86__)
|
2022-11-09 07:40:26 +00:00
|
|
|
return;
|
2020-08-07 19:25:05 +00:00
|
|
|
#else
|
2022-11-09 07:40:26 +00:00
|
|
|
int i;
|
|
|
|
int j;
|
|
|
|
|
|
|
|
// Turn off active signal
|
|
|
|
SetControl(PIN_ACT, ACT_OFF);
|
|
|
|
|
|
|
|
// Set all signals to off
|
|
|
|
for (i = 0;; i++) {
|
|
|
|
j = SignalTable[i];
|
|
|
|
if (j < 0) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
SetSignal(j, OFF);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (actmode == mode_e::TARGET) {
|
|
|
|
// Target mode
|
|
|
|
|
|
|
|
// Set target signal to input
|
|
|
|
SetControl(PIN_TAD, TAD_IN);
|
|
|
|
SetMode(PIN_BSY, IN);
|
|
|
|
SetMode(PIN_MSG, IN);
|
|
|
|
SetMode(PIN_CD, IN);
|
|
|
|
SetMode(PIN_REQ, IN);
|
|
|
|
SetMode(PIN_IO, IN);
|
|
|
|
|
|
|
|
// Set the initiator signal to input
|
|
|
|
SetControl(PIN_IND, IND_IN);
|
|
|
|
SetMode(PIN_SEL, IN);
|
|
|
|
SetMode(PIN_ATN, IN);
|
|
|
|
SetMode(PIN_ACK, IN);
|
|
|
|
SetMode(PIN_RST, IN);
|
|
|
|
|
|
|
|
// Set data bus signals to input
|
|
|
|
SetControl(PIN_DTD, DTD_IN);
|
|
|
|
SetMode(PIN_DT0, IN);
|
|
|
|
SetMode(PIN_DT1, IN);
|
|
|
|
SetMode(PIN_DT2, IN);
|
|
|
|
SetMode(PIN_DT3, IN);
|
|
|
|
SetMode(PIN_DT4, IN);
|
|
|
|
SetMode(PIN_DT5, IN);
|
|
|
|
SetMode(PIN_DT6, IN);
|
|
|
|
SetMode(PIN_DT7, IN);
|
|
|
|
SetMode(PIN_DP, IN);
|
|
|
|
} else {
|
|
|
|
// Initiator mode
|
|
|
|
|
|
|
|
// Set target signal to input
|
|
|
|
SetControl(PIN_TAD, TAD_IN);
|
|
|
|
SetMode(PIN_BSY, IN);
|
|
|
|
SetMode(PIN_MSG, IN);
|
|
|
|
SetMode(PIN_CD, IN);
|
|
|
|
SetMode(PIN_REQ, IN);
|
|
|
|
SetMode(PIN_IO, IN);
|
|
|
|
|
|
|
|
// Set the initiator signal to output
|
|
|
|
SetControl(PIN_IND, IND_OUT);
|
|
|
|
SetMode(PIN_SEL, OUT);
|
|
|
|
SetMode(PIN_ATN, OUT);
|
|
|
|
SetMode(PIN_ACK, OUT);
|
|
|
|
SetMode(PIN_RST, OUT);
|
|
|
|
|
|
|
|
// Set the data bus signals to output
|
|
|
|
SetControl(PIN_DTD, DTD_OUT);
|
|
|
|
SetMode(PIN_DT0, OUT);
|
|
|
|
SetMode(PIN_DT1, OUT);
|
|
|
|
SetMode(PIN_DT2, OUT);
|
|
|
|
SetMode(PIN_DT3, OUT);
|
|
|
|
SetMode(PIN_DT4, OUT);
|
|
|
|
SetMode(PIN_DT5, OUT);
|
|
|
|
SetMode(PIN_DT6, OUT);
|
|
|
|
SetMode(PIN_DT7, OUT);
|
|
|
|
SetMode(PIN_DP, OUT);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Initialize all signals
|
|
|
|
signals = 0;
|
2020-08-07 19:25:05 +00:00
|
|
|
#endif // ifdef __x86_64__ || __X86__
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
void GPIOBUS::SetENB(bool ast)
|
2020-07-04 14:57:44 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
PinSetSignal(PIN_ENB, ast ? ENB_ON : ENB_OFF);
|
2020-07-04 14:57:44 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
bool GPIOBUS::GetBSY() const
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
return GetSignal(PIN_BSY);
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
Refactoring, device handling extensions, additional settings, improved error handling, 64 bit OS support, fixed issues (#184)
* Device type unification, support of removable media
* Added support for .hdr extension
* Removable flag cleanup
* Manpage update
* Enriched PbOperation with PbDevice
* Added file size to PbImageFile
* Added device list support
* Set image_file
* Make remote interface more robust by ignoring SIGPIPE
* Return status only once
* Fixed typo
* Error handling update
* When starting rascsi parse everything before attaching devices
* Added dry run mode
* Comment update
* Updated logging
* Added Device base class, Disk class inherits from it
* Renaming
* Use vectors for controllers and disks, as preparation for using maps
* Updated file support handling
* Comment update
* DaynaPort and Bridge inherit from Device instead of Disk
* ProcessCmd() now works with devices instead of disks
* Renaming
* Added DeviceFactory
* Improved factory
* Comment update
* protected disk_t
* Code cleanup, added translations
* Device name can be set for rascsi
* rasctl can set device name
* Manpage update
* Manpage update
* Formatting update
* Check for missing name
* Initialize fd
* Initialize type
* Fixed string length issue
* Updated capacity formatting
* Fixed typo
* Split PbDevice into device and device definition
* Added TODO
* Renaming
* Renaming
* Device types can be explicitly specified with -t (no FILE:TYPE syntax anymore)
* Fixed compile-time issue
* Removed unused Append mode, updated read-only handling
* Type handling and manpage update
* Cleanup
* rasctl parser cleanup
* Review
* Constructor update
* Added .hdr (SCRM) support to web interface, tested web interface
* Default folder can be set remotely
* Removed deprecated operation
* DETACH supports all parameters in order to detach all devices
* include cleanup
* Logging should not depend on NDEBUG, for RaSCSI it is not peformance-critical
* INFO is default log level
* Exception renaming
* Updated GetPaddedName()
* Inheritance update
* Added BlockDevice class
* Removed unused code
* Updated typedefs
* Revert "Updated typedefs"
This reverts commit 546b46215a4d9b65067a11698e59ab1123cc6d64.
* Removed unused code
* Fixed warnign
* Use standard C++ integer types, use streams to resolve printf data type issues
* Added TODOs
* Added TODO
* Renaming
* Added TODO
* Added TODO
* Improved dry-run
* Code cleanup
* Updated handling of unknown options, code review and cleanup
* Manpage update
* Added PrimaryDevice
* Include cleanup
* Added pure virtual methods
* Comment updates
* Split rasutil
* Replaced some occurrences of BOOL
* Removed obsolete RASCSI definition in xm6.h
* Removed unused code, updated TODOs, replaced BOOL
* Added capacity check (issue #192)
* Fixed (most likely) https://github.com/akuker/RASCSI/issues/191
* Fixed wrong error messages
* For root the default image folder is /home/pi/images, updated error handling
* Dynaport code review
* Improved error handling
* Implemented READ CAPACITY(16)
* Comment update
* Commands can be 16 bytes long
* Implemented READ/WRITE/VERIFY(16)
* Comment update
* Renamed method to reflect the name of the respective SCSI command
* Do not created devices during dryRun
* Fixed padding of SCSIHD_APPLE vendor and product
* Initial implementation
* Updated ReportLuns
* Byte count update
* Fixed typo
* Finalized REPORT LUNS
* Removed TODO
* Updated TODO
* TODO update
* Updated device factory
* Comment update
* 64 bit update, tested on Ubuntu 64 bit system
* Removed assertion
* SCSI hard disks always have Apple specific mode pages (resolves issue #193)
* Error messsage update, 64 bit cleanup
* Reduced streams usage
* Updated handling of device flags
* MOs are protectable
* Removed duplicate error code handling
* Removed duplicate code
* Fixed CmdReadToc buffer overflow (https://github.com/akuker/RASCSI/issues/194)
* Added naive implementation of GET EVENT STATUS NOTIFICATION to avoid wranings
* HD must set removable device bit if the media is removable
* Removed duplicate logging
* Updated daynaport additional length
* Removed broken daynaport REQUEST SENSE. Successfully tested with my Mac.
* EnableInterface should not always return TRUE
* Updated Inquiry
* Updated LUN handling
* Replaced incorrect free by delete
* Updated comments and write-protection handling
* Made default HD name consistent
* STATUS_NOERROR is default
* Fixed Eject
* More eject handling updates
* Manpage updates
* Logging update
* Changed debug level
* Logging update
* Log capacity of all media types
* Logging update
* Encapsulated disk.blocks
* Encapsulated sector size
* Added overrides
* Added more overrides
* Fixed error message
* Fixed typos
* Fixed logging
* Added logging
* Use PrimaryDevice when calling Inquiry
* Comment update
* Changed default buffer size for testing
* Reverted last change
* Removed debug output
* De-inlined methods because optimized code did not work with them inlined
* Web interface can attach Daynaport again
* Improved handling of read-only hard disks
* Fixed issue with "all" semantics of DETACH
* rasctl supports adding removable media devices without providing a filename
* Removed unused flag in PbDeviceDefinition
* Updated rasctl output for ecjected media (resolves issue #199)
* Validate default folder name when changing default folder
2021-08-21 21:45:30 +00:00
|
|
|
void GPIOBUS::SetBSY(bool ast)
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
// Set BSY signal
|
|
|
|
SetSignal(PIN_BSY, ast);
|
|
|
|
|
|
|
|
if (actmode == mode_e::TARGET) {
|
|
|
|
if (ast) {
|
|
|
|
// Turn on ACTIVE signal
|
|
|
|
SetControl(PIN_ACT, ACT_ON);
|
|
|
|
|
|
|
|
// Set Target signal to output
|
|
|
|
SetControl(PIN_TAD, TAD_OUT);
|
|
|
|
|
|
|
|
SetMode(PIN_BSY, OUT);
|
|
|
|
SetMode(PIN_MSG, OUT);
|
|
|
|
SetMode(PIN_CD, OUT);
|
|
|
|
SetMode(PIN_REQ, OUT);
|
|
|
|
SetMode(PIN_IO, OUT);
|
|
|
|
} else {
|
|
|
|
// Turn off the ACTIVE signal
|
|
|
|
SetControl(PIN_ACT, ACT_OFF);
|
|
|
|
|
|
|
|
// Set the target signal to input
|
|
|
|
SetControl(PIN_TAD, TAD_IN);
|
|
|
|
|
|
|
|
SetMode(PIN_BSY, IN);
|
|
|
|
SetMode(PIN_MSG, IN);
|
|
|
|
SetMode(PIN_CD, IN);
|
|
|
|
SetMode(PIN_REQ, IN);
|
|
|
|
SetMode(PIN_IO, IN);
|
|
|
|
}
|
|
|
|
}
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
bool GPIOBUS::GetSEL() const
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
return GetSignal(PIN_SEL);
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
void GPIOBUS::SetSEL(bool ast)
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
if (actmode == mode_e::INITIATOR && ast) {
|
|
|
|
// Turn on ACTIVE signal
|
|
|
|
SetControl(PIN_ACT, ACT_ON);
|
|
|
|
}
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Set SEL signal
|
|
|
|
SetSignal(PIN_SEL, ast);
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
bool GPIOBUS::GetATN() const
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
return GetSignal(PIN_ATN);
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
void GPIOBUS::SetATN(bool ast)
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
SetSignal(PIN_ATN, ast);
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
bool GPIOBUS::GetACK() const
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
return GetSignal(PIN_ACK);
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
void GPIOBUS::SetACK(bool ast)
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
SetSignal(PIN_ACK, ast);
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
bool GPIOBUS::GetACT() const
|
2020-10-19 12:31:06 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
return GetSignal(PIN_ACT);
|
2020-10-19 12:31:06 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
void GPIOBUS::SetACT(bool ast)
|
2020-10-19 12:31:06 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
SetSignal(PIN_ACT, ast);
|
2020-10-19 12:31:06 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
bool GPIOBUS::GetRST() const
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
return GetSignal(PIN_RST);
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
void GPIOBUS::SetRST(bool ast)
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
SetSignal(PIN_RST, ast);
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
bool GPIOBUS::GetMSG() const
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
return GetSignal(PIN_MSG);
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
void GPIOBUS::SetMSG(bool ast)
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
SetSignal(PIN_MSG, ast);
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
bool GPIOBUS::GetCD() const
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
return GetSignal(PIN_CD);
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
void GPIOBUS::SetCD(bool ast)
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
SetSignal(PIN_CD, ast);
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
bool GPIOBUS::GetIO()
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
bool ast = GetSignal(PIN_IO);
|
|
|
|
|
|
|
|
if (actmode == mode_e::INITIATOR) {
|
|
|
|
// Change the data input/output direction by IO signal
|
|
|
|
if (ast) {
|
|
|
|
SetControl(PIN_DTD, DTD_IN);
|
|
|
|
SetMode(PIN_DT0, IN);
|
|
|
|
SetMode(PIN_DT1, IN);
|
|
|
|
SetMode(PIN_DT2, IN);
|
|
|
|
SetMode(PIN_DT3, IN);
|
|
|
|
SetMode(PIN_DT4, IN);
|
|
|
|
SetMode(PIN_DT5, IN);
|
|
|
|
SetMode(PIN_DT6, IN);
|
|
|
|
SetMode(PIN_DT7, IN);
|
|
|
|
SetMode(PIN_DP, IN);
|
|
|
|
} else {
|
|
|
|
SetControl(PIN_DTD, DTD_OUT);
|
|
|
|
SetMode(PIN_DT0, OUT);
|
|
|
|
SetMode(PIN_DT1, OUT);
|
|
|
|
SetMode(PIN_DT2, OUT);
|
|
|
|
SetMode(PIN_DT3, OUT);
|
|
|
|
SetMode(PIN_DT4, OUT);
|
|
|
|
SetMode(PIN_DT5, OUT);
|
|
|
|
SetMode(PIN_DT6, OUT);
|
|
|
|
SetMode(PIN_DT7, OUT);
|
|
|
|
SetMode(PIN_DP, OUT);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ast;
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
void GPIOBUS::SetIO(bool ast)
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
SetSignal(PIN_IO, ast);
|
|
|
|
|
|
|
|
if (actmode == mode_e::TARGET) {
|
|
|
|
// Change the data input/output direction by IO signal
|
|
|
|
if (ast) {
|
|
|
|
SetControl(PIN_DTD, DTD_OUT);
|
|
|
|
SetDAT(0);
|
|
|
|
SetMode(PIN_DT0, OUT);
|
|
|
|
SetMode(PIN_DT1, OUT);
|
|
|
|
SetMode(PIN_DT2, OUT);
|
|
|
|
SetMode(PIN_DT3, OUT);
|
|
|
|
SetMode(PIN_DT4, OUT);
|
|
|
|
SetMode(PIN_DT5, OUT);
|
|
|
|
SetMode(PIN_DT6, OUT);
|
|
|
|
SetMode(PIN_DT7, OUT);
|
|
|
|
SetMode(PIN_DP, OUT);
|
|
|
|
} else {
|
|
|
|
SetControl(PIN_DTD, DTD_IN);
|
|
|
|
SetMode(PIN_DT0, IN);
|
|
|
|
SetMode(PIN_DT1, IN);
|
|
|
|
SetMode(PIN_DT2, IN);
|
|
|
|
SetMode(PIN_DT3, IN);
|
|
|
|
SetMode(PIN_DT4, IN);
|
|
|
|
SetMode(PIN_DT5, IN);
|
|
|
|
SetMode(PIN_DT6, IN);
|
|
|
|
SetMode(PIN_DT7, IN);
|
|
|
|
SetMode(PIN_DP, IN);
|
|
|
|
}
|
|
|
|
}
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
bool GPIOBUS::GetREQ() const
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
return GetSignal(PIN_REQ);
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
void GPIOBUS::SetREQ(bool ast)
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
SetSignal(PIN_REQ, ast);
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Get data signals
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
uint8_t GPIOBUS::GetDAT()
|
|
|
|
{
|
|
|
|
uint32_t data = Acquire();
|
|
|
|
data =
|
|
|
|
((data >> (PIN_DT0 - 0)) & (1 << 0)) |
|
|
|
|
((data >> (PIN_DT1 - 1)) & (1 << 1)) |
|
|
|
|
((data >> (PIN_DT2 - 2)) & (1 << 2)) |
|
|
|
|
((data >> (PIN_DT3 - 3)) & (1 << 3)) |
|
|
|
|
((data >> (PIN_DT4 - 4)) & (1 << 4)) |
|
|
|
|
((data >> (PIN_DT5 - 5)) & (1 << 5)) |
|
|
|
|
((data >> (PIN_DT6 - 6)) & (1 << 6)) |
|
|
|
|
((data >> (PIN_DT7 - 7)) & (1 << 7));
|
|
|
|
|
|
|
|
return (uint8_t)data;
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Set data signals
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
void GPIOBUS::SetDAT(uint8_t dat)
|
|
|
|
{
|
|
|
|
// Write to port
|
|
|
|
#if SIGNAL_CONTROL_MODE == 0
|
|
|
|
uint32_t fsel = gpfsel[0];
|
|
|
|
fsel &= tblDatMsk[0][dat];
|
|
|
|
fsel |= tblDatSet[0][dat];
|
|
|
|
if (fsel != gpfsel[0]) {
|
|
|
|
gpfsel[0] = fsel;
|
|
|
|
gpio[GPIO_FSEL_0] = fsel;
|
|
|
|
}
|
|
|
|
|
|
|
|
fsel = gpfsel[1];
|
|
|
|
fsel &= tblDatMsk[1][dat];
|
|
|
|
fsel |= tblDatSet[1][dat];
|
|
|
|
if (fsel != gpfsel[1]) {
|
|
|
|
gpfsel[1] = fsel;
|
|
|
|
gpio[GPIO_FSEL_1] = fsel;
|
|
|
|
}
|
|
|
|
|
|
|
|
fsel = gpfsel[2];
|
|
|
|
fsel &= tblDatMsk[2][dat];
|
|
|
|
fsel |= tblDatSet[2][dat];
|
|
|
|
if (fsel != gpfsel[2]) {
|
|
|
|
gpfsel[2] = fsel;
|
|
|
|
gpio[GPIO_FSEL_2] = fsel;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
gpio[GPIO_CLR_0] = tblDatMsk[dat];
|
|
|
|
gpio[GPIO_SET_0] = tblDatSet[dat];
|
|
|
|
#endif // SIGNAL_CONTROL_MODE
|
2020-07-04 14:57:44 +00:00
|
|
|
}
|
|
|
|
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
bool GPIOBUS::GetDP() const
|
2020-07-04 14:57:44 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
return GetSignal(PIN_DP);
|
2020-07-04 14:57:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
2020-07-06 03:56:25 +00:00
|
|
|
// Receive command handshake
|
2020-07-04 14:57:44 +00:00
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
2022-11-06 18:44:44 +00:00
|
|
|
int GPIOBUS::CommandHandShake(vector<uint8_t>& buf)
|
2020-07-04 14:57:44 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
// Only works in TARGET mode
|
|
|
|
if (actmode != mode_e::TARGET) {
|
|
|
|
return 0;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
DisableIRQ();
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Assert REQ signal
|
|
|
|
SetSignal(PIN_REQ, ON);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Wait for ACK signal
|
|
|
|
bool ret = WaitSignal(PIN_ACK, ON);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Wait until the signal line stabilizes
|
|
|
|
SysTimer::SleepNsec(SCSI_DELAY_BUS_SETTLE_DELAY_NS);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Get data
|
|
|
|
buf[0] = GetDAT();
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Disable REQ signal
|
|
|
|
SetSignal(PIN_REQ, OFF);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Timeout waiting for ACK assertion
|
|
|
|
if (!ret) {
|
|
|
|
EnableIRQ();
|
|
|
|
return 0;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Wait for ACK to clear
|
|
|
|
ret = WaitSignal(PIN_ACK, OFF);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Timeout waiting for ACK to clear
|
|
|
|
if (!ret) {
|
|
|
|
EnableIRQ();
|
|
|
|
return 0;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// The ICD AdSCSI ST, AdSCSI Plus ST and AdSCSI Micro ST host adapters allow SCSI devices to be connected
|
|
|
|
// to the ACSI bus of Atari ST/TT computers and some clones. ICD-aware drivers prepend a $1F byte in front
|
|
|
|
// of the CDB (effectively resulting in a custom SCSI command) in order to get access to the full SCSI
|
|
|
|
// command set. Native ACSI is limited to the low SCSI command classes with command bytes < $20.
|
|
|
|
// Most other host adapters (e.g. LINK96/97 and the one by Inventronik) and also several devices (e.g.
|
|
|
|
// UltraSatan or GigaFile) that can directly be connected to the Atari's ACSI port also support ICD
|
|
|
|
// semantics. I fact, these semantics have become a standard in the Atari world.
|
2022-02-05 01:45:10 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// RaSCSI becomes ICD compatible by ignoring the prepended $1F byte before processing the CDB.
|
|
|
|
if (buf[0] == 0x1F) {
|
|
|
|
SetSignal(PIN_REQ, ON);
|
2022-02-05 01:45:10 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
ret = WaitSignal(PIN_ACK, ON);
|
2022-02-05 01:45:10 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
SysTimer::SleepNsec(SCSI_DELAY_BUS_SETTLE_DELAY_NS);
|
2022-02-05 01:45:10 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Get the actual SCSI command
|
|
|
|
buf[0] = GetDAT();
|
2022-02-05 01:45:10 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
SetSignal(PIN_REQ, OFF);
|
2022-02-05 01:45:10 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
if (!ret) {
|
|
|
|
EnableIRQ();
|
|
|
|
return 0;
|
|
|
|
}
|
2022-02-05 01:45:10 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
WaitSignal(PIN_ACK, OFF);
|
2022-02-05 01:45:10 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
if (!ret) {
|
|
|
|
EnableIRQ();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
2022-02-05 01:45:10 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
const int command_byte_count = GetCommandByteCount(buf[0]);
|
|
|
|
if (command_byte_count == 0) {
|
|
|
|
EnableIRQ();
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2022-11-06 18:44:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
int offset = 0;
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
int bytes_received;
|
|
|
|
for (bytes_received = 1; bytes_received < command_byte_count; bytes_received++) {
|
|
|
|
++offset;
|
2022-11-06 18:44:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Assert REQ signal
|
|
|
|
SetSignal(PIN_REQ, ON);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Wait for ACK signal
|
|
|
|
ret = WaitSignal(PIN_ACK, ON);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Wait until the signal line stabilizes
|
|
|
|
SysTimer::SleepNsec(SCSI_DELAY_BUS_SETTLE_DELAY_NS);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Get data
|
|
|
|
buf[offset] = GetDAT();
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Clear the REQ signal
|
|
|
|
SetSignal(PIN_REQ, OFF);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Check for timeout waiting for ACK assertion
|
|
|
|
if (!ret) {
|
|
|
|
break;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Wait for ACK to clear
|
|
|
|
ret = WaitSignal(PIN_ACK, OFF);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Check for timeout waiting for ACK to clear
|
|
|
|
if (!ret) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
EnableIRQ();
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
return bytes_received;
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
2020-07-06 03:56:25 +00:00
|
|
|
// Data reception handshake
|
2018-05-03 13:47:57 +00:00
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
2022-11-02 06:36:25 +00:00
|
|
|
int GPIOBUS::ReceiveHandShake(uint8_t *buf, int count)
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
int i;
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Disable IRQs
|
|
|
|
DisableIRQ();
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
if (actmode == mode_e::TARGET) {
|
|
|
|
for (i = 0; i < count; i++) {
|
|
|
|
// Assert the REQ signal
|
|
|
|
SetSignal(PIN_REQ, ON);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Wait for ACK
|
|
|
|
bool ret = WaitSignal(PIN_ACK, ON);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Wait until the signal line stabilizes
|
|
|
|
SysTimer::SleepNsec(SCSI_DELAY_BUS_SETTLE_DELAY_NS);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Get data
|
|
|
|
*buf = GetDAT();
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Clear the REQ signal
|
|
|
|
SetSignal(PIN_REQ, OFF);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Check for timeout waiting for ACK signal
|
|
|
|
if (!ret) {
|
|
|
|
break;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Wait for ACK to clear
|
|
|
|
ret = WaitSignal(PIN_ACK, OFF);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Check for timeout waiting for ACK to clear
|
|
|
|
if (!ret) {
|
|
|
|
break;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Advance the buffer pointer to receive the next byte
|
|
|
|
buf++;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Get phase
|
|
|
|
uint32_t phase = Acquire() & GPIO_MCI;
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
for (i = 0; i < count; i++) {
|
|
|
|
// Wait for the REQ signal to be asserted
|
|
|
|
bool ret = WaitSignal(PIN_REQ, ON);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Check for timeout waiting for REQ signal
|
|
|
|
if (!ret) {
|
|
|
|
break;
|
|
|
|
}
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Phase error
|
|
|
|
if ((signals & GPIO_MCI) != phase) {
|
|
|
|
break;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Wait until the signal line stabilizes
|
|
|
|
SysTimer::SleepNsec(SCSI_DELAY_BUS_SETTLE_DELAY_NS);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Get data
|
|
|
|
*buf = GetDAT();
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Assert the ACK signal
|
|
|
|
SetSignal(PIN_ACK, ON);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Wait for REQ to clear
|
|
|
|
ret = WaitSignal(PIN_REQ, OFF);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Clear the ACK signal
|
|
|
|
SetSignal(PIN_ACK, OFF);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Check for timeout waiting for REQ to clear
|
|
|
|
if (!ret) {
|
|
|
|
break;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Phase error
|
|
|
|
if ((signals & GPIO_MCI) != phase) {
|
|
|
|
break;
|
|
|
|
}
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Advance the buffer pointer to receive the next byte
|
|
|
|
buf++;
|
|
|
|
}
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Re-enable IRQ
|
|
|
|
EnableIRQ();
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Return the number of bytes received
|
|
|
|
return i;
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
2020-07-06 03:56:25 +00:00
|
|
|
// Data transmission handshake
|
2018-05-03 13:47:57 +00:00
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
2022-11-02 06:36:25 +00:00
|
|
|
int GPIOBUS::SendHandShake(uint8_t *buf, int count, int delay_after_bytes)
|
2018-05-03 13:47:57 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
int i;
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Disable IRQs
|
|
|
|
DisableIRQ();
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
if (actmode == mode_e::TARGET) {
|
|
|
|
for (i = 0; i < count; i++) {
|
|
|
|
if(i==delay_after_bytes){
|
|
|
|
LOGTRACE("%s DELAYING for %dus after %d bytes", __PRETTY_FUNCTION__, SCSI_DELAY_SEND_DATA_DAYNAPORT_US, (int)delay_after_bytes)
|
|
|
|
SysTimer::SleepUsec(SCSI_DELAY_SEND_DATA_DAYNAPORT_US);
|
|
|
|
}
|
2021-04-05 19:17:05 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Set the DATA signals
|
|
|
|
SetDAT(*buf);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Wait for ACK to clear
|
|
|
|
bool ret = WaitSignal(PIN_ACK, OFF);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Check for timeout waiting for ACK to clear
|
|
|
|
if (!ret) {
|
|
|
|
break;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Already waiting for ACK to clear
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Assert the REQ signal
|
|
|
|
SetSignal(PIN_REQ, ON);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Wait for ACK
|
|
|
|
ret = WaitSignal(PIN_ACK, ON);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Clear REQ signal
|
|
|
|
SetSignal(PIN_REQ, OFF);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Check for timeout waiting for ACK to clear
|
|
|
|
if (!ret) {
|
|
|
|
break;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Advance the data buffer pointer to receive the next byte
|
|
|
|
buf++;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Wait for ACK to clear
|
|
|
|
WaitSignal(PIN_ACK, OFF);
|
|
|
|
} else {
|
|
|
|
// Get Phase
|
|
|
|
uint32_t phase = Acquire() & GPIO_MCI;
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
for (i = 0; i < count; i++) {
|
|
|
|
if(i==delay_after_bytes){
|
|
|
|
LOGTRACE("%s DELAYING for %dus after %d bytes", __PRETTY_FUNCTION__, SCSI_DELAY_SEND_DATA_DAYNAPORT_US, (int)delay_after_bytes)
|
|
|
|
SysTimer::SleepUsec(SCSI_DELAY_SEND_DATA_DAYNAPORT_US);
|
|
|
|
}
|
2021-04-05 19:17:05 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Set the DATA signals
|
|
|
|
SetDAT(*buf);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Wait for REQ to be asserted
|
|
|
|
bool ret = WaitSignal(PIN_REQ, ON);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Check for timeout waiting for REQ to be asserted
|
|
|
|
if (!ret) {
|
|
|
|
break;
|
|
|
|
}
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Phase error
|
|
|
|
if ((signals & GPIO_MCI) != phase) {
|
|
|
|
break;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Already waiting for REQ assertion
|
2020-10-19 12:31:06 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Assert the ACK signal
|
|
|
|
SetSignal(PIN_ACK, ON);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Wait for REQ to clear
|
|
|
|
ret = WaitSignal(PIN_REQ, OFF);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Clear the ACK signal
|
|
|
|
SetSignal(PIN_ACK, OFF);
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Check for timeout waiting for REQ to clear
|
|
|
|
if (!ret) {
|
|
|
|
break;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Phase error
|
|
|
|
if ((signals & GPIO_MCI) != phase) {
|
|
|
|
break;
|
|
|
|
}
|
2018-05-03 13:47:57 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Advance the data buffer pointer to receive the next byte
|
|
|
|
buf++;
|
|
|
|
}
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Re-enable IRQ
|
|
|
|
EnableIRQ();
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Return number of transmissions
|
|
|
|
return i;
|
2020-07-04 14:57:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef USE_SEL_EVENT_ENABLE
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
2020-07-06 03:56:25 +00:00
|
|
|
// SEL signal event polling
|
2020-07-04 14:57:44 +00:00
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
SASI code removal, error handling update, bug fixes, code cleanup (#806)
Summary ov most important changes triggered by the SASI code removal:
- Removed the SASI controller code
- New controller management. There is a new controller base class AbstractController and a class ControllerManager managing the controller lifecycle. The lifecycle management was removed from rasci.cpp and is covered by unit tests.
- New device management. The DeviceFactory manages the device lifecycle instead of rascsi.cpp. The new code is covered by unit tests.
- The lifecycle managment uses C++ collections with variable size instead of arrays with hard-coded sizes.
- The ScsiController method contains most of what was previously contained in scsidev_ctrl.cpp plus the code from sasidev_ctrl.cpp that was relevant for SCSI.
- scsi_command_util contains helper methods used for identical SCSI command implementations of more than one device
- Devices know their controllers, so that the controller instance does not need to be passed to each SCSI command. This change helps to decouple the devices from the controller. The phase_handler interface is also part of this decoupling.
- Use scsi_command_exception for propagating SCSI command execution errors, This resolves issues with the previous error handling, which was based on return values and often on magic numbers.
- Removed legacy SCSI error codes, all errors are now encoded by sense_key::, asc:: and status::.
- Fixed various warnings reported with -Wextra, -Weffc++ and -Wpedantic.
- Use constructor member initialization lists (recommended for ISO C++)
- Consistently use new/delete instead of malloc/free (recommended for ISO C++), resulting in better type safety and error handling
- Replaced variable sized arrays on the stack (violates ISO C++ and can cause a stack overflow)
- Replaced NULL by nullptr (recommended for C++), resulting in better type safety
- Use more const member functions in order to avoid side effects
- The format device page can now also be changed for hard disk drives (Fujitsu M2624S supports this, for instance), not just for MOs.
- Better encapsulation, updated access specifiers in many places
- Removed unused methods and method arguments
- Fixed a number of TODOs
- Added/updated unit tests for a lot of non-legacy classes
- Makefile support for creating HTML coverage reports with lcov/genhtml
2022-09-03 14:53:53 +00:00
|
|
|
bool GPIOBUS::PollSelectEvent()
|
2020-07-04 14:57:44 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
errno = 0;
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
if (epoll_event epev; epoll_wait(epfd, &epev, 1, -1) <= 0) {
|
|
|
|
LOGWARN("%s epoll_wait failed", __PRETTY_FUNCTION__)
|
|
|
|
return false;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
if (gpioevent_data gpev; read(selevreq.fd, &gpev, sizeof(gpev)) < 0) {
|
|
|
|
LOGWARN("%s read failed", __PRETTY_FUNCTION__)
|
2022-10-01 15:56:06 +00:00
|
|
|
return false;
|
2022-11-09 07:40:26 +00:00
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
return true;
|
2020-07-04 14:57:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
2020-07-06 03:56:25 +00:00
|
|
|
// Cancel SEL signal event
|
2020-07-04 14:57:44 +00:00
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
2021-07-26 18:33:36 +00:00
|
|
|
void GPIOBUS::ClearSelectEvent()
|
2020-07-04 14:57:44 +00:00
|
|
|
{
|
2018-05-03 13:47:57 +00:00
|
|
|
}
|
2022-11-09 07:40:26 +00:00
|
|
|
#endif // USE_SEL_EVENT_ENABLE
|
2018-05-03 13:47:57 +00:00
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
2020-07-06 03:56:25 +00:00
|
|
|
// Signal table
|
2018-05-03 13:47:57 +00:00
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
2022-11-09 07:40:26 +00:00
|
|
|
const array<int, 19> GPIOBUS::SignalTable = {
|
|
|
|
PIN_DT0, PIN_DT1, PIN_DT2, PIN_DT3,
|
|
|
|
PIN_DT4, PIN_DT5, PIN_DT6, PIN_DT7, PIN_DP,
|
|
|
|
PIN_SEL,PIN_ATN, PIN_RST, PIN_ACK,
|
|
|
|
PIN_BSY, PIN_MSG, PIN_CD, PIN_IO, PIN_REQ,
|
|
|
|
-1
|
|
|
|
};
|
2020-07-04 14:57:44 +00:00
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
2020-07-06 03:56:25 +00:00
|
|
|
// Create work table
|
2020-07-04 14:57:44 +00:00
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
2021-07-26 18:33:36 +00:00
|
|
|
void GPIOBUS::MakeTable(void)
|
2020-07-04 14:57:44 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
const array<int, 9> pintbl = {
|
|
|
|
PIN_DT0, PIN_DT1, PIN_DT2, PIN_DT3, PIN_DT4,
|
|
|
|
PIN_DT5, PIN_DT6, PIN_DT7, PIN_DP
|
|
|
|
};
|
|
|
|
|
|
|
|
array<bool, 256> tblParity;
|
|
|
|
|
|
|
|
// Create parity table
|
|
|
|
for (uint32_t i = 0; i < 0x100; i++) {
|
|
|
|
uint32_t bits = i;
|
|
|
|
uint32_t parity = 0;
|
|
|
|
for (int j = 0; j < 8; j++) {
|
|
|
|
parity ^= bits & 1;
|
|
|
|
bits >>= 1;
|
|
|
|
}
|
|
|
|
parity = ~parity;
|
|
|
|
tblParity[i] = parity & 1;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
|
|
|
#if SIGNAL_CONTROL_MODE == 0
|
2022-11-09 07:40:26 +00:00
|
|
|
// Mask and setting data generation
|
|
|
|
for (auto& tbl : tblDatMsk) {
|
|
|
|
tbl.fill(-1);
|
|
|
|
}
|
|
|
|
for (auto& tbl : tblDatSet) {
|
|
|
|
tbl.fill(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (uint32_t i = 0; i < 0x100; i++) {
|
|
|
|
// Bit string for inspection
|
|
|
|
uint32_t bits = i;
|
|
|
|
|
|
|
|
// Get parity
|
|
|
|
if (tblParity[i]) {
|
|
|
|
bits |= (1 << 8);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Bit check
|
|
|
|
for (int j = 0; j < 9; j++) {
|
|
|
|
// Index and shift amount calculation
|
|
|
|
int index = pintbl[j] / 10;
|
|
|
|
int shift = (pintbl[j] % 10) * 3;
|
|
|
|
|
|
|
|
// Mask data
|
|
|
|
tblDatMsk[index][i] &= ~(0x7 << shift);
|
|
|
|
|
|
|
|
// Setting data
|
|
|
|
if (bits & 1) {
|
|
|
|
tblDatSet[index][i] |= (1 << shift);
|
|
|
|
}
|
|
|
|
|
|
|
|
bits >>= 1;
|
|
|
|
}
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
#else
|
2022-11-09 07:40:26 +00:00
|
|
|
for (uint32_t i = 0; i < 0x100; i++) {
|
|
|
|
// Bit string for inspection
|
|
|
|
uint32_t bits = i;
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Get parity
|
|
|
|
if (tblParity[i]) {
|
|
|
|
bits |= (1 << 8);
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
|
|
|
#if SIGNAL_CONTROL_MODE == 1
|
2022-11-09 07:40:26 +00:00
|
|
|
// Negative logic is inverted
|
|
|
|
bits = ~bits;
|
2020-07-04 14:57:44 +00:00
|
|
|
#endif
|
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Create GPIO register information
|
|
|
|
uint32_t gpclr = 0;
|
|
|
|
uint32_t gpset = 0;
|
|
|
|
for (int j = 0; j < 9; j++) {
|
|
|
|
if (bits & 1) {
|
|
|
|
gpset |= (1 << pintbl[j]);
|
|
|
|
} else {
|
|
|
|
gpclr |= (1 << pintbl[j]);
|
|
|
|
}
|
|
|
|
bits >>= 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
tblDatMsk[i] = gpclr;
|
|
|
|
tblDatSet[i] = gpset;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Control signal setting
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
void GPIOBUS::SetControl(int pin, bool ast)
|
|
|
|
{
|
|
|
|
PinSetSignal(pin, ast);
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Input/output mode setting
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
void GPIOBUS::SetMode(int pin, int mode)
|
|
|
|
{
|
|
|
|
#if SIGNAL_CONTROL_MODE == 0
|
|
|
|
if (mode == OUT) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
#endif // SIGNAL_CONTROL_MODE
|
|
|
|
|
|
|
|
int index = pin / 10;
|
|
|
|
int shift = (pin % 10) * 3;
|
|
|
|
uint32_t data = gpfsel[index];
|
|
|
|
data &= ~(0x7 << shift);
|
|
|
|
if (mode == OUT) {
|
|
|
|
data |= (1 << shift);
|
|
|
|
}
|
|
|
|
gpio[index] = data;
|
|
|
|
gpfsel[index] = data;
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Get input signal value
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
bool GPIOBUS::GetSignal(int pin) const
|
|
|
|
{
|
|
|
|
return (signals >> pin) & 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Set output signal value
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
void GPIOBUS::SetSignal(int pin, bool ast)
|
|
|
|
{
|
|
|
|
#if SIGNAL_CONTROL_MODE == 0
|
|
|
|
int index = pin / 10;
|
|
|
|
int shift = (pin % 10) * 3;
|
|
|
|
uint32_t data = gpfsel[index];
|
|
|
|
if (ast) {
|
|
|
|
data |= (1 << shift);
|
|
|
|
} else {
|
|
|
|
data &= ~(0x7 << shift);
|
|
|
|
}
|
|
|
|
gpio[index] = data;
|
|
|
|
gpfsel[index] = data;
|
|
|
|
#elif SIGNAL_CONTROL_MODE == 1
|
|
|
|
if (ast) {
|
|
|
|
gpio[GPIO_CLR_0] = 0x1 << pin;
|
|
|
|
} else {
|
|
|
|
gpio[GPIO_SET_0] = 0x1 << pin;
|
|
|
|
}
|
|
|
|
#elif SIGNAL_CONTROL_MODE == 2
|
|
|
|
if (ast) {
|
|
|
|
gpio[GPIO_SET_0] = 0x1 << pin;
|
|
|
|
} else {
|
|
|
|
gpio[GPIO_CLR_0] = 0x1 << pin;
|
|
|
|
}
|
|
|
|
#endif // SIGNAL_CONTROL_MODE
|
|
|
|
}
|
|
|
|
|
2020-07-04 14:57:44 +00:00
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
2020-07-06 03:56:25 +00:00
|
|
|
// Wait for signal change
|
2020-07-04 14:57:44 +00:00
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
2022-09-21 06:27:51 +00:00
|
|
|
bool GPIOBUS::WaitSignal(int pin, int ast)
|
2020-07-04 14:57:44 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
// Get current time
|
|
|
|
uint32_t now = SysTimer::GetTimerLow();
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Calculate timeout (3000ms)
|
|
|
|
uint32_t timeout = 3000 * 1000;
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// end immediately if the signal has changed
|
|
|
|
do {
|
|
|
|
// Immediately upon receiving a reset
|
|
|
|
Acquire();
|
|
|
|
if (GetRST()) {
|
|
|
|
return false;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
// Check for the signal edge
|
2022-10-25 00:21:40 +00:00
|
|
|
if (((signals >> pin) ^ ~ast) & 1) {
|
2022-11-09 07:40:26 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
} while ((SysTimer::GetTimerLow() - now) < timeout);
|
|
|
|
|
|
|
|
// We timed out waiting for the signal
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void GPIOBUS::DisableIRQ()
|
|
|
|
{
|
|
|
|
#ifdef __linux__
|
|
|
|
if (rpitype == 4) {
|
|
|
|
// RPI4 is disabled by GICC
|
|
|
|
giccpmr = gicc[GICC_PMR];
|
|
|
|
gicc[GICC_PMR] = 0;
|
|
|
|
} else if (rpitype == 2) {
|
|
|
|
// RPI2,3 disable core timer IRQ
|
|
|
|
tintcore = sched_getcpu() + QA7_CORE0_TINTC;
|
|
|
|
tintctl = qa7regs[tintcore];
|
|
|
|
qa7regs[tintcore] = 0;
|
|
|
|
} else {
|
|
|
|
// Stop system timer interrupt with interrupt controller
|
|
|
|
irptenb = irpctl[IRPT_ENB_IRQ_1];
|
|
|
|
irpctl[IRPT_DIS_IRQ_1] = irptenb & 0xf;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
(void)0;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
void GPIOBUS::EnableIRQ()
|
|
|
|
{
|
|
|
|
if (rpitype == 4) {
|
|
|
|
// RPI4 enables interrupts via the GICC
|
|
|
|
gicc[GICC_PMR] = giccpmr;
|
|
|
|
} else if (rpitype == 2) {
|
|
|
|
// RPI2,3 re-enable core timer IRQ
|
|
|
|
qa7regs[tintcore] = tintctl;
|
|
|
|
} else {
|
|
|
|
// Restart the system timer interrupt with the interrupt controller
|
|
|
|
irpctl[IRPT_ENB_IRQ_1] = irptenb & 0xf;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Pin direction setting (input/output)
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
void GPIOBUS::PinConfig(int pin, int mode)
|
|
|
|
{
|
|
|
|
// Check for invalid pin
|
|
|
|
if (pin < 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
int index = pin / 10;
|
|
|
|
uint32_t mask = ~(0x7 << ((pin % 10) * 3));
|
|
|
|
gpio[index] = (gpio[index] & mask) | ((mode & 0x7) << ((pin % 10) * 3));
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Pin pull-up/pull-down setting
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
void GPIOBUS::PullConfig(int pin, int mode)
|
|
|
|
{
|
|
|
|
uint32_t pull;
|
|
|
|
|
|
|
|
// Check for invalid pin
|
|
|
|
if (pin < 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rpitype == 4) {
|
|
|
|
switch (mode) {
|
|
|
|
case GPIO_PULLNONE:
|
|
|
|
pull = 0;
|
|
|
|
break;
|
|
|
|
case GPIO_PULLUP:
|
|
|
|
pull = 1;
|
|
|
|
break;
|
|
|
|
case GPIO_PULLDOWN:
|
|
|
|
pull = 2;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
pin &= 0x1f;
|
|
|
|
int shift = (pin & 0xf) << 1;
|
|
|
|
uint32_t bits = gpio[GPIO_PUPPDN0 + (pin >> 4)];
|
|
|
|
bits &= ~(3 << shift);
|
|
|
|
bits |= (pull << shift);
|
|
|
|
gpio[GPIO_PUPPDN0 + (pin >> 4)] = bits;
|
|
|
|
} else {
|
|
|
|
pin &= 0x1f;
|
|
|
|
gpio[GPIO_PUD] = mode & 0x3;
|
|
|
|
SysTimer::SleepUsec(2);
|
|
|
|
gpio[GPIO_CLK_0] = 0x1 << pin;
|
|
|
|
SysTimer::SleepUsec(2);
|
|
|
|
gpio[GPIO_PUD] = 0;
|
|
|
|
gpio[GPIO_CLK_0] = 0;
|
|
|
|
}
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Set output pin
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
void GPIOBUS::PinSetSignal(int pin, bool ast)
|
|
|
|
{
|
|
|
|
// Check for invalid pin
|
|
|
|
if (pin < 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ast) {
|
|
|
|
gpio[GPIO_SET_0] = 0x1 << pin;
|
|
|
|
} else {
|
|
|
|
gpio[GPIO_CLR_0] = 0x1 << pin;
|
|
|
|
}
|
2020-07-04 14:57:44 +00:00
|
|
|
}
|
|
|
|
|
2022-11-09 07:40:26 +00:00
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Set the signal drive strength
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
void GPIOBUS::DrvConfig(uint32_t drive)
|
|
|
|
{
|
|
|
|
uint32_t data = pads[PAD_0_27];
|
|
|
|
pads[PAD_0_27] = (0xFFFFFFF8 & data) | drive | 0x5a000000;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-07-04 14:57:44 +00:00
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
2022-10-25 00:21:40 +00:00
|
|
|
// Generic Phase Acquisition (Doesn't read GPIO)
|
2020-07-04 14:57:44 +00:00
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
2022-10-25 00:21:40 +00:00
|
|
|
BUS::phase_t GPIOBUS::GetPhaseRaw(uint32_t raw_data)
|
2020-07-04 14:57:44 +00:00
|
|
|
{
|
2022-11-09 07:40:26 +00:00
|
|
|
// Selection Phase
|
|
|
|
if (GetPinRaw(raw_data, PIN_SEL)) {
|
|
|
|
if(GetPinRaw(raw_data, PIN_IO)) {
|
|
|
|
return BUS::phase_t::reselection;
|
|
|
|
} else{
|
|
|
|
return BUS::phase_t::selection;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Bus busy phase
|
|
|
|
if (!GetPinRaw(raw_data, PIN_BSY)) {
|
|
|
|
return BUS::phase_t::busfree;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get target phase from bus signal line
|
|
|
|
int mci = GetPinRaw(raw_data, PIN_MSG) ? 0x04 : 0x00;
|
|
|
|
mci |= GetPinRaw(raw_data, PIN_CD) ? 0x02 : 0x00;
|
|
|
|
mci |= GetPinRaw(raw_data, PIN_IO) ? 0x01 : 0x00;
|
|
|
|
return GetPhase(mci);
|
2020-07-04 14:57:44 +00:00
|
|
|
}
|