Mercurial > nand-ecoscentric
changeset 1087:549ccefb35ed
Add RedBoot mcopy command
| author | msalter |
|---|---|
| date | Tue, 01 Jul 2003 16:25:22 +0000 |
| parents | f66c8d5a570d |
| children | 4c13726203c5 |
| files | packages/redboot/current/ChangeLog packages/redboot/current/cdl/redboot.cdl packages/redboot/current/doc/redboot_cmds.sgml packages/redboot/current/src/mcopy.c |
| diffstat | 4 files changed, 246 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/redboot/current/ChangeLog +++ b/packages/redboot/current/ChangeLog @@ -1,3 +1,9 @@ +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
--- a/packages/redboot/current/cdl/redboot.cdl +++ b/packages/redboot/current/cdl/redboot.cdl @@ -178,6 +178,13 @@ cdl_package CYGPKG_REDBOOT { 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
--- a/packages/redboot/current/doc/redboot_cmds.sgml +++ b/packages/redboot/current/doc/redboot_cmds.sgml @@ -1305,6 +1305,105 @@ Buffers don't match - 0x00100020=0x6000, </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>
new file mode 100644 --- /dev/null +++ b/packages/redboot/current/src/mcopy.c @@ -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 + );
