libftdi Archives

Subject: USB Device file disappeared after ftdi library open its port

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 <stdio.h>
#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.
To unsubscribe send a mail to libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx


Current Thread