Skip to content

Commit

Permalink
differentiate LimeSDR-mini and LimeNET-Micro boards
Browse files Browse the repository at this point in the history
  • Loading branch information
rjonaitis committed Aug 19, 2024
1 parent 1b2a332 commit 7592481
Show file tree
Hide file tree
Showing 5 changed files with 685 additions and 7 deletions.
48 changes: 45 additions & 3 deletions src/boards/DeviceFactoryFTDI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <string_view>

#include "LimeSDR_Mini/LimeSDR_Mini.h"
#include "LimeSDR_Mini/LimeNET_Micro.h"
#include "limesuiteng/DeviceHandle.h"
#include "LimeSDR_Mini/USB_CSR_Pipe_Mini.h"
#include "comms/USB/LMS64C_LMS7002M_Over_USB.h"
Expand Down Expand Up @@ -55,7 +56,7 @@ std::vector<DeviceHandle> DeviceFactoryFTDI::enumerate(const DeviceHandle& hint)
return handles;
}

SDRDevice* DeviceFactoryFTDI::make_LimeSDR_Mini(const DeviceHandle& handle, uint16_t vid, uint16_t pid)
static SDRDevice* make_LimeSDR_Mini(const DeviceHandle& handle, uint16_t vid, uint16_t pid)
{
auto usbComms = std::make_shared<FT601>();
if (!usbComms->Connect(vid, pid, handle.serial.c_str()))
Expand All @@ -77,6 +78,28 @@ SDRDevice* DeviceFactoryFTDI::make_LimeSDR_Mini(const DeviceHandle& handle, uint
return board;
}

static SDRDevice* make_LimeNET_Micro(const DeviceHandle& handle, uint16_t vid, uint16_t pid)
{
auto usbComms = std::make_shared<FT601>();
if (!usbComms->Connect(vid, pid, handle.serial.c_str()))
{
const std::string reason = "Unable to connect to device using handle ("s + handle.Serialize() + ")"s;
throw std::runtime_error(reason);
}

auto usbPipe = std::make_shared<USB_CSR_Pipe_Mini>(*usbComms);

// protocol layer
auto route_lms7002m = std::make_shared<LMS64C_LMS7002M_Over_USB>(usbPipe);
auto route_fpga = std::make_shared<LMS64C_FPGA_Over_USB>(usbPipe);

auto board = new LimeNET_Micro(route_lms7002m, route_fpga, usbComms, usbPipe);
// LimeNET Micro serial number is taken from USB chip's descriptor.
// TODO: add serial number getter into UnixUsb, and use it inside LimeSDR_mini
board->SetSerialNumber(handle.serial);
return board;
}

SDRDevice* DeviceFactoryFTDI::make(const DeviceHandle& handle)
{
const auto splitPos = handle.addr.find(':');
Expand All @@ -90,8 +113,27 @@ SDRDevice* DeviceFactoryFTDI::make(const DeviceHandle& handle)
pid = std::stoi(handle.addr.substr(splitPos + 1), nullptr, 16);
}

if (ids.find({ vid, pid }) != ids.end())
return make_LimeSDR_Mini(handle, vid, pid);
if (ids.find({ vid, pid }) == ids.end())
return nullptr;

// read info what kind of board it is
LMS64CProtocol::FirmwareInfo fw{};
{
auto usbComms = std::make_shared<FT601>();
if (!usbComms->Connect(vid, pid, handle.serial.c_str()))
return nullptr;
auto usbPipe = std::make_shared<USB_CSR_Pipe_Mini>(*usbComms);
LMS64CProtocol::GetFirmwareInfo(*usbPipe.get(), fw);
}

switch (fw.deviceId)
{
case LMS_DEV_LIMENET_MICRO:
return make_LimeNET_Micro(handle, vid, pid);
case LMS_DEV_LIMESDRMINI:
case LMS_DEV_LIMESDRMINI_V2:
default:
return make_LimeSDR_Mini(handle, vid, pid);
}
return nullptr;
}
3 changes: 0 additions & 3 deletions src/boards/DeviceFactoryFTDI.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,6 @@ class DeviceFactoryFTDI : public DeviceRegistryEntry
DeviceFactoryFTDI();
std::vector<DeviceHandle> enumerate(const DeviceHandle& hint) override;
SDRDevice* make(const DeviceHandle& handle) override;

private:
SDRDevice* make_LimeSDR_Mini(const DeviceHandle& handle, uint16_t vid, uint16_t pid);
};

} // namespace lime
2 changes: 1 addition & 1 deletion src/boards/LimeSDR_Mini/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
target_sources(limesuiteng PRIVATE LimeSDR_Mini.cpp FPGA_Mini.cpp USB_CSR_Pipe_Mini.cpp)
target_sources(limesuiteng PRIVATE LimeSDR_Mini.cpp FPGA_Mini.cpp USB_CSR_Pipe_Mini.cpp LimeNET_Micro.cpp)
Loading

0 comments on commit 7592481

Please sign in to comment.