- }
- ret=read(lpc->fwfd,line+1,2);
- line[3]='\0';
- len=atoi(line+1);
- ret=read(lpc->fwfd,line+3,4);
- line[7]='\0';
- addr=strtol(line+3);
+ }
+ /* read len */
+ ret=read(fd,buf,2);
+ sscanf(buf,"%02x",&len);
+ /* read addr */
+ ret=read(fd,buf,4);
+ sscanf(buf,"%04x",&addr);
+ /* read type */
+ ret=read(fd,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(fd,buf,2*(len+1));
+ if(ret!=(2*(len+1))) {
+ printf("fw to mem: 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 mem: invalid len\n");
+ return -1;
+ }
+ if(memtype==RAM)
+ write_to_ram(lpc,buf,addr,len);
+ else
+ write_to_flash(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 mem: unknown type %02x\n",type);
+ return -1;
+ }
+ }
+
+ return 0;
+}