Implement ftdi_set_interface for avrftdi

This commit is contained in:
Marius Greuel 2020-10-06 20:36:52 +02:00
parent d25d40e2fe
commit c0fc095500
1 changed files with 39 additions and 1 deletions

View File

@ -46,6 +46,7 @@ static ftdi_chip_type MapChipType(ULONG type)
return TYPE_AM; return TYPE_AM;
} }
} }
static int SetError(struct ftdi_context* ftdi, int result, const char* error_str) static int SetError(struct ftdi_context* ftdi, int result, const char* error_str)
{ {
if (ftdi != nullptr) if (ftdi != nullptr)
@ -82,6 +83,42 @@ void ftdi_free(struct ftdi_context* ftdi)
int ftdi_set_interface(struct ftdi_context* ftdi, enum ftdi_interface interface) int ftdi_set_interface(struct ftdi_context* ftdi, enum ftdi_interface interface)
{ {
if (ftdi == nullptr)
{
return SetError(ftdi, -2, "USB device unavailable");
}
if (ftdi->usb_dev != nullptr)
{
if (ftdi->index != (interface != INTERFACE_ANY ? interface : INTERFACE_A))
{
return SetError(ftdi, -3, "Interface can not be changed on an already open device");
}
}
switch (interface)
{
case INTERFACE_ANY:
case INTERFACE_A:
ftdi->interface = 0;
ftdi->index = INTERFACE_A;
break;
case INTERFACE_B:
ftdi->interface = 1;
ftdi->index = INTERFACE_B;
break;
case INTERFACE_C:
ftdi->interface = 2;
ftdi->index = INTERFACE_C;
break;
case INTERFACE_D:
ftdi->interface = 3;
ftdi->index = INTERFACE_D;
break;
default:
return SetError(ftdi, -1, "Unknown interface");
}
return 0; return 0;
} }
@ -93,7 +130,7 @@ int ftdi_init(struct ftdi_context* ftdi)
void ftdi_deinit(struct ftdi_context* ftdi) void ftdi_deinit(struct ftdi_context* ftdi)
{ {
if (ftdi->usb_dev != nullptr) if (ftdi != nullptr && ftdi->usb_dev != nullptr)
{ {
std::unique_ptr<FtdiDevice> device(reinterpret_cast<FtdiDevice*>(ftdi->usb_dev)); std::unique_ptr<FtdiDevice> device(reinterpret_cast<FtdiDevice*>(ftdi->usb_dev));
ftdi->usb_dev = nullptr; ftdi->usb_dev = nullptr;
@ -145,6 +182,7 @@ int ftdi_usb_open_desc_index(struct ftdi_context* ftdi, int vendor, int product,
return SetError(ftdi, -3, "failed to open device"); return SetError(ftdi, -3, "failed to open device");
} }
device->ResetDevice();
device->SetEventNotification(FT_EVENT_RXCHAR); device->SetEventNotification(FT_EVENT_RXCHAR);
ftdi->type = MapChipType(info.Type); ftdi->type = MapChipType(info.Type);