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

📄 xmodem.c

📁 基于arm7s3c2410开发板的bootloader的设计与实现源代码 采用汇编语言和C语言编写
💻 C
字号:
/* * vivi/deriver/serialxmodem.c: *     - an implementation of the xmodem protocol from the spec. * * Based on bootldr/xmodem.c (C) 2000 Compaq Computer Coporation. * * Copyright (C) 2001 MIZI Research, Inc. * * * 1999-01-xx: Edwin Foo <efoo@crl.dec.com> *    - Initial code * * 2001-10-04: Janghoon Lyu <nandy@mizi.com> *    - Modified a little bit. * * 2002-07-04: Janghoon Lyu <nandy@mizi.com> *    - get_param_value() 牢磐其捞胶啊 官差绢辑 捞俊 嘎霸 荐沥. */#include "xmodem.h"#include "led_api.h"/* global error variable */char *xmodem_errtxt = NULL;int get_byte_err = 0;U8 volatile receive_buffer[BLOCK_SIZE];long download_addr = 0x8000;/* prototypes of helper functions */int get_record(void);U8 get_byte(void);enum{	SAC_SEND_NAK = 0,	SAC_SENT_NAK = 1,	SAC_PAST_START_NAK = 2};static volatile int seen_a_char = SAC_SEND_NAK;static int one_nak = 0;static unsigned long xmodem_timeout = GET_BYTE_TIMEOUT;char debugbuf[4096];int db_idx = 0;#if 0void bufputs(char *s){	int len = my_strlen(s) + 1;	if (len + db_idx > sizeof(debugbuf))		len = sizeof(debugbuf) - db_idx;	if (len) {		my_memcpy(&debugbuf[db_idx], s, len);		db_idx += len;	}}void reset_debugbuf(void){	my_memset(debugbuf, 0x2a, sizeof(debugbuf));	db_idx = 0;}#endifvoid delay(){	int j;	for (j = 0; j < 20000000; j++)		;}U32 xmodem_receive(void){	char ochr;	int r = 0, rx_block_num = 0, error_count = 0;	U32 foffset = 0;	int i;	int ret;	char nak = NAK;	int j = 50000;	xmodem_errtxt = NULL;	seen_a_char = 0;#if 0	one_nak = get_param_value("xmodem_one_nak", &ret);	if (ret) one_nak = 0;	xmodem_timeout = get_param_value("xmodem_initial_timeout", &ret);	if (ret) xmodem_timeout = GET_BYTE_TIMEOUT;#endif	delay();	uart_putchar(UART0_BASE, nak);		rx_block_num = 1;	/* times to retry */	error_count = RETRIES;	do {		/* when local block number equals to the block number in the packet,			store the data into the memory which download_addr points*/		if ((r = get_record()) == (rx_block_num & 255)) {			error_count = RETRIES;			for (i = 0; i <BLOCK_SIZE; i++)				*(U8 *)(download_addr+foffset+i) = receive_buffer[i];			xmodem_errtxt = "RX PACKET";			rx_block_num++;			ochr = ACK;			foffset += BLOCK_SIZE;		} else {			switch (r) {			case -1: /* TIMEOUT */				xmodem_errtxt = "TIMEOUT";				ochr = NAK;				break;			case -2: /* Bad block */				xmodem_errtxt = "BAD BLOCK#";				/* eat teh rest of the block */#if 0				get_byte_err = 0;				while (get_byte_err != -1) get_byte();#endif				ochr = NAK;				break;			case -3: /* Bad checksum */				xmodem_errtxt = "BAD CHKSUM";				ochr = NAK;				break;			case -4: /* End of file */				xmodem_errtxt = "DONE";				ochr = ACK;				break;			case -5: /* Cancel */				xmodem_errtxt = "ABORTED";				ochr = ACK;				break;			default: /* Block out of sequence */				xmodem_errtxt = "WRONG BLK";				ochr = NAK;			}			error_count--;		}		/**/		uart_putchar(UART0_BASE, ochr);	} while ((r > -3) && error_count);	if ((!error_count) || (r != -4)) {		foffset = 0;	/* indicate failure to caller */		/*printk("x-modem error: %s\n", xmodem_errtxt); */	}	return foffset;}/* * Read a record in the XMODEM protocol, return the block number * (0-255) if successful, or one of the following return codes: * 	-1 = Bad byte * 	-2 = Bad block number * 	-3 = Bad block checksum * 	-4 = End of file * 	-5 = Canceled by remote */int get_record(void){	char c; 	int block_num = 0;	int i;	U32 check_sum;	/* clear the buffer */	for (i = 0; i < BLOCK_SIZE; i++)		receive_buffer[i] = 0x00;	check_sum = 0;	/* initialize i to -2,when begin to transfer,the first byte	   will be store into blcok_num,and after plused one,the next	   byte will be treated as a negated section */	i = -2;	uart_getchar( UART0_BASE, &c);	switch (c) 	{		case SOH:	/* Receive packet */			for (;;) 			{				uart_getchar( UART0_BASE, &c);				switch (i) 				{					case -2: 						block_num = c;						break;									case -1:#if 0#ifdef CHECK_NEGATED_SECTNUM				if (c != (-block_num -1))					return -2;#endif#endif						break;					case BLOCK_SIZE:					/* check if reveived data is correct,				   	when correct,block num is returned,				  	 else -3 is returned */						if ((check_sum & 0xff) != c)							return -3;						else							return block_num;						break;										default:					/* save data to buffer,and accumulate to check_sum */						receive_buffer[i] = c;						check_sum += c;				}				i++;			}	case EOT:	/* end of file encountered */		return -4;	case CAN:	/* cancel protocol */		return -5;	default:		return -5;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -