This is the mail archive of the ecos-patches@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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
+    );


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]