[U-Boot-Users] [PATCH 1/6] binupld
Robert Schwebel
robert at schwebel.de
Mon Dec 15 19:50:21 CET 2003
-------------- next part --------------
#
# Author: Robert Schwebel <r.schwebel at pengutronix.de>
#
# Description: Binary upload tool by Chris Hallinan
#
# State: 2003-12-09: submit
#
#
# Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher
#
--- /dev/null 1970-01-01 01:00:00.000000000 +0100
+++ u-boot-patches/tools/binupld.c 2003-12-09 18:59:59.000000000 +0100
@@ -0,0 +1,204 @@
+/* This utility downloads a binary file from Minicom to
+ * the serial port. It supports the Xon-Xoff software
+ * flow control protocol to use the highest possible speed
+ *
+ * (C) Copyright 2001, 2002 DS4.COM, Inc.
+ * Chris Hallinan clh at net1plus.com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ * To use this utility with Minicom, add the entry in Minicom's
+ * File Transfer Protocol as follows:
+ * Type Ctl-A, O (enter Configuration menu)
+ * Select File transfer protocols from menu
+ * Add the entry for binupld to look like the following (Item K)
+ *
+ * Name Program Name U/D FullScr IO-Red. Multi
+ * A zmodem /usr/bin/sz -vv -b Y U N Y Y
+ * B ymodem /usr/bin/sb -vv Y U N Y Y
+ * C xmodem /usr/bin/sx -vv Y U N Y N
+ * D zmodem /usr/bin/rz -vv -b -E N D N Y Y
+ * E ymodem /usr/bin/rb -vv N D N Y Y
+ * F xmodem /usr/bin/rx -vv Y D N Y N
+ * G kermit /usr/bin/kermit -i -l %l -s Y U Y N N
+ * H kermit /usr/bin/kermit -i -l %l -r N D Y N N
+ * I ascii /usr/bin/ascii-xfr -dsv Y U N Y N
+ * J srecdnld /usr/bin/srecdnl Y U N Y N
+ * K binupld /usr/bin/binupld Y U N Y N
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <asm/errno.h>
+
+#define BUFSZ 1024
+#define TXBLK_SIZE 32
+#define XON 0x11 /* ASCII DC1 character */
+#define XOFF 0x13 /* ASCII DC3 character */
+
+#define USE_STDERR
+#undef USE_STDOUT
+
+#ifdef USE_STDERR
+#define ERR_OUT stderr
+#else
+#define ERR_OUT err_fp
+#define ERR_DEVICE "/dev/pts/0"
+#endif
+
+#ifdef USE_STDOUT
+#define LINE_OUT stdout
+#else
+#define LINE_OUT tty_fp
+#endif
+
+int
+main(int argc, char **argv)
+{
+ int bin_fd, i, fsize, nResult, count;
+ struct stat fst;
+ char lbuf;
+ int stepval, done, xoff, msgbidx = 0;
+ fd_set rfds;
+ struct timeval tv;
+ static char msgbuf[2048];
+ static int got_xoff = 0;
+
+#ifndef USE_STDOUT
+ int LINE_OUT;
+#endif
+
+#ifndef USE_STDERR
+ FILE *ERR_OUT;
+
+ ERR_OUT = fopen(ERR_DEVICE, "w");
+ if (ERR_OUT == NULL) {
+ perror("Error opening error output device");
+ return -1;
+ }
+#endif
+
+#ifndef USE_STDOUT
+ LINE_OUT = open("/dev/ttyS0", O_RDWR);
+ if (LINE_OUT == 1) {
+ perror("Error opening serial output device");
+ return -1;
+ }
+#endif
+
+ if (argc != 2) {
+ fprintf(ERR_OUT, "Bad args\n");
+ return -1;
+ }
+
+ if (strlen(argv[1]) < 1) {
+ fprintf(ERR_OUT, "Bad file name\n");
+ return -1;
+ }
+
+ bin_fd = open(argv[1], O_RDONLY);
+ if (bin_fd == 1) {
+ perror("Open failed");
+ return -1;
+ }
+
+ /* Get file size */
+ i = fstat(bin_fd, &fst);
+ if (i == -1) {
+ perror("stat failed");
+ close(bin_fd);
+ return -1;
+ }
+ fsize = fst.st_size;
+ stepval = 100;
+
+ /* Now ready for the file transfer! */
+ fprintf(ERR_OUT, "\nUploading from %s --- xxxxxxx", argv[1]);
+
+ i = 0;
+ done = 0;
+ xoff = 0;
+ while (!done) {
+ if (!xoff) {
+ count = read(bin_fd, &lbuf, TXBLK_SIZE);
+ if (count == 0) {
+ done = 1;
+ break;
+ }
+
+ /* Write the output byte to tty port */
+ if (write(LINE_OUT, &lbuf, count) != count) {
+ fprintf(ERR_OUT,
+ "Aw shit, binary write failed\n");
+ return -1;
+ }
+ }
+
+#if 1 /* Delete if you don't need XON/XOFF spt */
+ /* Setup for watching serial line input */
+ FD_ZERO(&rfds);
+ FD_SET(LINE_OUT, &rfds);
+ /* Wait up to five hundred microseconds. */
+ tv.tv_sec = 0;
+ tv.tv_usec = 500;
+ nResult = select(LINE_OUT + 1, &rfds, NULL, NULL, &tv);
+ if (nResult == -1) {
+ perror("Select failed");
+ return -1;
+ }
+
+ if (nResult && FD_ISSET(LINE_OUT, &rfds)) {
+ char c = getchar();
+ /* Character received from serial port */
+ switch (c) {
+ case XOFF:
+ xoff = 1;
+ got_xoff = 1;
+ break;
+ case XON:
+ xoff = 0;
+ break;
+ default:
+ msgbuf[msgbidx++] = c;
+ /* fprintf(ERR_OUT, " Data [%02x]\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b", c); */
+ break;
+ }
+ }
+#endif
+
+ /* Display download progress */
+ i += count;
+ fprintf(ERR_OUT, "\b\b\b\b\b\b\b%07d", i);
+ }
+
+ fprintf(ERR_OUT, " - Done\n");
+ msgbuf[msgbidx] = '\0';
+ if (strlen(msgbuf))
+ fprintf(ERR_OUT, "Msgbuf: %s\n", msgbuf);
+
+ /* Report if we got an XOFF */
+ if (got_xoff)
+ fprintf(ERR_OUT, "Got XOFF\n");
+
+ close(bin_fd);
+ return 0;
+}
More information about the U-Boot
mailing list