LINUX.ORG.RU

Как управлять DTR/RTS порта?

 ,


0

2

Пробую, как написано здесь сделать так:

int RTS_flag = TIOCM_RTS; // TIOCM_DTR
if(ioctl(comfd,TIOCMBIC,&RTS_flag) < 0) exit(-2);//Clear RTS pin
Не получается: ioctl возвращает ошибку -1.

Видимо, эти ioctl'ы старые. У меня ядро 5.0.4. Как в нем принято это делать? Работаю с эмулятором PL2303 на STM32F103.

UPD. Проверил на «настоящем китайском» PL2303: работает без ошибок. А мой эмулятор выдает ошибку и в dmesg вижу

pl2303 ttyUSB0: pl2303_set_control_lines - failed: -71
В общем, надо смотреть, что я там в обработчике накосячил.

☆☆☆☆☆

Последнее исправление: Eddy_Em (всего исправлений: 1)

Вы сейчас чьим UARTом управляете , аппаратным (STM32) или вымышленным (эмулятором PL2303) ?

anonymous
()
Ответ на: комментарий от anonymous

Я просто хочу передать ноль в состоянии DTR или RTS. Железяка на STM32 подключена к USB компьютера и эмулирует эмулятор последовательного порта PL2303. При подключении по сигналу SET_CONTROL_LINE_STATE от компьютера приходит DTR=1, RTS=1. А мне хочется переслать другие значения. На том же PL2303 можно таким образом дрыгать двумя ногами (что дает возможность сделать двухканальную USB-релюшку без микроконтроллера).

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Уверены , что там полная эмуляция ? Даже если RXD-TXD работает , и даже если работает RTS ( квитирование при передаче данных ) оно может и не управляться как GPIO (дрыганьем ног).

Этот самый bitbang в PL2303 есть ? Вроде нет , насколько помню . В нем есть :Two general purpose I/O (GPIO) pins , но это отдельные ножки на м/c , никогда не приходилось с ними иметь дело .

anonymous
()
Ответ на: комментарий от Eddy_Em

PL2303HXD / EA / RA has 8 software controllable “General Purpose Input Output, GPIO” control signals pin, you can use this API to control

- USB Device with PL2303HXD, PL2303EA or PL2303RA controller chip NOTE: PL2303HXA and PL2303XA are not supported (Discontinued Products)

anonymous
()
Ответ на: комментарий от anonymous

Хм, полез в исходники модуля:

static int pl2303_tiocmset(struct tty_struct *tty,
               unsigned int set, unsigned int clear)
{
    struct usb_serial_port *port = tty->driver_data;
    struct pl2303_private *priv = usb_get_serial_port_data(port);
    unsigned long flags;
    u8 control;
    int ret;

    spin_lock_irqsave(&priv->lock, flags);
    if (set & TIOCM_RTS)
        priv->line_control |= CONTROL_RTS;
    if (set & TIOCM_DTR)
        priv->line_control |= CONTROL_DTR;
    if (clear & TIOCM_RTS)
        priv->line_control &= ~CONTROL_RTS;
    if (clear & TIOCM_DTR)
        priv->line_control &= ~CONTROL_DTR;
    control = priv->line_control;
    spin_unlock_irqrestore(&priv->lock, flags);

    ret = pl2303_set_control_lines(port, control);
    if (ret)
        return usb_translate_errors(ret);

    return 0;
}
И в структуре usb_serial_driver эта функция указана в поле .tiocmset

Что ж за нафиг?

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Попробовал так:

int g=-1; ioctl(comfd, TIOCMGET, &g);
g &= ~(TIOCM_CTS | TIOCM_RTS);
int c = ioctl(comfd, TIOCMSET, &g);
Первый ioctl возвращает 0, второй возвращает -1.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

второй возвращает -1.

strerror(errno) то какое?

vodz ★★★★★
()

А ты уверен, что в коде прошивки стмки эти фичи DTR RTS реализованы и обрабатываются корректно?

kuzulis ★★
()
Последнее исправление: kuzulis (всего исправлений: 1)
Ответ на: комментарий от kuzulis

Проверил на китайском PL2303: работает. Значит, косяк-таки в моей прошивке. Буду дальше ее править, как время будет...

Eddy_Em ☆☆☆☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.