diff options
author | Amaury Pouly <amaury.pouly@gmail.com> | 2016-11-06 00:12:04 +0100 |
---|---|---|
committer | Amaury Pouly <amaury.pouly@gmail.com> | 2016-11-06 00:12:04 +0100 |
commit | 5017babb307122d8567ca78a5721e96c4d7ff8f2 (patch) | |
tree | 26ca7ac1d8a3608e364d59a203c32b81b16f92e3 /utils/nwztools/plattools/dualboot.c | |
parent | d492f25c54b4134fd6632156efee07670ab4004f (diff) | |
download | rockbox-5017babb307122d8567ca78a5721e96c4d7ff8f2.tar.gz rockbox-5017babb307122d8567ca78a5721e96c4d7ff8f2.zip |
nwztools/plattools: fix black screen issue in dualboot, rework dualboot
Sony added extensions to the frambuffer interface. It is important to take them
into account since the OF uses them and might leave the framebuffer in an
unusual state which would make the dualboot not display anything. Also rework
the dualboot code so that it can boot rockbox (not doing anything at the moment),
display all tools or boot the OF.
Change-Id: Ia0f589c9ec8558f375270841503c0964aff07f0b
Diffstat (limited to 'utils/nwztools/plattools/dualboot.c')
-rw-r--r-- | utils/nwztools/plattools/dualboot.c | 114 |
1 files changed, 45 insertions, 69 deletions
diff --git a/utils/nwztools/plattools/dualboot.c b/utils/nwztools/plattools/dualboot.c index 965fabed72..a5d04fa4ed 100644 --- a/utils/nwztools/plattools/dualboot.c +++ b/utils/nwztools/plattools/dualboot.c | |||
@@ -29,7 +29,14 @@ | |||
29 | * error, the OF is run. This seems like the safest option since the OF is | 29 | * error, the OF is run. This seems like the safest option since the OF is |
30 | * always there and might do magic things. */ | 30 | * always there and might do magic things. */ |
31 | 31 | ||
32 | bool boot_rockbox(void) | 32 | enum boot_mode |
33 | { | ||
34 | BOOT_ROCKBOX, | ||
35 | BOOT_TOOLS, | ||
36 | BOOT_OF | ||
37 | }; | ||
38 | |||
39 | enum boot_mode get_boot_mode(void) | ||
33 | { | 40 | { |
34 | /* get time */ | 41 | /* get time */ |
35 | struct timeval deadline; | 42 | struct timeval deadline; |
@@ -37,7 +44,7 @@ bool boot_rockbox(void) | |||
37 | { | 44 | { |
38 | nwz_lcdmsg(false, 0, 2, "Cannot get time"); | 45 | nwz_lcdmsg(false, 0, 2, "Cannot get time"); |
39 | sleep(2); | 46 | sleep(2); |
40 | return false; | 47 | return BOOT_OF; |
41 | } | 48 | } |
42 | /* open input device */ | 49 | /* open input device */ |
43 | int input_fd = nwz_key_open(); | 50 | int input_fd = nwz_key_open(); |
@@ -45,11 +52,11 @@ bool boot_rockbox(void) | |||
45 | { | 52 | { |
46 | nwz_lcdmsg(false, 0, 2, "Cannot open input device"); | 53 | nwz_lcdmsg(false, 0, 2, "Cannot open input device"); |
47 | sleep(2); | 54 | sleep(2); |
48 | return false; | 55 | return BOOT_OF; |
49 | } | 56 | } |
50 | deadline.tv_sec += 5; | 57 | deadline.tv_sec += 5; |
51 | /* wait for user action */ | 58 | /* wait for user action */ |
52 | bool boot_rb = false; | 59 | enum boot_mode mode = BOOT_OF; |
53 | while(true) | 60 | while(true) |
54 | { | 61 | { |
55 | /* get time */ | 62 | /* get time */ |
@@ -69,7 +76,8 @@ bool boot_rockbox(void) | |||
69 | int sec_left = deadline.tv_sec - cur_time.tv_sec; | 76 | int sec_left = deadline.tv_sec - cur_time.tv_sec; |
70 | sec_left += (deadline.tv_usec - cur_time.tv_usec + 999999) / 1000000; /* round up */ | 77 | 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); | 78 | nwz_lcdmsgf(false, 0, 2, "Booting OF in %d seconds ", sec_left); |
72 | nwz_lcdmsg(false, 0, 3, "Press BACK to boot RB"); | 79 | nwz_lcdmsg(false, 0, 3, "Press BACK to run tools"); |
80 | nwz_lcdmsg(false, 0, 3, "Press PLAY to boot RB"); | ||
73 | /* wait for a key (1s) */ | 81 | /* wait for a key (1s) */ |
74 | int ret = nwz_key_wait_event(input_fd, 1000000); | 82 | int ret = nwz_key_wait_event(input_fd, 1000000); |
75 | if(ret != 1) | 83 | if(ret != 1) |
@@ -77,14 +85,21 @@ bool boot_rockbox(void) | |||
77 | struct input_event evt; | 85 | struct input_event evt; |
78 | if(nwz_key_read_event(input_fd, &evt) != 1) | 86 | if(nwz_key_read_event(input_fd, &evt) != 1) |
79 | continue; | 87 | continue; |
80 | if(nwz_key_event_get_keycode(&evt) == NWZ_KEY_BACK && !nwz_key_event_is_press(&evt)) | 88 | if(nwz_key_event_is_press(&evt)) |
89 | continue; | ||
90 | if(nwz_key_event_get_keycode(&evt) == NWZ_KEY_PLAY) | ||
81 | { | 91 | { |
82 | boot_rb = true; | 92 | mode = BOOT_ROCKBOX; |
93 | break; | ||
94 | } | ||
95 | else if(nwz_key_event_get_keycode(&evt) == NWZ_KEY_BACK) | ||
96 | { | ||
97 | mode = BOOT_TOOLS; | ||
83 | break; | 98 | break; |
84 | } | 99 | } |
85 | } | 100 | } |
86 | nwz_key_close(input_fd); | 101 | nwz_key_close(input_fd); |
87 | return boot_rb; | 102 | return mode; |
88 | } | 103 | } |
89 | 104 | ||
90 | static char *boot_rb_argv[] = | 105 | static char *boot_rb_argv[] = |
@@ -97,41 +112,40 @@ static char *boot_rb_argv[] = | |||
97 | NULL | 112 | NULL |
98 | }; | 113 | }; |
99 | 114 | ||
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); | 115 | int NWZ_TOOL_MAIN(all_tools)(int argc, char **argv); |
121 | 116 | ||
122 | int main(int argc, char **argv) | 117 | int main(int argc, char **argv) |
123 | { | 118 | { |
124 | #if 0 | 119 | /* make sure backlight is on and we are running the standard lcd mode */ |
120 | int fb_fd = nwz_fb_open(true); | ||
121 | if(fb_fd >= 0) | ||
122 | { | ||
123 | struct nwz_fb_brightness bl; | ||
124 | nwz_fb_get_brightness(fb_fd, &bl); | ||
125 | bl.level = NWZ_FB_BL_MAX_LEVEL; | ||
126 | nwz_fb_set_brightness(fb_fd, &bl); | ||
127 | nwz_fb_set_standard_mode(fb_fd); | ||
128 | nwz_fb_close(fb_fd); | ||
129 | } | ||
125 | nwz_lcdmsg(true, 0, 0, "dualboot"); | 130 | nwz_lcdmsg(true, 0, 0, "dualboot"); |
126 | if(boot_rockbox()) | 131 | /* run all tools menu */ |
132 | enum boot_mode mode = get_boot_mode(); | ||
133 | if(mode == BOOT_TOOLS) | ||
134 | { | ||
135 | /* run tools and then run OF */ | ||
136 | NWZ_TOOL_MAIN(all_tools)(argc, argv); | ||
137 | } | ||
138 | else if(mode == BOOT_ROCKBOX) | ||
127 | { | 139 | { |
128 | /* boot rockox */ | 140 | /* boot rockox */ |
129 | nwz_lcdmsg(true, 0, 3, "Booting rockbox..."); | 141 | nwz_lcdmsg(true, 0, 3, "Booting rockbox..."); |
142 | /* in the future, we will run rockbox here, for now we just print a | ||
143 | * message */ | ||
130 | execvp("/usr/local/bin/lcdmsg", boot_rb_argv); | 144 | execvp("/usr/local/bin/lcdmsg", boot_rb_argv); |
145 | /* fallback to OF in case of failure */ | ||
131 | nwz_lcdmsg(false, 0, 4, "failed."); | 146 | nwz_lcdmsg(false, 0, 4, "failed."); |
132 | sleep(5); | 147 | sleep(5); |
133 | } | 148 | } |
134 | /* if for some reason, running rockbox failed, then try to run the OF */ | ||
135 | /* boot OF */ | 149 | /* boot OF */ |
136 | nwz_lcdmsg(true, 0, 3, "Booting OF..."); | 150 | nwz_lcdmsg(true, 0, 3, "Booting OF..."); |
137 | execvp("/usr/local/bin/SpiderApp.of", argv); | 151 | execvp("/usr/local/bin/SpiderApp.of", argv); |
@@ -140,42 +154,4 @@ int main(int argc, char **argv) | |||
140 | /* if we reach this point, everything failed, so return an error so that | 154 | /* if we reach this point, everything failed, so return an error so that |
141 | * sysmgrd knows something is wrong */ | 155 | * sysmgrd knows something is wrong */ |
142 | return 1; | 156 | 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 | } | 157 | } |