# HG changeset patch # User Space Falcon # Date 1441741600 0 # Node ID c298d579788ec2b0286ecf17097caef1d2849e45 # Parent 9b4b0fcddc7728a3ac153fcf60a4fab9a5932d02 fc-pirhackinit implemented, compiles diff -r 9b4b0fcddc77 -r c298d579788e rvinterf/etmsync/Makefile --- a/rvinterf/etmsync/Makefile Tue Sep 08 19:01:19 2015 +0000 +++ b/rvinterf/etmsync/Makefile Tue Sep 08 19:46:40 2015 +0000 @@ -1,6 +1,6 @@ CC= gcc CFLAGS= -O2 -I../include -PROGS= fc-fsio fc-getpirimei +PROGS= fc-fsio fc-getpirimei fc-pirhackinit INSTBIN=/usr/local/bin FSIO_OBJS= connect.o dispatch.o fdcmd.o fileio.o fsbasics.o fscmdtab.o \ @@ -11,6 +11,9 @@ PIRIMEI_OBJS= connect.o interf.o launchrvif.o memops.o pirimei.o \ pirimeimain.o simplemain.o +PIRHACK_OBJS= connect.o fileio.o fserr.o interf.o launchrvif.o memops.o \ + pirhackinit.o pirimei.o rfcap.o simplemain.o stddirs.o + all: ${PROGS} fc-fsio: ${FSIO_OBJS} @@ -19,6 +22,9 @@ fc-getpirimei: ${PIRIMEI_OBJS} ${CC} ${CFLAGS} -o $@ ${PIRIMEI_OBJS} -lcrypto +fc-pirhackinit: ${PIRHACK_OBJS} + ${CC} ${CFLAGS} -o $@ ${PIRHACK_OBJS} -lcrypto + install: ${PROGS} mkdir -p ${INSTBIN} install -c ${PROGS} ${INSTBIN} diff -r 9b4b0fcddc77 -r c298d579788e rvinterf/etmsync/pirhackinit.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/etmsync/pirhackinit.c Tue Sep 08 19:46:40 2015 +0000 @@ -0,0 +1,161 @@ +/* + * This fc-pirhackinit utility is highly specific to the TCS211-on-Pirelli + * exercise. DO NOT run it against Pirelli's stock firmware, nor is it needed + * when using our full-source FreeCalypso firmware. + */ + +#include +#include +#include +#include +#include +#include "etm.h" +#include "ffs.h" +#include "ffserr.h" +#include "tmffs2.h" +#include "localtypes.h" +#include "exitcodes.h" + +extern u_char pirelli_imeisv[8]; + +write_pcm_imei() +{ + static char destfile[] = "/pcm/IMEI"; + u_char swapped[8]; + int i, d1, d2; + + printf("Writing %s\n", destfile); + for (i = 0; i < 8; i++) { + d1 = pirelli_imeisv[i] >> 4; + d2 = pirelli_imeisv[i] & 0xF; + swapped[i] = (d2 << 4) | d1; + } + return do_short_fwrite(destfile, swapped, 8); +} + +read_mem_region(memaddr, databuf, total_bytes) + u32 memaddr; + u_char *databuf; +{ + int chunk, remain, rc; + + for (remain = total_bytes; remain; remain -= chunk) { + chunk = remain; + if (chunk > 240) + chunk = 240; + rc = do_memory_read(memaddr, databuf, chunk); + if (rc) + return(rc); + memaddr += chunk; + databuf += chunk; + } + return(0); +} + +write_buf_to_file(pathname, data, datalen) + char *pathname; + u_char *data; +{ + int tfd, rc, chunk, remain; + + if (datalen <= max_short_file_write(pathname)) + return do_short_fwrite(pathname, data, datalen); + /* do it the long way */ + rc = fd_open(pathname, FFS_O_WRONLY | FFS_O_CREATE | FFS_O_TRUNC, &tfd); + if (rc) + return(rc); + for (remain = datalen; remain; remain -= chunk) { + chunk = remain; + if (chunk > 240) + chunk = 240; + rc = fd_write(tfd, data, chunk); + if (rc) { + fd_close(tfd); + return(rc); + } + data += chunk; + } + return fd_close(tfd); +} + +copy_calib_record(memaddr, pathname, size) + u32 memaddr; + char *pathname; + int size; +{ + u_char *buf; + int rc; + + buf = malloc(size); + if (!buf) { + perror("malloc"); + exit(ERROR_UNIX); + } + rc = read_mem_region(memaddr, buf, size); + if (rc) { + free(buf); + return(rc); + } + rc = write_buf_to_file(pathname, buf, size); + free(buf); + return(rc); +} + +static struct calmap { + u32 offset; + int size; + char *ti_equiv; +} pirelli_cal_map[] = { + {0x06E5, 36, "/sys/adccal"}, + {0x072B, 512, "/gsm/rf/tx/ramps.900"}, + {0x092C, 128, "/gsm/rf/tx/levels.900"}, + {0x09AD, 128, "/gsm/rf/tx/calchan.900"}, + {0x0A2E, 512, "/gsm/rf/tx/ramps.1800"}, + {0x0C2F, 128, "/gsm/rf/tx/levels.1800"}, + {0x0CB0, 128, "/gsm/rf/tx/calchan.1800"}, + {0x0D31, 512, "/gsm/rf/tx/ramps.1900"}, + {0x0F32, 128, "/gsm/rf/tx/levels.1900"}, + {0x0FB3, 128, "/gsm/rf/tx/calchan.1900"}, + {0x10AF, 40, "/gsm/rf/rx/calchan.900"}, + {0x10D8, 8, "/gsm/rf/rx/agcparams.900"}, + {0x10E1, 40, "/gsm/rf/rx/calchan.1800"}, + {0x110A, 8, "/gsm/rf/rx/agcparams.1800"}, + {0x1113, 40, "/gsm/rf/rx/calchan.1900"}, + {0x113C, 8, "/gsm/rf/rx/agcparams.1900"}, + {0, 0, 0} +}; + +copy_calib_data() +{ + struct calmap *tp; + int rc; + + printf("Copying calibration records to FFS\n"); + for (tp = pirelli_cal_map; tp->size; tp++) { + rc = copy_calib_record(0x027F0000 + tp->offset, tp->ti_equiv, + tp->size); + if (rc) + return(rc); + } + return(0); +} + +single_op_main() +{ + int rc; + + rc = get_pirelli_imei(); + if (rc) + return(rc); + printf("Creating TCS211 file system directories\n"); + rc = create_std_dirs(); + if (rc) + return(rc); + rc = write_pcm_imei(); + if (rc) + return(rc); + rc = copy_calib_data(); + if (rc) + return(rc); + return set_rfcap("tri900"); +}