diff options
| author | Marcin Bukat <marcin.bukat@gmail.com> | 2011-05-30 21:10:43 +0000 |
|---|---|---|
| committer | Marcin Bukat <marcin.bukat@gmail.com> | 2011-05-30 21:10:43 +0000 |
| commit | 8f4202db285b2139cfee6269b838733d6d2a2306 (patch) | |
| tree | a362bd367c35a03928b68485df0188e637e09ea3 /utils/rk27utils/rk27load/main.c | |
| parent | 976a1699da373f01dabc9353b34aef261ebf740f (diff) | |
| download | rockbox-8f4202db285b2139cfee6269b838733d6d2a2306.zip rockbox-8f4202db285b2139cfee6269b838733d6d2a2306.tar.gz rockbox-8f4202db285b2139cfee6269b838733d6d2a2306.tar.bz2 rockbox-8f4202db285b2139cfee6269b838733d6d2a2306.tar.xz | |
Rockchip rk27xx utils
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29936 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'utils/rk27utils/rk27load/main.c')
| -rw-r--r-- | utils/rk27utils/rk27load/main.c | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/utils/rk27utils/rk27load/main.c b/utils/rk27utils/rk27load/main.c new file mode 100644 index 0000000..d183ae2 --- /dev/null +++ b/utils/rk27utils/rk27load/main.c @@ -0,0 +1,165 @@ +#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; +} |