13 #include "stage1_upload.h"
15 /* ### upload sdram init code ### */
16 int upload_stage1_code(libusb_device_handle
*hdev
, char *fn_stage1
,
25 if ((f
= fopen(fn_stage1
, "rb")) == NULL
)
27 fprintf(stderr
, "[error]: Could not open file \"%s\"\n", fn_stage1
);
31 codesize
= filesize(f
);
35 fprintf(stderr
, "[error]: Code too big for stage1\n");
39 fprintf(stderr
, "[stage1]: Loading %d bytes (%s) of code... ", codesize
, fn_stage1
);
41 code
= (uint8_t *)malloc(0x200);
44 fprintf(stderr
, "\n[error]: Out of memory\n");
49 memset(code
, 0, 0x200);
50 if (fread(code
, 1, codesize
, f
) != codesize
)
52 fprintf(stderr
, "\n[error]: I/O error\n");
58 fprintf(stderr
, "done\n");
61 /* encode data if requested */
65 fprintf(stderr
, "[stage1]: Encoding %d bytes of data ... ", codesize
);
66 scramble(code
, code
, codesize
);
67 fprintf(stderr
, "done\n");
71 fprintf(stderr
, "[stage1]: codesize = %d (0x%x)\n", codesize
, codesize
);
73 fprintf(stderr
, "[stage1]: Calculating checksum... ");
74 cks
= checksum((void *)code
, codesize
);
75 fprintf(stderr
, "0x%04x\n", cks
);
76 code
[0x1fe] = (cks
>> 8) & 0xff;
77 code
[0x1ff] = cks
& 0xff;
80 fprintf(stderr
, "[stage1]: Uploading code (%d bytes)... ", codesize
);
82 ret
= libusb_control_transfer(hdev
, /* device handle */
83 USB_EP0
, /* bmRequestType */
84 VCMD_UPLOAD
, /* bRequest */
86 VCMD_INDEX_STAGE1
, /* wIndex */
88 codesize
, /* wLength */
89 USB_TIMEOUT
/* timeout */
93 fprintf(stderr
, "\n[error]: Code upload request failed (ret=%d)\n", ret
);
98 if (ret
!= (int)codesize
)
100 fprintf(stderr
, "\n[error]: Sent %d of %d total\n", ret
, codesize
);
105 sleep(1); /* wait for code to finish */
106 fprintf(stderr
, "done\n");