[En-Nut-Discussion] UART Flow Control

Dušan dferbas at solarmonitor.cz
Thu Mar 5 23:15:19 CET 2020


Hi Uwe,

your modification makes sense.
BTW, your link points to the exactly same email, I pointed in my email 
message :-).

---
I need somehow to communicate with my usart device driver portion - 
arch/cm3/dev/nxp/mk64f_usart.inc.c 
<https://github.com/dferbas/ethernut/blob/master/nut/arch/cm3/dev/nxp/mk64f_usart.inc.c>
#define USART_MF_HALFDUPLEX_YZ    0x2000
#define USART_MF_FULLDUPLEX_232    0x4000
#define USART_MF_LOOPBACK_AB    0x8000
#define USART_MF_LOOPBACK_YZ    0x4000        /* same as for 232 if 
piggy-232 board present */

I can compare the feature to the PhyCtl() for ethernet.

The PhyCtl has a dcb, which is registered during NutRegisterPhy().

As there is usually only 1 ethernet, this works.

-----------
But with UARTs, more than 1 interface is common for boards, where Nut/OS 
is a good choice as OS.

for RS232

     control = USART_MF_RTSCONTROL | USART_MF_CTSSENSE;
     _ioctl(_fileno(stream), UART_SETFLOWCONTROL, &control);

for RS485
     u_long duplex_mode = USART_MF_HALFDUPLEX;
     _ioctl(_fileno(hbus_stream), UART_SETFLOWCONTROL, &duplex_mode);

for RS422
...

This generated an idea to tie this with usart driver via ioctl.
And as the ioctl is implemented in the common portion of the driver 
(dev/usart.c 
<https://github.com/dferbas/ethernut/blob/master/nut/dev/usart.c>),
there are only 2 options UART_SETSTATUS and UART_SETFLOWCONTROL,
which can pass arguments to the low level driver portion,
where they can be handled.

Should we extend the USARTDCB with some phyctl ?

Is there anyone who can benefit from using a loopback mode on RS485
for detecting issues with e.g. short circuit on bus lines?

*Dušan*

On 5.3.2020 21:00, bon at elektron.ikp.physik.tu-darmstadt.de wrote:
> Dušan writes:
>> Hi guys,
>>
>> we are working on a Nut/OS port for NXP Kinetis MK64F (LQFP100 - 144,
>> ethernet).
>> Actual state can be seen here: https://github.com/dferbas/ethernut
>>
>> Once tested, I plan to merge it with Nut.
>> It does not use the NutUseCritical() macros.
>>
>> ------------------------
>> We have an issue with USART driver.
>> We use the UART_SETFLOWCONTROL to set half duplex or full duplex and
>> also loopback modes.
>> All this is done with RE, DE signals to 2 RS485 transceivers, nicely
>> hidden from an application through the ioctl.
>>
>> The [r4163] <https://sourceforge.net/p/ethernut/code/4163/> added
>> XONXOFF only, which was later removed at
>>
>> [r4584] <https://sourceforge.net/p/ethernut/code/4584/> with following
>> remark:
>> Do not fix flow control to XON/XOFF handshake.
>> See
>> http://lists.egnite.de/pipermail/en-nut-discussion/2012-August/013821.html
>>
>> ---
>> As the dcb->dcb_modeflags should be hidden from an application,
>> what was the intention to leave it as it is now?
>>
>> What about to simply stay with the old version (#2555 - #4116):
>>       case UART_SETFLOWCONTROL:
>>           rc = (*dcb->dcb_set_flow_control) (lv);
>>           break;
>>
>> This allows everything to be passed from an application.
> I recently also implemented XON/XOFF for STM32 and have following
> patch not yet pushed to sourceforge:
> commit 60a551843e2dd5cb4846939d50b03aaf0d50ce4e
> Author: Uwe Bonnes <bon at elektron.ikp.physik.tu-darmstadt.de>
> Date:   Wed Feb 19 20:27:47 2020 +0100
>
>      usart.c: We must relay XONXOFF to the dcb_modeflags.
>      
>      Only relay dcb_modeflags. See http://lists.egnite.de/pipermail/en-nut-discussion/2012-August/013821.html.
>
> diff --git a/nut/dev/usart.c b/nut/dev/usart.c
> index a8228ef87..008dd036d 100644
> --- a/nut/dev/usart.c
> +++ b/nut/dev/usart.c
> @@ -834,6 +834,11 @@ int UsartIOCtl(NUTDEVICE * dev, int req, void *conf)
>   
>       case UART_SETFLOWCONTROL:
>           lv = dcb->dcb_modeflags;
> +        if (bv & USART_MF_XONXOFF) {
> +            lv |= USART_MF_XONXOFF;
> +        } else {
> +            lv &= ~USART_MF_XONXOFF;
> +        }
>           rc = (dcb->dcb_set_flow_control) (lv);
>           if (rc == 0) {
>               dcb->dcb_modeflags = lv;
>
> This only changes XONXOFF, but keeps other settings, e.g. half-duplex etc.
>
> What do you think of my solution?
>
> As neither Harald nor Ole seem to lurk, the original intention of the
> modification is probably lost.
>
> Should I put up my nutos repo on github?
>
> Bye


More information about the En-Nut-Discussion mailing list