⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 load_file.c

📁 s3c2440的LCD控制器驱动程序 ps 无操作系统的情况
💻 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 + -