diff options
Diffstat (limited to 'utils')
-rw-r--r-- | utils/nwztools/plattools/Makefile | 17 | ||||
-rw-r--r-- | utils/nwztools/plattools/README | 27 | ||||
-rw-r--r-- | utils/nwztools/plattools/nwz_keys.h | 60 | ||||
-rw-r--r-- | utils/nwztools/plattools/nwz_lib.c | 159 | ||||
-rw-r--r-- | utils/nwztools/plattools/nwz_lib.h | 64 | ||||
-rw-r--r-- | utils/nwztools/plattools/test_display.c | 30 | ||||
-rw-r--r-- | utils/nwztools/plattools/test_keys.c | 69 |
7 files changed, 426 insertions, 0 deletions
diff --git a/utils/nwztools/plattools/Makefile b/utils/nwztools/plattools/Makefile new file mode 100644 index 0000000000..d3efdb74a3 --- /dev/null +++ b/utils/nwztools/plattools/Makefile | |||
@@ -0,0 +1,17 @@ | |||
1 | PREFIX?=arm-sony-linux-gnueabi- | ||
2 | CC=$(PREFIX)gcc | ||
3 | LD=$(PREFIX)gcc | ||
4 | CFLAGS=-std=gnu99 -Wall -O2 | ||
5 | INCLUDES=-I. | ||
6 | |||
7 | LIB_FILES=nwz_lib.c | ||
8 | ALL_BUT_LIB=$(patsubst %.c,%.elf,$(filter-out $(LIB_FILES),$(wildcard *.c))) | ||
9 | |||
10 | all: $(ALL_BUT_LIB) | ||
11 | |||
12 | %.elf: %.c $(LIB_FILES) | ||
13 | $(CC) $(CFLAGS) $(INCLUDES) -o $@ $^ | ||
14 | |||
15 | clean: | ||
16 | rm -rf $(ALL_BUT_LIB) | ||
17 | |||
diff --git a/utils/nwztools/plattools/README b/utils/nwztools/plattools/README new file mode 100644 index 0000000000..e33dfeb354 --- /dev/null +++ b/utils/nwztools/plattools/README | |||
@@ -0,0 +1,27 @@ | |||
1 | Platform tools | ||
2 | -------------- | ||
3 | |||
4 | Those tools are designed to run on the devices. They are mostly tests that can | ||
5 | be run in firmware upgrade mode (using exec_file in utils/nwztools/scripts/). To | ||
6 | compile those, you will need the sony nwz cross compiler. The canonical way to | ||
7 | run them is as follows: | ||
8 | |||
9 | 1) Build the tools: | ||
10 | cd /path/to/utils/nwztools/plattools | ||
11 | make | ||
12 | Note that the default cross compiler prefix is arm-sony-linux-gnueabi- but it | ||
13 | can be changed using PREFIX: | ||
14 | PREFIX="sony-nwz-linux-gnueabi-" make | ||
15 | |||
16 | 2) Embed the wanted excutable in a firmware upgrade for your device. The README | ||
17 | in utils/nwztools/scripts contains more documentation on how to select the right | ||
18 | target. For example if you want to embed test_display for the NWZ-E460 series, | ||
19 | you should run: | ||
20 | cd /path/to/utils/nwztools/scripts | ||
21 | make exec_file UPG=test_display_nwze46x.upg NWZ_TARGET=nwz-e46x EXEC=../plattools/test_display.elf | ||
22 | |||
23 | 3) Put the upgrade file on the device and trigger a firmware upgrade. Assuming | ||
24 | your NWZ device is /dev/sdb1 and is mounted at /media/pamaury/WALKMAN, run: | ||
25 | cd /path/to/utils/nwztools/scripts | ||
26 | make copy_fw_upgrade UPG=test_display_nwze46x.upg NWZ_MOUNT=/media/pamaury/WALKMAN/ | ||
27 | sudo make do_fw_upgrade NWZ_DEV=/dev/sdb1 | ||
diff --git a/utils/nwztools/plattools/nwz_keys.h b/utils/nwztools/plattools/nwz_keys.h new file mode 100644 index 0000000000..8228e5b620 --- /dev/null +++ b/utils/nwztools/plattools/nwz_keys.h | |||
@@ -0,0 +1,60 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2016 Amaury Pouly | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | #ifndef __NWZ_KEYS_H__ | ||
22 | #define __NWZ_KEYS_H__ | ||
23 | |||
24 | /* The Sony icx_key driver reports keys via the /dev/input/event0 device and | ||
25 | * abuses the standard struct input_event. The input_event.code is split into | ||
26 | * two parts: | ||
27 | * - one part giving the code of the key just pressed/released | ||
28 | * - one part is a bitmap of various keys (such as HOLD) | ||
29 | * The status of the HOLD can be queried at any time by reading the state of | ||
30 | * the first LED. | ||
31 | */ | ||
32 | |||
33 | /* key code and mask */ | ||
34 | #define NWZ_KEY_MASK 0x1f | ||
35 | #define NWZ_KEY_PLAY 0 | ||
36 | #define NWZ_KEY_RIGHT 1 | ||
37 | #define NWZ_KEY_LEFT 2 | ||
38 | #define NWZ_KEY_UP 3 | ||
39 | #define NWZ_KEY_DOWN 4 | ||
40 | #define NWZ_KEY_ZAPPIN 5 | ||
41 | #define NWZ_KEY_AD0_6 6 | ||
42 | #define NWZ_KEY_AD0_7 7 | ||
43 | /* special "key" when event is for bitmap key, like HOLD */ | ||
44 | #define NWZ_KEY_NONE 15 | ||
45 | #define NWZ_KEY_VOL_DOWN 16 | ||
46 | #define NWZ_KEY_VOL_UP 17 | ||
47 | #define NWZ_KEY_BACK 18 | ||
48 | #define NWZ_KEY_OPTION 19 | ||
49 | #define NWZ_KEY_BT 20 | ||
50 | #define NWZ_KEY_AD1_5 21 | ||
51 | #define NWZ_KEY_AD1_6 22 | ||
52 | #define NWZ_KEY_AD1_7 23 | ||
53 | |||
54 | /* bitmap of other things */ | ||
55 | #define NWZ_KEY_NMLHP_MASK 0x20 | ||
56 | #define NWZ_KEY_NCHP_MASK 0x40 | ||
57 | #define NWZ_KEY_HOLD_MASK 0x80 | ||
58 | #define NWZ_KEY_NC_MASK 0x100 | ||
59 | |||
60 | #endif /* __NWZ_KEYS_H__ */ | ||
diff --git a/utils/nwztools/plattools/nwz_lib.c b/utils/nwztools/plattools/nwz_lib.c new file mode 100644 index 0000000000..ec862e638b --- /dev/null +++ b/utils/nwztools/plattools/nwz_lib.c | |||
@@ -0,0 +1,159 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2016 Amaury Pouly | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | #include "nwz_lib.h" | ||
22 | |||
23 | void nwz_run(const char *file, const char *args[], bool wait) | ||
24 | { | ||
25 | pid_t child_pid = fork(); | ||
26 | if(child_pid != 0) | ||
27 | { | ||
28 | if(wait) | ||
29 | { | ||
30 | int status; | ||
31 | waitpid(child_pid, &status, 0); | ||
32 | } | ||
33 | } | ||
34 | else | ||
35 | { | ||
36 | execvp(file, (char * const *)args); | ||
37 | _exit(1); | ||
38 | } | ||
39 | } | ||
40 | |||
41 | void nwz_lcdmsg(bool clear, int x, int y, const char *msg) | ||
42 | { | ||
43 | const char *path_lcdmsg = "/usr/local/bin/lcdmsg"; | ||
44 | const char *args[16]; | ||
45 | int index = 0; | ||
46 | char locate[32]; | ||
47 | args[index++] = path_lcdmsg; | ||
48 | if(clear) | ||
49 | args[index++] = "-c"; | ||
50 | args[index++] = "-f"; | ||
51 | args[index++] = "/usr/local/bin/font_08x12.bmp"; | ||
52 | args[index++] = "-l"; | ||
53 | sprintf(locate, "%d,%d", x, y); | ||
54 | args[index++] = locate; | ||
55 | args[index++] = msg; | ||
56 | args[index++] = NULL; | ||
57 | /* wait for lcdmsg to finish to avoid any race conditions in framebuffer | ||
58 | * accesses */ | ||
59 | nwz_run(path_lcdmsg, args, true); | ||
60 | } | ||
61 | |||
62 | void nwz_lcdmsgf(bool clear, int x, int y, const char *format, ...) | ||
63 | { | ||
64 | char buffer[1024]; | ||
65 | va_list args; | ||
66 | va_start(args, format); | ||
67 | vsprintf(buffer, format, args); | ||
68 | va_end(args); | ||
69 | nwz_lcdmsg(clear, x, y, buffer); | ||
70 | } | ||
71 | |||
72 | int nwz_key_open(void) | ||
73 | { | ||
74 | return open("/dev/input/event0", O_RDONLY); | ||
75 | } | ||
76 | |||
77 | void nwz_key_close(int fd) | ||
78 | { | ||
79 | close(fd); | ||
80 | } | ||
81 | |||
82 | int nwz_key_get_hold_status(int fd) | ||
83 | { | ||
84 | unsigned long led_hold = 0; | ||
85 | if(ioctl(fd, EVIOCGLED(sizeof(led_hold)), &led_hold) < 0) | ||
86 | return -1; | ||
87 | return led_hold; | ||
88 | } | ||
89 | |||
90 | int nwz_key_wait_event(int fd, long tmo_us) | ||
91 | { | ||
92 | fd_set rfds; | ||
93 | struct timeval tv; | ||
94 | struct timeval *tv_ptr = NULL; | ||
95 | /* watch the input device */ | ||
96 | FD_ZERO(&rfds); | ||
97 | FD_SET(fd, &rfds); | ||
98 | /* setup timeout */ | ||
99 | if(tmo_us >= 0) | ||
100 | { | ||
101 | tv.tv_sec = 0; | ||
102 | tv.tv_usec = tmo_us; | ||
103 | tv_ptr = &tv; | ||
104 | } | ||
105 | return select(fd + 1, &rfds, NULL, NULL, tv_ptr); | ||
106 | } | ||
107 | |||
108 | int nwz_key_read_event(int fd, struct input_event *evt) | ||
109 | { | ||
110 | int ret = read(fd, evt, sizeof(struct input_event)); | ||
111 | if(ret != sizeof(struct input_event)) | ||
112 | return -1; | ||
113 | return 1; | ||
114 | } | ||
115 | |||
116 | int nwz_key_event_get_keycode(struct input_event *evt) | ||
117 | { | ||
118 | return evt->code & NWZ_KEY_MASK; | ||
119 | } | ||
120 | |||
121 | bool nwz_key_event_is_press(struct input_event *evt) | ||
122 | { | ||
123 | return evt->value == 0; | ||
124 | } | ||
125 | |||
126 | bool nwz_key_event_get_hold_status(struct input_event *evt) | ||
127 | { | ||
128 | return !!(evt->code & NWZ_KEY_HOLD_MASK); | ||
129 | } | ||
130 | |||
131 | static const char *nwz_keyname[NWZ_KEY_MASK + 1] = | ||
132 | { | ||
133 | [0 ... NWZ_KEY_MASK] = "unknown", | ||
134 | [NWZ_KEY_PLAY] = "PLAY", | ||
135 | [NWZ_KEY_RIGHT] = "RIGHT", | ||
136 | [NWZ_KEY_LEFT] = "LEFT", | ||
137 | [NWZ_KEY_UP] = "UP", | ||
138 | [NWZ_KEY_DOWN] = "DOWN", | ||
139 | [NWZ_KEY_ZAPPIN] = "ZAPPIN", | ||
140 | [NWZ_KEY_AD0_6] = "AD0_6", | ||
141 | [NWZ_KEY_AD0_7] = "AD0_7", | ||
142 | [NWZ_KEY_NONE] = "NONE", | ||
143 | [NWZ_KEY_VOL_DOWN] = "VOL DOWN", | ||
144 | [NWZ_KEY_VOL_UP] = "VOL UP", | ||
145 | [NWZ_KEY_BACK] = "BACK", | ||
146 | [NWZ_KEY_OPTION] = "OPTION", | ||
147 | [NWZ_KEY_BT] = "BT", | ||
148 | [NWZ_KEY_AD1_5] = "AD1_5", | ||
149 | [NWZ_KEY_AD1_6] = "AD1_6", | ||
150 | [NWZ_KEY_AD1_7] = "AD1_7", | ||
151 | }; | ||
152 | |||
153 | const char *nwz_key_get_name(int keycode) | ||
154 | { | ||
155 | if(keycode <0 || keycode > NWZ_KEY_MASK) | ||
156 | return "invalid"; | ||
157 | else | ||
158 | return nwz_keyname[keycode]; | ||
159 | } | ||
diff --git a/utils/nwztools/plattools/nwz_lib.h b/utils/nwztools/plattools/nwz_lib.h new file mode 100644 index 0000000000..e9d885d87a --- /dev/null +++ b/utils/nwztools/plattools/nwz_lib.h | |||
@@ -0,0 +1,64 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2016 Amaury Pouly | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | #ifndef _NWZLIB_H_ | ||
22 | #define _NWZLIB_H_ | ||
23 | |||
24 | #include <stdio.h> | ||
25 | #include <stdbool.h> | ||
26 | #include <stdarg.h> | ||
27 | #include <unistd.h> | ||
28 | #include <sys/types.h> | ||
29 | #include <sys/wait.h> | ||
30 | #include <linux/input.h> | ||
31 | #include <fcntl.h> | ||
32 | |||
33 | #include "nwz_keys.h" | ||
34 | |||
35 | /* run a program and exit with nonzero status in case of error | ||
36 | * argument list must be NULL terminated */ | ||
37 | void nwz_run(const char *file, const char *args[], bool wait); | ||
38 | |||
39 | /* invoke /usr/bin/lcdmsg to display a message using the small font, optionally | ||
40 | * clearing the screen before */ | ||
41 | void nwz_lcdmsg(bool clear, int x, int y, const char *msg); | ||
42 | void nwz_lcdmsgf(bool clear, int x, int y, const char *format, ...); | ||
43 | |||
44 | /* open icx_key input device and return file descriptor */ | ||
45 | int nwz_key_open(void); | ||
46 | void nwz_key_close(int fd); | ||
47 | /* return HOLD status: 0 or 1, or -1 on error */ | ||
48 | int nwz_key_get_hold_status(int fd); | ||
49 | /* wait for an input event (and return 1), or a timeout (return 0), or error (-1) | ||
50 | * set the timeout to -1 to block */ | ||
51 | int nwz_key_wait_event(int fd, long tmo_us); | ||
52 | /* read an event from the device (may block unless you waited for an event before), | ||
53 | * return 1 on success, <0 on error */ | ||
54 | int nwz_key_read_event(int fd, struct input_event *evt); | ||
55 | /* return keycode from event */ | ||
56 | int nwz_key_event_get_keycode(struct input_event *evt); | ||
57 | /* return press/released status from event */ | ||
58 | bool nwz_key_event_is_press(struct input_event *evt); | ||
59 | /* return HOLD status from event */ | ||
60 | bool nwz_key_event_get_hold_status(struct input_event *evt); | ||
61 | /* get keycode name */ | ||
62 | const char *nwz_key_get_name(int keycode); | ||
63 | |||
64 | #endif /* _NWZLIB_H_ */ | ||
diff --git a/utils/nwztools/plattools/test_display.c b/utils/nwztools/plattools/test_display.c new file mode 100644 index 0000000000..a0dc706624 --- /dev/null +++ b/utils/nwztools/plattools/test_display.c | |||
@@ -0,0 +1,30 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2016 Amaury Pouly | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | #include "nwz_lib.h" | ||
22 | |||
23 | int main(int argc, char **argv) | ||
24 | { | ||
25 | /* clear screen and display welcome message */ | ||
26 | nwz_lcdmsg(true, 0, 0, "test_display"); | ||
27 | nwz_lcdmsg(false, 3, 10, "This program will stop in 5 seconds"); | ||
28 | sleep(5); | ||
29 | return 0; | ||
30 | } | ||
diff --git a/utils/nwztools/plattools/test_keys.c b/utils/nwztools/plattools/test_keys.c new file mode 100644 index 0000000000..3640e007fc --- /dev/null +++ b/utils/nwztools/plattools/test_keys.c | |||
@@ -0,0 +1,69 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2016 Amaury Pouly | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | #include "nwz_lib.h" | ||
22 | |||
23 | int main(int argc, char **argv) | ||
24 | { | ||
25 | /* clear screen and display welcome message */ | ||
26 | nwz_lcdmsg(true, 0, 0, "test_keys"); | ||
27 | nwz_lcdmsg(false, 0, 2, "hold PWR OFF for 3 seconds to quit"); | ||
28 | /* open input device */ | ||
29 | int input_fd = nwz_key_open(); | ||
30 | if(input_fd < 0) | ||
31 | { | ||
32 | nwz_lcdmsg(false, 3, 4, "Cannot open input device"); | ||
33 | sleep(2); | ||
34 | return 1; | ||
35 | } | ||
36 | /* display input state in a loop */ | ||
37 | int pwr_off_pressed = 0; /* 0 = no pressed, >0 = number of seconds pressed - 1 */ | ||
38 | while(1) | ||
39 | { | ||
40 | /* display HOLD status */ | ||
41 | nwz_lcdmsgf(false, 2, 5, "HOLD: %d", nwz_key_get_hold_status(input_fd)); | ||
42 | /* wait for event */ | ||
43 | int ret = nwz_key_wait_event(input_fd, 1000000); | ||
44 | if(ret != 1) | ||
45 | { | ||
46 | if(pwr_off_pressed > 0) | ||
47 | pwr_off_pressed++; | ||
48 | if(pwr_off_pressed >= 4) | ||
49 | break; | ||
50 | continue; | ||
51 | } | ||
52 | struct input_event evt; | ||
53 | if(nwz_key_read_event(input_fd, &evt) != 1) | ||
54 | continue; | ||
55 | nwz_lcdmsgf(false, 2, 6, "%s %s (HOLD=%d) ", | ||
56 | nwz_key_get_name(nwz_key_event_get_keycode(&evt)), | ||
57 | nwz_key_event_is_press(&evt) ? "pressed" : "released", | ||
58 | nwz_key_event_get_hold_status(&evt)); | ||
59 | if(nwz_key_event_get_keycode(&evt) == NWZ_KEY_OPTION && nwz_key_event_is_press(&evt)) | ||
60 | pwr_off_pressed = 1; | ||
61 | else | ||
62 | pwr_off_pressed = 0; | ||
63 | } | ||
64 | /* close input device */ | ||
65 | close(input_fd); | ||
66 | /* finish nicely */ | ||
67 | return 0; | ||
68 | } | ||
69 | |||