apps/system/zmodem: Add an option to enable hardware flow control via termios.

This commit is contained in:
Gregory Nutt 2018-05-26 15:59:58 -06:00
parent 803323c213
commit 1e94c78e2e
5 changed files with 110 additions and 6 deletions

View File

@ -65,6 +65,26 @@ config SYSTEM_ZMODEM_MOUNTPOINT
Names of file send by the sz commond, on the other hand, must be Names of file send by the sz commond, on the other hand, must be
absolute paths beginning with '/'. absolute paths beginning with '/'.
config SYSTEM_ZMODEM_FLOWC
bool
default n
config SYSTEM_ZMODEM_IFLOW
bool "Rx flow control"
default n
select SYSTEM_ZMODEM_FLOWC
depends on SERIAL_TERMIOS
---help---
Enable H/W CTS flow control.
config SYSTEM_ZMODEM_OFLOW
bool "Tx flow control"
default n
select SYSTEM_ZMODEM_FLOWC
depends on SERIAL_TERMIOS
---help---
Enable H/W RTS flow control.
config SYSTEM_ZMODEM_RCVSAMPLE config SYSTEM_ZMODEM_RCVSAMPLE
bool "Reverse channel" bool "Reverse channel"
default n default n

View File

@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
* system/zmodem/rz_main.c * system/zmodem/rz_main.c
* *
* Copyright (C) 2013 Gregory Nutt. All rights reserved. * Copyright (C) 2013, 2018 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -127,6 +127,12 @@ int rz_main(int argc, FAR char **argv)
goto errout; goto errout;
} }
#ifdef CONFIG_SYSTEM_ZMODEM_FLOWC
/* Enable hardware Rx/Tx flow control */
zm_flowc(fd);
#endif
/* Get the Zmodem handle */ /* Get the Zmodem handle */
handle = zmr_initialize(fd); handle = zmr_initialize(fd);

View File

@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
* system/zmodem/sz_main.c * system/zmodem/sz_main.c
* *
* Copyright (C) 2013 Gregory Nutt. All rights reserved. * Copyright (C) 2013, 2018 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -186,6 +186,12 @@ int sz_main(int argc, FAR char **argv)
goto errout; goto errout;
} }
#ifdef CONFIG_SYSTEM_ZMODEM_FLOWC
/* Enable hardware Rx/Tx flow control */
zm_flowc(fd);
#endif
/* Get the Zmodem handle */ /* Get the Zmodem handle */
handle = zms_initialize(fd); handle = zms_initialize(fd);

View File

@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
* apps/system/zmodem/zm.h * apps/system/zmodem/zm.h
* *
* Copyright (C) 2013 Gregory Nutt. All rights reserved. * Copyright (C) 2013, 2018 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* References: * References:
@ -577,6 +577,18 @@ int zm_writefile(int fd, FAR const uint8_t *buffer, size_t buflen, bool zcnl);
uint32_t zm_filecrc(FAR struct zm_state_s *pzm, FAR const char *filename); uint32_t zm_filecrc(FAR struct zm_state_s *pzm, FAR const char *filename);
/****************************************************************************
* Name: zm_flowc
*
* Description:
* Enable hardware Rx/Tx flow control
*
****************************************************************************/
#ifdef CONFIG_SYSTEM_ZMODEM_FLOWC
void zm_flowc(int fd);
#endif
/**************************************************************************** /****************************************************************************
* Name: zm_putzdle * Name: zm_putzdle
* *

View File

@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
* system/zmodem/zm_utils.c * system/zmodem/zm_utils.c
* *
* Copyright (C) 2013 Gregory Nutt. All rights reserved. * Copyright (C) 2013, 2018 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -42,6 +42,7 @@
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include <termios.h>
#include <assert.h> #include <assert.h>
#include <errno.h> #include <errno.h>
#include <crc32.h> #include <crc32.h>
@ -430,7 +431,7 @@ int zm_writefile(int fd, FAR const uint8_t *buffer, size_t buflen, bool zcnl)
return ret; return ret;
} }
/************************************************************************************************ /****************************************************************************
* Name: zm_filecrc * Name: zm_filecrc
* *
* Description: * Description:
@ -439,7 +440,7 @@ int zm_writefile(int fd, FAR const uint8_t *buffer, size_t buflen, bool zcnl)
* Assumptions: * Assumptions:
* The allocated I/O buffer is available to buffer file data. * The allocated I/O buffer is available to buffer file data.
* *
************************************************************************************************/ ****************************************************************************/
uint32_t zm_filecrc(FAR struct zm_state_s *pzm, FAR const char *filename) uint32_t zm_filecrc(FAR struct zm_state_s *pzm, FAR const char *filename)
{ {
@ -471,3 +472,62 @@ uint32_t zm_filecrc(FAR struct zm_state_s *pzm, FAR const char *filename)
close(fd); close(fd);
return ~crc; return ~crc;
} }
/****************************************************************************
* Name: zm_flowc
*
* Description:
* Enable hardware Rx/Tx flow control
*
****************************************************************************/
#ifdef CONFIG_SYSTEM_ZMODEM_FLOWC
void zm_flowc(int fd)
{
struct termios term;
/* Get the termios */
tcgetattr(fd, &term);
#ifdef CONFIG_SYSTEM_ZMODEM_IFLOW
/* Set input flow control */
#ifdef CRTS_IFLOW
term.c_cflag |= CRTS_IFLOW;
#else
term.c_cflag |= CRTSCTS;
#endif
#else /* CONFIG_SYSTEM_ZMODEM_IFLOW */
/* Clear input flow control */
#ifdef CRTS_IFLOW
term.c_cflag &= ~CRTS_IFLOW;
#else
term.c_cflag &= ~CRTSCTS;
#endif
#endif /* CONFIG_SYSTEM_ZMODEM_IFLOW */
#ifdef CONFIG_SYSTEM_ZMODEM_OFLOW
/* Set output flow control */
#ifdef CCTS_OFLOW
term.c_cflag |= CCTS_OFLOW;
#else
term.c_cflag |= CRTSCTS;
#endif
#else /* CONFIG_SYSTEM_ZMODEM_OFLOW */
/* Clear output flow control */
#ifdef CCTS_OFLOW
term.c_cflag &= ~CCTS_OFLOW;
#else
term.c_cflag &= ~CRTSCTS;
#endif
#endif /* CONFIG_SYSTEM_ZMODEM_OFLOW */
/* Save the modified termios */
tcsetattr(fd, TCSANOW, &term);
}
#endif