собрал, запускаю :
Error: couldn't write MPSSE commands to FT2232
подозрительно, все работало еще неделю назад, залазю в git репозиторий посмотреть что недавно правили в драйвере ft2232 - вижу что недавно ничего! а то что правили - давно и несущественно. лезем в код под отладчиком и изумляемся.
CODE
static int ft2232_write(uint8_t* buf, int size, uint32_t* bytes_written)
{
#if BUILD_FT2232_FTD2XX == 1
FT_STATUS status;
DWORD dw_bytes_written;
if ((status = FT_Write(ftdih, buf, size, &dw_bytes_written)) != FT_OK)
{
*bytes_written = dw_bytes_written;
LOG_ERROR("FT_Write returned: %lu", status);
return ERROR_JTAG_DEVICE_ERROR;
}
else
{
*bytes_written = dw_bytes_written;
}
#elif BUILD_FT2232_LIBFTDI == 1
int retval;
if ((retval = ftdi_write_data(&ftdic, buf, size)) < 0)
{
*bytes_written = 0;
LOG_ERROR("ftdi_write_data: %s", ftdi_get_error_string(&ftdic));
return ERROR_JTAG_DEVICE_ERROR;
}
else
{
*bytes_written = retval;
}
#endif
if (*bytes_written != (uint32_t)size)
{
return ERROR_JTAG_DEVICE_ERROR;
}
return ERROR_OK;
}
{
#if BUILD_FT2232_FTD2XX == 1
FT_STATUS status;
DWORD dw_bytes_written;
if ((status = FT_Write(ftdih, buf, size, &dw_bytes_written)) != FT_OK)
{
*bytes_written = dw_bytes_written;
LOG_ERROR("FT_Write returned: %lu", status);
return ERROR_JTAG_DEVICE_ERROR;
}
else
{
*bytes_written = dw_bytes_written;
}
#elif BUILD_FT2232_LIBFTDI == 1
int retval;
if ((retval = ftdi_write_data(&ftdic, buf, size)) < 0)
{
*bytes_written = 0;
LOG_ERROR("ftdi_write_data: %s", ftdi_get_error_string(&ftdic));
return ERROR_JTAG_DEVICE_ERROR;
}
else
{
*bytes_written = retval;
}
#endif
if (*bytes_written != (uint32_t)size)
{
return ERROR_JTAG_DEVICE_ERROR;
}
return ERROR_OK;
}
стековая переменная dw_bytes_written не инициализируется (атоматически не должна по стандарту) , песатель кода надеется что при вызове FT_Write чтото в нее запишется по любому. Вот тут и начинается события из разрадя ''встретились два барана" - двараза мимо кассы, песатели FT_Write так изготовили что если писать команду без данных, тоесть размер size равен нулю, то она почемуто думает что в dw_bytes_written ничего записывать ненадо - ну так они видят мир в FTDI, простите, в индии. таким образом в результате в пременной dw_bytes_written после операции имеем мусор из стека при входе в эту процедуру с вываливанием в итоге по ERROR_JTAG_DEVICE_ERROR.
контрольный вопрос - как это работало раньше? ответ, ВЕЗЛО - код так распологался в озу и так стеки использовались что в нужном месте всегда оказывался нуль, гдето переписали кусок кода который также временами проходится по стек и по другому его использует и все - ПРЕВЕД!
решение проблемы - инициализация нулем dw_bytes_written = 0 при объявлении.
делаем правку собираем запускаем - вау! заработало!
едем дальше - хотим сообщить разработчикам чтоб поправили. нашел единственный путь - через форум forum.sparkfun.com
пытался зарегестрироватся, потерял полтра часа с перерывами на остывание мозгов - ну видители мой адрес почты невалидный и все тут! рыжий я!, зарегестрировался, результат - аккаунт зарегестрировался но не активен! писма на почту с активацие й не пришло. привед!
выводы:
а) авторы молодцы - openOCD замечательная вещь, но кодописатели-любители, как работают С.С++ как работают компиллеры не знают, наверно им это не нада, до поры и так все хрустит.
б) песатели драйверов ftdi d2xx под linux64 - уроды, драйверы это ответственная вещь и писать их должны пониающее люди. драйвер для винды возможно работает правильно - если драйвер другие кексы делали.
с) вебадмины forum.sparkfun.com - дятлы.
д) как обычно - пока сам напильником не допилиш - счасть я не будет

я так изнервничался при регистрации на forum.sparkfun.com что промазал разделом. прошу прощения. просьба к админам переместить топик в соседний раздел GNU/OpenSource средства разработки для avr/arm/mips
засим откланиюсь.