libftdi Archives

Subject: Re: Why can not set DTR and RTS?

From: linux fddl <fddllinux@xxxxxxxxx>
To: matthias.janke@xxxxxxxxxxxxxxxxxxxxxxx
Cc: libftdi@xxxxxxxxxxxxxxxxxxxxxxx
Date: Fri, 19 Apr 2013 10:58:56 +0800
Addition, my libftdi is libftdi 0.17 and 0.19

2013/4/19 linux fddl <fddllinux@xxxxxxxxx>:
> Thanks for your answer.
>
>> Hm, ok I use ftdi_setflowctrl and it works for me. Just having a quick 
>> glance at
>> your code reveals the following line:
>>
>> if (f = ftdi_setrts(ftdi, SIO_SET_DTR_HIGH))
>> return f;
>>
>> which immediately returns after setting RTS high not touching DTR as the
>> following lines of that function suggests. (the assignment did work -> true) 
>> You
>> probably meant something like
>>
>> if ((f = ftdi_setrts(ftdi, SIO_SET_DTR_HIGH))!=0)
>> return f;
>>
>> but that is just guessing.
>
>   In fact, I just try to set RTS and DTR high/low. It's just a test
> code, [return f] just because I want to know whether there is any
> error, hope to simplify my debug. I'm so sorry... This may wast your
> time. Really sorry...
> The really problem is I can not set RTS and DTR.
>
>> but that is just guessing. Reducing your code to the bare minimum, no option
>> parsing, no error handling, no DBG might help to reveal the cause of your 
>> problem.
>
>   The following code is a reducing one.
>
>> But since you do error handling etc. , could you be a bit more verbose on the
>> actual result of your program? (console output, return values, expected 
>> output,
>> pin state on your board, ...)
>
> There is no error output from console.
> Also the output is not what I want. For example, if I hope a
> high/low/high/low level,
> I can not see this from my board's pins.
> But, but if I write datas, I can see the output from TX, though I'm
> not sure whether it is right,
> I think it's not the key.
>
> I calls ftdi_set_bitmode() twice, but even calls any one of them,
> still not work. I also tried to
> call none of them, but ...
>
> Other things I want to know is:
> Do I need to config my chip(FTDI 232RL) with FT_Prog? For example, IO?
> Or, should I use cbus?
>
> -----------------------------------------------------------------------------------------------------------------------
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <unistd.h>
> #include <getopt.h>
> #include <string.h>
> #include <ftdi.h>
>
> static int ctrl_dtr(struct ftdi_context *ftdi)
> {
> int f;
>
> if (f = ftdi_setdtr(ftdi, SIO_SET_DTR_HIGH))
> return f;
> usleep(1 * 1000000);
>
> if (f = ftdi_setdtr(ftdi, SIO_SET_DTR_LOW))
> return f;
> usleep(1 * 1000000);
>
> return f;
> }
>
> static int ctrl_rts(struct ftdi_context *ftdi)
> {
> int f;
>
> if (f = ftdi_setrts(ftdi, SIO_SET_DTR_HIGH))
> return f;
> usleep(1 * 1000000);
>
> if (f = ftdi_setrts(ftdi, SIO_SET_DTR_LOW))
> return f;
> usleep(1 * 1000000);
>
> return f;
> }
>
> int main(int argc, char **argv)
> {
> struct ftdi_context *ftdi;
> int f,i;
> unsigned char buf[1];
> int retval = 0;
>
> if ((ftdi = ftdi_new()) == 0) {
> fprintf(stderr, "ftdi_new failed\n");
> return EXIT_FAILURE;
> }
>
> f = ftdi_usb_open(ftdi, 0x0403, 0x6001);
> if (f < 0 && f != -5) {
> fprintf(stderr, "unable to open ftdi device: %d (%s)\n",
> f, ftdi_get_error_string(ftdi));
> retval = EXIT_FAILURE;
> goto done;
> }
>
> f = ftdi_set_bitmode(ftdi, 0xFF, BITMODE_BITBANG);
> if (f < 0) {
> fprintf(stderr, "unable to BITBANG ftdi device: %d (%s)\n", f,
> ftdi_get_error_string(ftdi));
> retval = 1;
> goto done;
> }
>
> f = ftdi_set_bitmode(ftdi, 0xFF, BITMODE_RESET);
> if (f < 0) {
> fprintf(stderr, "unable to RESET ftdi device: %d (%s)\n", f,
> ftdi_get_error_string(ftdi));
> retval = 1;
> goto done;
> }
>
> f = ftdi_setflowctrl(ftdi, SIO_DISABLE_FLOW_CTRL);
> //f = ftdi_setflowctrl(ftdi, SIO_DTR_DSR_HS);
> if (f < 0) {
> fprintf(stderr, "fail to setup flowctrl ftdi device: %d (%s)\n", f,
> ftdi_get_error_string(ftdi));
> retval = 1;
> goto done;
> }
>
> f = ftdi_set_baudrate(ftdi, 9600);
> if (f < 0) {
> fprintf(stderr, "fail to set baudrate ftdi device: %d (%s)\n", f,
> ftdi_get_error_string(ftdi));
> retval = 1;
> goto done;
> }
>
> f = ctrl_dtr(ftdi);
> if (f < 0) {
> fprintf(stderr,"setup failed for dtr, error %d (%s)\n",
> f, ftdi_get_error_string(ftdi));
> retval = EXIT_FAILURE;
> goto done;
> }
>
> f = ctrl_rts(ftdi);
> if (f < 0) {
> fprintf(stderr,"setup failed for rts, error %d (%s)\n",
> f, ftdi_get_error_string(ftdi));
> retval = EXIT_FAILURE;
> goto done;
> }
>
> ftdi_disable_bitbang(ftdi);
>
> ftdi_usb_close(ftdi);
> done:
> ftdi_free(ftdi);
>
> return retval;
> }
>
> -----------------------------------------------------------------------------------------------------------------------
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> 2013/4/18 Matthias Janke <matthias.janke@xxxxxxxxxxxxxxxxxxxxxxx>:
>> Hm, ok I use ftdi_setflowctrl and it works for me. Just having a quick 
>> glance at
>> your code reveals the following line:
>>
>> if (f = ftdi_setrts(ftdi, SIO_SET_DTR_HIGH))
>> return f;
>>
>> which immediately returns after setting RTS high not touching DTR as the
>> following lines of that function suggests. (the assignment did work -> true) 
>> You
>> probably meant something like
>>
>> if ((f = ftdi_setrts(ftdi, SIO_SET_DTR_HIGH))!=0)
>> return f;
>>
>> but that is just guessing. Reducing your code to the bare minimum, no option
>> parsing, no error handling, no DBG might help to reveal the cause of your 
>> problem.
>> But since you do error handling etc. , could you be a bit more verbose on the
>> actual result of your program? (console output, return values, expected 
>> output,
>> pin state on your board, ...)
>>
>> Cheers
>> Matthias
>>
>> Am Thu, 18 Apr 2013 16:54:14 +0800
>> schrieb linux fddl <fddllinux@xxxxxxxxx>:
>>
>>>   I have a usb-to-serial cable(FTDI 232RL chip),
>>> I am trying to control my board by a userland program(linux) basing on
>>> libftdi, but can not set DTR and RTS. I really do not know why.
>>>   I also tried to call ftdi_set_bitmode(ftdi, 0xFF, BITMODE_RESET) and
>>> ftdi_setflowctrl(ftdi, SIO_DISABLE_FLOW_CTRL)/ftdi_setflowctrl(ftdi,
>>> SIO_DTR_DSR_HS), but all of them were useless.
>>>
>>> Here is my code(I'm so sorry, it's not clean enough), is there anything 
>>> wrong?
>>>
>>>
>>> #include <stdio.h>
>>> #include <stdlib.h>
>>> #include <unistd.h>
>>> #include <getopt.h>
>>> #include <string.h>
>>> #include <ftdi.h>
>>>
>>> #define DEBUG
>>>
>>> #ifdef DEBUG
>>> #define DBG printf
>>> #else
>>> #define DBG
>>> #endif
>>>
>>> #define VID 0x0403
>>> #define PID 0x6001
>>>
>>> struct usb_id_info {
>>> int vendor;
>>> int product;
>>> };
>>>
>>> /* ctrl the pin(s) or not */
>>> struct ctrl_pins {
>>> int dtr; /* ctrl RS232's DTR pin */
>>> int rts; /* ctrl RS232's RTS pin */
>>> };
>>>
>>> struct cmd_context {
>>> struct usb_id_info usb_id;
>>> struct ctrl_pins pins;
>>> };
>>>
>>> static struct cmd_context cmd;
>>> static char app_name[32] = {"ftdi-pin-ctrl"};
>>>
>>> static void show_usage(void)
>>> {
>>> fprintf(stderr, "Usage: %s [-v hex] [-p hex] [-o pin]\n",
>>> app_name);
>>> fprintf(stderr, "Options are:\n");
>>> fprintf(stderr, " -v hex assign a vendor id, default 0x0403\n");
>>> fprintf(stderr, " -p hex assign a product id, default 0x6001\n");
>>> fprintf(stderr, " -o pin which pin to ctrl, now only dtr and rts are
>>> supported, default none\n");
>>> }
>>>
>>> static void exit_bad_args(void)
>>> {
>>> show_usage();
>>> exit(EXIT_FAILURE);
>>> }
>>>
>>> static int parse_args(int argc, char **argv)
>>> {
>>> int result = 0;
>>> const char short_opts[] = {"v:p:o:h"};
>>> while((result = getopt(argc, argv, short_opts))  != -1) {
>>> switch(result) {
>>> case 'v':
>>> DBG("option=%c, optarg=%s\n", result, optarg);
>>> cmd.usb_id.vendor = (int)strtoul(optarg, NULL, 16);
>>> break;
>>> case 'p':
>>> DBG("option=%c, optarg=%s\n", result, optarg);
>>> cmd.usb_id.product = (int)strtoul(optarg, NULL, 16);
>>> break;
>>> case 'o':
>>> DBG("option=%c, optarg=%s\n", result, optarg);
>>> if(!strcmp("dtr", optarg))
>>> cmd.pins.dtr = 1;
>>> if(!strcmp("rts", optarg))
>>> cmd.pins.rts = 1;
>>> DBG("dtr[%d], rts[%d]\n", cmd.pins.dtr, cmd.pins.rts);
>>> break;
>>> case 'h':
>>> show_usage();
>>> exit(EXIT_SUCCESS);
>>> default:
>>> show_usage();
>>> exit(EXIT_FAILURE);
>>> }
>>> }
>>>
>>> DBG("vendor[0x%04x]\n", cmd.usb_id.vendor);
>>> DBG("product[0x%04x]\n", cmd.usb_id.product);
>>> DBG("dtr[%d], rts[%d]\n", cmd.pins.dtr, cmd.pins.rts);
>>>
>>> return 0;
>>> }
>>>
>>> static void set_default_args(void)
>>> {
>>> memset(&cmd, 0, sizeof(cmd));
>>> cmd.usb_id.vendor = VID;
>>> cmd.usb_id.product = PID;
>>> }
>>>
>>> static int ctrl_dtr(struct ftdi_context *ftdi)
>>> {
>>> int f;
>>> int i;
>>> for (i = 0; i < 8; i++) {
>>> if (f = ftdi_setdtr(ftdi, SIO_SET_DTR_HIGH))
>>> return f;
>>>
>>> usleep(1 * 1000000);
>>>
>>> if (f = ftdi_setdtr(ftdi, SIO_SET_DTR_LOW))
>>> return f;
>>>
>>> usleep(1 * 1000000);
>>> }
>>> return f;
>>> }
>>>
>>> static int ctrl_rts(struct ftdi_context *ftdi)
>>> {
>>> int f;
>>> int i;
>>> for (i = 0; i < 8; i++) {
>>>
>>> if (f = ftdi_setrts(ftdi, SIO_SET_DTR_HIGH))
>>> return f;
>>>
>>> usleep(1 * 1000000);
>>>
>>> if (f = ftdi_setrts(ftdi, SIO_SET_DTR_LOW))
>>> return f;
>>>
>>> usleep(1 * 1000000);
>>> }
>>> return f;
>>> }
>>>
>>> int main(int argc, char **argv)
>>> {
>>> struct ftdi_context *ftdi;
>>> int f,i;
>>> unsigned char buf[1];
>>> int retval = 0;
>>>
>>> /* at least one args is needed */
>>> if (argc <= 1)
>>> exit_bad_args();
>>>
>>> set_default_args();
>>>
>>> parse_args(argc, argv);
>>>
>>> if ((ftdi = ftdi_new()) == 0) {
>>> fprintf(stderr, "ftdi_new failed\n");
>>> return EXIT_FAILURE;
>>> }
>>>
>>> // f = ftdi_usb_open(ftdi, 0x0403, 0x6001);
>>> f = ftdi_usb_open(ftdi, cmd.usb_id.vendor, cmd.usb_id.product);
>>>
>>> if (f < 0 && f != -5) {
>>> fprintf(stderr, "unable to open ftdi device: %d (%s)\n",
>>> f, ftdi_get_error_string(ftdi));
>>> retval = EXIT_FAILURE;
>>> goto done;
>>> }
>>>
>>> printf("ftdi open succeeded: %d\n",f);
>>>
>>> //sjh
>>> printf("enabling bitbang mode\n");
>>> ftdi_set_bitmode(ftdi, 0xFF, BITMODE_BITBANG);
>>>
>>> //usleep(3 * 1000000);
>>>
>>> #if 1
>>> printf("resetting bitmode...\n");
>>> f = ftdi_set_bitmode(ftdi, 0xFF, BITMODE_RESET);
>>> if (f < 0) {
>>> fprintf(stderr, "unable to RESET ftdi device: %d (%s)\n", f,
>>> ftdi_get_error_string(ftdi));
>>> retval = 1;
>>> goto done;
>>> }
>>> #endif
>>>
>>> #if 1
>>> printf("disabling flowctrl...\n");
>>> //f = ftdi_setflowctrl(ftdi, SIO_DISABLE_FLOW_CTRL);
>>> f = ftdi_setflowctrl(ftdi, SIO_DTR_DSR_HS);
>>> if (f < 0) {
>>> fprintf(stderr, "fail to disable flowctrl ftdi device: %d (%s)\n", f,
>>> ftdi_get_error_string(ftdi));
>>> retval = 1;
>>> goto done;
>>> }
>>> #endif
>>>
>>> #if 1
>>> printf("setting baudrage...\n");
>>> f = ftdi_set_baudrate(ftdi, 9600);
>>> if (f < 0) {
>>> fprintf(stderr, "fail to set baudrate ftdi device: %d (%s)\n", f,
>>> ftdi_get_error_string(ftdi));
>>> retval = 1;
>>> goto done;
>>> }
>>> #endif
>>>
>>> //if (cmd.pins.dtr) {
>>> printf("controlling dtr...\n");
>>> f = ctrl_dtr(ftdi);
>>> if (f < 0) {
>>> fprintf(stderr,"setup failed for dtr, error %d (%s)\n",
>>> f, ftdi_get_error_string(ftdi));
>>> retval = EXIT_FAILURE;
>>> goto done;
>>> }
>>> //}
>>>
>>> //if (cmd.pins.rts) {
>>> printf("controlling rts...\n");
>>> f = ctrl_rts(ftdi);
>>> if (f < 0) {
>>> fprintf(stderr,"setup failed for dtr, error %d (%s)\n",
>>> f, ftdi_get_error_string(ftdi));
>>> retval = EXIT_FAILURE;
>>> goto done;
>>> }
>>> //}
>>> #if 1
>>> buf[0] = 0x0;
>>> printf("turning everything on\n");
>>> f = ftdi_write_data(ftdi, buf, 1);
>>> if (f < 0)
>>> {
>>> fprintf(stderr,"write failed for 0x%x, error %d (%s)\n",buf[0],f,
>>> ftdi_get_error_string(ftdi));
>>> }
>>>
>>> //usleep(3 * 1000000);
>>>
>>> buf[0] = 0xFF;
>>> printf("turning everything off\n");
>>> f = ftdi_write_data(ftdi, buf, 1);
>>> if (f < 0)
>>> {
>>> fprintf(stderr,"write failed for 0x%x, error %d (%s)\n",buf[0],f,
>>> ftdi_get_error_string(ftdi));
>>> }
>>>
>>> //usleep(3 * 1000000);
>>>
>>> for (i = 0; i < 32; i++)
>>> {
>>> buf[0] =  0 | (0xFF ^ 1 << (i % 8));
>>> if ( i > 0 && (i % 8) == 0)
>>> {
>>> printf("\n");
>>> }
>>> printf("%02hhx ",buf[0]);
>>> fflush(stdout);
>>> f = ftdi_write_data(ftdi, buf, 1);
>>> if (f < 0)
>>> {
>>> fprintf(stderr,"write failed for 0x%x, error %d (%s)\n",buf[0],f,
>>> ftdi_get_error_string(ftdi));
>>> }
>>> usleep(1 * 1000000);
>>> }
>>>
>>> printf("\n");
>>> #endif
>>> printf("disabling bitbang mode\n");
>>> ftdi_disable_bitbang(ftdi);
>>>
>>> ftdi_usb_close(ftdi);
>>> done:
>>> ftdi_free(ftdi);
>>>
>>> return retval;
>>> }
>>>
>>>
>>> Best regards
>>> ShiJinghui
>>>
>>> --
>>> libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
>>> To unsubscribe send a mail to libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx
>>
>>
>> --
>> ---------------------------------------------------------------------
>>  Dipl.-Phys. Matthias Janke
>>
>>  Physikalisches Institut der Universität Heidelberg
>>  Im Neunheimer Feld 226
>>  69120 Heidelberg
>>  Deutschland
>>
>>  Tel:    +49 (6221) 54 19 45 6
>>  Fax:    +49 (6221) 54 19 54 0
>>  E-Mail: matthias.janke@xxxxxxxxxxxxxxxxxxxxxxx
>>
>>  Büro: 02.209
>> ---------------------------------------------------------------------
>>
>> --
>> libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
>> To unsubscribe send a mail to libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx
>>

--
libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx

Current Thread