This is the mail archive of the
ecos-patches@sources.redhat.com
mailing list for the eCos project.
Add mcopy command to RedBoot
- From: Mark Salter <msalter at redhat dot com>
- To: ecos-patches at sources dot redhat dot com
- Date: Tue, 1 Jul 2003 12:26:38 -0400 (EDT)
- Subject: Add mcopy command to RedBoot
RedBoot already has a memory fill, dump, and compare, so I added
a copy for completeness.
--Mark
Index: redboot/current/ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/redboot/current/ChangeLog,v
retrieving revision 1.115
diff -u -p -5 -r1.115 ChangeLog
--- redboot/current/ChangeLog 26 Jun 2003 05:34:51 -0000 1.115
+++ redboot/current/ChangeLog 1 Jul 2003 16:24:23 -0000
@@ -1,5 +1,11 @@
+2003-07-01 Mark Salter <msalter@redhat.com>
+
+ * cdl/redboot.cdl (CYGBLD_BUILD_REDBOOT_WITH_MCOPY): New option.
+ * src/mcopy.c: New file adding mcopy command.
+ * doc/redboot_cmds.sgml: Add mcopy.
+
2003-06-26 Jonathan Larmour <jifl@eCosCentric.com>
* doc/redboot_installing.sgml: Clarify use of correct cables with
serial ports with AT91 boards.
Index: redboot/current/cdl/redboot.cdl
===================================================================
RCS file: /cvs/ecos/ecos/packages/redboot/current/cdl/redboot.cdl,v
retrieving revision 1.49
diff -u -p -5 -r1.49 redboot.cdl
--- redboot/current/cdl/redboot.cdl 20 May 2003 18:43:51 -0000 1.49
+++ redboot/current/cdl/redboot.cdl 1 Jul 2003 16:24:23 -0000
@@ -176,10 +176,17 @@ cdl_package CYGPKG_REDBOOT {
doc ref/mcmp-command.html
default_value 1
compile -library=libextras.a mcmp.c
}
+ cdl_option CYGBLD_BUILD_REDBOOT_WITH_MCOPY {
+ display "Include memory copy command"
+ doc ref/mcopy-command.html
+ default_value 1
+ compile -library=libextras.a mcopy.c
+ }
+
cdl_option CYGBLD_BUILD_REDBOOT_WITH_DUMP {
display "Include memory dump command"
doc ref/dump-command.html
default_value 1
compile -library=libextras.a dump.c
Index: redboot/current/doc/redboot_cmds.sgml
===================================================================
RCS file: /cvs/ecos/ecos/packages/redboot/current/doc/redboot_cmds.sgml,v
retrieving revision 1.7
diff -u -p -5 -r1.7 redboot_cmds.sgml
--- redboot/current/doc/redboot_cmds.sgml 26 Jun 2003 05:29:45 -0000 1.7
+++ redboot/current/doc/redboot_cmds.sgml 1 Jul 2003 16:24:24 -0000
@@ -1303,10 +1303,109 @@ Buffers don't match - 0x00100020=0x6000,
</screen>
</para>
</refsect1>
</refentry>
+<!-- ******** mcopy *************************************************** -->
+ <refentry id="mcopy-command">
+ <refnamediv>
+ <refname>mcopy</refname>
+ <refpurpose>Copy memory</refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>mcopy</command>
+ <arg choice="req">-s <replaceable>source</replaceable></arg>
+ <arg choice="req">-d <replaceable>destination</replaceable></arg>
+ <arg choice="req">-l <replaceable>length</replaceable></arg>
+ <group>
+ <arg>-1</arg>
+ <arg>-2</arg>
+ <arg>-4</arg>
+ </group>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+ <refsect1>
+ <title>Arguments</title>
+ <informaltable frame="all">
+ <tgroup cols="4" colsep="1" rowsep="1" align="left">
+ <colspec colname="c1">
+ <colspec colname="c2">
+ <colspec colname="c3">
+ <colspec colname="c4">
+ <thead>
+ <row>
+ <entry>Name</entry>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ <entry>Default</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>-s <replaceable>location1</replaceable></entry>
+ <entry>Memory address</entry>
+ <entry>Location of data to copy.</entry>
+ <entry><emphasis>none</emphasis></entry>
+ </row>
+ <row>
+ <entry>-d <replaceable>location2</replaceable></entry>
+ <entry>Memory address</entry>
+ <entry>Destination for copied data.</entry>
+ <entry><emphasis>none</emphasis></entry>
+ </row>
+ <row>
+ <entry>-l <replaceable>length</replaceable></entry>
+ <entry>Number</entry>
+ <entry>Length of data</entry>
+ <entry><emphasis>none</emphasis></entry>
+ </row>
+ <row>
+ <entry>-1</entry>
+ <entry></entry>
+ <entry>Copy one byte (8 bits) at a time.</entry>
+ <entry>-4</entry>
+ </row>
+ <row>
+ <entry>-2</entry>
+ <entry></entry>
+ <entry>Copy two bytes (16 bits) at a time.</entry>
+ <entry>-4</entry>
+ </row>
+ <row>
+ <entry>-4</entry>
+ <entry></entry>
+ <entry>Copy one word (32 bits) at a time.</entry>
+ <entry>-4</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </refsect1>
+ <refsect1>
+ <title>Description</title>
+ <para>Copies memory (RAM, ROM, FLASH, etc) from one area to another.</para>
+ </refsect1>
+ <refsect1>
+ <title>Examples</title>
+ <para>
+Copy 16 bits at a time.
+<screen>
+RedBoot> <userinput>mfill -b 0x100000 -l 0x20 -2 -p 0xDEAD</userinput>
+RedBoot> <userinput>mfill -b 0x200000 -l 0x20 -2 -p 0x0</userinput>
+RedBoot> <userinput>dump -b 0x200000 -l 0x20 -2</userinput>
+00200000: 0000 0000 0000 0000 0000 0000 0000 0000
+00200010: 0000 0000 0000 0000 0000 0000 0000 0000
+RedBoot> <userinput>mcopy -s 0x100000 -d 0x200000 -2 -l 0x20</userinput>
+RedBoot> <userinput>dump -b 0x200000 -l 0x20 -2</userinput>
+00200000: DEAD DEAD DEAD DEAD DEAD DEAD DEAD DEAD
+00200010: DEAD DEAD DEAD DEAD DEAD DEAD DEAD DEAD
+</screen>
+</para>
+ </refsect1>
+ </refentry>
+
<!-- ******** mfill *************************************************** -->
<refentry id="mfill-command">
<refnamediv>
<refname>mfill</refname>
<refpurpose>Fill RAM with a specified pattern</refpurpose>
Index: redboot/current/src/mcopy.c
===================================================================
RCS file: redboot/current/src/mcopy.c
diff -N redboot/current/src/mcopy.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ redboot/current/src/mcopy.c 1 Jul 2003 16:24:24 -0000
@@ -0,0 +1,134 @@
+//==========================================================================
+//
+// mcopy.c
+//
+// RedBoot memory copy (mcopy) routine
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc.
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): msalter
+// Contributors: msalter
+// Date: 2003-07-01
+// Purpose:
+// Description:
+//
+// This code is part of RedBoot (tm).
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <redboot.h>
+
+static void
+do_mcopy(int argc, char *argv[])
+{
+ struct option_info opts[6];
+ unsigned long src, dst, len, end;
+ bool src_set, dst_set, len_set;
+ bool sz32, sz16, sz8;
+ int incr = 1;
+
+ init_opts(&opts[0], 's', true, OPTION_ARG_TYPE_NUM,
+ (void **)&src, (bool *)&src_set, "base address");
+ init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
+ (void **)&len, (bool *)&len_set, "length");
+ init_opts(&opts[2], 'd', true, OPTION_ARG_TYPE_NUM,
+ (void **)&dst, (bool *)&dst_set, "base address");
+ init_opts(&opts[3], '4', false, OPTION_ARG_TYPE_FLG,
+ (void *)&sz32, (bool *)0, "copy 32 bit data");
+ init_opts(&opts[4], '2', false, OPTION_ARG_TYPE_FLG,
+ (void **)&sz16, (bool *)0, "copy 16 bit data");
+ init_opts(&opts[5], '1', false, OPTION_ARG_TYPE_FLG,
+ (void **)&sz8, (bool *)0, "copy 8 bit data");
+ if (!scan_opts(argc, argv, 1, opts, 6, 0, 0, "")) {
+ return;
+ }
+
+ // Must have src, dst, len. No more than one size specifier.
+ if (!src_set || !dst_set || !len_set || (sz32 + sz16 + sz8) > 1) {
+ diag_printf("usage: mcopy -s <addr> -d <addr> -l <length> [-1|-2|-4]\n");
+ return;
+ }
+
+ // adjust incr and len for data size
+ if (sz16) {
+ len = (len + 1) & ~1;
+ incr = 2;
+ } else if (sz32 || !sz8) {
+ len = (len + 3) & ~3;
+ incr = 4;
+ }
+
+ end = src + len;
+
+ // If overlapping areas, must copy backwards.
+ if (dst > src && dst < (src + len)) {
+ end = src - incr;
+ src += (len - incr);
+ dst += (len - incr);
+ incr = -incr;
+ }
+
+ if (sz8) {
+ while (src != end) {
+ *(cyg_uint8 *)dst = *(cyg_uint8 *)src;
+ src += incr;
+ dst += incr;
+ }
+ } else if (sz16) {
+ while (src != end) {
+ *(cyg_uint16 *)dst = *(cyg_uint16 *)src;
+ src += incr;
+ dst += incr;
+ }
+ } else {
+ // Default - 32 bits
+ while (src != end) {
+ *(cyg_uint32 *)dst = *(cyg_uint32 *)src;
+ src += incr;
+ dst += incr;
+ }
+ }
+}
+
+
+RedBoot_cmd("mcopy",
+ "Copy memory from one address to another",
+ "-s <location> -d <location> -l <length> [-1|-2|-4]",
+ do_mcopy
+ );