summaryrefslogtreecommitdiff
path: root/utils/rk27utils/rk27load/main.c
diff options
context:
space:
mode:
authorMarcin Bukat <marcin.bukat@gmail.com>2011-05-30 21:10:43 +0000
committerMarcin Bukat <marcin.bukat@gmail.com>2011-05-30 21:10:43 +0000
commit8f4202db285b2139cfee6269b838733d6d2a2306 (patch)
treea362bd367c35a03928b68485df0188e637e09ea3 /utils/rk27utils/rk27load/main.c
parent976a1699da373f01dabc9353b34aef261ebf740f (diff)
downloadrockbox-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.c165
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;
+}