bullshit commit, sync for travel (to zn00H!) :)
[my-code/arm.git] / betty / fwdump.c
index 3769508..db07910 100644 (file)
  *
  */
 
+#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!=4) {
+               printf("usage: %s <serial port> <dump file> <mem>\n",argv[0]);
+               printf("\nmem:\n");
+               printf("0: bank0\n");
+               printf("2: bank2\n");
+               printf("b: bootoader\n");
+               return -1;
+       }
+
+       if((argv[3][0]!='0')&(argv[3][0]!='2')&(argv[3][0]!='b')) {
+               printf("unsupported mem type!\n");
+               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]=argv[3][0];
+       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;
 }
-