166 lines
3.8 KiB
C
166 lines
3.8 KiB
C
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include <stdint.h>
|
||
|
#include <stdbool.h>
|
||
|
|
||
|
#include <libusb.h>
|
||
|
|
||
|
#include "rk27load.h"
|
||
|
#include "common.h"
|
||
|
#include "stage1_upload.h"
|
||
|
#include "stage2_upload.h"
|
||
|
#include "stage3_upload.h"
|
||
|
|
||
|
#define VERSION "v0.2"
|
||
|
|
||
|
enum {
|
||
|
NONE = 0,
|
||
|
ENCODE_S1 = 1,
|
||
|
ENCODE_S2 = 2
|
||
|
};
|
||
|
|
||
|
static void usage(char *name)
|
||
|
{
|
||
|
printf("usage: (sudo) %s [-e1 -e2] -s1 stage1.bin -s2 stage2.bin -s3 usercode.bin\n", name);
|
||
|
printf("stage1.bin - binary of the stage1 (sdram init)\n");
|
||
|
printf("stage2.bin - binary of the stage2 bootloader\n");
|
||
|
printf("usercode.bin - binary of the custom usercode\n");
|
||
|
printf("\n");
|
||
|
printf("options:\n");
|
||
|
printf("-e1 - encode stage1 bootloader\n");
|
||
|
printf("-e2 - encode stage2 bootloader\n");
|
||
|
}
|
||
|
|
||
|
int main(int argc, char **argv)
|
||
|
{
|
||
|
libusb_device_handle *hdev;
|
||
|
char *filenames[3];
|
||
|
int i=1, action=0, ret=0;
|
||
|
|
||
|
while (i < argc)
|
||
|
{
|
||
|
if (strcmp(argv[i],"-e1") == 0)
|
||
|
{
|
||
|
action |= ENCODE_S1;
|
||
|
i++;
|
||
|
}
|
||
|
else if (strcmp(argv[i],"-e2") == 0)
|
||
|
{
|
||
|
action |= ENCODE_S2;
|
||
|
i++;
|
||
|
}
|
||
|
else if (strcmp(argv[i],"-s1") == 0)
|
||
|
{
|
||
|
i++;
|
||
|
if (i == argc)
|
||
|
{
|
||
|
usage(argv[0]);
|
||
|
return -1;
|
||
|
}
|
||
|
filenames[0] = argv[i];
|
||
|
printf("%s", argv[i]);
|
||
|
i++;
|
||
|
}
|
||
|
else if (strcmp(argv[i],"-s2") == 0)
|
||
|
{
|
||
|
i++;
|
||
|
if (i == argc)
|
||
|
{
|
||
|
usage(argv[0]);
|
||
|
return -2;
|
||
|
}
|
||
|
filenames[1] = argv[i];
|
||
|
i++;
|
||
|
}
|
||
|
else if (strcmp(argv[i],"-s3") == 0)
|
||
|
{
|
||
|
i++;
|
||
|
if (i == argc)
|
||
|
{
|
||
|
usage(argv[0]);
|
||
|
return -3;
|
||
|
}
|
||
|
filenames[2] = argv[i];
|
||
|
i++;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
usage(argv[0]);
|
||
|
return -4;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
fprintf(stderr,"rk27load " VERSION "\n");
|
||
|
fprintf(stderr,"(C) Marcin Bukat 2011\n");
|
||
|
fprintf(stderr,"Based on rk27load ver. 0.1 written by AleMaxx (alemaxx at hotmail.de)\n\n");
|
||
|
fprintf(stderr,"This is free software; see the source for copying conditions. There is NO\n");
|
||
|
fprintf(stderr,"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
|
||
|
|
||
|
/* initialize libusb */
|
||
|
libusb_init(NULL);
|
||
|
|
||
|
/* configure device */
|
||
|
fprintf(stderr, "[info]: Initializing device... ");
|
||
|
hdev = libusb_open_device_with_vid_pid(NULL, VENDORID, PRODUCTID);
|
||
|
|
||
|
if (hdev == NULL)
|
||
|
{
|
||
|
fprintf(stderr, "\n[error]: Could not find rockchip device\n");
|
||
|
ret = -2;
|
||
|
goto finish;
|
||
|
}
|
||
|
|
||
|
ret = libusb_set_configuration(hdev, 1);
|
||
|
if (ret < 0)
|
||
|
{
|
||
|
fprintf(stderr, "\n[error]: Could not select configuration (1)\n");
|
||
|
ret = -3;
|
||
|
goto finish;
|
||
|
}
|
||
|
|
||
|
ret = libusb_claim_interface(hdev, 0);
|
||
|
if (ret < 0)
|
||
|
{
|
||
|
fprintf(stderr, "\n[error]: Could not claim interface #0\n");
|
||
|
ret = -4;
|
||
|
goto finish;
|
||
|
}
|
||
|
|
||
|
ret = libusb_set_interface_alt_setting(hdev, 0, 0);
|
||
|
if (ret < 0)
|
||
|
{
|
||
|
fprintf(stderr, "\n[error]: Could not set alternate interface #0\n");
|
||
|
ret = -5;
|
||
|
goto finish;
|
||
|
}
|
||
|
|
||
|
fprintf(stderr, "done\n");
|
||
|
|
||
|
|
||
|
ret = upload_stage1_code(hdev, filenames[0], (action & ENCODE_S1));
|
||
|
if (ret < 0)
|
||
|
goto finish;
|
||
|
|
||
|
ret = upload_stage2_code(hdev, filenames[1], (action & ENCODE_S2));
|
||
|
if (ret < 0)
|
||
|
goto finish;
|
||
|
|
||
|
ret = upload_stage3_code(hdev, filenames[2]);
|
||
|
if (ret < 0)
|
||
|
goto finish;
|
||
|
|
||
|
/* done */
|
||
|
ret = 0;
|
||
|
|
||
|
finish:
|
||
|
if (hdev != NULL)
|
||
|
libusb_close(hdev);
|
||
|
|
||
|
if (ret < 0)
|
||
|
fprintf(stderr, "[error]: Error %d\n", ret);
|
||
|
|
||
|
return ret;
|
||
|
}
|