2022-12-03 04:20:27 +00:00
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
2022-12-05 17:58:23 +00:00
|
|
|
// SCSI Target Emulator PiSCSI
|
2022-12-03 04:20:27 +00:00
|
|
|
// for Raspberry Pi
|
|
|
|
//
|
|
|
|
// Powered by XM6 TypeG Technology.
|
|
|
|
// Copyright (C) 2016-2020 GIMONS
|
|
|
|
// [ GPIO-SCSI bus ]
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "hal/data_sample_raspberry.h"
|
|
|
|
#include "hal/gpiobus.h"
|
|
|
|
#include "shared/log.h"
|
|
|
|
#include "shared/scsi.h"
|
|
|
|
|
|
|
|
#include <map>
|
|
|
|
#include <semaphore.h>
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Class definition
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
class GPIOBUS_Virtual final : public GPIOBUS
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
// Basic Functions
|
|
|
|
GPIOBUS_Virtual() = default;
|
|
|
|
~GPIOBUS_Virtual() override = default;
|
|
|
|
// Destructor
|
|
|
|
bool Init(mode_e mode = mode_e::TARGET) override;
|
|
|
|
|
|
|
|
// // Initialization
|
|
|
|
void Reset() override;
|
|
|
|
// Reset
|
|
|
|
void Cleanup() override;
|
|
|
|
// Cleanup
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Bus signal acquisition
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
uint32_t Acquire() override;
|
|
|
|
|
|
|
|
void SetENB(bool ast) override;
|
|
|
|
// Set ENB signal
|
|
|
|
|
|
|
|
bool GetBSY() const override;
|
|
|
|
// Get BSY signal
|
|
|
|
void SetBSY(bool ast) override;
|
|
|
|
// Set BSY signal
|
|
|
|
|
|
|
|
bool GetSEL() const override;
|
|
|
|
// Get SEL signal
|
|
|
|
void SetSEL(bool ast) override;
|
|
|
|
// Set SEL signal
|
|
|
|
|
|
|
|
bool GetATN() const override;
|
|
|
|
// Get ATN signal
|
|
|
|
void SetATN(bool ast) override;
|
|
|
|
// Set ATN signal
|
|
|
|
|
|
|
|
bool GetACK() const override;
|
|
|
|
// Get ACK signal
|
|
|
|
void SetACK(bool ast) override;
|
|
|
|
// Set ACK signal
|
|
|
|
|
|
|
|
bool GetACT() const override;
|
|
|
|
// Get ACT signal
|
|
|
|
void SetACT(bool ast) override;
|
|
|
|
// Set ACT signal
|
|
|
|
|
|
|
|
bool GetRST() const override;
|
|
|
|
// Get RST signal
|
|
|
|
void SetRST(bool ast) override;
|
|
|
|
// Set RST signal
|
|
|
|
|
|
|
|
bool GetMSG() const override;
|
|
|
|
// Get MSG signal
|
|
|
|
void SetMSG(bool ast) override;
|
|
|
|
// Set MSG signal
|
|
|
|
|
|
|
|
bool GetCD() const override;
|
|
|
|
// Get CD signal
|
|
|
|
void SetCD(bool ast) override;
|
|
|
|
// Set CD signal
|
|
|
|
|
|
|
|
bool GetIO() override;
|
|
|
|
// Get IO signal
|
|
|
|
void SetIO(bool ast) override;
|
|
|
|
// Set IO signal
|
|
|
|
|
|
|
|
bool GetREQ() const override;
|
|
|
|
// Get REQ signal
|
|
|
|
void SetREQ(bool ast) override;
|
|
|
|
// Set REQ signal
|
|
|
|
|
|
|
|
bool GetDP() const override;
|
|
|
|
|
|
|
|
bool WaitREQ(bool ast) override
|
|
|
|
{
|
|
|
|
return WaitSignal(PIN_REQ, ast);
|
|
|
|
}
|
|
|
|
bool WaitACK(bool ast) override
|
|
|
|
{
|
|
|
|
return WaitSignal(PIN_ACK, ast);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint8_t GetDAT() override;
|
|
|
|
// Get DAT signal
|
|
|
|
void SetDAT(uint8_t dat) override;
|
|
|
|
// Set DAT signal
|
|
|
|
private:
|
|
|
|
// SCSI I/O signal control
|
|
|
|
void MakeTable() override;
|
|
|
|
// Create work data
|
|
|
|
void SetControl(int pin, bool ast) override;
|
|
|
|
// Set Control Signal
|
|
|
|
void SetMode(int pin, int mode) override;
|
|
|
|
// Set SCSI I/O mode
|
|
|
|
int GetMode(int pin) override
|
|
|
|
{
|
|
|
|
// Not implemented (or needed for thist gpio bus type)
|
|
|
|
(void)pin;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
bool GetSignal(int pin) const override;
|
|
|
|
// Get SCSI input signal value
|
|
|
|
void SetSignal(int pin, bool ast) override;
|
|
|
|
// Wait for a signal to change
|
|
|
|
// Interrupt control
|
|
|
|
void DisableIRQ() override;
|
|
|
|
// IRQ Disabled
|
|
|
|
void EnableIRQ() override;
|
|
|
|
// IRQ Enabled
|
|
|
|
|
|
|
|
// GPIO pin functionality settings
|
|
|
|
void PinConfig(int pin, int mode) override
|
|
|
|
{
|
|
|
|
(void)pin;
|
|
|
|
(void)mode;
|
|
|
|
}
|
|
|
|
// GPIO pin direction setting
|
|
|
|
void PullConfig(int pin, int mode) override
|
|
|
|
{
|
|
|
|
(void)mode; // Put these in opposite order so Sonar doesn't complain
|
|
|
|
(void)pin; // That PinConfig and PullConfig are identical
|
|
|
|
}
|
|
|
|
// GPIO pin pull up/down resistor setting
|
|
|
|
void PinSetSignal(int pin, bool ast) override;
|
|
|
|
// Set GPIO output signal
|
|
|
|
void DrvConfig(uint32_t drive) override;
|
|
|
|
// Set GPIO drive strength
|
|
|
|
|
|
|
|
array<int, 19> SignalTable;
|
|
|
|
shared_ptr<uint32_t> signals; // All bus signals
|
|
|
|
|
|
|
|
unique_ptr<DataSample> GetSample(uint64_t timestamp) override
|
|
|
|
{
|
|
|
|
return make_unique<DataSample_Raspberry>(*signals, timestamp);
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef SHARED_MEMORY_GPIO
|
|
|
|
inline static const string SHARED_MEM_MUTEX_NAME = "/sem-mutex";
|
|
|
|
inline static const string SHARED_MEM_NAME = "/posix-shared-mem-example";
|
|
|
|
|
|
|
|
sem_t *mutex_sem, *buffer_count_sem, *spool_signal_sem;
|
|
|
|
int fd_shm, fd_log;
|
|
|
|
#endif
|
|
|
|
};
|