[Buildroot] svn commit: trunk/buildroot/target/u-boot/2009.01-rc1

ulf at uclibc.org ulf at uclibc.org
Sat Jan 3 00:03:32 UTC 2009


Author: ulf
Date: 2009-01-03 00:03:31 +0000 (Sat, 03 Jan 2009)
New Revision: 24654

Log:
Add X-Modem tools for minicom to u-boot allowing easy downloading of U-Boot

Added:
   trunk/buildroot/target/u-boot/2009.01-rc1/u-boot-2009.01-rc1-007-tools.patch


Changeset:
Added: trunk/buildroot/target/u-boot/2009.01-rc1/u-boot-2009.01-rc1-007-tools.patch
===================================================================
--- trunk/buildroot/target/u-boot/2009.01-rc1/u-boot-2009.01-rc1-007-tools.patch	                        (rev 0)
+++ trunk/buildroot/target/u-boot/2009.01-rc1/u-boot-2009.01-rc1-007-tools.patch	2009-01-03 00:03:31 UTC (rev 24654)
@@ -0,0 +1,576 @@
+diff -urN u-boot-2008.10-0rig//tools/Makefile u-boot-2008.10/tools/Makefile
+--- u-boot-2008.10-0rig//tools/Makefile	2008-12-31 17:51:29.000000000 +0100
++++ u-boot-2008.10/tools/Makefile	2008-12-31 19:38:15.000000000 +0100
+@@ -37,6 +37,11 @@
+ #OBJ_FILES	+= mpc86x_clk.o
+ #endif
+ 
++ifeq ($(VENDOR),atmel)
++BINS+= raw-at91$(SFX) sx-at91$(SFX)
++OBJS+= raw-at91.o sx-at91.o
++endif
++
+ LIBFDT_OBJ_FILES	= $(obj)fdt.o $(obj)fdt_ro.o $(obj)fdt_rw.o $(obj)fdt_strerror.o $(obj)fdt_wip.o
+ 
+ LOGO_H	= $(OBJTREE)/include/bmp_logo.h
+@@ -175,6 +180,14 @@
+ 		$(CC) $(CFLAGS) $(HOST_LDFLAGS) -o $@ $^
+ 		$(STRIP) $@
+ 
++$(obj)raw-at91$(SFX):	$(obj)raw-at91.o
++		$(CC) $(CFLAGS) $(HOST_LDFLAGS) -o $@ $^
++		$(STRIP) $@
++
++$(obj)sx-at91$(SFX):	$(obj)sx-at91.o
++		$(CC) $(CFLAGS) $(HOST_LDFLAGS) -o $@ $^
++		$(STRIP) $@
++
+ $(obj)envcrc.o:	$(src)envcrc.c
+ 		$(CC) -g $(CFLAGS) -c -o $@ $<
+ 
+@@ -223,6 +236,12 @@
+ $(obj)fdt_wip.o:	$(obj)fdt_wip.c
+ 		$(CC) -g $(FIT_CFLAGS) -c -o $@ $<
+ 
++$(obj)sx-at91.o:		$(src)sx-at91.c
++		$(CC) -g $(CFLAGS) -c -o $@ $<
++
++$(obj)raw-at91.o:	$(src)raw-at91.c
++		$(CC) -g $(CFLAGS) -c -o $@ $<
++
+ subdirs:
+ ifeq ($(TOOLSUBDIRS),)
+ 		@:
+diff -urN u-boot-2008.10-0rig//tools/raw-at91.c u-boot-2008.10/tools/raw-at91.c
+--- u-boot-2008.10-0rig//tools/raw-at91.c	1970-01-01 01:00:00.000000000 +0100
++++ u-boot-2008.10/tools/raw-at91.c	2008-12-31 19:26:23.000000000 +0100
+@@ -0,0 +1,225 @@
++/*
++ * xmodem-at91.c
++ *
++ * A simple program using xmodem/1kxmode upload file to at91rm9200 based board.
++ * Created by (C) Copyright 2004
++ * Linhang.Zhang, Jilin University of PR.China, linxing at jlu.edu.cn.
++ *
++ *************************************************************************************
++ *
++ * Modified 01-Feb-2005 (C)Copyright 2005
++ * Marco Cavallini, www.KoanSoftware.com - ITALY, m.cavallini at koansoftware.com
++ * - edited indentations and changed break usage in switch statement.
++ * - added "\r" to printf
++ *
++ * - build with 
++ *   gcc sx-at91.c -o sx-at91
++ *
++ * - Howto use this program with minicom/xminicom and AT91 
++ *   start minicom or xminicom
++ *   edit Options / File transfer protocol, 
++ *   add a name (for example J) like the following example
++ *
++ *   |     Name             Program                 Name U/D FullScr IO-Red. Multi  |
++ *   | A  zmodem     /usr/bin/sz -vv -b              Y    U    N       Y       Y    |
++ *   | B  ymodem     /usr/bin/sb -vv                 Y    U    N       Y       Y    |
++ *   | C  xmodem     /usr/bin/sx -vv                 Y    U    N       Y       N    |
++ *   | D  zmodem     /usr/bin/rz -vv -b -E           N    D    N       Y       Y    |
++ *   | E  ymodem     /usr/bin/rb -vv                 N    D    N       Y       Y    |
++ *   | F  xmodem     /usr/bin/rx -vv                 Y    D    N       Y       N    |
++ *   | G  kermit     /usr/bin/kermit -i -l %l -s     Y    U    Y       N       N    |
++ *   | H  kermit     /usr/bin/kermit -i -l %l -r     N    D    Y       N       N    |
++ *   | I  ascii      /usr/bin/ascii-xfr -dsv         Y    U    N       Y       N    |
++ *   | J  at91       /home/koan/xmodem/xs-at91       Y    U    Y       N       N    |
++ *   | K    -                                                                       |
++ *   | L    -                                                                       |
++ *
++ *   save and use it selecting at91 protocol when you start an Xmodem upload to AT91
++ *
++ *************************************************************************************
++ *
++ * This program 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 of
++ * the License, or (at your option) any later version.
++ *
++ * This program 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 this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++#include     <stdio.h>
++#include     <stdlib.h>
++#include     <string.h>
++#include     <unistd.h>
++#include     <sys/types.h>
++#include     <sys/stat.h>
++#include     <fcntl.h>
++#include     <termios.h>
++#include     <errno.h>
++#include     <time.h>
++
++#define	TRUE		1
++#define	FALSE		0
++#define LINESIZE	1024
++
++/*********/
++
++#define SERIAL_DEVICE "/dev/ttyS0"
++#define MYBAUDRATE B115200
++
++/***************SUB PROGRAM*******/
++
++int Initial_SerialPort(void)
++{
++	int fd;
++	struct termios options;
++
++	fd = open( SERIAL_DEVICE , O_RDWR | O_NOCTTY | O_NDELAY );
++	if ( fd == -1 )
++	{ 
++		/*open error!*/
++		perror("Can't open serial port!");
++		return -1;
++	}
++
++	/*Get the current options for the port...*/
++	tcgetattr(fd, &options);
++
++	/*Set the baud rates to BAUDRATE...*/
++	cfsetispeed(&options,MYBAUDRATE);
++	cfsetospeed(&options,MYBAUDRATE);
++	tcsetattr(fd, TCSANOW, &options);
++	if (0 != tcgetattr(fd, &options)) 
++	{
++		perror("SetupSerial 1");
++		return -1;
++	} 
++	
++	/*
++	 * 8bit Data,no partity,1 stop bit...
++	 */
++	options.c_cflag &= ~PARENB;
++	options.c_cflag &= ~CSTOPB;
++	options.c_cflag &= ~CSIZE;
++	options.c_cflag |= CS8;
++	tcflush(fd,TCIFLUSH);
++
++	/***Choosing Raw Input*/
++	options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
++	options.c_oflag &= ~OPOST; 
++
++	/*
++	 * Set the new options for the port...
++	 */
++	if (0 != tcsetattr(fd, TCSANOW, &options))
++	{
++ 		perror("SetupSerial error");
++ 		return -1 ;
++	}
++
++	return fd ;
++}
++
++/******************************/
++void ClearReceiveBuffer(int fd)
++{
++	unsigned char tmp;
++	while ((read(fd,&tmp,1))>0);
++	
++	return;
++}
++unsigned char filebuf[ LINESIZE+2 ];
++unsigned char outbuf[ LINESIZE+2 ];
++FILE *datafile;
++int fd;
++
++static	unsigned int	ChCnt=0;
++static	unsigned int	ChIx;
++unsigned char	GetChar(unsigned char *ch)
++/* 
++ * SUCCESS:	Return TRUE
++ * FAILURE:	Return FALSE
++ */
++{
++  
++  if(ChCnt == 0) {
++    ChCnt = fread( filebuf, sizeof(char), LINESIZE, datafile);
++    ChIx = 0;
++  }
++  if(ChCnt > 0) {
++    *ch = filebuf[ChIx++];
++    ChCnt--;
++    return TRUE;
++  } else {
++    return FALSE;	/* Reached End of File */
++  }
++}
++
++/********************************/
++void	delay()
++{
++}
++
++int main(int argc,char *argv[])
++{
++	char *data_file_name;
++	int	len;
++	unsigned char c;
++	int complete,i,sts;
++
++	printf("raw-at91 started...\r\n");
++	
++	/* open serial port1 */
++	if ( (fd = Initial_SerialPort()) == -1)  
++		return -1 ;
++
++	data_file_name = argv[1];
++
++	if((datafile=fopen(data_file_name,"rb"))==NULL)
++	{
++		perror ("Can't open file!");
++		return -1 ;
++	}
++
++	/*******************************/
++	
++	complete = 0;
++	/*	ClearReceiveBuffer(fd); */
++
++	/* while((read(fd,&ack_id,1))<=0);*/
++	
++	/* printf("%c\r\n",ack_id); */
++	while(!complete)
++	{
++	  for(i=0;i < LINESIZE; i++) {		/* A line more than 1024 characters will have problems...*/
++	    if((sts = GetChar(&outbuf[i]))) {
++	      /* Sts = Success */
++	      if((c = outbuf[i]) == '\n') {	/* Found end of Line - Start Processing*/
++		outbuf[i+1] = '\0';		/* Terminate String*/
++		break;
++	      }
++	    } else {
++	      /* Sts = Failure - End of File */
++	      outbuf[i] = '\n';
++	      outbuf[i+1] = '\0';
++	      complete = 1;
++	    }
++	  }
++	  printf("%s",outbuf);		/* Inform user */
++	  len = strlen((char *)outbuf);
++	  write(fd,outbuf,strlen((char *)outbuf));
++	  for(i = 0; i < 500000000; i++ ) delay();
++	  while((read(fd,&c,1))<=0) putchar(c);
++	  printf("  ");
++	}
++	fclose(datafile);
++	close(fd);
++	return 0;
++}
+diff -urN u-boot-2008.10-0rig//tools/sx-at91.c u-boot-2008.10/tools/sx-at91.c
+--- u-boot-2008.10-0rig//tools/sx-at91.c	1970-01-01 01:00:00.000000000 +0100
++++ u-boot-2008.10/tools/sx-at91.c	2008-12-31 19:26:23.000000000 +0100
+@@ -0,0 +1,300 @@
++/*
++ * xmodem-at91.c
++ *
++ * A simple program using xmodem/1kxmode upload file to at91rm9200 based board.
++ * Created by (C) Copyright 2004
++ * Linhang.Zhang, Jilin University of PR.China, linxing at jlu.edu.cn.
++ *
++ *************************************************************************************
++ *
++ * Modified 01-Feb-2005 (C)Copyright 2005
++ * Marco Cavallini, www.KoanSoftware.com - ITALY, m.cavallini at koansoftware.com
++ * - edited indentations and changed break usage in switch statement.
++ * - added "\r" to printf
++ *
++ * - build with 
++ *   gcc sx-at91.c -o sx-at91
++ *
++ * - Howto use this program with minicom/xminicom and AT91 
++ *   start minicom or xminicom
++ *   edit Options / File transfer protocol, 
++ *   add a name (for example J) like the following example
++ *
++ *   |     Name             Program                 Name U/D FullScr IO-Red. Multi  |
++ *   | A  zmodem     /usr/bin/sz -vv -b              Y    U    N       Y       Y    |
++ *   | B  ymodem     /usr/bin/sb -vv                 Y    U    N       Y       Y    |
++ *   | C  xmodem     /usr/bin/sx -vv                 Y    U    N       Y       N    |
++ *   | D  zmodem     /usr/bin/rz -vv -b -E           N    D    N       Y       Y    |
++ *   | E  ymodem     /usr/bin/rb -vv                 N    D    N       Y       Y    |
++ *   | F  xmodem     /usr/bin/rx -vv                 Y    D    N       Y       N    |
++ *   | G  kermit     /usr/bin/kermit -i -l %l -s     Y    U    Y       N       N    |
++ *   | H  kermit     /usr/bin/kermit -i -l %l -r     N    D    Y       N       N    |
++ *   | I  ascii      /usr/bin/ascii-xfr -dsv         Y    U    N       Y       N    |
++ *   | J  at91       /home/koan/xmodem/xs-at91       Y    U    Y       N       N    |
++ *   | K    -                                                                       |
++ *   | L    -                                                                       |
++ *
++ *   save and use it selecting at91 protocol when you start an Xmodem upload to AT91
++ *
++ *************************************************************************************
++ *
++ * This program 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 of
++ * the License, or (at your option) any later version.
++ *
++ * This program 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 this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++#include     <stdio.h>
++#include     <stdlib.h>
++#include     <unistd.h>
++#include     <sys/types.h>
++#include     <sys/stat.h>
++#include     <fcntl.h>
++#include     <termios.h>
++#include     <errno.h>
++#include     <time.h>
++
++/*
++Xmodem Frame form: <SOH><blk #><255-blk #><--128 data bytes--><CRC hi><CRC lo>
++*/
++
++#define XMODEM_SOH 0x01
++#define XMODEM_STX 0x02
++#define XMODEM_EOT 0x04
++#define XMODEM_ACK 0x06
++#define XMODEM_NAK 0x15
++#define XMODEM_CRC_CHR	'C'
++#define XMODEM_CRC_SIZE 2			/* Crc_High Byte + Crc_Low Byte */
++#define XMODEM_FRAME_ID_SIZE 2 /* Frame_Id + 255-Frame_Id */
++#define XMODEM_DATA_SIZE_SOH 128  /* for Xmodem protocol */
++#define XMODEM_DATA_SIZE_STX 1024 /* for 1K xmodem protocol */
++#define USE_1K_XMODEM 0  /* 1 for use 1k_xmodem 0 for xmodem */
++
++#if (USE_1K_XMODEM)
++	#define XMODEM_DATA_SIZE 	XMODEM_DATA_SIZE_STX
++	#define XMODEM_HEAD		XMODEM_STX
++#else
++	#define XMODEM_DATA_SIZE 	XMODEM_DATA_SIZE_SOH
++	#define XMODEM_HEAD 		XMODEM_SOH
++#endif
++/*********/
++
++#define SERIAL_DEVICE "/dev/ttyS0"
++#define MYBAUDRATE B115200
++
++/***************SUB PROGRAM*******/
++unsigned short GetCrc16 ( char *ptr, unsigned short count )
++{
++	unsigned short crc, i;
++
++	crc = 0;
++	while(count--)
++	{
++		crc = crc ^ (int) *ptr++ << 8;
++	
++		for(i = 0; i < 8; i++)
++		{
++			if(crc & 0x8000)
++				crc = crc << 1 ^ 0x1021;
++			else			
++				crc = crc << 1;
++		}
++	}
++
++	return (crc & 0xFFFF);
++}
++
++/*******************************/
++int Initial_SerialPort(void)
++{
++	int fd;
++	struct termios options;
++
++	fd = open( SERIAL_DEVICE , O_RDWR | O_NOCTTY | O_NDELAY );
++	if ( fd == -1 )
++	{ 
++		/*open error!*/
++		perror("Can't open serial port!");
++		return -1;
++	}
++
++	/*Get the current options for the port...*/
++	tcgetattr(fd, &options);
++
++	/*Set the baud rates to BAUDRATE...*/
++	cfsetispeed(&options,MYBAUDRATE);
++	cfsetospeed(&options,MYBAUDRATE);
++	tcsetattr(fd, TCSANOW, &options);
++	if (0 != tcgetattr(fd, &options)) 
++	{
++		perror("SetupSerial 1");
++		return -1;
++	} 
++	
++	/*
++	 * 8bit Data,no partity,1 stop bit...
++	 */
++	options.c_cflag &= ~PARENB;
++	options.c_cflag &= ~CSTOPB;
++	options.c_cflag &= ~CSIZE;
++	options.c_cflag |= CS8;
++	tcflush(fd,TCIFLUSH);
++
++	/***Choosing Raw Input*/
++	options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
++	options.c_oflag &= ~OPOST; 
++
++	/*
++	 * Set the new options for the port...
++	 */
++	if (0 != tcsetattr(fd, TCSANOW, &options))
++	{
++ 		perror("SetupSerial error");
++ 		return -1 ;
++	}
++
++	return fd ;
++}
++
++/******************************/
++void ClearReceiveBuffer(int fd)
++{
++	unsigned char tmp;
++	while ((read(fd,&tmp,1))>0);
++	
++	return;
++}
++
++/********************************/
++int main(int argc,char *argv[])
++{
++	int fd;
++	char *data_file_name;
++	char packet_data[ XMODEM_DATA_SIZE ];
++	char frame_data[ XMODEM_DATA_SIZE + XMODEM_CRC_SIZE + XMODEM_FRAME_ID_SIZE + 1 ];
++	FILE *datafile;
++	int complete,retry_num,pack_counter,read_number,write_number,i;
++	unsigned short crc_value;
++	unsigned char ack_id;
++
++	printf("sx-at91 started...\r\n");
++	
++	/* open serial port1 */
++	if ( (fd = Initial_SerialPort()) == -1)  
++		return -1 ;
++
++	data_file_name = argv[1];
++
++	if((datafile=fopen(data_file_name,"rb"))==NULL)
++	{
++		perror ("Can't open file!");
++		return -1 ;
++	}
++
++	/*******************************/
++	
++	pack_counter = 0;
++	complete = 0;
++	retry_num = 0;
++	ClearReceiveBuffer(fd);
++
++	while((read(fd,&ack_id,1))<=0);
++	
++	printf("%c\r\n",ack_id);
++	ack_id=XMODEM_ACK;
++	while(!complete)
++	{
++		switch(ack_id)
++		{
++		case XMODEM_ACK:
++			retry_num = 0;
++			pack_counter++;
++			read_number = fread( packet_data, sizeof(char), XMODEM_DATA_SIZE, datafile);
++			if(read_number>0)
++			{
++				if(read_number<XMODEM_DATA_SIZE_SOH)
++				{
++			
++					printf("Start filling the last frame!\r\n");
++					for(;read_number<XMODEM_DATA_SIZE;read_number++)
++						packet_data[read_number] = 0x00;
++				}
++				frame_data[0] = XMODEM_HEAD;
++				frame_data[1] = (char)pack_counter;
++				frame_data[2] = (char)(255-frame_data[1]);
++	
++				for(i=0;i<XMODEM_DATA_SIZE;i++)
++					frame_data[i+3]=packet_data[i];
++	
++				crc_value = GetCrc16(packet_data,XMODEM_DATA_SIZE);
++				frame_data[XMODEM_DATA_SIZE_SOH+3]=(unsigned char)(crc_value >> 8);
++				frame_data[XMODEM_DATA_SIZE_SOH+4]=(unsigned char)(crc_value);
++				write_number = write( fd, frame_data, XMODEM_DATA_SIZE_SOH + 5);
++				printf("waiting for ACK,%d,%d,...",pack_counter,write_number);
++				while((read(fd,&ack_id,1))<=0);
++			
++				if(ack_id == XMODEM_ACK)
++					printf("Ok!\r\n");
++				else
++					printf("Error!\r\n");
++			}
++			else
++			{
++				ack_id = XMODEM_EOT;
++				complete = 1;
++				printf("Waiting for complete ACK ...");
++			
++				while(ack_id != XMODEM_ACK)
++				{
++					ack_id = XMODEM_EOT;	
++					write_number=write(fd,&ack_id,1);
++					while((read(fd,&ack_id,1))<=0);
++				}
++				printf("OK\r\n");
++		
++				printf("Sending file complete\r\n");
++			}
++		break;
++
++		case XMODEM_NAK:
++			if( retry_num++ > 10) 
++			{
++				printf("Retry too many times,Quit!\r\n");
++				complete = 1;
++			}
++			else
++			{
++				write_number = write(fd,frame_data,XMODEM_DATA_SIZE + 5);
++				printf("Retry for ACK,%d,%d...",pack_counter,write_number);
++				while((read(fd,&ack_id,1))<=0);
++				
++				if( ack_id == XMODEM_ACK )
++					printf("OK\r\n");
++				else
++					printf("Error!\r\n");
++			}
++		break;
++
++		default:
++			printf("Fatal Error!\r\n");
++			complete = 1;
++		break;
++		}
++
++	}
++
++	fclose(datafile);
++	close(fd);
++
++	return 0;
++}



More information about the buildroot mailing list