diff options
Diffstat (limited to 'utils/nwztools/plattools')
-rw-r--r-- | utils/nwztools/plattools/Makefile | 5 | ||||
-rw-r--r-- | utils/nwztools/plattools/dualboot.c | 181 | ||||
-rw-r--r-- | utils/nwztools/plattools/nwz_lib.c | 39 | ||||
-rw-r--r-- | utils/nwztools/plattools/nwz_lib.h | 5 |
4 files changed, 227 insertions, 3 deletions
diff --git a/utils/nwztools/plattools/Makefile b/utils/nwztools/plattools/Makefile index 8251afaf0a..f4e88cd778 100644 --- a/utils/nwztools/plattools/Makefile +++ b/utils/nwztools/plattools/Makefile | |||
@@ -7,7 +7,7 @@ INCLUDES=-I. | |||
7 | LIB_FILES=nwz_lib.c nwz_lib_devlist.c | 7 | LIB_FILES=nwz_lib.c nwz_lib_devlist.c |
8 | TOOL_FILES=dest_tool.c test_adc.c test_adc.c test_bl.c test_display.c \ | 8 | TOOL_FILES=dest_tool.c test_adc.c test_adc.c test_bl.c test_display.c \ |
9 | test_keys.c test_power.c test_ts.c | 9 | test_keys.c test_power.c test_ts.c |
10 | ALL_ELF=$(patsubst %.c,%.elf,$(TOOL_FILES)) all_tools.elf | 10 | ALL_ELF=$(patsubst %.c,%.elf,$(TOOL_FILES)) all_tools.elf dualboot.elf |
11 | 11 | ||
12 | all: $(ALL_ELF) | 12 | all: $(ALL_ELF) |
13 | 13 | ||
@@ -17,5 +17,8 @@ all: $(ALL_ELF) | |||
17 | all_tools.elf: all_tools.c $(TOOL_FILES) $(LIB_FILES) | 17 | all_tools.elf: all_tools.c $(TOOL_FILES) $(LIB_FILES) |
18 | $(CC) $(CFLAGS) -DNWZ_EMBED_TOOLS $(INCLUDES) -o $@ $^ | 18 | $(CC) $(CFLAGS) -DNWZ_EMBED_TOOLS $(INCLUDES) -o $@ $^ |
19 | 19 | ||
20 | dualboot.elf: dualboot.c all_tools.c $(TOOL_FILES) $(LIB_FILES) | ||
21 | $(CC) $(CFLAGS) -DNWZ_DUALBOOT -DNWZ_EMBED_TOOLS $(INCLUDES) -o $@ $^ | ||
22 | |||
20 | clean: | 23 | clean: |
21 | rm -rf $(ALL_ELF) | 24 | rm -rf $(ALL_ELF) |
diff --git a/utils/nwztools/plattools/dualboot.c b/utils/nwztools/plattools/dualboot.c new file mode 100644 index 0000000000..965fabed72 --- /dev/null +++ b/utils/nwztools/plattools/dualboot.c | |||
@@ -0,0 +1,181 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2011 by Amaury Pouly | ||
11 | * | ||
12 | * Based on Rockbox iriver bootloader by Linus Nielsen Feltzing | ||
13 | * and the ipodlinux bootloader by Daniel Palffy and Bernard Leach | ||
14 | * | ||
15 | * This program is free software; you can redistribute it and/or | ||
16 | * modify it under the terms of the GNU General Public License | ||
17 | * as published by the Free Software Foundation; either version 2 | ||
18 | * of the License, or (at your option) any later version. | ||
19 | * | ||
20 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
21 | * KIND, either express or implied. | ||
22 | * | ||
23 | ****************************************************************************/ | ||
24 | #include "nwz_lib.h" | ||
25 | #include "nwz_plattools.h" | ||
26 | #include <time.h> | ||
27 | |||
28 | /* Important Note: this bootloader is carefully written so that in case of | ||
29 | * error, the OF is run. This seems like the safest option since the OF is | ||
30 | * always there and might do magic things. */ | ||
31 | |||
32 | bool boot_rockbox(void) | ||
33 | { | ||
34 | /* get time */ | ||
35 | struct timeval deadline; | ||
36 | if(gettimeofday(&deadline, NULL) != 0) | ||
37 | { | ||
38 | nwz_lcdmsg(false, 0, 2, "Cannot get time"); | ||
39 | sleep(2); | ||
40 | return false; | ||
41 | } | ||
42 | /* open input device */ | ||
43 | int input_fd = nwz_key_open(); | ||
44 | if(input_fd < 0) | ||
45 | { | ||
46 | nwz_lcdmsg(false, 0, 2, "Cannot open input device"); | ||
47 | sleep(2); | ||
48 | return false; | ||
49 | } | ||
50 | deadline.tv_sec += 5; | ||
51 | /* wait for user action */ | ||
52 | bool boot_rb = false; | ||
53 | while(true) | ||
54 | { | ||
55 | /* get time */ | ||
56 | struct timeval cur_time; | ||
57 | if(gettimeofday(&cur_time, NULL) != 0) | ||
58 | { | ||
59 | nwz_lcdmsg(false, 0, 4, "Cannot get time"); | ||
60 | sleep(2); | ||
61 | break; | ||
62 | } | ||
63 | /* check timeout */ | ||
64 | if(cur_time.tv_sec > deadline.tv_sec) | ||
65 | break; | ||
66 | if(cur_time.tv_sec == deadline.tv_sec && cur_time.tv_usec >= deadline.tv_usec) | ||
67 | break; | ||
68 | /* print message */ | ||
69 | int sec_left = deadline.tv_sec - cur_time.tv_sec; | ||
70 | sec_left += (deadline.tv_usec - cur_time.tv_usec + 999999) / 1000000; /* round up */ | ||
71 | nwz_lcdmsgf(false, 0, 2, "Booting OF in %d seconds ", sec_left); | ||
72 | nwz_lcdmsg(false, 0, 3, "Press BACK to boot RB"); | ||
73 | /* wait for a key (1s) */ | ||
74 | int ret = nwz_key_wait_event(input_fd, 1000000); | ||
75 | if(ret != 1) | ||
76 | continue; | ||
77 | struct input_event evt; | ||
78 | if(nwz_key_read_event(input_fd, &evt) != 1) | ||
79 | continue; | ||
80 | if(nwz_key_event_get_keycode(&evt) == NWZ_KEY_BACK && !nwz_key_event_is_press(&evt)) | ||
81 | { | ||
82 | boot_rb = true; | ||
83 | break; | ||
84 | } | ||
85 | } | ||
86 | nwz_key_close(input_fd); | ||
87 | return boot_rb; | ||
88 | } | ||
89 | |||
90 | static char *boot_rb_argv[] = | ||
91 | { | ||
92 | "lcdmsg", | ||
93 | "-c", | ||
94 | "-l", | ||
95 | "0,3", | ||
96 | "Hello from RB", | ||
97 | NULL | ||
98 | }; | ||
99 | |||
100 | static void wait_key(void) | ||
101 | { | ||
102 | int input_fd = nwz_key_open(); | ||
103 | /* display input state in a loop */ | ||
104 | while(1) | ||
105 | { | ||
106 | /* wait for event (10ms) */ | ||
107 | int ret = nwz_key_wait_event(input_fd, 10000); | ||
108 | if(ret != 1) | ||
109 | continue; | ||
110 | struct input_event evt; | ||
111 | if(nwz_key_read_event(input_fd, &evt) != 1) | ||
112 | continue; | ||
113 | if(nwz_key_event_get_keycode(&evt) == NWZ_KEY_BACK && !nwz_key_event_is_press(&evt)) | ||
114 | break; | ||
115 | } | ||
116 | /* finish nicely */ | ||
117 | nwz_key_close(input_fd); | ||
118 | } | ||
119 | |||
120 | int NWZ_TOOL_MAIN(all_tools)(int argc, char **argv); | ||
121 | |||
122 | int main(int argc, char **argv) | ||
123 | { | ||
124 | #if 0 | ||
125 | nwz_lcdmsg(true, 0, 0, "dualboot"); | ||
126 | if(boot_rockbox()) | ||
127 | { | ||
128 | /* boot rockox */ | ||
129 | nwz_lcdmsg(true, 0, 3, "Booting rockbox..."); | ||
130 | execvp("/usr/local/bin/lcdmsg", boot_rb_argv); | ||
131 | nwz_lcdmsg(false, 0, 4, "failed."); | ||
132 | sleep(5); | ||
133 | } | ||
134 | /* if for some reason, running rockbox failed, then try to run the OF */ | ||
135 | /* boot OF */ | ||
136 | nwz_lcdmsg(true, 0, 3, "Booting OF..."); | ||
137 | execvp("/usr/local/bin/SpiderApp.of", argv); | ||
138 | nwz_lcdmsg(false, 0, 4, "failed."); | ||
139 | sleep(5); | ||
140 | /* if we reach this point, everything failed, so return an error so that | ||
141 | * sysmgrd knows something is wrong */ | ||
142 | return 1; | ||
143 | #elif 0 | ||
144 | const char *args_mount[] = {"mount", NULL}; | ||
145 | int status; | ||
146 | char *output = nwz_run_pipe("mount", args_mount, &status); | ||
147 | nwz_lcdmsgf(true, 0, 0, "%d\n%s", status, output); | ||
148 | free(output); | ||
149 | wait_key(); | ||
150 | const char *args_ls[] = {"ls", "/var", NULL}; | ||
151 | output = nwz_run_pipe("ls", args_ls, &status); | ||
152 | nwz_lcdmsgf(true, 0, 0, "%d\n%s", status, output); | ||
153 | free(output); | ||
154 | wait_key(); | ||
155 | const char *args_glogctl[] = {"glogctl", "flush", NULL}; | ||
156 | output = nwz_run_pipe("/usr/local/bin/glogctl", args_glogctl, &status); | ||
157 | nwz_lcdmsgf(true, 0, 0, "%d\n%s", status, output); | ||
158 | free(output); | ||
159 | wait_key(); | ||
160 | system("cp /var/GEMINILOG* /contents/"); | ||
161 | sync(); | ||
162 | execvp("/usr/local/bin/SpiderApp.of", argv); | ||
163 | return 0; | ||
164 | #else | ||
165 | /* make sure backlight is on */ | ||
166 | int fb_fd = nwz_fb_open(true); | ||
167 | if(fb_fd >= 0) | ||
168 | { | ||
169 | struct nwz_fb_brightness bl; | ||
170 | nwz_fb_get_brightness(fb_fd, &bl); | ||
171 | bl.level = NWZ_FB_BL_MAX_LEVEL; | ||
172 | nwz_fb_set_brightness(fb_fd, &bl); | ||
173 | nwz_fb_close(fb_fd); | ||
174 | } | ||
175 | /* run all tools menu */ | ||
176 | NWZ_TOOL_MAIN(all_tools)(argc, argv); | ||
177 | /* run OF */ | ||
178 | execvp("/usr/local/bin/SpiderApp.of", argv); | ||
179 | return 0; | ||
180 | #endif | ||
181 | } | ||
diff --git a/utils/nwztools/plattools/nwz_lib.c b/utils/nwztools/plattools/nwz_lib.c index 4f49bec909..087db8834a 100644 --- a/utils/nwztools/plattools/nwz_lib.c +++ b/utils/nwztools/plattools/nwz_lib.c | |||
@@ -30,7 +30,7 @@ const char *nwz_get_model_name(unsigned long model_id) | |||
30 | return NULL; | 30 | return NULL; |
31 | } | 31 | } |
32 | 32 | ||
33 | void nwz_run(const char *file, const char *args[], bool wait) | 33 | int nwz_run(const char *file, const char *args[], bool wait) |
34 | { | 34 | { |
35 | pid_t child_pid = fork(); | 35 | pid_t child_pid = fork(); |
36 | if(child_pid != 0) | 36 | if(child_pid != 0) |
@@ -39,7 +39,10 @@ void nwz_run(const char *file, const char *args[], bool wait) | |||
39 | { | 39 | { |
40 | int status; | 40 | int status; |
41 | waitpid(child_pid, &status, 0); | 41 | waitpid(child_pid, &status, 0); |
42 | return status; | ||
42 | } | 43 | } |
44 | else | ||
45 | return 0; | ||
43 | } | 46 | } |
44 | else | 47 | else |
45 | { | 48 | { |
@@ -48,6 +51,40 @@ void nwz_run(const char *file, const char *args[], bool wait) | |||
48 | } | 51 | } |
49 | } | 52 | } |
50 | 53 | ||
54 | char *nwz_run_pipe(const char *file, const char *args[], int *status) | ||
55 | { | ||
56 | int pipe_fds[2]; | ||
57 | pipe(pipe_fds); | ||
58 | pid_t child_pid = fork(); | ||
59 | if(child_pid == 0) | ||
60 | { | ||
61 | dup2(pipe_fds[1], 1); /* redirect stdout */ | ||
62 | dup2(pipe_fds[1], 2); /* redirect stderr */ | ||
63 | close(pipe_fds[0]); /* close reading */ | ||
64 | close(pipe_fds[1]); /* close writing */ | ||
65 | execvp(file, (char * const *)args); | ||
66 | _exit(1); | ||
67 | } | ||
68 | else | ||
69 | { | ||
70 | close(pipe_fds[1]); /* close writing */ | ||
71 | char buffer[1024]; | ||
72 | char *output = malloc(1); | ||
73 | ssize_t count; | ||
74 | size_t size = 0; | ||
75 | while((count = read(pipe_fds[0], buffer, sizeof(buffer))) > 0) | ||
76 | { | ||
77 | output = realloc(output, size + count + 1); | ||
78 | memcpy(output + size, buffer, count); | ||
79 | size += count; | ||
80 | } | ||
81 | close(pipe_fds[0]); | ||
82 | output[size] = 0; | ||
83 | waitpid(child_pid, status, 0); | ||
84 | return output; | ||
85 | } | ||
86 | } | ||
87 | |||
51 | void nwz_lcdmsg(bool clear, int x, int y, const char *msg) | 88 | void nwz_lcdmsg(bool clear, int x, int y, const char *msg) |
52 | { | 89 | { |
53 | const char *path_lcdmsg = "/usr/local/bin/lcdmsg"; | 90 | const char *path_lcdmsg = "/usr/local/bin/lcdmsg"; |
diff --git a/utils/nwztools/plattools/nwz_lib.h b/utils/nwztools/plattools/nwz_lib.h index 90d122003a..df0105a13d 100644 --- a/utils/nwztools/plattools/nwz_lib.h +++ b/utils/nwztools/plattools/nwz_lib.h | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/input.h> | 30 | #include <linux/input.h> |
31 | #include <fcntl.h> | 31 | #include <fcntl.h> |
32 | #include <string.h> | 32 | #include <string.h> |
33 | #include <stdlib.h> | ||
33 | 34 | ||
34 | #include "nwz_keys.h" | 35 | #include "nwz_keys.h" |
35 | #include "nwz_fb.h" | 36 | #include "nwz_fb.h" |
@@ -47,7 +48,9 @@ const char *nwz_get_model_name(unsigned long model_id); | |||
47 | 48 | ||
48 | /* run a program and exit with nonzero status in case of error | 49 | /* run a program and exit with nonzero status in case of error |
49 | * argument list must be NULL terminated */ | 50 | * argument list must be NULL terminated */ |
50 | void nwz_run(const char *file, const char *args[], bool wait); | 51 | int nwz_run(const char *file, const char *args[], bool wait); |
52 | /* run a program and return program output */ | ||
53 | char *nwz_run_pipe(const char *file, const char *args[], int *status); | ||
51 | 54 | ||
52 | /* invoke /usr/bin/lcdmsg to display a message using the small font, optionally | 55 | /* invoke /usr/bin/lcdmsg to display a message using the small font, optionally |
53 | * clearing the screen before */ | 56 | * clearing the screen before */ |