📄 load_file.c
字号:
#include <string.h>
#include "xmodem.h"
#include "UART_printf.h"
#include "typedef.h"
#include "load_file.h"
unsigned int strtoul(char *str, char **endptr, int requestedbase, int *ret)
{
unsigned int num = 0;
char c;
__u8 digit;
int base = 10;
int nchars = 0;
int leadingZero = 0;
*ret = 0;
while ((c = *str) != 0) {
if (nchars == 0 && c == '0') {
leadingZero = 1;
UART_printf("strtoul(): leadingZero nchar=%d\n", nchars);
goto step;
} else if (leadingZero && nchars == 1) {
if (c == 'x') {
base = 16;
UART_printf("strtoul(): base 16 nchars=%d\n", nchars);
goto step;
} else if (c == 'o') {
base = 8;
UART_printf("strtoul(): base8 nchars=%d\n", nchars);
goto step;
}
}
UART_printf("strtoul: c=%c\n", c);
if (c >= '0' && c <= '9') {
digit = c - '0';
} else if (c >= 'a' && c <= 'z') {
digit = c - 'a' + 10;
} else if (c >= 'A' && c <= 'Z') {
digit = c - 'A' + 10;
} else {
*ret = 3;
return 0;
}
if (digit >= base) {
*ret = 4;
return 0;
}
num *= base;
num += digit;
step:
str++;
nchars++;
}
return num;
}
void load_ram(int argc, char **argv)
{
int ret;
char *buf = (char *)RAM_BASE;
size_t size;
__u32 retlen;
switch (argc) {
case 2: /* load file to RAM_BASE */
buf = (char *)RAM_BASE;
size = 0;
if ( (strcmp( "x", argv[1] ) != 0) && (strcmp( "y", argv[1] ) != 0) && (strcmp( "z", argv[1] ) != 0) )
goto error_parse_arg;
break;
case 3:
buf = (char *)strtoul(argv[1], NULL, 0, &ret);
if (ret)
goto error_parse_arg;
size = 0;
if ( (strcmp( "x", argv[2] ) != 0) && (strcmp( "y", argv[2] ) != 0) && (strcmp( "z", argv[2] ) != 0) )
goto error_parse_arg;
break;
case 4:
buf = (char *)strtoul(argv[1], NULL, 0, &ret);
if (ret)
goto error_parse_arg;
size = (size_t)strtoul(argv[2], NULL, 0, &ret);
if (ret)
goto error_parse_arg;
if ( (strcmp( "x", argv[3] ) != 0) && (strcmp( "y", argv[3] ) != 0) && (strcmp( "z", argv[3] ) != 0) )
goto error_parse_arg;
break;
default:
UART_printf("invalid 'load ram' command: too few or many arguments\n");
return;
}
retlen = xmodem_receive(buf, size );
if (retlen == 0)
goto error_download;
UART_printf("downloaed file at %x, size = %d bytes\n", buf, retlen);
return;
error_parse_arg:
UART_printf("Can't parsing argumets.\n");
error_download:
UART_printf("Failed downloading file.\n");
return;
}
void load_flash(int argc, char **argv)
{
/*int ret;
loff_t to;
char *buf = (char *)RAM_BASE;
size_t size;
__u32 retlen;
int modem;
mtd_partition_t *dst_part;
int flag;
if (argc != 4 && argc != 3) {
UART_printf("invalid 'load flash' command: too few or many arguments\n");
}
if (argc == 3) {
dst_part = get_mtd_partition(argv[1]);
if (dst_part == NULL) {
UART_printf("Could not found \"%s\" partition\n", argv[1]);
return;
}
to = dst_part->offset;
size = dst_part->size;
flag = dst_part->flag;
modem = modem_is(argv[2]);
} else {
to = strtoul(argv[1], NULL, 0, &ret);
if (ret) goto error_parse_arg;
size = (size_t)strtoul(argv[2], NULL, 0, &ret);
if (ret) goto error_parse_arg;
modem = modem_is(argv[3]);
flag = 0;
}
retlen = xmodem_receive(buf, size );
// hacked by nandy. delay for serial output
{ int i = 0x10000; while (i > 0) i--; }
if (retlen == 0) {
UART_printf("Failed downloading file\n");
return;
}
UART_printf("Downloaded file at 0x%08lx, size = %d bytes\n", buf, retlen);
if (retlen > size) {
UART_printf("An image size is too large to write flash.
wanted = 0x%08lx, loaded = 0x%08lx\n", size, retlen);
return;
}
ret = write_to_flash(to, retlen, buf, flag);
return;
error_parse_arg:
UART_printf("Can't parsing argumets\n");
return;*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -