Files
RASCSI/src/raspberrypi/devices/scsi_nuvolink.h
2020-09-11 17:00:11 -05:00

103 lines
3.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//---------------------------------------------------------------------------
//
// SCSI Target Emulator RaSCSI (*^..^*)
// for Raspberry Pi
//
// Copyright (C) 2020 akuker
// Copyright (C) 2014-2020 GIMONS
// Copyright (C) 2001-2006 (ytanaka@ipc-tokai.or.jp)
//
// Licensed under the BSD 3-Clause License.
// See LICENSE file in the project root folder.
//
// [ Emulation of the Nuvolink SC SCSI Ethernet interface ]
//
// This is based upon the fantastic documentation from Saybur on Gibhub
// for the scuznet device. He did most of the hard work of reverse
// engineering the protocol, documented here:
// https://github.com/saybur/scuznet/blob/master/PROTOCOL.md
//
// This does NOT include the file system functionality that is present
// in the Sharp X68000 host bridge.
//
// Note: This requires a the Nuvolink SC driver
//---------------------------------------------------------------------------
#pragma once
#include "xm6.h"
#include "os.h"
#include "disk.h"
#include "ctapdriver.h"
//===========================================================================
//
// SCSI Nuvolink SC
//
//===========================================================================
class SCSINuvolink : public Disk
{
public:
// Basic Functions
SCSINuvolink();
// Constructor
virtual ~SCSINuvolink();
// Destructor
// commands
int FASTCALL Inquiry(const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor);
// INQUIRY command
BOOL FASTCALL TestUnitReady(const DWORD *cdb);
// TEST UNIT READY command
int FASTCALL GetMessage10(const DWORD *cdb, BYTE *buf);
// GET MESSAGE10 command
BOOL FASTCALL SendMessage10(const DWORD *cdb, BYTE *buf);
// SEND MESSAGE10 command
private:
enum nuvolink_command_enum : BYTE {
cmmd_tstrdy = 0x00, // Test Unit Ready
cmmd_ethrst = 0x02, // Reset Statistics (Vendor Specific)
cmmd_rqsens = 0x03, // Request Sense
cmmd_ethwrt = 0x05, // Send Package (Vendor Specific)
cmmd_addr = 0x06, // Change MAC address (Vendor Specific)
cmmd_getmsg = 0x08, // Get Message
cmmd_mcast = 0x09, // Set Multicast Registers
cmmd_sndmsg = 0x0A, // Send Message
cmmd_mdsens = 0x0C, // Unknown Vendor Specific Command?
cmmd_inq = 0x12, // Inquiry
cmmd_rdiag = 0x1C, // Receive Diagnostic Results
cmmd_sdiag = 0x1D, // Send Diagnostic
};
static const char* m_vendor_name;
static const char* m_device_name;
static const char* m_revision;
#if defined(RASCSI) && !defined(BAREMETAL)
int FASTCALL GetMacAddr(BYTE *buf);
// Get MAC address
void FASTCALL SetMacAddr(BYTE *buf);
// Set MAC address
void FASTCALL ReceivePacket();
// Receive a packet
void FASTCALL GetPacketBuf(BYTE *buf);
// Get a packet
void FASTCALL SendPacket(BYTE *buf, int len);
// Send a packet
CTapDriver *tap;
// TAP driver
BOOL m_bTapEnable;
// TAP valid flag
BYTE mac_addr[6];
// MAC Addres
int packet_len;
// Receive packet size
BYTE packet_buf[0x1000];
// Receive packet buffer
BOOL packet_enable;
// Received packet valid
#endif // RASCSI && !BAREMETAL
};