Project

General

Profile

DeprecatedPortingGuideMSMQSD » History » Version 58

Paul Kocialkowski, 05/16/2011 07:02 PM

1 1 Denis 'GNUtoo' Carikli
== Introduction ==
2
Many people bought many different phones, and some of them whish to help replicant and/or to port replicant to their phones or devices.
3 33 Michael Haas -
This guide will show what was done for the htc dream, so these people can understand the process better.
4 34 Michael Haas -
When talking about porting, this page talks about re-using existing product definitions. You will not learn how to
5
build Android for a device not currently supported by Android. Instead, you will learn how to build a version of
6
[Cyanogenmod http://www.cyanogenmod.com/] without proprietary parts.
7 35 Michael Haas -
To gain more insight in the Android build system, refer to [http://source.android.com/porting/build_system.html Android Build System documentation] which is part of
8 34 Michael Haas -
[http://source.android.com/porting/ Android Platform Developer's Guide]. You should find an answer there if you have any questions about the Makefiles referenced in this document.
9 32 Michael Haas -
10 1 Denis 'GNUtoo' Carikli
== Terminology ==
11 33 Michael Haas -
The RIL is the radio interface library, that is to say, a library that talks to the modem, usually (but not always) trough AT commands.
12 32 Michael Haas -
Basically the modem runs on a separate CPU,and there is some sort of communication needed between the main CPU and the modem CPU to make telephony work. For instance, the modem must tell you when you've got a call, and you must tell the modem that you want to call someone.
13 1 Denis 'GNUtoo' Carikli
TODO: point to 0707 standard or newer
14
15 31 Denis 'GNUtoo' Carikli
== Help with source code ==
16 32 Michael Haas -
Keep in mind that on most devices, the full source code of the kernel is released.
17
However, some userspace libraries, or dlopened libraries (libraries loaded at runtime after the application started) are proprietary software,
18 31 Denis 'GNUtoo' Carikli
so if you're porting to a new CPU/SOC keep in mind that you have the source code to the kernel interfaces.
19
That can help a lot, and sometimes there is even some sort of documentation in the headers.
20 1 Denis 'GNUtoo' Carikli
21
== Build the source ==
22
23
The first thing to do is to download the replicant sources:
24
[wiki:BuildDream] can be used as a reference: download and build the sources for your device.
25 32 Michael Haas -
Let's say the user has a HTC Wildfire. It is useful to know the codename of the device in question, which is "Buzz" in case
26
of the Wildfire.
27 1 Denis 'GNUtoo' Carikli
28 32 Michael Haas -
You need to configure the build tree for our device. By default, a generic image
29
for the Android emulator will be built. 
30
In [wiki:BuildDream], you would use the following command to set up the build:
31 2 Denis 'GNUtoo' Carikli
{{{
32
lunch cyanogen_dream_sapphire-eng 
33
}}}
34 32 Michael Haas -
Now, since you are not building for the HTC dream, you need to identify the right command that corresponds to your device.
35
In order to do that, run the following command and look at its output.
36 2 Denis 'GNUtoo' Carikli
{{{
37
$ source build/envsetup.sh
38
including device/geeksphone/one/vendorsetup.sh
39
including device/htc/ace/vendorsetup.sh
40
including device/htc/bravoc/vendorsetup.sh
41
including device/htc/bravo/vendorsetup.sh
42
including device/htc/buzz/vendorsetup.sh
43
including device/htc/glacier/vendorsetup.sh
44 1 Denis 'GNUtoo' Carikli
including device/htc/heroc/vendorsetup.sh
45
including device/htc/inc/vendorsetup.sh
46 2 Denis 'GNUtoo' Carikli
including device/htc/legend/vendorsetup.sh
47
including device/htc/liberty/vendorsetup.sh
48
including device/htc/supersonic/vendorsetup.sh
49
including device/htc/vision/vendorsetup.sh
50
including device/motorola/sholes/vendorsetup.sh
51
including device/nvidia/harmony/vendorsetup.sh
52
including vendor/cyanogen/vendorsetup.sh
53
}}}
54 37 Denis 'GNUtoo' Carikli
The last line is important:
55 1 Denis 'GNUtoo' Carikli
{{{
56 37 Denis 'GNUtoo' Carikli
$ cat vendor/cyanogen/vendorsetup.sh
57
add_lunch_combo cyanogen_ace-eng
58
add_lunch_combo cyanogen_bravo-eng
59
add_lunch_combo cyanogen_bravoc-eng
60
add_lunch_combo cyanogen_buzz-eng
61
add_lunch_combo cyanogen_dream_sapphire-eng
62
add_lunch_combo cyanogen_espresso-eng
63
add_lunch_combo cyanogen_glacier-eng
64
add_lunch_combo cyanogen_harmony-eng
65
add_lunch_combo cyanogen_hero-eng
66
add_lunch_combo cyanogen_heroc-eng
67
add_lunch_combo cyanogen_inc-eng
68
add_lunch_combo cyanogen_legend-eng
69
add_lunch_combo cyanogen_liberty-eng
70
add_lunch_combo cyanogen_one-eng
71
add_lunch_combo cyanogen_passion-eng
72
add_lunch_combo cyanogen_sholes-eng
73
add_lunch_combo cyanogen_supersonic-eng
74
add_lunch_combo cyanogen_vibrant-eng
75
add_lunch_combo cyanogen_vision-eng
76
add_lunch_combo cyanogen_z71-eng
77 4 Denis 'GNUtoo' Carikli
78 37 Denis 'GNUtoo' Carikli
PATH=$PATH:$PWD/vendor/cyanogen/tools ; export PATH
79 4 Denis 'GNUtoo' Carikli
}}}
80 37 Denis 'GNUtoo' Carikli
The output include the list of supported (by cyanogenmod) devices.
81
For instance if you have the Wildfire (codename 'buzz') phone do:
82 36 Michael Haas -
{{{
83 1 Denis 'GNUtoo' Carikli
lunch cyanogen_buzz-eng
84 36 Michael Haas -
}}}
85
86 1 Denis 'GNUtoo' Carikli
Then build the source, backup what's on your device, including the operating system, and flash the new replicant image.
87 9 Denis 'GNUtoo' Carikli
88
Then test what works and what doesn't.
89 1 Denis 'GNUtoo' Carikli
90
The images are located in 
91
{{{
92
out/target/product/dream_sapphire
93 32 Michael Haas -
}}}
94 8 Denis 'GNUtoo' Carikli
in the case of the HTC Dream. You need to look in the path that corresponds to your device.
95 1 Denis 'GNUtoo' Carikli
96
== Trying free replacements ==
97 32 Michael Haas -
98
The source code you just built contains some free replacements for the proprietary
99
libraries shipped by your phone vendor with the default firmware.
100
101 1 Denis 'GNUtoo' Carikli
A list of proprietary libraries is available in
102 10 Denis 'GNUtoo' Carikli
{{{
103
device/htc/dream_sapphire/extract-files.sh
104 32 Michael Haas -
}}}
105
Note: don't run this file, just look at it. If you run it, the proprietary files will be copied from your phone into the build tree. A build containing proprietary files would put you and
106 1 Denis 'GNUtoo' Carikli
your users at risk. Additionally, it is illegal to redistribute such build, because the libraries are not redistributable(the copyright owner didn't allow you to redistribute them).
107 32 Michael Haas -
108
109
=== RIL test ===
110
I will take the example of how to use the free RIL (Radio Interface Library) to see if it works fine without modifications:
111 11 Denis 'GNUtoo' Carikli
The proprietary RIL library (which you don't have in the phone) location is found looking at the extract-files.sh
112
here's a part of extract-files.sh:
113
{{{
114
adb pull /system/lib/libhtc_ril.so ../../../vendor/htc/$DEVICE/proprietary/libhtc_ril.so
115 32 Michael Haas -
}}}
116
Note: don't run this command, just look at it. If you run it, the proprietary files will be copied from your phone into the build tree. A build containing proprietary files would put you and
117
your users at risk. Additionally, it is illegal to redistribute such build, because the libraries are not redistributable(the copyright owner didn't allow you to redistribute them).
118
119 12 Denis 'GNUtoo' Carikli
So looking at the above line the proprietary RIL is located here on the phone:
120
{{{
121
/system/lib/libhtc_ril.so
122 32 Michael Haas -
}}}
123 13 Denis 'GNUtoo' Carikli
while the free ril is located here (known fact):
124 14 Denis 'GNUtoo' Carikli
{{{
125 1 Denis 'GNUtoo' Carikli
/system/lib/libreference-ril.so
126 32 Michael Haas -
}}}
127 13 Denis 'GNUtoo' Carikli
In order to test the free RIL you could be tempted to do that:
128 14 Denis 'GNUtoo' Carikli
{{{
129 15 Denis 'GNUtoo' Carikli
# ./adb remount
130 14 Denis 'GNUtoo' Carikli
# ./adb shell
131 1 Denis 'GNUtoo' Carikli
mv /system/lib/libreference-ril.so /system/lib/libhtc_ril.so
132
}}}
133
But that wouldn't work as it wouldn't be using the right serial port, the correct way to try that is to use getprop/setprop:
134 14 Denis 'GNUtoo' Carikli
{{{
135 1 Denis 'GNUtoo' Carikli
# ./adb shell
136
# setprop
137
usage: setprop <key> <value>
138 32 Michael Haas -
}}}
139 39 Konstantinos Karantias -
What you can do to set the libre RIL is - possibly - this:
140
{{{
141
./adb shell
142
setprop rild.libpath /system/lib/libreference-ril.so
143
setprop rild.libargs -d/dev/smd0
144
}}}
145 13 Denis 'GNUtoo' Carikli
Here's how it looks on a working replicant on the HTC Dream:
146
{{{
147
# ./adb shell
148
# getprop | grep ril
149
[ro.ril.hsxpa]: [2]
150
[ro.ril.gprsclass]: [10]
151 1 Denis 'GNUtoo' Carikli
[rild.libpath]: [/system/lib/libreference-ril.so]
152
[rild.libargs]: [-d/dev/smd0]
153 15 Denis 'GNUtoo' Carikli
[init.svc.ril-daemon]: [running]
154
[ro.ril.def.agps.mode]: [2]
155 32 Michael Haas -
[gsm.version.ril-impl]: [android reference-ril 1.0]
156 14 Denis 'GNUtoo' Carikli
}}}
157 12 Denis 'GNUtoo' Carikli
 * /dev/smd0 is the (emulated) serial port
158
 * /system/lib/libreference-ril.so is where to look for the RIL hardware specific library 
159 1 Denis 'GNUtoo' Carikli
160 39 Konstantinos Karantias -
Then, you can kill the ril daemon:
161 1 Denis 'GNUtoo' Carikli
{{{
162 39 Konstantinos Karantias -
./adb shell killall rild
163 1 Denis 'GNUtoo' Carikli
}}}
164 39 Konstantinos Karantias -
Then try the reference RIL. You can see debugging things and such by doing:
165
{{{
166
./adb logcat -b radio
167
}}}
168
169
That's also tested and worked on the gtklocker's HTC Hero, so I suppose it will work for the most HTC devices out there. If your device isn't listed anywhere, don't dare to try it.
170 32 Michael Haas -
171 16 Denis 'GNUtoo' Carikli
== Replacing proprietary libraries for real ==
172 32 Michael Haas -
173
On the HTC Dream the following proprietary libraries were replaced:
174 16 Denis 'GNUtoo' Carikli
(Refer to [wiki:ProprietaryHtcDreamLibsReplacement] for more up to date details(or fix it if it's less recent))
175
176
The first thing you will have to do is to modify the build system.
177 1 Denis 'GNUtoo' Carikli
The key thing to do is to change 
178 32 Michael Haas -
179
=== RIL ===
180
If the RIL you previously tried works fine, why not switching to it...directly in the build system.
181 16 Denis 'GNUtoo' Carikli
Here's the diff between A working RIL and a non-working RIL for the htcdream:
182
{{{
183
android_device_htc_dream_sapphire$ git diff 5593d2899203ec378c306701788f1c43af9a6935 -- full_dream_sapphire.mk
184
diff --git a/full_dream_sapphire.mk b/full_dream_sapphire.mk
185
index 9ec7feb..eb1b956 100644
186
--- a/full_dream_sapphire.mk
187
+++ b/full_dream_sapphire.mk
188
@@ -40,7 +40,8 @@ PRODUCT_PROPERTY_OVERRIDES := \
189
     ro.media.dec.jpeg.memcap=10000000
190
 
191
 PRODUCT_PROPERTY_OVERRIDES += \
192
-    rild.libpath=/system/lib/libhtc_ril.so \
193
+    rild.libpath=/system/lib/libreference-ril.so \
194
+    rild.libargs=-d/dev/smd0 \
195
     wifi.interface=tiwlan0
196 17 Denis 'GNUtoo' Carikli
 
197
 # Time between scans in seconds. Keep it high to minimize battery drain.
198
199
}}}
200
Note that full_dream_sapphire.mk is located here:
201
{{{
202 18 Denis 'GNUtoo' Carikli
device/htc/dream_sapphire/full_dream_sapphire.mk
203
}}}
204
The diff is self-explanatory and how to do the change is left as an exercise to the reader.
205 32 Michael Haas -
206 18 Denis 'GNUtoo' Carikli
In case the RIL need to be modified the sources are in :
207 19 Denis 'GNUtoo' Carikli
{{{
208
hardware/ril/reference-ril
209
}}}
210 21 Denis 'GNUtoo' Carikli
They are written in C.
211 19 Denis 'GNUtoo' Carikli
212 32 Michael Haas -
=== Audio libraries ===
213
On the HTC dream the audio libraries were modified.
214 40 Denis 'GNUtoo' Carikli
If your device is an msm7k "CPU" (in reality it's called a SOC, or system on a chip), it already contain [http://gitorious.org/replicant/android_hardware_msm7k/commit/e0b55a19b2fc004915503ebdfd7c4c02c4264611 the routing fix].
215
Note several things on [http://gitorious.org/replicant/android_hardware_msm7k/commit/e0b55a19b2fc004915503ebdfd7c4c02c4264611 the commit]:
216 22 Denis 'GNUtoo' Carikli
 * the routing was disabled, I had to re-enable it
217 28 Denis 'GNUtoo' Carikli
 * I had to replace some non-existant functions, for that I used public playwav2.c source code that the author released to us under the apache 2.0 license.
218
 * I had nearly no knowledge of C++
219 32 Michael Haas -
 * it was easy
220 28 Denis 'GNUtoo' Carikli
221 41 Denis 'GNUtoo' Carikli
On the nexus one the proprietary libacoustic libraries are only used for bluetooth(all the rest works if you pushed the firmwares).
222
223 58 Paul Kocialkowski
On the dream (msm7k), libacoustic has been fully replaced, see [http://gitorious.org/replicant/android_hardware_msm7k/commit/c650b45892aa8be87f3e88ee6eae5df053a0a047]: it loads the values from the /system/etc/AudioPara4.csv CSV file to MSM shared memory, which fixes in-call volume regulation and adds support for No Mic Wired Headset. It should also add support for other other things (probably including bluetooth devices) but this has not been tested yet. 
224 56 Paul Kocialkowski
The existing replacement code (hardware/msm7k/libaudio/AudioAcoustic.cpp) should work for your msm7k device but it has only been tested on the Dream. 
225 1 Denis 'GNUtoo' Carikli
226 58 Paul Kocialkowski
If it does not work, check that your device contains the /system/etc/AudioPara4.csv CSV file. If it does not, the file may have another name or perhaps your device does not work like the Dream. If it's the case, you'll probably have to write the code to support acoustic or find another working replacement. You can read jbruneaux's work on audio acoustic for WinCE devices from {{{ git://gitorious.org/~jbruneaux/xdandroid/hardware_msm7k_libacoustic.git }}} (userland) and {{{ git://gitorious.org/linux-on-qualcomm-s-msm/linux-msm-home-work.git }}} branch {{{ htc-msm-2.6.27-libacoustic }}} (kernel-space). Note that audio acoustic is not absolutely necessary to make audio work, it'll just cause some minor issues as written above. 
227
228 56 Paul Kocialkowski
To make sure it parses the CSV file, run adb logcat | grep Audio and find the following lines: 
229 1 Denis 'GNUtoo' Carikli
{{{
230 56 Paul Kocialkowski
D/AudioAcousticMSM72XX(  122): Successfully opened /system/etc/AudioPara4.csv
231
D/AudioAcousticMSM72XX(  122): CSV Header: Dream_TMU_20090305
232
D/AudioAcousticMSM72XX(  122): Read:
233
D/AudioAcousticMSM72XX(  122): 24 Audio_Path_Table entries
234
D/AudioAcousticMSM72XX(  122): 24 Audio_Path_Uplink_Table entries
235
D/AudioAcousticMSM72XX(  122): 35 Phone_Acoustic_Table entries
236
D/AudioAcousticMSM72XX(  122): 35 BT_Phone_Acoustic_Table entries
237
D/AudioAcousticMSM72XX(  122): 24 HTC_VOC_CAL_CODEC_TABLE_Table entries
238
D/AudioAcousticMSM72XX(  122): 0 CE_Acoustic_Table entries
239 1 Denis 'GNUtoo' Carikli
}}}
240 56 Paul Kocialkowski
Then, if it parses the file but does not work, it's probably because the addresses (or the size) where the tables must be written in MSM shared memory are not the same for the Dream and for your device. 
241
In order to find the correct addresses, you'll have to use CyanogenMod code with the non-free libhtc_acoustic.so lib that you can get from CyanogenMod downloadable zip for your device.
242
move the hardware/msm7k/ directory to another place '''not in the build tree''' or it'll fail ({{{ mv hardware/msm7k/ ../msm7k }}}.
243
Then download CyanogenMod code:
244
{{{ git clone git://github.com/CyanogenMod/android_hardware_msm7k.git -b froyo-stable hardware/msm7k/ }}}
245
Now you need to modify the kernel-side driver to print some useful infos on file kernel-msm/arch/arm/mach-msm/htc_acoustic.c, function acoustic_mmap(), add the following code:
246
{{{
247
D(" -- vma dump start --\n");
248
249
D("vm_start=%x (%d)\n", vma->vm_start, vma->vm_start);
250
D("vm_end=%x (%d)\n", vma->vm_end, vma->vm_end);
251
D("vm_page_prot=%x (%d)\n", vma->vm_page_prot,vma->vm_page_prot);
252
D("vm_flags=%x (%d)\n", vma->vm_flags, vma->vm_flags);
253
D("vm_pgoff=%x (%d)\n", vma->vm_pgoff, vma->vm_pgoff);
254
255
D(" -- vma dump end --\n");
256
}}}
257
258
Then build the code (make -j9 bootimage && make-j9 systemimage), and flash system.img and boot.img to your device, boot it, copy the libhtc_acoustic.so lib to /system/lib/ (you need to remount /system using {{{ adb remount }}} to write under /system) and check the kernel logs with {{{ adb shell dmesg | grep acoustic }}}. You should see something like:
259
{{{
260
<6>[   22.250274] htc-acoustic: open
261
<6>[   22.252716] htc-acoustic: mmap
262
<6>[   22.253265] htc-acoustic:  -- vma dump start --
263
<6>[   22.254028] htc-acoustic: vm_start=4010c000 (1074839552)
264
<6>[   22.254699] htc-acoustic: vm_end=40119000 (1074892800)
265
<6>[   22.255310] htc-acoustic: vm_page_prot=38f (911)
266
<6>[   22.256011] htc-acoustic: vm_flags=400844ff (1074283775)
267
<6>[   22.256622] htc-acoustic: vm_pgoff=1f4a (8010)
268
<6>[   22.257293] htc-acoustic:  -- vma dump end --
269
<6>[   22.742675] htc-acoustic: ioctl
270
<6>[   22.743103] htc-acoustic: ioctl: ACOUSTIC_ARM11_DONE called 123.
271
<6>[   22.746612] htc-acoustic: ioctl: ONCRPC_ACOUSTIC_INIT_PROC success.
272
<6>[   22.747344] htc-acoustic: release
273
}}}
274
275
Now you can get the size of the dedicated memory area: vm_start - vm_end = 0x4010c000-0x40119000 = '''0xd000'''.
276
Then, you'll have to dump the entire memory to a file that you need to create: {{{ adb shell touch /data/dump }}}. Add a function to AudioHardware.cpp :
277
{{{
278
void acoustic_mmap_dump(void)
279
{
280
	uint8_t *test_map_base;
281
	uint8_t *ptr, nval;
282
	int fd, fdd=0;
283
	off_t TargetAddr;
284
	int len;
285
286
	fd = open("/dev/htc-acoustic", O_RDWR | O_SYNC);
287
	fdd = open("/data/dump", O_RDWR | O_TRUNC | O_CREAT);
288
289
	test_map_base = (uint8_t *)
290
	    mmap(0, 0xd000, PROT_READ | PROT_WRITE, MAP_SHARED, fd,
291
		 0);
292
//	test_virt_base = test_map_base + (TargetAddr & MAP_MASK);
293
//	LOGD("virtual base at %p (phys=0x%X)\n", test_virt_base, TargetAddr);
294
295
	LOGD(" -- htc-acoustic memory read -- \n");
296
	LOGD("beginning adress is@%p\n", test_map_base);
297
          for (len = 0; len < 0xd000; len++)
298
		{
299
			if( write(fdd, test_map_base, sizeof(uint8_t) ) < 0)
300
			{
301
				LOGE("write failed");
302
				break;
303
			}
304
			//LOGD("0x%x (%d) @%p",  *(test_map_base), *(test_map_base), test_map_base);
305
		  test_map_base++;
306
		}
307
308
309
	munmap(test_map_base, 0xd000);
310
	close(fdd);
311
	close(fd);
312 1 Denis 'GNUtoo' Carikli
}
313
}}}
314
replace 0xd000 by the size you found out and call it after {{{ int rc = set_acoustic_parameters(); }}} on the AudioHardware::AudioHardware() function.
315 58 Paul Kocialkowski
Build the code (make -j9 systemimage), flash system.img to your device and get /data/dump: {{{ adb pull /data/dump }}}. This should copy dump to your current directory. You can try to load that file in MSM shared memory at the exact place where you dumped it. To do that, add the following functions to AudioHardware.cpp (don't forget to replace the size, 0xd000 if it's different for your device):
316
{{{
317
#define ACOUSTIC_IOCTL_MAGIC 'p'
318
#define ACOUSTIC_NOTICE		_IOW(ACOUSTIC_IOCTL_MAGIC, 42, unsigned int)
319
#define ACOUSTIC_ARM11_DONE	_IOW(ACOUSTIC_IOCTL_MAGIC, 22, unsigned int)
320
321
void acoustic_mmap(void)
322
{
323
	char *test_map_base;
324
	volatile int *ptr, nval;
325
	int fd, fdd;
326
	off_t TargetAddr;
327
	int len;
328
329
	fd = open("/dev/htc-acoustic", O_RDWR | O_SYNC);
330
	fdd = open("/data/dump", O_RDWR);
331
332
	test_map_base = (char *)
333
	    mmap(0, 0xd000, PROT_READ | PROT_WRITE, MAP_SHARED, fd,
334
		 0);
335
//	test_virt_base = test_map_base + (TargetAddr & MAP_MASK);
336
//	LOGD("virtual base at %p (phys=0x%X)\n", test_virt_base, TargetAddr);
337
338
	LOGD(" -- htc-acoustic memory write -- \n");
339
          for (len = 0; len < 0xd000; len++)
340
		{
341
		  read(fdd, test_map_base, sizeof(char) );
342
		  test_map_base++;
343
		}
344
345
346
	munmap(test_map_base, 0xd000);
347
	close(fdd);
348
	close(fd);
349
}
350
351
void acoustic_done(void)
352
{
353
     int fd;
354
	       fd = open("/dev/htc-acoustic",O_RDWR);
355
356
               if (fd < 0) {
357
	            LOGE("Cannot open htc-acoustic device");
358
	            close(fd);
359
	            return;
360
               }
361
362
       ioctl(fd,ACOUSTIC_ARM11_DONE, NULL);
363
       close(fd);
364
}
365
}}}
366
Now replace:
367
{{{
368
    set_acoustic_parameters = (int (*)(void))::dlsym(acoustic, "set_acoustic_parameters");
369
    if ((*set_acoustic_parameters) == 0 ) {
370
        LOGE("Could not open set_acoustic_parameters()");
371
        return;
372
    }
373
374
    int rc = set_acoustic_parameters();
375
    if (rc < 0) {
376
        LOGE("Could not set acoustic parameters to share memory: %d", rc);
377
//        return;
378
    }
379
}}}
380
with:
381
{{{
382
acoustic_mmap();
383
acoustic_done();
384
}}}
385
386
Build system.img: {{{ make -j9 systemimage }}} and flash it to your device. Now '''audioacoustic should work''' but it's not a clean way to make it work: the clean way is to parse the CSV file and load it to MSM shared memory with free code. If it does not work, then your device is definitely not working like the Dream and you'll have to find another way to make it work. 
387 56 Paul Kocialkowski
388 42 Denis 'GNUtoo' Carikli
=== GPS ===
389
Two GPS libraries exist:
390
 * libgps
391
 * libloc_api
392 43 Denis 'GNUtoo' Carikli
Both provide the same functionalities at the application level.
393 1 Denis 'GNUtoo' Carikli
Choose the one that is supported by your device or that has support for a device close to your device.
394 43 Denis 'GNUtoo' Carikli
==== libgps ====
395
For adding support to libgps you need to enable it like in [http://gitorious.org/replicant/android_device_htc_dream_sapphire/commit/153ab7e8fcf6bfc294b200d60a6f01feb5bb571a this commit]:
396
add the following(or modify if it's already there but holds another value) in device/htc/dream_sapphire/BoardConfig.mk (replace dream_saphire by your device code) :
397
{{{
398
BOARD_HAVE_GPS_HARDWARE := true
399
BOARD_GPS_LIBRARIES := libhardware
400 1 Denis 'GNUtoo' Carikli
}}}
401 43 Denis 'GNUtoo' Carikli
I'm not sure if the "BOARD_HAVE_GPS_HARDWARE := true" is really needed.
402
403
If your device is different from the htc dream you may have to modify the GPS library code to match your device,
404
Here's the adaptation made for the htc dream:
405
{{{
406
hardware/libhardware_legacy/gps$ diff -u ../../../../repos_external/phh_libhardware_legacy/gps/gps-rpc.c ./gps-rpc.c 
407
--- ../../../../repos_external/phh_libhardware_legacy/gps/gps-rpc.c	2010-08-15 11:35:03.210095153 +0200
408
+++ ./gps-rpc.c	2011-01-06 16:46:45.417685002 +0100
409
@@ -464,8 +464,8 @@
410
 }
411
 
412
 int init_gps6125() {
413
-	struct CLIENT *clnt=clnt_create(NULL, 0x3000005B, 0, NULL);
414
-	struct CLIENT *clnt_atl=clnt_create(NULL, 0x3000001D, 0, NULL);
415
+	struct CLIENT *clnt=clnt_create(NULL, 0x3000005B, 0x90380d3d, NULL);
416
+	struct CLIENT *clnt_atl=clnt_create(NULL, 0x3000001D, 0x51c92bd8, NULL);
417
 	int i;
418
 	_clnt=clnt;
419
 	SVCXPRT *svc=svcrtr_create();
420
@@ -538,33 +538,21 @@
421
 
422
 
423
 int init_gps_rpc() {
424
-	int fd=open("/sys/class/htc_hw/amss", O_RDONLY);
425
-	char buf[32];
426
-	bzero(buf, 32);
427
-	read(fd, buf, 32);
428
-	if(strncmp(buf, "6125", 4)==0)
429
-		amss=A6125;
430
-	else if((strncmp(buf, "5225", 4)==0) || (strncmp(buf, "6150", 4)==0))
431
-		amss=A5225;
432
-	else
433
-		amss=A6125; //Fallback to 6125 ATM
434
-	if(amss==A6125)
435
-		init_gps6125();
436
-	else if(amss==A5225)
437
-		init_gps5225();
438
+	amss=A6125;
439
+	init_gps6125();
440
 	return 0;
441
 }
442
 
443
 void gps_get_position() {
444
 	int i;
445
-	for(i=5;i;--i) if(!can_send) sleep(1);//Time out of 5 seconds on can_send
446
+	for(i=3;i;--i) if(!can_send) sleep(1);//Time out of 5 seconds on can_send
447
 	can_send=0;
448
 	pdsm_get_position(_clnt, 0, 0, 1, 1, 1, 0x3B9AC9FF, 1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,32,2,client_IDs[2]);
449
 }
450
 
451
 void exit_gps_rpc() {
452
-	if(amss==A6125)
453
-		pdsm_client_end_session(_clnt, 0, 2);
454
+	//if(amss==A6125)
455
+	//	pdsm_client_end_session(_clnt, 0, 2);
456
 	//5225 doesn't seem to like end_session ?
457
 	//Bah it ends session on itself after 10seconds.
458 1 Denis 'GNUtoo' Carikli
 }
459 44 Denis 'GNUtoo' Carikli
}}}
460
461
so let's go step by steps on that diff:
462
First we see that:
463
{{{
464
+	struct CLIENT *clnt=clnt_create(NULL, 0x3000005B, 0x90380d3d, NULL);
465
+	struct CLIENT *clnt_atl=clnt_create(NULL, 0x3000001D, 0x51c92bd8, NULL);
466
}}}
467
This corresponds to some devices nodes:
468
{{{
469
# ls -l /dev/oncrpc
470
crw-rw----    1 radio    system    253,   0 Jan  6 16:43 00000000:0
471
crw-rw----    1 radio    system    253,  11 Jan  6 16:43 30000000:5a10cf88
472
crw-rw----    1 radio    system    253,   9 Jan  6 16:43 30000002:aa2b1a44
473
crw-rw----    1 radio    system    253,   4 Jan  6 16:43 30000003:94103dec
474
crw-rw----    1 radio    system    253,  30 Jan  6 16:43 3000000a:71d1094b
475
crw-rw----    1 radio    system    253,  28 Jan  6 16:43 3000000e:2bf06595
476
crw-rw----    1 radio    system    253,  26 Jan  6 16:43 3000000f:46d257e5
477
crw-rw----    1 radio    system    253,  23 Jan  6 16:43 30000013:e94e8f0c
478
crw-rw----    1 radio    system    253,  22 Jan  6 16:43 30000014:7cfcd2c6
479
crw-rw----    1 radio    system    253,  21 Jan  6 16:43 30000016:c713bd79
480
crw-rw----    1 radio    system    253,  19 Jan  6 16:43 30000019:acb4a896
481
crw-rw----    1 radio    system    253,  18 Jan  6 16:43 3000001b:97d7b24a
482
crw-rw----    1 radio    system    253,  12 Jan  6 16:43 3000001d:51c92bd8
483
crw-rw----    1 radio    system    253,   8 Jan  6 16:43 30000021:f330a24e
484
crw-rw----    1 radio    system    253,  14 Jan  6 16:43 3000003c:03d4377c
485
crw-rw----    1 radio    system    253,  29 Jan  6 16:43 30000048:0da5b528
486
crw-rw----    1 radio    system    253,  17 Jan  6 16:43 30000059:00000000
487
crw-rw----    1 radio    system    253,  16 Jan  6 16:43 3000005a:00000000
488
crw-rw----    1 radio    system    253,  13 Jan  6 16:43 3000005b:90380d3d
489
crw-rw----    1 radio    system    253,   7 Jan  6 16:43 3000005f:95d1d9f5
490
crw-rw----    1 radio    system    253,   5 Jan  6 16:43 30000060:bcfb5d63
491
crw-rw----    1 radio    system    253,   2 Jan  6 16:43 30000061:fb837d0b
492
crw-rw----    1 radio    system    253,  31 Jan  6 16:43 30000066:1f4b343e
493
crw-rw----    1 radio    system    253,  27 Jan  6 16:43 3000006b:0aabc7a4
494
crw-rw----    1 radio    system    253,  25 Jan  6 16:43 3000006c:00000000
495
crw-rw----    1 radio    system    253,  20 Jan  6 16:43 30000075:f708938d
496
crw-rw----    1 radio    system    253,  15 Jan  6 16:43 30000079:00000000
497
crw-rw----    1 radio    system    253,   1 Jan  6 16:43 30000081:ccc5b439
498
crw-rw----    1 radio    system    253,  24 Jan  6 16:43 3000fe00:00000000
499
crw-rw----    1 radio    system    253,  10 Jan  6 16:43 3000fffe:00000000
500
crw-rw----    1 radio    system    253,   6 Jan  6 16:43 30100001:00000000
501
crw-rw----    1 radio    system    253,   3 Jan  6 16:43 30100002:00000000
502
}}}
503
Theses 2 lines should ring a bell:
504
{{{
505
crw-rw----    1 radio    system    253,  13 Jan  6 16:43 3000005b:90380d3d
506 1 Denis 'GNUtoo' Carikli
crw-rw----    1 radio    system    253,  12 Jan  6 16:43 3000001d:51c92bd8
507 45 Denis 'GNUtoo' Carikli
}}}
508
509
Next there is that line:
510
{{{
511
+	for(i=3;i;--i) if(!can_send) sleep(1);//Time out of 5 seconds on can_send
512 1 Denis 'GNUtoo' Carikli
}}}
513 45 Denis 'GNUtoo' Carikli
This is the time between 2 requests, if you put it too low it can reboot your phone(it will crashes and reboot)
514
515 47 Denis 'GNUtoo' Carikli
516
==== libloc_api ====
517 49 Denis 'GNUtoo' Carikli
For adding support for libloc_api you need to modify the BOARD_GPS_LIBRARIES variable
518 45 Denis 'GNUtoo' Carikli
519 50 Denis 'GNUtoo' Carikli
[https://github.com/CyanogenMod/android_hardware_qcom_gps That repository] should have newer devices support(like in AOSP) and older too(like rmcc's commits)
520
521
==== testing ====
522
{{{
523
cd hardware/libhardware_legacy/tests/gpstest/
524
mm
525 45 Denis 'GNUtoo' Carikli
}}}
526 43 Denis 'GNUtoo' Carikli
gives you a gpstest binary, copy it to the device and run it, it'll tell you if it has a fix
527 1 Denis 'GNUtoo' Carikli
==== Note on the GPS ====
528 45 Denis 'GNUtoo' Carikli
Note that messing with GPS can reboot(that is to say your phone crashes and reboots because of that) your phone on certain devices(like the htc dream or the nexus one).
529
530
The GPS is attached to the modem on the htc dream and the nexus one.
531
The only way to request a fix or to activate it is trough a rpc mecanism that is between the modem and the CPU that runs Android.
532
That RPC mecanism uses shared memory between the modem and the CPU that runs Android.
533
534
On the htcdream and the nexusone a serial line is emulated on top of the RPC mecanism: the serial lines can be accesed at /dev/smd0 for the modem(AT commands) and /dev/smd27 for the GPS NMEA.
535 46 Denis 'GNUtoo' Carikli
So compatibility with applications that understand NMEA is garanteed.
536 42 Denis 'GNUtoo' Carikli
537 51 Denis 'GNUtoo' Carikli
Note that the GPS parsing library doesn't require to use NMEA, it could also uses the RPC directly(to be verified)
538
539
=== Sensors ===
540
Devices with an hardware keyboard slide can rotate with the slide of the keyboard, so accelerometers are not strictly necessary. Examples of such device include the HTC dream.
541
Other devices lack that hardware keyboard, and so the only way to rotate is trough theses accelerometers. Examples of such device include the nexus one.
542
543 52 Denis 'GNUtoo' Carikli
The nexusone has akmd.free which is the free implementation of akmd, the sensor daemon(which handle rotation)
544 51 Denis 'GNUtoo' Carikli
545
==== akmd.free ====
546
akmd.free is located in:
547
{{{
548 1 Denis 'GNUtoo' Carikli
hardware/akmd_free
549 52 Denis 'GNUtoo' Carikli
}}}
550 51 Denis 'GNUtoo' Carikli
it has currently(at the time of writing) support for akm8973+bma150 based sensors.
551
akmd.free was made specifically for the htc hero by its authors.
552
The device supported include the nexus one(tested) and the HTC hero(not tested,not activated).
553
554 1 Denis 'GNUtoo' Carikli
In order to activate the support for it you must add that in your BoardConfig.mk
555 52 Denis 'GNUtoo' Carikli
{{{
556
BUILD_AKMD := true
557
}}}
558
559
If you need to add support for other akm sensors  you could modify hardware/akmd_free/jni/Android.mk, for instance the nexusone had an issue with rotation beeing done in the reverse sense, so I did that:
560
{{{
561
+#ifdef TARGET_DEVICE_NEXUSONE
562
+    abuf[index] = Vector(-bma150_data[0], -bma150_data[1], bma150_data[2]);
563
+#else
564
     abuf[index] = Vector(bma150_data[0], -bma150_data[1], bma150_data[2]);
565
+#endif
566
}}}
567
And that:
568
{{{
569
ifeq ($(TARGET_DEVICE),passion)
570 51 Denis 'GNUtoo' Carikli
  LOCAL_CFLAGS += -DTARGET_DEVICE_NEXUSONE
571 32 Michael Haas -
endif
572
}}}
573 28 Denis 'GNUtoo' Carikli
== Re-using source code ==
574
The previous source code re-used some public source code that was licensed under the Apache 2.0 license.
575 22 Denis 'GNUtoo' Carikli
The ril will also re-use some public source code licensed under Apache 2.0.
576
That is the advised way to do it as it save some time and is easier to do, however proper credit must be attributed, at least in the commit message.
577 23 Denis 'GNUtoo' Carikli
It is even advised to look at the public apache 2.0 source code of other rils libraries or components of android.
578
579
=== Ril ===
580
 * vilvord ril
581
 * openmoko (android on freerunner) ril
582
583
== Source organization and commit access ==
584
Until now we made some changes in the tree, but we want the changes to land upstream in replicant.
585 24 Denis 'GNUtoo' Carikli
For instance let's say we modified only the ril path like in the ril section in 
586
{{{
587
device/htc/dream_sapphire/full_dream_sapphire.mk 
588
}}}
589
first we save our modifications:
590
{{{
591
cd device/htc/dream_sapphire/
592
git diff > git_diff.patch
593 1 Denis 'GNUtoo' Carikli
}}}
594
then we find where is the root of the git repository we are in:
595 24 Denis 'GNUtoo' Carikli
{{{
596
cd replicant-2.2 #top replicant directory where everything is in
597
cd .repo
598
cat manifest.xml
599
}}}
600
and we find that:
601
{{{
602
  <project path="device/htc/buzz" name="CyanogenMod/android_device_htc_buzz" remote="github" />
603
}}}
604
so...now our repository is in device/htc/buzz
605
We will now look where the source repository is:
606
{{{
607
cd device/htc/buzz
608
cd .git
609
cat config
610
}}}
611
We find that:
612
{{{
613
	url = git://github.com/CyanogenMod/android_device_htc_buzz.git
614 25 Denis 'GNUtoo' Carikli
}}}
615
616
Then create a directory, not under the replicant-2.2 directory that will contain your repositories:
617
{{{
618
mkdir repo
619
cd repo
620
}}}
621
and clone the source:
622
{{{
623 26 Denis 'GNUtoo' Carikli
git clone git://github.com/CyanogenMod/android_device_htc_buzz.git
624
cd android_device_htc_buzz
625 27 Denis 'GNUtoo' Carikli
}}}
626 26 Denis 'GNUtoo' Carikli
apply the previous patch:
627
{{{
628
git apply path/to/git_diff.patch
629
}}}
630
commit locally the result:
631
{{{
632 32 Michael Haas -
git commit -s
633
}}}
634 1 Denis 'GNUtoo' Carikli
Note that the commit message should have the following format:
635 27 Denis 'GNUtoo' Carikli
The first line should be a summary
636
Followed by a linebreak
637
And then the details explaining the commit
638
If you made an error writing the commit message do
639
{{{
640 1 Denis 'GNUtoo' Carikli
git commit --amend
641
}}}
642
643
TODO: complete for sending the git patch(git format-patch -1,git send-email)
644
645
==== Pushing to replicant ====
646
TODO: git remote add+git push