Kludge scsimon back together so it compiles

This commit is contained in:
Tony Kuker 2022-10-28 20:53:25 -05:00
parent 6f855715a1
commit feda864def
6 changed files with 80 additions and 63 deletions

View File

@ -60,12 +60,6 @@ public:
// Get the string phase name, based upon the raw data // Get the string phase name, based upon the raw data
static const char* GetPhaseStrRaw(phase_t current_phase); static const char* GetPhaseStrRaw(phase_t current_phase);
// Extract as specific pin field from a raw data capture
static inline uint32_t GetPinRaw(uint32_t raw_data, uint32_t pin_num)
{
return ((raw_data >> pin_num) & 1);
}
virtual bool GetBSY() const = 0; virtual bool GetBSY() const = 0;
virtual void SetBSY(bool ast) = 0; virtual void SetBSY(bool ast) = 0;

View File

@ -466,6 +466,16 @@ bool GPIOBUS::GetDP() const
return GetSignal(board->pin_dp); return GetSignal(board->pin_dp);
} }
// Extract as specific pin field from a raw data capture
uint32_t GPIOBUS::GetPinRaw(uint32_t raw_data, board_type::pi_physical_pin_e pin_num){
// return GetSignalRaw(raw_data, pin_num);
(void)raw_data;
(void)pin_num;
LOGWARN("THIS FUNCTION ISN'T IMPLEMENTED YET");
return 0;
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
// Receive command handshake // Receive command handshake

View File

@ -326,6 +326,14 @@ class GPIOBUS : public BUS
// Set REQ signal // Set REQ signal
bool GetDP() const override; bool GetDP() const override;
// Get Data parity signal // Get Data parity signal
// Extract as specific pin field from a raw data capture
uint32_t GetPinRaw(uint32_t raw_data, board_type::pi_physical_pin_e pin_num);
// TODO: SCSIMON needs to be re-worked to work differently. For now, a quick
// and dirty hack is just to expose the current board type data structure.
shared_ptr<board_type::Rascsi_Board_Type> GetBoard(){return board;}
int CommandHandShake(BYTE *buf) override; int CommandHandShake(BYTE *buf) override;
// Command receive handshake // Command receive handshake
int ReceiveHandShake(BYTE *buf, int count) override; int ReceiveHandShake(BYTE *buf, int count) override;

View File

@ -13,6 +13,7 @@
#include "scsi.h" #include "scsi.h"
#include "hal/gpiobus.h" #include "hal/gpiobus.h"
#include "hal/board_type.h"
using data_capture_t = struct data_capture using data_capture_t = struct data_capture
{ {
@ -22,27 +23,30 @@ using data_capture_t = struct data_capture
#define GET_PIN(SAMPLE, PIN) ((bool)((SAMPLE->data >> PIN) & 1)) #define GET_PIN(SAMPLE, PIN) ((bool)((SAMPLE->data >> PIN) & 1))
inline bool GetBsy(const data_capture *sample) { return BUS::GetPinRaw(sample->data, PIN_BSY); } extern shared_ptr<GPIOBUS> bus; // GPIO Bus
inline bool GetSel(const data_capture *sample) { return BUS::GetPinRaw(sample->data, PIN_SEL); }
inline bool GetAtn(const data_capture *sample) { return BUS::GetPinRaw(sample->data, PIN_ATN); } inline bool GetBsy(const data_capture *sample) { return bus->GetPinRaw(sample->data, bus->GetBoard()->pin_bsy); }
inline bool GetAck(const data_capture *sample) { return BUS::GetPinRaw(sample->data, PIN_ACK); } inline bool GetSel(const data_capture *sample) { return bus->GetPinRaw(sample->data, bus->GetBoard()->pin_sel); }
inline bool GetRst(const data_capture *sample) { return BUS::GetPinRaw(sample->data, PIN_RST); } inline bool GetAtn(const data_capture *sample) { return bus->GetPinRaw(sample->data, bus->GetBoard()->pin_atn); }
inline bool GetMsg(const data_capture *sample) { return BUS::GetPinRaw(sample->data, PIN_MSG); } inline bool GetAck(const data_capture *sample) { return bus->GetPinRaw(sample->data, bus->GetBoard()->pin_ack); }
inline bool GetCd(const data_capture *sample) { return BUS::GetPinRaw(sample->data, PIN_CD); } inline bool GetRst(const data_capture *sample) { return bus->GetPinRaw(sample->data, bus->GetBoard()->pin_rst); }
inline bool GetIo(const data_capture *sample) { return BUS::GetPinRaw(sample->data, PIN_IO); } inline bool GetMsg(const data_capture *sample) { return bus->GetPinRaw(sample->data, bus->GetBoard()->pin_msg); }
inline bool GetReq(const data_capture *sample) { return BUS::GetPinRaw(sample->data, PIN_REQ); } inline bool GetCd(const data_capture *sample) { return bus->GetPinRaw(sample->data, bus->GetBoard()->pin_cd); }
inline bool GetDp(const data_capture *sample) { return BUS::GetPinRaw(sample->data, PIN_DP); } inline bool GetIo(const data_capture *sample) { return bus->GetPinRaw(sample->data, bus->GetBoard()->pin_io); }
inline bool GetReq(const data_capture *sample) { return bus->GetPinRaw(sample->data, bus->GetBoard()->pin_req); }
inline bool GetDp(const data_capture *sample) { return bus->GetPinRaw(sample->data, bus->GetBoard()->pin_dp); }
inline BYTE GetData(const data_capture *sample) inline BYTE GetData(const data_capture *sample)
{ {
uint32_t data = sample->data; uint32_t result = 0;
return (BYTE)((data >> (PIN_DT0 - 0)) & (1 << 0)) | result |= (bus->GetPinRaw(sample->data, bus->GetBoard()->pin_dt0) != 0) ? (1 << 0) : 0;
((data >> (PIN_DT1 - 1)) & (1 << 1)) | result |= (bus->GetPinRaw(sample->data, bus->GetBoard()->pin_dt1) != 0) ? (1 << 1) : 0;
((data >> (PIN_DT2 - 2)) & (1 << 2)) | result |= (bus->GetPinRaw(sample->data, bus->GetBoard()->pin_dt2) != 0) ? (1 << 2) : 0;
((data >> (PIN_DT3 - 3)) & (1 << 3)) | result |= (bus->GetPinRaw(sample->data, bus->GetBoard()->pin_dt3) != 0) ? (1 << 3) : 0;
((data >> (PIN_DT4 - 4)) & (1 << 4)) | result |= (bus->GetPinRaw(sample->data, bus->GetBoard()->pin_dt4) != 0) ? (1 << 4) : 0;
((data >> (PIN_DT5 - 5)) & (1 << 5)) | result |= (bus->GetPinRaw(sample->data, bus->GetBoard()->pin_dt5) != 0) ? (1 << 5) : 0;
((data >> (PIN_DT6 - 6)) & (1 << 6)) | result |= (bus->GetPinRaw(sample->data, bus->GetBoard()->pin_dt6) != 0) ? (1 << 6) : 0;
((data >> (PIN_DT7 - 7)) & (1 << 7)); result |= (bus->GetPinRaw(sample->data, bus->GetBoard()->pin_dt7) != 0) ? (1 << 7) : 0;
return result;
} }
const char *GetPhaseStr(const data_capture *sample); const char *GetPhaseStr(const data_capture *sample);

View File

@ -20,6 +20,8 @@
using namespace std; using namespace std;
extern shared_ptr<GPIOBUS> bus;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
// Constant declarations // Constant declarations
@ -49,28 +51,27 @@ const int PIN_PHASE = 0;
// Variable declarations // Variable declarations
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
static BYTE prev_value[32] = {0xFF}; // TODO: prev_value can be smaller. Just making up a big number for now
static BYTE prev_value[128] = {0xFF};
extern double ns_per_loop; extern double ns_per_loop;
static BYTE get_pin_value(uint32_t data, int pin) static BYTE get_pin_value(uint32_t data, board_type::pi_physical_pin_e pin)
{ {
return (data >> pin) & 1; return bus->GetPinRaw(data, pin);
// return (data >> pin) & 1;
} }
static BYTE get_data_field(uint32_t data) static BYTE get_data_field(uint32_t data)
{ {
const uint32_t data_out = // TODO: This is a quick hack to re-use the GetData() function from data_sample.h
((data >> (PIN_DT0 - 0)) & (1 << 7)) | const struct data_capture dummy_data_capture =
((data >> (PIN_DT1 - 1)) & (1 << 6)) | {
((data >> (PIN_DT2 - 2)) & (1 << 5)) | .data = data,
((data >> (PIN_DT3 - 3)) & (1 << 4)) | .timestamp = 0,
((data >> (PIN_DT4 - 4)) & (1 << 3)) | };
((data >> (PIN_DT5 - 5)) & (1 << 2)) | return GetData(&dummy_data_capture);
((data >> (PIN_DT6 - 6)) & (1 << 1)) |
((data >> (PIN_DT7 - 7)) & (1 << 0));
return (BYTE)data_out;
} }
static void vcd_output_if_changed_phase(ofstream& fp, uint32_t data, int pin, char symbol) static void vcd_output_if_changed_phase(ofstream& fp, uint32_t data, int pin, char symbol)
@ -82,11 +83,11 @@ static void vcd_output_if_changed_phase(ofstream& fp, uint32_t data, int pin, ch
} }
} }
static void vcd_output_if_changed_bool(ofstream& fp, uint32_t data, int pin, char symbol) static void vcd_output_if_changed_bool(ofstream& fp, uint32_t data, board_type::pi_physical_pin_e pin, char symbol)
{ {
const BYTE new_value = get_pin_value(data, pin); const BYTE new_value = get_pin_value(data, pin);
if (prev_value[pin] != new_value) { if (prev_value[(int)pin] != new_value) {
prev_value[pin] = new_value; prev_value[(int)pin] = new_value;
fp << new_value << symbol << endl; fp << new_value << symbol << endl;
} }
} }
@ -97,14 +98,14 @@ static void vcd_output_if_changed_byte(ofstream& fp, uint32_t data, int pin, cha
if (prev_value[pin] != new_value) { if (prev_value[pin] != new_value) {
prev_value[pin] = new_value; prev_value[pin] = new_value;
fp << "b" fp << "b"
<< fmt::format("{0:b}", get_pin_value(data, PIN_DT7)) << fmt::format("{0:b}", get_pin_value(data, bus->GetBoard()->pin_dt7))
<< fmt::format("{0:b}", get_pin_value(data, PIN_DT6)) << fmt::format("{0:b}", get_pin_value(data, bus->GetBoard()->pin_dt6))
<< fmt::format("{0:b}", get_pin_value(data, PIN_DT5)) << fmt::format("{0:b}", get_pin_value(data, bus->GetBoard()->pin_dt5))
<< fmt::format("{0:b}", get_pin_value(data, PIN_DT4)) << fmt::format("{0:b}", get_pin_value(data, bus->GetBoard()->pin_dt4))
<< fmt::format("{0:b}", get_pin_value(data, PIN_DT3)) << fmt::format("{0:b}", get_pin_value(data, bus->GetBoard()->pin_dt3))
<< fmt::format("{0:b}", get_pin_value(data, PIN_DT2)) << fmt::format("{0:b}", get_pin_value(data, bus->GetBoard()->pin_dt2))
<< fmt::format("{0:b}", get_pin_value(data, PIN_DT1)) << fmt::format("{0:b}", get_pin_value(data, bus->GetBoard()->pin_dt1))
<< fmt::format("{0:b}", get_pin_value(data, PIN_DT0)) << fmt::format("{0:b}", get_pin_value(data, bus->GetBoard()->pin_dt0))
<< " " << symbol << endl; << " " << symbol << endl;
} }
} }
@ -166,16 +167,16 @@ void scsimon_generate_value_change_dump(const char *filename, const data_capture
uint32_t i = 0; uint32_t i = 0;
while (i < capture_count) { while (i < capture_count) {
vcd_ofstream << "#" << (uint64_t)(data_capture_array[i].timestamp * ns_per_loop) << endl; vcd_ofstream << "#" << (uint64_t)(data_capture_array[i].timestamp * ns_per_loop) << endl;
vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, PIN_BSY, SYMBOL_PIN_BSY); vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, bus->GetBoard()->pin_bsy, SYMBOL_PIN_BSY);
vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, PIN_SEL, SYMBOL_PIN_SEL); vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, bus->GetBoard()->pin_sel, SYMBOL_PIN_SEL);
vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, PIN_CD, SYMBOL_PIN_CD); vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, bus->GetBoard()->pin_cd, SYMBOL_PIN_CD);
vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, PIN_IO, SYMBOL_PIN_IO); vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, bus->GetBoard()->pin_io, SYMBOL_PIN_IO);
vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, PIN_MSG, SYMBOL_PIN_MSG); vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, bus->GetBoard()->pin_msg, SYMBOL_PIN_MSG);
vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, PIN_REQ, SYMBOL_PIN_REQ); vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, bus->GetBoard()->pin_req, SYMBOL_PIN_REQ);
vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, PIN_ACK, SYMBOL_PIN_ACK); vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, bus->GetBoard()->pin_ack, SYMBOL_PIN_ACK);
vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, PIN_ATN, SYMBOL_PIN_ATN); vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, bus->GetBoard()->pin_atn, SYMBOL_PIN_ATN);
vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, PIN_RST, SYMBOL_PIN_RST); vcd_output_if_changed_bool(vcd_ofstream, data_capture_array[i].data, bus->GetBoard()->pin_rst, SYMBOL_PIN_RST);
vcd_output_if_changed_byte(vcd_ofstream, data_capture_array[i].data, PIN_DT0, SYMBOL_PIN_DAT); vcd_output_if_changed_byte(vcd_ofstream, data_capture_array[i].data, (int)bus->GetBoard()->pin_dt0, SYMBOL_PIN_DAT);
vcd_output_if_changed_phase(vcd_ofstream, data_capture_array[i].data, PIN_PHASE, SYMBOL_PIN_PHASE); vcd_output_if_changed_phase(vcd_ofstream, data_capture_array[i].data, PIN_PHASE, SYMBOL_PIN_PHASE);
i++; i++;
} }

View File

@ -33,7 +33,7 @@ static const int _MAX_FNAME = 256;
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
static volatile bool running; // Running flag static volatile bool running; // Running flag
unique_ptr<GPIOBUS> bus; // GPIO Bus shared_ptr<GPIOBUS> bus; // GPIO Bus
uint32_t buff_size = 1000000; uint32_t buff_size = 1000000;
data_capture *data_buffer; data_capture *data_buffer;
@ -151,7 +151,7 @@ void Banner(int, char *[])
} }
else { else {
LOGINFO("Reading live data from the GPIO pins") LOGINFO("Reading live data from the GPIO pins")
LOGINFO(" Connection type : %s", CONNECT_DESC.c_str()) LOGINFO(" Connection type : %s", bus->GetConnectDesc().c_str())
} }
LOGINFO(" Data buffer size: %u", buff_size) LOGINFO(" Data buffer size: %u", buff_size)
LOGINFO(" ") LOGINFO(" ")
@ -331,13 +331,13 @@ int main(int argc, char *argv[])
(void)gettimeofday(&start_time, nullptr); (void)gettimeofday(&start_time, nullptr);
LOGDEBUG("ALL_SCSI_PINS %08X\n", ALL_SCSI_PINS) // LOGDEBUG("ALL_SCSI_PINS %08X\n", ALL_SCSI_PINS)
// Main Loop // Main Loop
while (running) while (running)
{ {
// Work initialization // Work initialization
this_sample = (bus->Acquire() & ALL_SCSI_PINS); this_sample = (bus->Acquire());// & ALL_SCSI_PINS);
loop_count++; loop_count++;
if (loop_count > LLONG_MAX - 1) if (loop_count > LLONG_MAX - 1)
{ {