Mercurial > ecos
diff packages/hal/arm/edb7xxx/current/support/dl_edb7xxx.c @ 54:f10165814f1e ecos-sw-1999-11-19
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
| author | jlarmour |
|---|---|
| date | Fri, 19 Nov 1999 23:37:56 +0000 |
| parents | |
| children | 3836136e7743 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/hal/arm/edb7xxx/current/support/dl_edb7xxx.c @@ -0,0 +1,411 @@ +//**************************************************************************** +// +// DOWNLOAD.C - Automates the download of code into the flash on the +// CL-PS7111-DK-D2 board. +// +// Copyright (c) 1999 Cirrus Logic, Inc. +// +// Adapted for Linux by Cygnus Solutions, Inc. +// Renamed 'dl_edb7xxx' to indicate support for all Cirrus Logic eval boards. +// +//**************************************************************************** +#include <stdio.h> +#include "bootcode.h" + +#define DEFAULT_PORT "/dev/ttyS1" +extern char ReceiveChar(long); +extern void SendChar(long, char); +extern void SetBaud(long, long); +extern int CharRead(long port); +extern void WaitForOutputReady(long port); +extern long OpenPort(char *); + +//**************************************************************************** +// +// WaitFor waits until a specific character is read from the comm port. +// +//**************************************************************************** +void +WaitFor(long lPort, char cWaitChar) +{ + char cChar; + + // + // Wait until we read a specific character from the comm port. + // + while(1) + { + // + // Read a character. + // + cChar = ReceiveChar(lPort); + + // + // Stop waiting if we received the character. + // + if(cChar == cWaitChar) + { + break; + } + } +} + +//**************************************************************************** +// +// This program waits for the '<' character from the boot ROM, sends the boot +// code, waits for the '>' from the boot ROM, waits for the '?' from the boot +// code, changes the serial port rate (preferably to 115200), downloads the +// user data file, and then prints out progress status as the boot code writes +// the user data file to the flash. +// +//**************************************************************************** +void +main(int argc, char *argv[]) +{ + long lPort; + long lRate = 38400; + long lFileSize, lIdx; + char cChar, cFirstChar, *pcFile, cRateChar; + FILE *pFile; + + // + // Make sure that a filename was specified. + // + if(argc < 2) + { + fprintf(stderr, "Usage: %s <filename> {<baud rate> {<comm port>}}\n", argv[0]); + return; + } + + // + // If a baud rate was specified, then read it and make sure it is valid. + // + if(argc > 2) + { + lRate = atoi(argv[2]); + if((lRate != 9600) && (lRate != 19200) && (lRate != 28800) && + (lRate != 38400) && (lRate != 57600) && (lRate != 115200)) + { + fprintf(stderr, "Invalid baud rate: %d(%s).\n", lRate, argv[2]); + return; + } + } + + // + // If a comm port was specified, then read it and make sure it is valid. + // + if(argc > 3) + { + lPort = OpenPort(argv[3]); + } else + { + lPort = OpenPort(DEFAULT_PORT); + } + if (lPort < 0) + { + fprintf(stderr, "Can't open port: %s\n", argv[3]); + return; + } + + // + // Open the file to be downloaded. + // + pFile = fopen(argv[1], "rb"); + if(!pFile) + { + fprintf(stderr, "Could not open file '%s'.\n", argv[1]); + return; + } + + // + // Get the size of the file. + // + fseek(pFile, 0, SEEK_END); + lFileSize = ftell(pFile); + fseek(pFile, 0, SEEK_SET); + + // + // Allocate memory to hold the file contents. + // + pcFile = (char *)malloc(lFileSize); + if(!pcFile) + { + fprintf(stderr, "Failed to allocate memory for the file.\n"); + return; + } + + // + // Read the contents of the file into memory. + // + if(fread(pcFile, 1, lFileSize, pFile) != lFileSize) + { + fprintf(stderr, "Failed to read file '%s'.\n", argv[1]); + return; + } + + // + // Close the file. + // + fclose(pFile); + + // + // Get the baud rate divisor for the given baud rate. + // + SetBaud(lPort, 9600); + switch(lRate) + { + case 9600: + { + cRateChar = '0'; + break; + } + + case 19200: + { + cRateChar = '1'; + break; + } + + case 28800: + { + cRateChar = '2'; + break; + } + + case 38400: + { + cRateChar = '3'; + break; + } + + case 57600: + { + cRateChar = '4'; + break; + } + + case 115200: + { + cRateChar = '5'; + break; + } + } + + // + // Empty out the input queue. + // + while(CharReady(lPort)) + { + cChar = ReceiveChar(lPort); + } + + // + // Tell the user to reset the board. + // + fprintf(stderr, "Waiting for the board to wakeup..."); + + // + // Wait until we read a '<' from the comm port. + // + WaitFor(lPort, '<'); + + // + // Tell the user that we are downloading the boot code. + // + fprintf(stderr, "\nDownloading boot code...( 0%%)"); + + // + // Write the boot code to the comm port. + // + for(lIdx = 0; lIdx < 2048; lIdx++) + { + // + // Write this character. + // + SendChar(lPort, pcBoot[lIdx]); + + // + // Periodically print out our progress. + // + if((lIdx & 127) == 127) + { + fprintf(stderr, "\b\b\b\b\b%3d%%)", ((lIdx + 1) * 100) / 2048); + } + } + + // + // Wait until we read a '>' from the comm port. + // + WaitFor(lPort, '>'); + + // + // Wait until we read a '?' from the comm port. + // + WaitFor(lPort, '?'); + + // + // Tell the boot code to switch to the desired baud rate. + // + SendChar(lPort, 'B'); + SendChar(lPort, cRateChar); + + // + // Wait until the output buffer is empty. + // + WaitForOutputEmpty(); + + // + // Switch our baud rate to the desired rate. + // + SetBaud(lPort, lRate); + + // + // Send a '-' character until we receive back a '?' character. + // + while(1) + { + // + // Send a '-' character. + // + SendChar(lPort, '-'); + + // + // Wait a little bit. + // + for(lIdx = 0; lIdx < 1024 * 1024; lIdx++) + { + } + + // + // See if there is a character waiting to be read. + // + if(CharReady(lPort)) + { + // + // Read the character. + // + cChar = ReceiveChar(lPort); + + // + // Quit waiting if this is a '?'. + // + if(cChar == '?') + { + break; + } + } + } + + // + // Empty out the input queue. + // + while(CharReady(lPort)) + { + cChar = ReceiveChar(lPort); + } + + // + // Send the program flash command. + // + SendChar(lPort, 'F'); + + // + // We always program the flash at location 0. + // + SendChar(lPort, 0); + SendChar(lPort, 0); + SendChar(lPort, 0); + SendChar(lPort, 0); + + // + // Send the length of the data file. + // + SendChar(lPort, (char)(lFileSize & 0xFF)); + SendChar(lPort, (char)((lFileSize >> 8) & 0xFF)); + SendChar(lPort, (char)((lFileSize >> 16) & 0xFF)); + SendChar(lPort, (char)((lFileSize >> 24) & 0xFF)); + + // + // Tell the user that we are downloading the file data. + // + fprintf(stderr, "\nDownloading file data...( 0%%)"); + + // + // Send the actual data in the file. + // + for(lIdx = 0; lIdx < lFileSize; lIdx++) + { + // + // Send this byte. + // + SendChar(lPort, pcFile[lIdx]); + + // + // Periodically print out our progress. + // + if((lIdx & 127) == 127) + { + fprintf(stderr, "\b\b\b\b\b%3d%%)", ((lIdx + 1) * 100) / lFileSize); + } + } + + // + // Tell the user that we are erasing the flash. + // + fprintf(stderr, "\nErasing the flash...( 0%%)"); + + // + // Wait until the flash has been erased. + // + cFirstChar = cChar = ReceiveChar(lPort); + while(cChar != '1') + { + // + // Print out our progress. + // + fprintf(stderr, "\b\b\b\b\b%3d%%)", + ((cFirstChar - cChar + 1) * 100) / (cFirstChar - '0')); + + // + // Read a character from the boot code. + // + cChar = ReceiveChar(lPort); + } + + // + // Tell the user that we are programming the flash. + // + fprintf(stderr, "\nProgramming the flash...( 0%%)"); + + // + // Wait until the flash has been programmed. + // + lIdx = 0; + while(1) + { + // + // Read a character from the boot code. + // + cChar = ReceiveChar(lPort); + + // + // If the character is a '?', then we are done. + // + if(cChar == '?') + { + break; + } + + // + // Print out our progress. + // + fprintf(stderr, "\b\b\b\b\b%3d%%)", + (++lIdx * 100) / ((lFileSize + 1023) / 1024)); + } + + // + // Tell the user we are done. + // + fprintf(stderr, "\nSuccessfully downloaded '%s'.\n", argv[1]); +} +
