libftdi Archives
|
From: | Mohamed Abou Samra <my_abousamra@xxxxxxxxx> |
---|---|
To: | "libftdi@xxxxxxxxxxxxxxxxxxxxxxx" <libftdi@xxxxxxxxxxxxxxxxxxxxxxx> |
Date: | Wed, 16 Mar 2022 16:40:52 +0000 (UTC) |
Hi, I wrote this program to assert ftdi pins using bitbang feature but when it opens the usb port, the device file (/dev/ttyUSBx) doesn't appear again for ever (until a reboot). It seems it fails to close it properly. Any ideas? CODE: #include <unistd.h> #include <string.h> #include <stdlib.h> #include <ftdi.h> static void usagePrint( char* aName) { fprintf(stderr, "Usage: %s -f <fdti_serial> -n <pin_number> -s <pin_state> | [-h]\n", aName); fprintf(stderr, "\t-f: FTDI cable serial\n"); fprintf(stderr, "\t-n: Pin number [1-8]\n"); fprintf(stderr, "\t-s: Pin state [0-1]\n"); fprintf(stderr, "\t-h: Get help, print this menu\n"); } int main( int aArgsCount, /**< [in] Number of arguments.*/ char** aArgsPtr /**< [in] Arguments array.*/) { int ret = 0; int opt; int pinNum = -1; int pinNumMask; unsigned char pinState = -1; unsigned char ftdiPinState; char* ftdiSerialPtr; struct ftdi_context ftdic; /* Parse command options */ while ((opt = getopt(aArgsCount, aArgsPtr, "f:n:s:h")) != -1) { switch (opt) { case 'f': ftdiSerialPtr = optarg; break; case 'n': pinNum = (int) atoi(optarg); break; case 's': pinState = (unsigned char) atoi(optarg); break; case 'h': usagePrint(aArgsPtr[0]); goto FuncExit; default: usagePrint(aArgsPtr[0]); ret = -1; goto FuncExit; } } /* Assure command options are correct */ if ((NULL == ftdiSerialPtr) || (pinNum < 1) || (pinNum > 8) || (pinState < 0) || (pinState > 1)) { usagePrint(aArgsPtr[0]); ret = -1; goto FuncExit; } memset(&ftdic, 0, sizeof(struct ftdi_context)); /* Initialize FTDI context for subsequent function calls */ ret = ftdi_init(&ftdic); if (ret < 0) { fprintf(stderr, "Error: can't initialize ftdi context!\n"); goto FuncExit; } /* Open FTDI device based on FT232R vendor & product IDs */ ret = ftdi_usb_open_desc(&ftdic, 0x0403, 0x6001, NULL, ftdiSerialPtr); if (ret < 0) { fprintf(stderr, "Error: can't open device [%s]!\n", ftdiSerialPtr); goto FuncExit2; } pinNumMask = 1U << (pinNum - 1); /* Enable bitbang mode with a single output line */ ret = ftdi_set_bitmode(&ftdic, pinNumMask, BITMODE_BITBANG); if (ret < 0) { fprintf(stderr, "Error: can't set bitbang mode on pin number %d!\n", pinNum); goto FuncExit3; } ret = ftdi_read_pins(&ftdic, &ftdiPinState); if (ret < 0) { fprintf(stderr, "Error: can't read the FTDI port!\n"); goto FuncExit4; } if (1 == pinState) { ftdiPinState |= pinNumMask; } else { ftdiPinState &= ~pinNumMask; } ret = ftdi_write_data(&ftdic, &ftdiPinState, sizeof(ftdiPinState)); if (ret < 0) { fprintf(stderr, "Error: can't write %d to pin number %d [FTDI port 0x%X]!\n", pinState, pinNum, ftdiPinState); goto FuncExit4; } FuncExit4: ret = ftdi_disable_bitbang(&ftdic); if (ret < 0) { fprintf(stderr, "Error: can't disable bitbang mode!\n"); } FuncExit3: /* Close FTDI device */ ret = ftdi_usb_close(&ftdic); if (ret < 0) { fprintf(stderr, "Error: can't close device [%s]!\n", ftdiSerialPtr); } FuncExit2: /* De-initialize the FTDI context */ ftdi_deinit(&ftdic); FuncExit: return ret; } BUILD: gcc -g -Wall -Werror -I/usr/include/libftdi1 -c ftdi_bitbang.c -o ftdi_bitbang.o gcc ftdi_bitbang.o -g -Wall -Werror -I/usr/include/libftdi1 -l ftdi1 -o ftdi_bitbang RUN: sudo ./ftdi_bitbang -f FTZ6Y8RD -n 3 -s 1 OS: Ubuntu 16.04 FTDI LIB VERSION: 1.2 Best Regards, M Y libftdi - see http://www.intra2net.com/en/developer/libftdi for details. |
Current Thread |
---|
|