LINUX.ORG.RU

FT2232C/D/H работа с I2C

 , ,


0

2

Есть платка на базе Future Technology Devices International, Ltd FT2232C/D/H Dual UART/FIFO IC. Заявлена поддержка I2C. Как ее получить?

Втыкаю - /dev/i2c* не появляется новое. Есть некий ftdi_sio драйвер. Есть libftdi и даже pylibftdi как обертка для питошки.

До меня начинает доходить, что чуда не будет. Чип дает bitbang ногодрыжный интерфейс, а дальше ручками. Да, есть обертки, может есть pullup на алишной плате.

Чтобы получить I2c на FT2232C:

  1. нужно bitbangить? 2) на всякий спрошу у опытных, а может снифер можно на этой штуке изобразить?

Может есть готовые программы или драйвер-обертки???

А даташит на микруху прочитать уже не модно? Про MPSSE и всё такое. Там же написано всё. Правда не уверен, что он в FT2232C есть. В D и H точно есть.

Stanson ★★★★★ ()
Последнее исправление: Stanson (всего исправлений: 1)

Втыкаю - /dev/i2c* не появляется новое.

А ещё /dev/spi*, /dev/jtag*. Вот это был бы люксус. Для подобных целей используют libmpsse. Оригинал, к сожалению, заброшен. Вот этот форк, якобы, более менее активен: https://github.com/l29ah/libmpsse.

А для максимальной скорости SPI/JTAG и полного контроля - напрямую libftdi. Для I2C, думаю, не должно понадобиться.

gag ★★★★★ ()
Ответ на: комментарий от gag

https://github.com/l29ah/libmpsse

За это спасибирую. Это годная наводка. Надо изучить эти ссылки, они мне не попадались. Хочется натянуть готовое решение, чтобы использовать обычный API для /dev/i2c*, чтобы i2ctools работали поверх этого

Но если не получится, я всегда годов навелосипедировать

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от SZT

Да, там VGA/DVI/etc он есть, но боюсь так просто оно не позволит это задействовать. Еще можно из DIMM разъема I2C вытащить. Но у меня лежит прекрасный FT2232 и обещает I2C из себя

I-Love-Microsoft ★★★★★ ()

вот где я щас шкворца-то и подниму :))))

Я некоторое время назад лепил на базе 232H мастер i2c (есть у меня одна мечта, но я вам про нее не расскажу). В целом все заработало.

Смысл там такой: _sio выкидываем, собираем библу от ftdi. И потом дергая за нее пытаемся реализовать i2c. Очень похоже на поддержку i2c в avr (посмотри на изиэлектроникс, там есть шикарный пример от автора сайта. Есть состояния шины, есть возможность выставлять состояния).

Тут также. Сделал сброс, выставил «start», потом выдал адрес, потом r/w, проверил ack, выдал «stop». Это все отдельными командами, то есть прям ногами дрыгать не надо, он сам все делает (причем синхронно с выставленной частой клока), нужно просто ему все эти отдельные стадии подсказывать что делать. Причем эти последовательности команд можно пихать в массив и за раз отдавать (ЕМНИП). Получается весьма быстро. Правда у меня там не все получилось прям красиво (исходя из моих представлений о прекрасном), но скорей всего я просто кое-где сделал не самым оптимальным образом.

yax123 ★★★★ ()
Ответ на: комментарий от gag

Вот этот форк, якобы, более менее активен: https://github.com/l29ah/libmpsse

Я долго парился, а оно «питхон три» не поддерживает!!! Так у них «в иссуях» написано, типа аффтор ждет пулл реквестов...

Хотя там же в INSTALL:

Example:
$ PYTHON=/usr/bin/python3 ./configure

Вообще говоря, оно наверное компилируется с Python 3 но установка проходит с ошибкой, буду вручную его присобачивать, копировать нужные файлы

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 2)
Ответ на: комментарий от I-Love-Microsoft

Так у них «в иссуях» написано, типа аффтор ждет пулл реквестов…

Тут вот 5 лет назад появился коммит для поддержки:

Ещё несколько форков с изменениями для 3-го питона:

На первый взгляд там только тривиальные изменения.

Вот что значит забросить такую широко используемую (в узких кругах) библиотечку, вместо того чтобы объявить поиск нового сопровождающего.

gag ★★★★★ ()
Ответ на: комментарий от yax123

Спасибо за ответ! Вернулся я спустя столько времени к этой задаче. Бросил Python, решил на Си, нужно чтобы работало а не шашечки gag

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

В ходе бенчмарка осознал, что частота чтения это 8 кГц, а надо бы раз в сто больше, чтобы нормально сниффить и вообще нормально работать с устройством, прикидываться слейвом. Был бы я мастером в этой задаче - хоть на 100 Гц работай меня бы устроило, но надо 400 кГц слейв

Вопросы:

1) Как мне настраивать линии на вход и выход? Я просто в даташите нашел что по дефолту там выход а что вход, и это сработало. Но для I2C известно что надо уметь переключать. Не могу найти, какая функция это делает, ftdi_read_pins вообще чудом в заголовочнике отыскал и это сработало

2) Как правильно сделать так, чтобы FT2232HL вообще могла работать быстрее, мну нужно как первостепенная задача - уметь сниффить. У меня есть SeaLogic, я могу бы им захватить, может так и сделаю на днях, но потом надо быть i2c slave потому с FT2232HL надо уметь работать

3) А на чем еще можно организовать i2c slave, кроме ПЛИС и МК? Например, у меня есть Raspberry Pi 3 и Orange Pi Zero - всё это работает отлично как I2C мастер, но слейвом пишут их просто так не сделать

Вот код моего теста, спойлер не позволяет скрыть его компактно:

#include <stdio.h>
#include <stdint.h>
#include <ftdi.h>

#include <sys/timeb.h>

#define VENDOR_ID   0x0403
#define PRODUCT_ID  0x6010

#define PIN_TX      0x01
#define PIN_RX      0x02
#define PIN_RTS     0x04
#define PIN_CTS     0x08
#define PIN_DTR     0x10
#define PIN_DSR     0x20
#define PIN_DCD     0x40
#define PIN_RI      0x80

int tdiff_ms2(const struct timeb *a, const struct timeb *b);
int tdiff_ms(const struct timeb *a);

int main()
{
	int i, k;
	struct timeb st;
	uint8_t *array;
	uint8_t ctr = 0;
	const int n = 10000;
	struct ftdi_context ftdi;
	ftdi_init(&ftdi);
	
	if(ftdi_usb_open(&ftdi, VENDOR_ID, PRODUCT_ID) < 0) {
		printf("can't open device\n");
		return 1;
	}
	
	printf("device opened ok\n");
	ftdi_set_bitmode(&ftdi, 0xFF, BITMODE_BITBANG);

#if 0
	for(;;)
	{
		ctr++;
		uint8_t data = 0;
		uint8_t read = 0;
		if(ctr & (1<<0)) data |= PIN_TX;
		if(ctr & (1<<1)) data |= PIN_RX;
		//ftdi_read_data(&ftdi, &read, 1);
		ftdi_read_pins(&ftdi, &read);
		ftdi_write_data(&ftdi, &data, 1);
		printf("write ok %d, read= 0x%02X\n", ctr, read);
		sleep(1);
	}
#endif

	array = malloc(n);
	for(k = 0; k < 10; k++)
	{
		ftime(&st);
		for(i = 0; i < n; i++)
		{
			ftdi_read_pins(&ftdi, &array[i]);
		}
		printf("%d\n", tdiff_ms(&st));
		fflush(NULL);
	}
	free(array);

	ftdi_disable_bitbang(&ftdi);
	ftdi_usb_close(&ftdi);
}

int tdiff_ms2(const struct timeb *a, const struct timeb *b)
{
	int diff = 0;
	diff = b->time - a->time;
	if(diff < 0) return 3600000;
	if(diff > 3600) return 3600000;
	diff = diff * 1000;
	diff = diff + b->millitm;
	diff = diff - a->millitm;
	return diff;
}

int tdiff_ms(const struct timeb *a)
{
	struct timeb b;
	ftime(&b);
	return tdiff_ms2(a, &b);
}

I-Love-Microsoft ★★★★★ ()

А пока закурил AN_135 FTDI MPSSE Basics, может что-то в башке прочистится

The MPSSE is always a master controller for the selected synchronous interface. As such, it generates the clock and any required interface select / chip-select signals. The MPSSE does not operate as a slave

Чтение окончено =(

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от yax123

Нужно прикинуться MIPI CSI-2 устройством, имитировать ответ. CSI-2 часть есть, нужно лишь прикинуться сенсором. Но сначала сграбить протокол. Описание CSI-2 есть - там просто I2C

У меня есть такая шняжулечка https://www.aliexpress.com/item/4000102166176.html Ее протокол и надо повторить. Сама штука работает отлично

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Все слова знакомые, а чего хочешь не ясно. Твоя шняга позволяет камере напрямую в hdmi вещать. Так у камеры и так есть i2c. Ты хочешь вместо камеры свой источник воткнуть?

Дажеи если это несущественно. То i2c-slave надо на мк делать, хоть на авр-ке, хоть на новомодной stm32. Мутить на базе линукс-хоста слейв задача так себе.

yax123 ★★★★ ()
Последнее исправление: yax123 (всего исправлений: 1)
Ответ на: комментарий от yax123

То i2c-slave надо на мк делать, хоть на авр-ке, хоть на новомодной stm32. Мутить на базе линукс-хоста слейв задача так себе

Вот я уже на пути к этому. Плата с ПЛИС вышла из строя недавно. То что слейвы вообще не делаются на FT2232HL я узнаю только сегодня

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Мутить на плис эту хрень, только если верилог ты знаешь лучше чем си и плата у тебя уже готовая, и делал ты его уже. Во всех остальных случаях, проще аврку взять и готовый пример. Я так лет 10 назад эмулятор резистивного тач контроллерра замутил на коленке и mega16

yax123 ★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Бросил Python, решил на Си, нужно чтобы работало а не шашечки gag

Я за питон и не брался, делал на Си.

The MPSSE does not operate as a slave

Чтение окончено =(

Так надо же было сразу сказать. Когда мне в очередной раз надо было решать задачу с передачей данных на ПК, и я, конечно же, взял FTDI, обломался именно на этом. Оказалось, что FTDI не так уж и всемогущ.

gag ★★★★★ ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей