Работа с микросхемами от FTDI через интерфейс D2XX в Linux.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Работа с микросхемами от FTDI через интерфейс D2XX в Linux.

Сообщение Mushroomer » 04.12.2017 15:32:05

Здравствуйте.
Два дня изысканий не привели к успеху, решил обратится к специалистам.
Вот пример кода работающий в Windows, но упорно не желающий работать в Linux.
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, dynlibs;

const
{$IFDEF MSWINDOWS}
  NameLib = 'FTD2XX.DLL';
{$ENDIF}
{$IFDEF UNIX}
  NameLib = '/usr/local/lib/libftd2xx.so';
{$ENDIF}

type
  TFT_ListDevices = function(pvArg1:Pointer; pvArg2:Pointer; dwFlags:Dword): integer; stdcall;
  TFT_Open = function(Index:Integer; ftHandle:Pointer): integer; stdcall;
  TFT_Close = function(ftHandle:Dword): integer; stdcall;

  { TForm1 }
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    fFtHandle: UInt32;
    fLibHandle: THandle;
    FT_ListDevices: TFT_ListDevices;
    FT_Open: TFT_Open;
    FT_Close: TFT_Close;
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var
  NumDevs: UInt16;
begin
  fLibHandle := LoadLibrary(NameLib);

  if fLibHandle <> 0 then
  begin
    FT_ListDevices := TFT_ListDevices(GetProcAddress(fLibHandle, 'FT_ListDevices'));
    if @FT_ListDevices <> nil then
    begin
      FT_Open := TFT_Open(GetProcAddress(fLibHandle, 'FT_Open'));
      FT_Close := TFT_Close(GetProcAddress(fLibHandle, 'FT_Close'));
    end;
  end;

  if FT_ListDevices(@NumDevs, nil, $80000000) = 0 then // Запрос числа FTDI-устройств, подключенных к ПК.
  begin                                                     // Результат запроса в NumDevs.
    if NumDevs > 0 then
    begin
      FT_Open(0, @fFtHandle);
      FT_Close(fFtHandle);
    end;
    FreeLibrary(fLibHandle);
  end;
  Caption := 'Кол-во: ' + IntToStr(NumDevs); // В Linux NumDevs = 0 ???
end;
end.

В Linux NumDevs = 0. А кроме этого после завершения FormCreate: "Процесс вызвал исключение ...."
К сожалению в Linux я пока ржавый чайник.
Библиотека тут: /usr/local/lib/libftd2xx.so

Буду благодарен если поделитесь опытом.
Последний раз редактировалось Mushroomer 11.12.2017 11:49:01, всего редактировалось 1 раз.
Mushroomer
новенький
 
Сообщения: 17
Зарегистрирован: 04.12.2017 15:07:39

Re: Работа с микросхемами от FTDI через интерфейс D2XX в Lin

Сообщение ElectroGuard » 09.12.2017 12:26:40

Я так понимаю - что либа не видит девайсов. Врятли проблема на стороне паса, скорее на стороне либы. Нужно с ней разбираться, мне кажется. Поищите ПО, умеющее работать с либой для проверки. Для начала.
ElectroGuard
новенький
 
Сообщения: 51
Зарегистрирован: 03.06.2016 12:10:22

Re: Работа с микросхемами от FTDI через интерфейс D2XX в Lin

Сообщение MysticCoder » 09.12.2017 14:49:06

http://www.ftdichip.com/Drivers/D2XX.htm
скачай дрова, там примеры есть на си, запусти что нить из них для проверки.
MysticCoder
постоялец
 
Сообщения: 119
Зарегистрирован: 14.09.2013 00:20:28

Re: Работа с микросхемами от FTDI через интерфейс D2XX в Lin

Сообщение serbod » 09.12.2017 18:00:34

Вот готовые компоненты, в том числе и для FTDI. Родной D2XX несколько кривой, заточен под единственное устройство в системе.

https://github.com/serbod/dataport
Аватара пользователя
serbod
постоялец
 
Сообщения: 232
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Работа с микросхемами от FTDI через интерфейс D2XX в Lin

Сообщение Mushroomer » 11.12.2017 11:34:41

Добрый день.
Благодарю за ответы.

MysticCoder писал(а):MysticCoder » 09.12.2017 15:49:06

Примеры от производителя запускал - не работают.

serbod писал(а): serbod » 09.12.2017 19:00:34

Спасибо за ссылку, буду разбираться.
Mushroomer
новенький
 
Сообщения: 17
Зарегистрирован: 04.12.2017 15:07:39

Re: Работа с микросхемами от FTDI через интерфейс D2XX в Lin

Сообщение wofs » 11.12.2017 20:23:38

Mushroomer писал(а):Примеры от производителя запускал - не работают.

А выполните-ка в консоли (при подключенном устройстве и без него) команду:
Код: Выделить всё
# dmesg | grep tty

и дайте вывод сюда...
Аватара пользователя
wofs
постоялец
 
Сообщения: 259
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Работа с микросхемами от FTDI через интерфейс D2XX в Lin

Сообщение Mushroomer » 12.12.2017 11:20:35

wofs писал(а):wofs » 11.12.2017 21:23:38


С устройством ...
alexander-Aquarius-Pro read # dmesg | grep tty
[ 0.000000] console [tty0] enabled
[ 1.034087] 00:08: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A

и без.
alexander-Aquarius-Pro read # dmesg | grep tty
[ 0.000000] console [tty0] enabled
[ 1.034087] 00:08: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A


Если я правильно понял это COM порт?

Согласно мануалу от FTDI драйверы D2XX и VCP являются взаимоисключающими.
Поэтому для работы с драйвером D2XX необходимо удалить модули ядра (они включены в ядро "на заводе")
sudo rmmod ftdi_sio
sudo rmmod usbserial
что я и выполняю прежде обращения к функциям из библиотеки libftd2xx.so.1.4.6

Я думаю после выполнения
modprobe ftdi_sio
modprobe usbserial
в системе должен был появится ещё один com порт (виртуальный).
По вашей рекомендации выполняю
dmesg | grep tty
но этого не происходит.
Последний раз редактировалось Mushroomer 12.12.2017 11:52:53, всего редактировалось 1 раз.
Mushroomer
новенький
 
Сообщения: 17
Зарегистрирован: 04.12.2017 15:07:39

Re: Работа с микросхемами от FTDI через интерфейс D2XX в Lin

Сообщение wofs » 12.12.2017 11:37:08

Mushroomer писал(а):Если я правильно понял это COM порт?

Да. В логах не видно, что устройство было подключено. Обычно оно подключается с именем ttyUSBx.
На всякий случай дайте еще вывод с подключенным устройством этой команды:
Код: Выделить всё
#dmesg | grep FTDI

Если пусто - у вас не установлен драйвер/нет поддержки в ядре ftdi.
И напишите сюда вывод
Код: Выделить всё
$uname -a

и(или)
Код: Выделить всё
$uname -r

(под рукой нет линукс машины - точно не помню). Нам нужен дистрибутив и версия ядра.

Добавлено спустя 7 минут 9 секунд:
Re: Работа с микросхемами от FTDI через интерфейс D2XX в Linux.
Mushroomer писал(а):что я и выполняю прежде обращения к функциям из библиотеки libftd2xx.so.1.4.6

Вы перво наперво добейтесь видимости устройства в системе.
Я не работал из Lazarus с ftdi, но отлично писал на дефолтовых драйверах avrdude AVR-ки. Никаких плясок не было - вставил/записал.

Добавлено спустя 4 минуты 2 секунды:
Re: Работа с микросхемами от FTDI через интерфейс D2XX в Linux.
Mushroomer писал(а):Согласно мануалу от FTDI драйверы D2XX и VCP являются взаимоисключающими.

Какой бы драйвер не был загружен - система должна увидеть устройство.
Аватара пользователя
wofs
постоялец
 
Сообщения: 259
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Работа с микросхемами от FTDI через интерфейс D2XX в Lin

Сообщение Mushroomer » 12.12.2017 11:58:14

И напишите сюда вывод


alexander-Aquarius-Pro read # dmesg | grep FTDI
[ 1216.235327] usbserial: USB Serial support registered for FTDI USB Serial Device
[ 1743.197758] usbserial: USB Serial deregistering driver FTDI USB Serial Device
[ 1767.943352] usbserial: USB Serial support registered for FTDI USB Serial Device
[ 2141.767267] usbserial: USB Serial deregistering driver FTDI USB Serial Device
[ 2832.268395] usbserial: USB Serial support registered for FTDI USB Serial Device
[ 3374.657742] usbserial: USB Serial deregistering driver FTDI USB Serial Device

alexander-Aquarius-Pro read # uname -a
Linux alexander-Aquarius-Pro 4.10.0-40-generic #44~16.04.1-Ubuntu SMP Thu Nov 9 15:33:07 UTC 2017 i686 i686 i686 GNU/Linux

alexander-Aquarius-Pro read # uname -r
4.10.0-40-generic

Добавлено спустя 3 минуты 44 секунды:
Re: Работа с микросхемами от FTDI через интерфейс D2XX в Linux.
Если пусто - у вас не установлен драйвер/нет поддержки в ядре ftdi.


Драйвер установлен, иначе GetProcAddress вернула бы nil.
А вот насчет поддержки ... возможно да. Но что для этого надо сделать?

Добавлено спустя 6 минут 21 секунду:
Re: Работа с микросхемами от FTDI через интерфейс D2XX в Linux.
А может дело в том, что у меня уст. Linux Mint 18.2.
Стоит ли попробовать на Ubuntu.
Mushroomer
новенький
 
Сообщения: 17
Зарегистрирован: 04.12.2017 15:07:39

Re: Работа с микросхемами от FTDI через интерфейс D2XX в Lin

Сообщение wadman » 12.12.2017 13:57:08

Mushroomer писал(а):Драйвер установлен, иначе GetProcAddress вернула бы nil.

Это процедура возвращает адрес процедуры из загруженной библиотеки и к драйверу не имеет отношения.
wadman
новенький
 
Сообщения: 75
Зарегистрирован: 18.10.2016 15:54:28

Re: Работа с микросхемами от FTDI через интерфейс D2XX в Lin

Сообщение Mushroomer » 12.12.2017 15:40:11

wadman писал(а): wadman » 12.12.2017 14:57:08
Это процедура возвращает адрес процедуры из загруженной библиотеки и к драйверу не имеет отношения.


Вы хотите сказать, что на сайте ftdi выложили библиотеку без драйвера?
Я сначала тоже думал (по аналогии с Windows), что должен быть драйвер + библиотека. Но потом где-то на просторах прочитал, что в Linux *.so это может быть и просто библиотека и драйвер.
Насколько я помню драйвер это в общем-то по сути динамическая библиотека.
Mushroomer
новенький
 
Сообщения: 17
Зарегистрирован: 04.12.2017 15:07:39

Re: Работа с микросхемами от FTDI через интерфейс D2XX в Lin

Сообщение wofs » 12.12.2017 17:42:28

Mushroomer писал(а):alexander-Aquarius-Pro read # dmesg | grep FTDI
[ 1216.235327] usbserial: USB Serial support registered for FTDI USB Serial Device
[ 1743.197758] usbserial: USB Serial deregistering driver FTDI USB Serial Device
[ 1767.943352] usbserial: USB Serial support registered for FTDI USB Serial Device
[ 2141.767267] usbserial: USB Serial deregistering driver FTDI USB Serial Device
[ 2832.268395] usbserial: USB Serial support registered for FTDI USB Serial Device
[ 3374.657742] usbserial: USB Serial deregistering driver FTDI USB Serial Device

Система видит, что вы вставляете устройство, может его опознать, но не создает для него ссылку-файл в /dev/.
Вы же команду
Код: Выделить всё
# dmesg | grep tty

выполняли из под root / sudo?

Если нет - попробуйте
Код: Выделить всё
$sudo dmesg | grep tty


Добавлено спустя 4 минуты 28 секунд:
Re: Работа с микросхемами от FTDI через интерфейс D2XX в Linux.
Mushroomer писал(а):А может дело в том, что у меня уст. Linux Mint 18.2.

А это и есть Ubuntu, не самая свежая, но она самая.
Mushroomer писал(а):Насколько я помню драйвер это в общем-то по сути динамическая библиотека.

Не совсем так.
Важно понимать одно - в Linux нет "устройств" как таковых. Есть файлы-ссылки на устройства в каталоге /dev/. Пока ядро, руководствуясь определенными правилами не создаст там файл, который указывает на устройство - вы ничего не сможете сделать.
Аватара пользователя
wofs
постоялец
 
Сообщения: 259
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Работа с микросхемами от FTDI через интерфейс D2XX в Lin

Сообщение Mushroomer » 13.12.2017 13:11:54

Всем спасибо за полученные знания (особенно wofs).
Беру тайм-аут.
Подключил к ПК другое устройство на FT232RL - все работает и драйвер VCP и D2XX.
Первое устройство, с которым я мучался, собрано с использованием FT245, работает в Windows и не работает в Linux.
Пошёл думать.
Mushroomer
новенький
 
Сообщения: 17
Зарегистрирован: 04.12.2017 15:07:39

Re: Работа с микросхемами от FTDI через интерфейс D2XX в Lin

Сообщение kolyacher » 13.12.2017 17:14:18

Может этот проект поможет? https://sourceforge.net/projects/ftdi-usb-ft245/
kolyacher
незнакомец
 
Сообщения: 2
Зарегистрирован: 28.03.2016 15:34:01

Re: Работа с микросхемами от FTDI через интерфейс D2XX в Lin

Сообщение Mushroomer » 13.12.2017 18:21:43

kolyacher писал(а):kolyacher » 13.12.2017 18:14:18 Может этот проект поможет?

Проект весьма интересный для изучения, спасибо.

В общем-то я разобрался. В FT245 были записаны не дефолтные VID, PID. В Windows это по барабану, а в Linux необходимо подключать пользовательскую комбинацию с помощью FT_SetVIDPID.
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, dynlibs;

type
  TFT_CreateDeviceInfoList = function(NumDevs: Pointer): integer; stdcall;
  TFT_SetVIDPID = function(dwVID: Dword; dwPID: Dword): integer; stdcall;

type
  { TForm1 }
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    fLibHandle: THandle;
    FT_CreateDeviceInfoList: TFT_CreateDeviceInfoList;
    FT_SetVIDPID: TFT_SetVIDPID;
  end;
var
  Form1: TForm1;

implementation
{$R *.lfm}
{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  NDevs: Integer;
begin
  NDevs := 0;
  fLibHandle := LoadLibrary('libftd2xx.so');
  if fLibHandle <> 0 then
  begin
    FT_SetVIDPID := TFT_SetVIDPID(GetProcAddress(fLibHandle, 'FT_SetVIDPID'));
    if @FT_SetVIDPID <> nil then
    begin
      FT_CreateDeviceInfoList := TFT_CreateDeviceInfoList(GetProcAddress(fLibHandle, 'FT_CreateDeviceInfoList'));
      FT_SetVIDPID($0256, $0001);
      FT_CreateDeviceInfoList(@NDevs);
    end;
    FreeLibrary(fLibHandle);
  end;
  Caption := IntToStr(NDevs);
end;
end.
Mushroomer
новенький
 
Сообщения: 17
Зарегистрирован: 04.12.2017 15:07:39


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 2

Рейтинг@Mail.ru