FreeCalypso > hg > fc-tourmaline
view bwsplash/pbm2c.c @ 244:96784b8974eb
Switch_ON(): detect charging mode by CHGPRES bit
Consider the following scenario: the phone is on, the user plugs in
the charger, and then executes the power-off operation. In the Iota
VRPC this sequence translates to a switch-off immediately followed
by another switch-on - but the CHGSTS bit doesn't get set on the second
switch-on cycle! Disassembly of Pirelli's fw shows that they check
the CHGPRES bit, and furthermore, if both CHGPRES and ONBSTS are set,
the code they pass to their modified Power_ON_Button() function is
the one for charging - so let's adopt the same CHGPRES check and
the same priority order for switch-on causes.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 03 May 2021 06:51:29 +0000 |
parents | 4d9f24c501f3 |
children |
line wrap: on
line source
/* * This program compiles bwsplash.pbm into a C char array * for inclusion into phone UI firmware source. */ #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> FILE *inf, *outf; char *infname, linebuf[128]; int lineno; void get_input_line() { char *cp; if (!fgets(linebuf, sizeof linebuf, inf)) { fprintf(stderr, "%s: premature EOF\n", infname); exit(1); } lineno++; cp = index(linebuf, '\n'); if (!cp) { fprintf(stderr, "%s line %d: too long or missing newline\n", infname, lineno); exit(1); } *cp = '\0'; } void parse_pixel_line(outbuf, npix) u_char *outbuf; unsigned npix; { char *cp; u_char *dp; unsigned n; cp = linebuf; dp = outbuf; for (n = 0; n < npix; n++) { if (*cp != '0' && *cp != '1') { inv: fprintf(stderr, "%s line %d: does not match expected line of %u 0/1 characters\n", infname, lineno, npix); exit(1); } *dp++ = *cp++ - '0'; } if (*cp) goto inv; } void pack_pixel_byte(bits) u_char *bits; { unsigned byte, mask, n; byte = 0; for (n = 0, mask = 0x80; n < 8; n++, mask >>= 1) if (bits[n]) byte |= mask; fprintf(outf, "0x%02X,", byte); } main(argc, argv) char **argv; { unsigned nrow, ncol; u_char rowbuf[80]; if (argc != 3) { fprintf(stderr, "usage: %s pbmfile outfile\n", argv[0]); exit(1); } infname = argv[1]; inf = fopen(infname, "r"); if (!inf) { perror(infname); exit(1); } get_input_line(); if (strcmp(linebuf, "P1")) { fprintf(stderr, "error in %s: first line is not the expected \"P1\"\n", infname); exit(1); } get_input_line(); if (strcmp(linebuf, "80 30")) { fprintf(stderr, "error in %s: second line is not the expected \"80 30\"\n", infname); exit(1); } outf = fopen(argv[2], "w"); if (!outf) { perror(argv[2]); exit(1); } for (nrow = 0; nrow < 30; nrow++) { get_input_line(); parse_pixel_line(rowbuf, 80); putc('\t', outf); for (ncol = 0; ncol < 80; ncol += 8) pack_pixel_byte(rowbuf + ncol); putc('\n', outf); } exit(0); }