Fix problems with host build of the Zmodem tools

This commit is contained in:
Gregory Nutt 2013-07-16 11:23:35 -06:00
parent c0e4184a3f
commit 394f46560c
7 changed files with 60 additions and 21 deletions

View File

@ -94,10 +94,10 @@ $(HOSTAPPS)/zmodem.h: $(APPSINC)/zmodem.h
$(Q) cp $(APPSINC)/zmodem.h $(HOSTAPPS)/zmodem.h $(Q) cp $(APPSINC)/zmodem.h $(HOSTAPPS)/zmodem.h
$(RZBIN): $(HOSTAPPS)/zmodem.h $(RZOBJS) $(CMNOBJS) $(RZBIN): $(HOSTAPPS)/zmodem.h $(RZOBJS) $(CMNOBJS)
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o $@ $(RZOBJS) $(CMNOBJS) $(Q) $(HOSTCC) $(HOSTCFLAGS) -o $@ $(RZOBJS) $(CMNOBJS) -lrt
$(SZBIN): $(HOSTAPPS)/zmodem.h $(SZOBJS) $(CMNOBJS) $(SZBIN): $(HOSTAPPS)/zmodem.h $(SZOBJS) $(CMNOBJS)
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o $@ $(SZOBJS) $(CMNOBJS) $(Q) $(HOSTCC) $(HOSTCFLAGS) -o $@ $(SZOBJS) $(CMNOBJS) -lrt
clean: clean:
ifneq ($(OBJEXT),) ifneq ($(OBJEXT),)

View File

@ -79,9 +79,11 @@ Using NuttX Zmodem with a Linux Host
overruns): overruns):
$ sudo stty -F /dev/ttyS0 9600 # Select 9600 BAUD $ sudo stty -F /dev/ttyS0 9600 # Select 9600 BAUD
$ sudo stty -F /dev/ttyS0 crtscts # Enables CTS/RTS handshaking $ sudo stty -F /dev/ttyS0 crtscts # Enables CTS/RTS handshaking *
$ sudo stty -F /dev/ttyS0 # Show the TTY configuration $ sudo stty -F /dev/ttyS0 # Show the TTY configuration
* Only is hardware flow control is enabled.
Start rz on the Linux host (using /dev/ttyS0 as an example): Start rz on the Linux host (using /dev/ttyS0 as an example):
$ sudo rz </dev/ttyS0 >/dev/ttyS0 $ sudo rz </dev/ttyS0 >/dev/ttyS0
@ -113,15 +115,21 @@ Using NuttX Zmodem with a Linux Host
Receiving Files on the Target from the Linux Host PC Receiving Files on the Target from the Linux Host PC
---------------------------------------------------- ----------------------------------------------------
NOTE: There are issues with using the Linux sz command with the NuttX
rz command. See "Status" below. It is recommended that you use the
NuttX sz command on Linux as described in the next paragraph.
To send a file to the target, first make sure that the serial port on the To send a file to the target, first make sure that the serial port on the
host is configured to work with the board (Assuming that you are using host is configured to work with the board (Assuming that you are using
9600 baud for the data transfers -- high rates may result in data 9600 baud for the data transfers -- high rates may result in data
overruns): overruns):
$ sudo stty -F /dev/ttyS0 9600 # Select 9600 BAUD $ sudo stty -F /dev/ttyS0 9600 # Select 9600 (or other) BAUD
$ sudo stty -F /dev/ttyS0 crtscts # Enables CTS/RTS handshaking $ sudo stty -F /dev/ttyS0 crtscts # Enables CTS/RTS handshaking *
$ sudo stty -F /dev/ttyS0 # Show the TTY configuration $ sudo stty -F /dev/ttyS0 # Show the TTY configuration
* Only is hardware flow control is enabled.
Start rz on the on the target. Here, in this example, we are using Start rz on the on the target. Here, in this example, we are using
/dev/ttyS1 to perform the transfer /dev/ttyS1 to perform the transfer
@ -169,20 +177,24 @@ Building the Zmodem Tools to Run Under Linux
2. Add CONFIG_DEBUG=1 to the make command line to enable debug output 2. Add CONFIG_DEBUG=1 to the make command line to enable debug output
3. Make sure to clean old target .o files before making new host .o files. 3. Make sure to clean old target .o files before making new host .o files.
This build is untested as of 2013-7-16. This build is has been verified as of 2013-7-16 using Linux to transfer
files with an Olimex LPC1766STK board. It works great and seems to solve
all of the problems found with the Linux sz/rz implementation.
Status Status
====== ======
2013-7-15: I have tested with the configs/olimex-lpc1766stk 2013-7-15: Testing against the Linux rz/sz commands.
configuration. I have been able to send large and small files with
the sz command. I have been able to receive small files, but there I have tested with the configs/olimex-lpc1766stk configuration. I
are problems receiving large files: The Linux SZ does not obey the have been able to send large and small files with the target sz
buffering limits and continues to send data while rz is writing command. I have been able to receive small files, but there are
the previously received data to the file and the serial driver's RX problems receiving large files using the Linux sz command: The
buffer is overrun by a few bytes while the write is in progress. Linux SZ does not obey the buffering limits and continues to send
As a result, when it reads the next buffer of data, a few bytes may data while rz is writing the previously received data to the file
be missing. The symptom of this missing data is a CRC check and the serial driver's RX buffer is overrun by a few bytes while
failure. the write is in progress. As a result, when it reads the next
buffer of data, a few bytes may be missing. The symptom of this
missing data is a CRC check failure.
Either (1) we need a more courteous host application, or (2) we Either (1) we need a more courteous host application, or (2) we
need to greatly improve the target side buffering capability! need to greatly improve the target side buffering capability!
@ -194,8 +206,26 @@ Status
the handshaking will solve the issues. Another option might be the handshaking will solve the issues. Another option might be
to fix the serial driver hardware flow control somehow. to fix the serial driver hardware flow control somehow.
2013-7-16: I have verified that with debug off and at lower serial 2013-7-16. More Testing against the Linux rz/sz commands.
BAUD (2400), the transfers of large succeed without errors. I do
I have verified that with debug off and at lower serial BAUD
(2400), the transfers of large files succeed without errors. I do
not consider this a "solution" to the problem. I also found that not consider this a "solution" to the problem. I also found that
the LPC17xx hardware flow control caused strange hangs; Zmodem the LPC17xx hardware flow control caused strange hangs; Zmodem
works better with hardware flow control disabled on the LPC17xx. works better with hardware flow control disabled on the LPC17xx.
At this lower BAUD, RX buffer sizes could probably be reduced; Or
perhaps the BAUD coud be increased. My thought, however, is that
tuning in such an unhealthy situation is not the approach: The
best thing to do would be to use the matching NuttX sz on the Linux
host side.
2013-7-16. More Testing against the NuttX rz/sz on Both Ends.
The NuttX sz/rz commands have been modified so that they can be
built and executed under Linux. In this case, there are no
transfer problems at all in either direction and with large or
small files. This configuration could probably run at much higher
serial speeds and with much smaller buffers (although that has not
been verified as of this writing).

View File

@ -41,6 +41,7 @@
****************************************************************************/ ****************************************************************************/
#include <nuttx/config.h> #include <nuttx/config.h>
#include <nuttx/compiler.h>
/**************************************************************************** /****************************************************************************
* Pre-processor Definitions * Pre-processor Definitions

View File

@ -121,6 +121,7 @@
/* Unknown compiler *********************************************************/ /* Unknown compiler *********************************************************/
#else #else
# warning Unknown Compiler
# undef CONFIG_CPP_HAVE_VARARGS # undef CONFIG_CPP_HAVE_VARARGS
# undef CONFIG_CPP_HAVE_WARNING # undef CONFIG_CPP_HAVE_WARNING

View File

@ -53,15 +53,20 @@
#define FAR #define FAR
#define DEBUGASSERT assert #define DEBUGASSERT assert
#define _GNU_SOURCE 1
/* Configuration */ /* Configuration */
#define CONFIG_SYSTEM_ZMODEM 1
#define CONFIG_SYSTEM_ZMODEM_DEVNAME "/dev/ttyS0" #define CONFIG_SYSTEM_ZMODEM_DEVNAME "/dev/ttyS0"
#define CONFIG_SYSTEM_ZMODEM_RCVBUFSIZE 512 #define CONFIG_SYSTEM_ZMODEM_RCVBUFSIZE 512
#define CONFIG_SYSTEM_ZMODEM_PKTBUFSIZE 1024 #define CONFIG_SYSTEM_ZMODEM_PKTBUFSIZE 1024
#define CONFIG_SYSTEM_ZMODEM_SNDBUFSIZE 512 #define CONFIG_SYSTEM_ZMODEM_SNDBUFSIZE 512
#define CONFIG_SYSTEM_ZMODEM_MOUNTPOINT "/tmp" #define CONFIG_SYSTEM_ZMODEM_MOUNTPOINT "/tmp"
#undef CONFIG_SYSTEM_ZMODEM_RCVSAMPLE #undef CONFIG_SYSTEM_ZMODEM_RCVSAMPLE
#undef CONFIG_SYSTEM_ZMODEM_SENDATTN #undef CONFIG_SYSTEM_ZMODEM_SENDATTN
#define CONFIG_SYSTEM_ZMODEM_ALWAYSSINT 1
#undef CONFIG_SYSTEM_ZMODEM_SENDBRAK
#define CONFIG_SYSTEM_ZMODEM_RESPTIME 10 #define CONFIG_SYSTEM_ZMODEM_RESPTIME 10
#define CONFIG_SYSTEM_ZMODEM_CONNTIME 30 #define CONFIG_SYSTEM_ZMODEM_CONNTIME 30
#define CONFIG_SYSTEM_ZMODEM_SERIALNO 1 #define CONFIG_SYSTEM_ZMODEM_SERIALNO 1

View File

@ -496,6 +496,8 @@ static int zms_zrinit(FAR struct zm_state_s *pzm)
else else
# endif # endif
{ {
zmdbg("ZMS_STATE %d->%d\n", pzm->state, );
pzm->state = ZMS_DONE;
return ZM_XFRDONE; return ZM_XFRDONE;
} }
#endif #endif

View File

@ -832,7 +832,7 @@ static int zm_parse(FAR struct zm_state_s *pzm, size_t rcvlen)
if (ret != OK) if (ret != OK)
{ {
zmdbg("Aborting: %d\n", ret); zmdbg("%s: %d\n", ret < 0 ? "Aborting" : "Done", ret);
return ret; return ret;
} }
} }