From: Yegor Yefremov <yegorsli...@googlemail.com> During checksum calculation in ftdi_eeprom_build() a 16-bit value will be read directly from EEPROM (FT230X devices only):
ftdi_read_eeprom_location(ftdi, i, &data) 'data' is little endian, so the bytes must be swapped on a big-endian system. Introduce related macro swap_short() and add endianess detection to CMakeLists.txt. --- CMakeLists.txt | 7 +++++++ src/ftdi.c | 2 +- src/ftdi_i.h | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ce122ff..3cb2f3f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,13 @@ if(${CMAKE_BUILD_TYPE} STREQUAL Debug) add_definitions(-DDEBUG) endif(${CMAKE_BUILD_TYPE} STREQUAL Debug) +# check, if he system is big endian or little endian +include(TestBigEndian) +test_big_endian(BIGENDIAN) +if(${BIGENDIAN}) + add_definitions(-DBIGENDIAN) +endif(${BIGENDIAN}) + # find libusb find_package ( USB1 REQUIRED ) include_directories ( ${LIBUSB_INCLUDE_DIR} ) diff --git a/src/ftdi.c b/src/ftdi.c index f5d263c..f516538 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -3239,7 +3239,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) fprintf(stderr, "Reading Factory Configuration Data failed\n"); i = 0x50; } - value = data; + value = swap_short(data); } else { value = output[i*2]; diff --git a/src/ftdi_i.h b/src/ftdi_i.h index cf2ac78..a9ab3a6 100644 --- a/src/ftdi_i.h +++ b/src/ftdi_i.h @@ -141,3 +141,8 @@ struct ftdi_eeprom int release_number; }; +#if BIGENDIAN +#define swap_short(val) ((val >> 8) | (val << 8)) +#else +#define swap_short(val) (val) +#endif -- 2.1.4 -- libftdi - see http://www.intra2net.com/en/developer/libftdi for details. To unsubscribe send a mail to libftdi+unsubscr...@developer.intra2net.com