#define MMAP_RAM 0x02
#define MMAP_EXT 0x03
+/* band 0/2 addr */
+#define BANK0 0x80000000
+#define BANK2 0x82000000
+
/*
* type definitions
*/
typedef unsigned char u8;
+typedef unsigned short u16;
typedef unsigned int u32;
/*
int main(void) {
+ /* variables */
+
+ u16 *flash;
+ u32 i;
+ u8 start;
+
/* memory mapping of interrupt vectors to static ram */
//mmap_init(MMAP_RAM);
/* uart initialization */
-#ifdef USE_FUNCTIONS
//uart0_init();
-#else
+
PINSEL0=0x05; // pin select -> tx, rx
UART0_FCR=0x07; // enable fifo
UART0_LCR=0x83; // set dlab + word length
UART0_DLL=0x10; // br: 9600 @ 10/4 mhz
UART0_DLM=0x00;
UART0_LCR=0x03; // unset dlab
-#endif
/* external memory init */
- while(1) {
+ //BCFG0=;
+ //BCFG2=;
+ flash=(u16 *)BANK0;
+
+ /* wait for fwdump to send transmit start character */
+ start=0;
+ while(start!=0x23) {
+ while(!(UART0_LSR&(1<<0)))
+ continue;
+ start=UART0_RBR;
+ }
+
+ /* transmit 1 mb of data */
+ for(i=0;i<524288;i++) {
+ while(!(UART0_LSR&(1<<5)))
+ continue;
+ UART0_THR=((*flash&0xff00)>>8);
while(!(UART0_LSR&(1<<5)))
continue;
- UART0_THR=0x23;
+ UART0_THR=(*flash&0xff);
+ flash++;
}
return 0;
*
*/
+#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>
+
+#define BUFSIZE 16
+
+int open_serial_port(char *sdev) {
+
+ struct termios term;
+ int fd;
+
+ /* open serial device */
+
+ fd=open(sdev,O_RDWR);
+ if(fd<0) {
+ perror("tts open");
+ return fd;
+ }
+
+ /* configure the serial device */
+
+ tcgetattr(fd,&term);
+
+ // input/output baudrate
+
+ cfsetispeed(&term,B9600);
+ cfsetospeed(&term,B9600);
+
+ // control options -> 8n1
+
+ term.c_cflag&=~PARENB; // no parity
+ term.c_cflag&=~CSTOPB; // only 1 stop bit
+ term.c_cflag&=~CSIZE; // no bit mask for data bits
+ term.c_cflag|=CS8; // 8 data bits
+
+ // line options -> raw input
+
+ term.c_lflag&=~(ICANON|ECHO|ECHOE|ISIG);
+
+ // input options -> enable flow control
+
+ term.c_iflag&=~(IXON|IXOFF|IXANY|INLCR|ICRNL);
+
+ // output options
+
+ term.c_oflag=0;
+
+ // more control options -> timeout / flow control
+
+ term.c_cc[VMIN]=0;
+ term.c_cc[VTIME]=40; // 4 second timeout
+ term.c_cc[VSTART]=0x11;
+ term.c_cc[VSTOP]=0x13;
+
+ tcsetattr(fd,TCSANOW,&term);
+
+ return fd;
+}
+
+int open_dump_file(char *file) {
+
+ int fd;
+
+ /* open dump file */
+
+ fd=open(file,O_WRONLY|O_CREAT);
+
+ if(fd<0)
+ perror("fw open");
+
+ return fd;
+}
+
int main(int argc,char **argv) {
+ int sfd,dfd;
+ unsigned char buf[BUFSIZE];
+ int cnt,size,ret;
+
+ if(argc!=3) {
+ printf("usage: %s <serial port> <dump file>\n",argv[0]);
+ return -1;
+ }
+
+ sfd=open_serial_port(argv[1]);
+ dfd=open_dump_file(argv[2]);
+
+ if((sfd<0)|(dfd<0))
+ return -1;
+
+ /* send start byte */
+ buf[0]=0x23;
+ ret=write(sfd,buf,1);
+ if(ret!=1) {
+ perror("write start byte");
+ return ret;
+ }
+
+ /* receive flash content */
+ while(ret) {
+ ret=read(sfd,buf,BUFSIZE);
+ size=ret;
+ cnt=0;
+ while(size) {
+ ret=write(dfd,buf+cnt,size-cnt);
+ if(ret<0) {
+ perror("write to dump file");
+ return ret;
+ }
+ size-=ret;
+ cnt+=ret;
+ }
+ }
return 0;
}
-