diff options
author | Wolfram Sang <w.sang@pengutronix.de> | 2011-06-03 09:32:56 +0000 |
---|---|---|
committer | Wolfram Sang <w.sang@pengutronix.de> | 2011-06-03 09:32:56 +0000 |
commit | 0407136054a26e2636ae2875313aa5fd884a93af (patch) | |
tree | 2220869e99ac0ac97083cbe96bd7ca79263db76f | |
parent | 209736af44aa332a8f62ecfb86b9786d58b9044c (diff) | |
download | memedit-0407136054a26e2636ae2875313aa5fd884a93af.tar.gz memedit-0407136054a26e2636ae2875313aa5fd884a93af.tar.xz |
memedit: add mf (memory fill) function
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
-rw-r--r-- | memedit.l | 6 | ||||
-rw-r--r-- | memedit.y | 33 |
2 files changed, 38 insertions, 1 deletions
@@ -117,7 +117,7 @@ printenv { return ENV; } -m[dm](\.[biw])* { +m[dmf](\.[biw])* { if (strlen (yytext) == 2) yylval.val = 4; else switch (*(yytext + 3)) { case 'b': yylval.val = 1; break; @@ -129,6 +129,10 @@ m[dm](\.[biw])* { if (debug > 4) printf ("MD %ld-bit\n",yylval.val*8); return MD; } + else if (*(yytext + 1) == 'f') { + if (debug > 4) printf ("MF %ld-bit\n",yylval.val*8); + return MF; + } else { if (debug > 4) printf ("MM %ld-bit\n",yylval.val*8); return MM; @@ -35,6 +35,7 @@ variable *vlist; void set_variable (char *param, int val); int get_variable (char *param); int hex_output (unsigned long offset, unsigned long len, unsigned long count); +int fill_mem (int offset, int len, int count, int val); void print_help (void); extern void yyerror (const char *s); @@ -66,6 +67,7 @@ char *tptr; %left <val> UNMAP %left <val> MD %left <val> MM +%left <val> MF %left <val> EQ %left <val> AT %token <val> EXIT @@ -192,6 +194,12 @@ mem: MD { else printf ("no region mapped\n"); } + | MF num num num { + if (mem) + fill_mem($2, $1, $3, $4); + else + printf ("no region mapped\n"); + } | MM { printf ("mm <offset> <value1> [<value2> ...]\n"); } | mm exp ; @@ -253,6 +261,7 @@ void print_help (void) { printf ("md [[@]<start> [<length>]] mem display from current position\n"); printf (" or from <start> for <length>\n"); printf ("mm <offset> <val1> .. <valN> modify from value <offset>\n"); + printf ("mf <start> <length> <value> fill from <offset> for <length> with <value>\n"); printf ("env print all currently defined variables\n"); printf ("<var> = <expr> set variable <var> to <expr>\n"); printf ("<var> print variable <var>\n"); @@ -390,6 +399,30 @@ int hex_output (unsigned long offset, unsigned long len, unsigned long count) { } } +int fill_mem (int offset, int len, int count, int val) { + + int i; + + for (i = offset; i < offset + count; i += len) { + switch (len) { + case 1: + val &= 0xff; + *(volatile unsigned char *)(mem + i) = val; + break; + case 2: + val &= 0xffff; + *(volatile unsigned short *)(mem + i) = val; + break; + case 4: + *(volatile unsigned long *)(mem + i) = val; + break; + } + + } + + return 0; +} + int yylex (void) { in_line++; return zzlex (); |