comparison rvinterf/etmsync/pirhackinit.c @ 0:e7502631a0f9

initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 11 Jun 2016 00:13:35 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:e7502631a0f9
1 /*
2 * This fc-pirhackinit utility is highly specific to the TCS211-on-Pirelli
3 * exercise. DO NOT run it against Pirelli's stock firmware, nor is it needed
4 * when using our full-source FreeCalypso firmware.
5 */
6
7 #include <sys/types.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <strings.h>
12 #include "etm.h"
13 #include "ffs.h"
14 #include "tmffs2.h"
15 #include "localtypes.h"
16 #include "exitcodes.h"
17
18 extern u_char pirelli_imeisv[8];
19
20 write_pcm_imei()
21 {
22 static char destfile[] = "/pcm/IMEI";
23 u_char swapped[8];
24 int i, d1, d2;
25
26 printf("Writing %s\n", destfile);
27 for (i = 0; i < 8; i++) {
28 d1 = pirelli_imeisv[i] >> 4;
29 d2 = pirelli_imeisv[i] & 0xF;
30 swapped[i] = (d2 << 4) | d1;
31 }
32 return do_short_fwrite(destfile, swapped, 8);
33 }
34
35 read_mem_region(memaddr, databuf, total_bytes)
36 u32 memaddr;
37 u_char *databuf;
38 {
39 int chunk, remain, rc;
40
41 for (remain = total_bytes; remain; remain -= chunk) {
42 chunk = remain;
43 if (chunk > MAX_MEMREAD_BYTES)
44 chunk = MAX_MEMREAD_BYTES;
45 rc = do_memory_read(memaddr, databuf, chunk);
46 if (rc)
47 return(rc);
48 memaddr += chunk;
49 databuf += chunk;
50 }
51 return(0);
52 }
53
54 write_buf_to_file(pathname, data, datalen)
55 char *pathname;
56 u_char *data;
57 {
58 int tfd, rc, chunk, remain;
59
60 if (datalen <= max_short_file_write(pathname))
61 return do_short_fwrite(pathname, data, datalen);
62 /* do it the long way */
63 rc = fd_open(pathname, FFS_O_WRONLY | FFS_O_CREATE | FFS_O_TRUNC, &tfd);
64 if (rc)
65 return(rc);
66 for (remain = datalen; remain; remain -= chunk) {
67 chunk = remain;
68 if (chunk > 240)
69 chunk = 240;
70 rc = fd_write(tfd, data, chunk);
71 if (rc) {
72 fd_close(tfd);
73 return(rc);
74 }
75 data += chunk;
76 }
77 return fd_close(tfd);
78 }
79
80 copy_calib_record(memaddr, pathname, size)
81 u32 memaddr;
82 char *pathname;
83 int size;
84 {
85 u_char *buf;
86 int rc;
87
88 buf = malloc(size);
89 if (!buf) {
90 perror("malloc");
91 exit(ERROR_UNIX);
92 }
93 rc = read_mem_region(memaddr, buf, size);
94 if (rc) {
95 free(buf);
96 return(rc);
97 }
98 rc = write_buf_to_file(pathname, buf, size);
99 free(buf);
100 return(rc);
101 }
102
103 static struct calmap {
104 u32 offset;
105 int size;
106 char *ti_equiv;
107 } pirelli_cal_map[] = {
108 {0x06E5, 36, "/sys/adccal"},
109 {0x072B, 512, "/gsm/rf/tx/ramps.900"},
110 {0x092C, 128, "/gsm/rf/tx/levels.900"},
111 {0x09AD, 128, "/gsm/rf/tx/calchan.900"},
112 {0x0A2E, 512, "/gsm/rf/tx/ramps.1800"},
113 {0x0C2F, 128, "/gsm/rf/tx/levels.1800"},
114 {0x0CB0, 128, "/gsm/rf/tx/calchan.1800"},
115 {0x0D31, 512, "/gsm/rf/tx/ramps.1900"},
116 {0x0F32, 128, "/gsm/rf/tx/levels.1900"},
117 {0x0FB3, 128, "/gsm/rf/tx/calchan.1900"},
118 {0x10AF, 40, "/gsm/rf/rx/calchan.900"},
119 {0x10D8, 8, "/gsm/rf/rx/agcparams.900"},
120 {0x10E1, 40, "/gsm/rf/rx/calchan.1800"},
121 {0x110A, 8, "/gsm/rf/rx/agcparams.1800"},
122 {0x1113, 40, "/gsm/rf/rx/calchan.1900"},
123 {0x113C, 8, "/gsm/rf/rx/agcparams.1900"},
124 {0, 0, 0}
125 };
126
127 copy_calib_data()
128 {
129 struct calmap *tp;
130 int rc;
131
132 printf("Copying calibration records to FFS\n");
133 for (tp = pirelli_cal_map; tp->size; tp++) {
134 rc = copy_calib_record(0x027F0000 + tp->offset, tp->ti_equiv,
135 tp->size);
136 if (rc)
137 return(rc);
138 }
139 return(0);
140 }
141
142 single_op_main()
143 {
144 int rc;
145
146 rc = get_pirelli_imei();
147 if (rc)
148 return(rc);
149 printf("Creating TCS211 file system directories\n");
150 rc = create_std_dirs();
151 if (rc)
152 return(rc);
153 rc = write_pcm_imei();
154 if (rc)
155 return(rc);
156 rc = copy_calib_data();
157 if (rc)
158 return(rc);
159 return set_rfcap("tri900");
160 }