diff options
Diffstat (limited to 'utils/nwztools/plattools/nwz_lib.c')
-rw-r--r-- | utils/nwztools/plattools/nwz_lib.c | 284 |
1 files changed, 269 insertions, 15 deletions
diff --git a/utils/nwztools/plattools/nwz_lib.c b/utils/nwztools/plattools/nwz_lib.c index b654855bb8..4ea1edee19 100644 --- a/utils/nwztools/plattools/nwz_lib.c +++ b/utils/nwztools/plattools/nwz_lib.c | |||
@@ -69,9 +69,29 @@ void nwz_lcdmsgf(bool clear, int x, int y, const char *format, ...) | |||
69 | nwz_lcdmsg(clear, x, y, buffer); | 69 | nwz_lcdmsg(clear, x, y, buffer); |
70 | } | 70 | } |
71 | 71 | ||
72 | int nwz_input_open(const char *requested_name) | ||
73 | { | ||
74 | /* try all /dev/input/eventX, there can't a lot of them */ | ||
75 | for(int index = 0; index < 8; index++) | ||
76 | { | ||
77 | char buffer[32]; | ||
78 | sprintf(buffer, "/dev/input/event%d", index); | ||
79 | int fd = open(buffer, O_RDWR); | ||
80 | if(fd < 0) | ||
81 | continue; /* try next one */ | ||
82 | /* query name */ | ||
83 | char name[256]; | ||
84 | if(ioctl(fd, EVIOCGNAME(sizeof(name)), name) >= 0 && | ||
85 | strcmp(name, requested_name) == 0) | ||
86 | return fd; | ||
87 | close(fd); | ||
88 | } | ||
89 | return -1; | ||
90 | } | ||
91 | |||
72 | int nwz_key_open(void) | 92 | int nwz_key_open(void) |
73 | { | 93 | { |
74 | return open(NWZ_KEY_DEV, O_RDONLY); | 94 | return nwz_input_open(NWZ_KEY_NAME); |
75 | } | 95 | } |
76 | 96 | ||
77 | void nwz_key_close(int fd) | 97 | void nwz_key_close(int fd) |
@@ -89,20 +109,7 @@ int nwz_key_get_hold_status(int fd) | |||
89 | 109 | ||
90 | int nwz_key_wait_event(int fd, long tmo_us) | 110 | int nwz_key_wait_event(int fd, long tmo_us) |
91 | { | 111 | { |
92 | fd_set rfds; | 112 | return nwz_wait_fds(&fd, 1, tmo_us); |
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 | } | 113 | } |
107 | 114 | ||
108 | int nwz_key_read_event(int fd, struct input_event *evt) | 115 | int nwz_key_read_event(int fd, struct input_event *evt) |
@@ -219,3 +226,250 @@ int nwz_adc_get_val(int fd, int ch) | |||
219 | else | 226 | else |
220 | return val; | 227 | return val; |
221 | } | 228 | } |
229 | |||
230 | int nwz_ts_open(void) | ||
231 | { | ||
232 | return nwz_input_open(NWZ_TS_NAME); | ||
233 | } | ||
234 | |||
235 | void nwz_ts_close(int fd) | ||
236 | { | ||
237 | close(fd); | ||
238 | } | ||
239 | |||
240 | int nwz_ts_state_init(int fd, struct nwz_ts_state_t *state) | ||
241 | { | ||
242 | memset(state, 0, sizeof(struct nwz_ts_state_t)); | ||
243 | struct input_absinfo info; | ||
244 | if(ioctl(fd, EVIOCGABS(ABS_X), &info) < 0) | ||
245 | return -1; | ||
246 | state->max_x = info.maximum; | ||
247 | if(ioctl(fd, EVIOCGABS(ABS_Y), &info) < 0) | ||
248 | return -1; | ||
249 | state->max_y = info.maximum; | ||
250 | if(ioctl(fd, EVIOCGABS(ABS_PRESSURE), &info) < 0) | ||
251 | return -1; | ||
252 | state->max_pressure = info.maximum; | ||
253 | if(ioctl(fd, EVIOCGABS(ABS_TOOL_WIDTH), &info) < 0) | ||
254 | return -1; | ||
255 | state->max_tool_width = info.maximum; | ||
256 | return 1; | ||
257 | } | ||
258 | |||
259 | int nwz_ts_state_update(struct nwz_ts_state_t *state, struct input_event *evt) | ||
260 | { | ||
261 | switch(evt->type) | ||
262 | { | ||
263 | case EV_SYN: | ||
264 | return 1; | ||
265 | case EV_REL: | ||
266 | if(evt->code == REL_RX) | ||
267 | state->flick_x = evt->value; | ||
268 | else if(evt->code == REL_RY) | ||
269 | state->flick_y = evt->value; | ||
270 | else | ||
271 | return -1; | ||
272 | state->flick = true; | ||
273 | break; | ||
274 | case EV_ABS: | ||
275 | if(evt->code == ABS_X) | ||
276 | state->x = evt->value; | ||
277 | else if(evt->code == ABS_Y) | ||
278 | state->y = evt->value; | ||
279 | else if(evt->code == ABS_PRESSURE) | ||
280 | state->pressure = evt->value; | ||
281 | else if(evt->code == ABS_TOOL_WIDTH) | ||
282 | state->tool_width = evt->value; | ||
283 | else | ||
284 | return -1; | ||
285 | break; | ||
286 | case EV_KEY: | ||
287 | if(evt->code == BTN_TOUCH) | ||
288 | state->touch = evt->value; | ||
289 | else | ||
290 | return -1; | ||
291 | break; | ||
292 | default: | ||
293 | return -1; | ||
294 | } | ||
295 | return 0; | ||
296 | } | ||
297 | |||
298 | int nwz_ts_state_post_syn(struct nwz_ts_state_t *state) | ||
299 | { | ||
300 | state->flick = false; | ||
301 | return 1; | ||
302 | } | ||
303 | |||
304 | int nwz_ts_read_events(int fd, struct input_event *evts, int nr_evts) | ||
305 | { | ||
306 | int ret = read(fd, evts, nr_evts * sizeof(struct input_event)); | ||
307 | if(ret < 0) | ||
308 | return -1; | ||
309 | return ret / sizeof(struct input_event); | ||
310 | } | ||
311 | |||
312 | long nwz_wait_fds(int *fds, int nr_fds, long tmo_us) | ||
313 | { | ||
314 | fd_set rfds; | ||
315 | struct timeval tv; | ||
316 | struct timeval *tv_ptr = NULL; | ||
317 | /* watch the input device */ | ||
318 | FD_ZERO(&rfds); | ||
319 | int max_fd = 0; | ||
320 | for(int i = 0; i < nr_fds; i++) | ||
321 | { | ||
322 | FD_SET(fds[i], &rfds); | ||
323 | if(fds[i] > max_fd) | ||
324 | max_fd = fds[i]; | ||
325 | } | ||
326 | /* setup timeout */ | ||
327 | if(tmo_us >= 0) | ||
328 | { | ||
329 | tv.tv_sec = 0; | ||
330 | tv.tv_usec = tmo_us; | ||
331 | tv_ptr = &tv; | ||
332 | } | ||
333 | int ret = select(max_fd + 1, &rfds, NULL, NULL, tv_ptr); | ||
334 | if(ret <= 0) | ||
335 | return ret; | ||
336 | long bitmap = 0; | ||
337 | for(int i = 0; i < nr_fds; i++) | ||
338 | if(FD_ISSET(fds[i], &rfds)) | ||
339 | bitmap |= 1 << i; | ||
340 | return bitmap; | ||
341 | } | ||
342 | |||
343 | int nwz_power_open(void) | ||
344 | { | ||
345 | return open(NWZ_POWER_DEV, O_RDWR); | ||
346 | } | ||
347 | |||
348 | void nwz_power_close(int fd) | ||
349 | { | ||
350 | close(fd); | ||
351 | } | ||
352 | |||
353 | int nwz_power_get_status(int fd) | ||
354 | { | ||
355 | int status; | ||
356 | if(ioctl(fd, NWZ_POWER_GET_STATUS, &status) < 0) | ||
357 | return -1; | ||
358 | return status; | ||
359 | } | ||
360 | |||
361 | static int nwz_power_adval_to_mv(int adval, int ad_base) | ||
362 | { | ||
363 | if(adval == -1) | ||
364 | return -1; | ||
365 | /* the AD base corresponds to the millivolt value if adval was 255 */ | ||
366 | return (adval * ad_base) / 255; | ||
367 | } | ||
368 | |||
369 | int nwz_power_get_vbus_adval(int fd) | ||
370 | { | ||
371 | int status; | ||
372 | if(ioctl(fd, NWZ_POWER_GET_VBUS_ADVAL, &status) < 0) | ||
373 | return -1; | ||
374 | return status; | ||
375 | } | ||
376 | |||
377 | int nwz_power_get_vbus_voltage(int fd) | ||
378 | { | ||
379 | return nwz_power_adval_to_mv(nwz_power_get_vbus_adval(fd), NWZ_POWER_AD_BASE_VBUS); | ||
380 | } | ||
381 | |||
382 | int nwz_power_get_vbus_limit(int fd) | ||
383 | { | ||
384 | int status; | ||
385 | if(ioctl(fd, NWZ_POWER_GET_VBUS_LIMIT, &status) < 0) | ||
386 | return -1; | ||
387 | return status; | ||
388 | } | ||
389 | |||
390 | int nwz_power_get_charge_switch(int fd) | ||
391 | { | ||
392 | int status; | ||
393 | if(ioctl(fd, NWZ_POWER_GET_CHARGE_SWITCH, &status) < 0) | ||
394 | return -1; | ||
395 | return status; | ||
396 | } | ||
397 | |||
398 | int nwz_power_get_charge_current(int fd) | ||
399 | { | ||
400 | int status; | ||
401 | if(ioctl(fd, NWZ_POWER_GET_CHARGE_CURRENT, &status) < 0) | ||
402 | return -1; | ||
403 | return status; | ||
404 | } | ||
405 | |||
406 | int nwz_power_get_battery_gauge(int fd) | ||
407 | { | ||
408 | int status; | ||
409 | if(ioctl(fd, NWZ_POWER_GET_BAT_GAUGE, &status) < 0) | ||
410 | return -1; | ||
411 | return status; | ||
412 | } | ||
413 | |||
414 | int nwz_power_get_battery_adval(int fd) | ||
415 | { | ||
416 | int status; | ||
417 | if(ioctl(fd, NWZ_POWER_GET_BAT_ADVAL, &status) < 0) | ||
418 | return -1; | ||
419 | return status; | ||
420 | } | ||
421 | |||
422 | int nwz_power_get_battery_voltage(int fd) | ||
423 | { | ||
424 | return nwz_power_adval_to_mv(nwz_power_get_battery_adval(fd), NWZ_POWER_AD_BASE_VBAT); | ||
425 | } | ||
426 | |||
427 | int nwz_power_get_vbat_adval(int fd) | ||
428 | { | ||
429 | int status; | ||
430 | if(ioctl(fd, NWZ_POWER_GET_VBAT_ADVAL, &status) < 0) | ||
431 | return -1; | ||
432 | return status; | ||
433 | } | ||
434 | |||
435 | int nwz_power_get_vbat_voltage(int fd) | ||
436 | { | ||
437 | return nwz_power_adval_to_mv(nwz_power_get_vbat_adval(fd), NWZ_POWER_AD_BASE_VBAT); | ||
438 | } | ||
439 | |||
440 | int nwz_power_get_sample_count(int fd) | ||
441 | { | ||
442 | int status; | ||
443 | if(ioctl(fd, NWZ_POWER_GET_SAMPLE_COUNT, &status) < 0) | ||
444 | return -1; | ||
445 | return status; | ||
446 | } | ||
447 | |||
448 | int nwz_power_get_vsys_adval(int fd) | ||
449 | { | ||
450 | int status; | ||
451 | if(ioctl(fd, NWZ_POWER_GET_VSYS_ADVAL, &status) < 0) | ||
452 | return -1; | ||
453 | return status; | ||
454 | } | ||
455 | |||
456 | int nwz_power_get_vsys_voltage(int fd) | ||
457 | { | ||
458 | return nwz_power_adval_to_mv(nwz_power_get_vsys_adval(fd), NWZ_POWER_AD_BASE_VSYS); | ||
459 | } | ||
460 | |||
461 | int nwz_power_get_acc_charge_mode(int fd) | ||
462 | { | ||
463 | int status; | ||
464 | if(ioctl(fd, NWZ_POWER_GET_ACCESSARY_CHARGE_MODE, &status) < 0) | ||
465 | return -1; | ||
466 | return status; | ||
467 | } | ||
468 | |||
469 | int nwz_power_is_fully_charged(int fd) | ||
470 | { | ||
471 | int status; | ||
472 | if(ioctl(fd, NWZ_POWER_IS_FULLY_CHARGED, &status) < 0) | ||
473 | return -1; | ||
474 | return status; | ||
475 | } | ||