+ /* read a line */
+ ret=1;
+ while(ret) {
+ /* sync line */
+ ret=read(lpc->fwfd,buf,1);
+ switch(buf[0]) {
+ case '\r':
+ continue;
+ case '\n':
+ continue;
+ case ':':
+ /* start code */
+ break;
+ default:
+ printf("fw to ram: no ihex format\n");
+ return -1;
+ }
+ /* read len */
+ ret=read(lpc->fwfd,buf,2);
+ sscanf(buf,"%02x",&len);
+ /* read addr */
+ ret=read(lpc->fwfd,buf,4);
+ sscanf(buf,"%04x",&addr);
+ /* read type */
+ ret=read(lpc->fwfd,buf,2);
+ sscanf(buf,"%02x",&type);
+ /* successfull return if type is end of file */
+ if(type==0x01)
+ return 0;
+ /* read data (and cksum) */
+ ret=read(lpc->fwfd,buf,2*(len+1));
+ if(ret!=(2*(len+1))) {
+ printf("fw to ram: data missing\n");
+ return -1;
+ }
+ for(ret=0;ret<len;ret++) {
+ sscanf(buf+2*ret,"%02x",&temp);
+ buf[ret]=temp;
+ }
+ /* act according to type */
+ switch(type) {
+ //case 0x03:
+ // /* get cs and ip */
+ // break;
+ case 0x00:
+ if(len%4) {
+ printf("fw to ram: invalid len\n");
+ return -1;
+ }
+ write_to_ram(lpc,buf,addr,len);
+ break;
+ case 0x04:
+ lpc->roff=((buf[0]<<24)|(buf[1]<<16));
+ break;
+ case 0x05:
+ lpc->jaddr=((buf[0]<<24)|(buf[1]<<16));
+ lpc->jaddr|=((buf[2]<<8)|buf[3]);
+ break;
+ default:
+ printf("fw to ram: unknown type %02x\n",type);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+int lpc_txbuf_flush(t_lpc *lpc) {
+
+ int i,ret;
+ u8 buf[16];
+
+ ret=1;
+ printf("flushing lpc tx buffer: ");
+ while(ret) {
+ ret=read(lpc->sfd,buf,16);
+ for(i=0;i<ret;i++)
+ printf("%02x ",buf[i]);
+ }
+ printf("\n");
+
+ return 0;
+}
+
+int dump_files(int sfd,int dfd,u32 addr,u32 len) {
+
+ int ret;
+ int size;
+ int cnt;
+ int i;
+ u8 buf[16];
+
+ printf("dumping content (addr=0x%08x, len=0x%08x) ...\n",addr,len);
+
+ /* send cmd */
+ size=1+4+4;
+ cnt=0;
+ buf[0]=CMD_READ;
+ buf[1]=(addr>>24)&0xff;
+ buf[2]=(addr>>16)&0xff;
+ buf[3]=(addr>>8)&0xff;
+ buf[4]=addr&0xff;
+ buf[5]=(len>>24)&0xff;
+ buf[6]=(len>>16)&0xff;
+ buf[7]=(len>>8)&0xff;
+ buf[8]=len&0xff;
+ printf(" sending cmd: ");
+ while(size) {
+ ret=write(sfd,buf+cnt,size);
+ for(i=cnt;i<cnt+ret;i++)
+ printf("%02x ",buf[i]);
+ if(ret<0) {
+ perror("dump file: send cmd ");
+ return ret;
+ }
+ size-=ret;
+ cnt+=ret;
+ }
+ printf("\n");
+
+ /* receive data and dump it to file */
+ ret=1;
+ cnt=0;
+ printf(" receiving data ...\n");
+ while(ret) {
+ ret=read(sfd,buf,16);
+ if(ret<0) {
+ perror("dump file: read data");
+ return ret;
+ }
+ size=ret;
+ cnt=0;
+ while(size) {
+ ret=write(dfd,buf+cnt,size-cnt);
+ if(ret<0) {
+ perror("dump file: write data");
+ return ret;
+ }
+ cnt+=ret;
+ size-=ret;
+ }
+ }