DeprecatedPortingGuideMSMQSD » History » Version 72
Paul Kocialkowski, 02/05/2012 03:59 PM
1 | 67 | Paul Kocialkowski | h1. Porting Guide: MSM/QSD |
---|---|---|---|
2 | 66 | Paul Kocialkowski | |
3 | h2. Introduction |
||
4 | |||
5 | 1 | Denis 'GNUtoo' Carikli | Many people bought many different phones, and some of them whish to help replicant and/or to port replicant to their phones or devices. |
6 | 33 | Michael Haas - | This guide will show what was done for the htc dream, so these people can understand the process better. |
7 | 1 | Denis 'GNUtoo' Carikli | When talking about porting, this page talks about re-using existing product definitions. You will not learn how to |
8 | build Android for a device not currently supported by Android. Instead, you will learn how to build a version of |
||
9 | [Cyanogenmod http://www.cyanogenmod.com/] without proprietary parts. |
||
10 | 66 | Paul Kocialkowski | To gain more insight in the Android build system, refer to "Android Build System documentation":http://source.android.com/porting/build_system.html which is part of |
11 | "Android Platform Developer's Guide":http://source.android.com/porting/. You should find an answer there if you have any questions about the Makefiles referenced in this document. |
||
12 | 1 | Denis 'GNUtoo' Carikli | |
13 | 66 | Paul Kocialkowski | Note: The Android Build System documentation above has been removed. You can find a mirror of the (outdated) documentation "here":http://www.kandroid.org/online-pdk/guide/index.html and "here":http://www.netmite.com/android/mydroid/development/pdk/docs/. |
14 | 62 | Igor Almeida - | |
15 | 66 | Paul Kocialkowski | |
16 | h2. Terminology |
||
17 | |||
18 | 1 | Denis 'GNUtoo' Carikli | 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. |
19 | 33 | 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. |
20 | 1 | Denis 'GNUtoo' Carikli | TODO: point to 0707 standard or newer |
21 | |||
22 | 66 | Paul Kocialkowski | |
23 | h2. Help with source code |
||
24 | |||
25 | 1 | Denis 'GNUtoo' Carikli | Keep in mind that on most devices, the full source code of the kernel is released. |
26 | However, some userspace libraries, or dlopened libraries (libraries loaded at runtime after the application started) are proprietary software, |
||
27 | so if you're porting to a new CPU/SOC keep in mind that you have the source code to the kernel interfaces. |
||
28 | That can help a lot, and sometimes there is even some sort of documentation in the headers. |
||
29 | |||
30 | |||
31 | 66 | Paul Kocialkowski | h2. Build the source |
32 | |||
33 | |||
34 | 1 | Denis 'GNUtoo' Carikli | The first thing to do is to download the replicant sources: |
35 | 66 | Paul Kocialkowski | [[BuildDream]] can be used as a reference: download and build the sources for your device. |
36 | 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 |
37 | of the Wildfire. |
||
38 | 1 | Denis 'GNUtoo' Carikli | |
39 | 32 | Michael Haas - | You need to configure the build tree for our device. By default, a generic image |
40 | for the Android emulator will be built. |
||
41 | 66 | Paul Kocialkowski | In [[BuildDream]], you would use the following command to set up the build: |
42 | <pre> |
||
43 | 2 | Denis 'GNUtoo' Carikli | lunch cyanogen_dream_sapphire-eng |
44 | 66 | Paul Kocialkowski | </pre> |
45 | 2 | Denis 'GNUtoo' Carikli | Now, since you are not building for the HTC dream, you need to identify the right command that corresponds to your device. |
46 | In order to do that, run the following command and look at its output. |
||
47 | 66 | Paul Kocialkowski | <pre> |
48 | 2 | Denis 'GNUtoo' Carikli | $ source build/envsetup.sh |
49 | including device/geeksphone/one/vendorsetup.sh |
||
50 | including device/htc/ace/vendorsetup.sh |
||
51 | 1 | Denis 'GNUtoo' Carikli | including device/htc/bravoc/vendorsetup.sh |
52 | including device/htc/bravo/vendorsetup.sh |
||
53 | 2 | Denis 'GNUtoo' Carikli | including device/htc/buzz/vendorsetup.sh |
54 | including device/htc/glacier/vendorsetup.sh |
||
55 | 1 | Denis 'GNUtoo' Carikli | including device/htc/heroc/vendorsetup.sh |
56 | including device/htc/inc/vendorsetup.sh |
||
57 | 2 | Denis 'GNUtoo' Carikli | including device/htc/legend/vendorsetup.sh |
58 | including device/htc/liberty/vendorsetup.sh |
||
59 | including device/htc/supersonic/vendorsetup.sh |
||
60 | including device/htc/vision/vendorsetup.sh |
||
61 | including device/motorola/sholes/vendorsetup.sh |
||
62 | including device/nvidia/harmony/vendorsetup.sh |
||
63 | including vendor/cyanogen/vendorsetup.sh |
||
64 | 66 | Paul Kocialkowski | </pre> |
65 | 37 | Denis 'GNUtoo' Carikli | The last line is important: |
66 | 66 | Paul Kocialkowski | <pre> |
67 | 37 | Denis 'GNUtoo' Carikli | $ cat vendor/cyanogen/vendorsetup.sh |
68 | add_lunch_combo cyanogen_ace-eng |
||
69 | add_lunch_combo cyanogen_bravo-eng |
||
70 | add_lunch_combo cyanogen_bravoc-eng |
||
71 | add_lunch_combo cyanogen_buzz-eng |
||
72 | add_lunch_combo cyanogen_dream_sapphire-eng |
||
73 | add_lunch_combo cyanogen_espresso-eng |
||
74 | add_lunch_combo cyanogen_glacier-eng |
||
75 | 1 | Denis 'GNUtoo' Carikli | add_lunch_combo cyanogen_harmony-eng |
76 | 37 | Denis 'GNUtoo' Carikli | add_lunch_combo cyanogen_hero-eng |
77 | 1 | Denis 'GNUtoo' Carikli | add_lunch_combo cyanogen_heroc-eng |
78 | add_lunch_combo cyanogen_inc-eng |
||
79 | 37 | Denis 'GNUtoo' Carikli | add_lunch_combo cyanogen_legend-eng |
80 | add_lunch_combo cyanogen_liberty-eng |
||
81 | add_lunch_combo cyanogen_one-eng |
||
82 | add_lunch_combo cyanogen_passion-eng |
||
83 | add_lunch_combo cyanogen_sholes-eng |
||
84 | 1 | Denis 'GNUtoo' Carikli | add_lunch_combo cyanogen_supersonic-eng |
85 | add_lunch_combo cyanogen_vibrant-eng |
||
86 | 37 | Denis 'GNUtoo' Carikli | add_lunch_combo cyanogen_vision-eng |
87 | 4 | Denis 'GNUtoo' Carikli | add_lunch_combo cyanogen_z71-eng |
88 | 1 | Denis 'GNUtoo' Carikli | |
89 | PATH=$PATH:$PWD/vendor/cyanogen/tools ; export PATH |
||
90 | 66 | Paul Kocialkowski | </pre> |
91 | 37 | Denis 'GNUtoo' Carikli | The output include the list of supported (by cyanogenmod) devices. |
92 | 36 | Michael Haas - | For instance if you have the Wildfire (codename 'buzz') phone do: |
93 | 66 | Paul Kocialkowski | <pre> |
94 | 1 | Denis 'GNUtoo' Carikli | lunch cyanogen_buzz-eng |
95 | 66 | Paul Kocialkowski | </pre> |
96 | 1 | Denis 'GNUtoo' Carikli | |
97 | 9 | Denis 'GNUtoo' Carikli | Then build the source, backup what's on your device, including the operating system, and flash the new replicant image. |
98 | 1 | Denis 'GNUtoo' Carikli | |
99 | Then test what works and what doesn't. |
||
100 | |||
101 | The images are located in |
||
102 | 66 | Paul Kocialkowski | <pre> |
103 | 1 | Denis 'GNUtoo' Carikli | out/target/product/dream_sapphire |
104 | 66 | Paul Kocialkowski | </pre> |
105 | 1 | Denis 'GNUtoo' Carikli | in the case of the HTC Dream. You need to look in the path that corresponds to your device. |
106 | 32 | Michael Haas - | |
107 | |||
108 | 66 | Paul Kocialkowski | h2. Trying free replacements |
109 | |||
110 | |||
111 | 1 | Denis 'GNUtoo' Carikli | The source code you just built contains some free replacements for the proprietary |
112 | libraries shipped by your phone vendor with the default firmware. |
||
113 | |||
114 | 32 | Michael Haas - | A list of proprietary libraries is available in |
115 | 66 | Paul Kocialkowski | <pre> |
116 | 1 | Denis 'GNUtoo' Carikli | device/htc/dream_sapphire/extract-files.sh |
117 | 66 | Paul Kocialkowski | </pre> |
118 | 32 | Michael Haas - | 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 |
119 | 11 | 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). |
120 | 1 | Denis 'GNUtoo' Carikli | |
121 | |||
122 | 66 | Paul Kocialkowski | |
123 | h3. RIL test |
||
124 | |||
125 | 1 | Denis 'GNUtoo' Carikli | I will take the example of how to use the free RIL (Radio Interface Library) to see if it works fine without modifications: |
126 | The proprietary RIL library (which you don't have in the phone) location is found looking at the extract-files.sh |
||
127 | here's a part of extract-files.sh: |
||
128 | 66 | Paul Kocialkowski | <pre> |
129 | 1 | Denis 'GNUtoo' Carikli | adb pull /system/lib/libhtc_ril.so ../../../vendor/htc/$DEVICE/proprietary/libhtc_ril.so |
130 | 66 | Paul Kocialkowski | </pre> |
131 | 1 | Denis 'GNUtoo' Carikli | 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 |
132 | 14 | 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). |
133 | 1 | Denis 'GNUtoo' Carikli | |
134 | So looking at the above line the proprietary RIL is located here on the phone: |
||
135 | 66 | Paul Kocialkowski | <pre> |
136 | 1 | Denis 'GNUtoo' Carikli | /system/lib/libhtc_ril.so |
137 | 66 | Paul Kocialkowski | </pre> |
138 | 15 | Denis 'GNUtoo' Carikli | while the free ril is located here (known fact): |
139 | 66 | Paul Kocialkowski | <pre> |
140 | 1 | Denis 'GNUtoo' Carikli | /system/lib/libreference-ril.so |
141 | 66 | Paul Kocialkowski | </pre> |
142 | 1 | Denis 'GNUtoo' Carikli | In order to test the free RIL you could be tempted to do that: |
143 | 66 | Paul Kocialkowski | <pre> |
144 | 1 | Denis 'GNUtoo' Carikli | # ./adb remount |
145 | # ./adb shell |
||
146 | mv /system/lib/libreference-ril.so /system/lib/libhtc_ril.so |
||
147 | 66 | Paul Kocialkowski | </pre> |
148 | 14 | Denis 'GNUtoo' Carikli | 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: |
149 | 66 | Paul Kocialkowski | <pre> |
150 | 1 | Denis 'GNUtoo' Carikli | # ./adb shell |
151 | # setprop |
||
152 | usage: setprop <key> <value> |
||
153 | 66 | Paul Kocialkowski | </pre> |
154 | 1 | Denis 'GNUtoo' Carikli | What you can do to set the libre RIL is - possibly - this: |
155 | 66 | Paul Kocialkowski | <pre> |
156 | 39 | Konstantinos Karantias - | ./adb shell |
157 | setprop rild.libpath /system/lib/libreference-ril.so |
||
158 | setprop rild.libargs -d/dev/smd0 |
||
159 | 66 | Paul Kocialkowski | </pre> |
160 | 13 | Denis 'GNUtoo' Carikli | Here's how it looks on a working replicant on the HTC Dream: |
161 | 66 | Paul Kocialkowski | <pre> |
162 | 13 | Denis 'GNUtoo' Carikli | # ./adb shell |
163 | # getprop | grep ril |
||
164 | 66 | Paul Kocialkowski | [ro.ril.hsxpa]: r2 |
165 | [ro.ril.gprsclass]: r10 |
||
166 | 12 | Denis 'GNUtoo' Carikli | [rild.libpath]: [/system/lib/libreference-ril.so] |
167 | [rild.libargs]: [-d/dev/smd0] |
||
168 | 1 | Denis 'GNUtoo' Carikli | [init.svc.ril-daemon]: [running] |
169 | 66 | Paul Kocialkowski | [ro.ril.def.agps.mode]: r2 |
170 | 1 | Denis 'GNUtoo' Carikli | [gsm.version.ril-impl]: [android reference-ril 1.0] |
171 | 66 | Paul Kocialkowski | </pre> |
172 | * /dev/smd0 is the (emulated) serial port |
||
173 | * /system/lib/libreference-ril.so is where to look for the RIL hardware specific library |
||
174 | 1 | Denis 'GNUtoo' Carikli | |
175 | 39 | Konstantinos Karantias - | Then, you can kill the ril daemon: |
176 | 66 | Paul Kocialkowski | <pre> |
177 | 1 | Denis 'GNUtoo' Carikli | ./adb shell killall rild |
178 | 66 | Paul Kocialkowski | </pre> |
179 | 1 | Denis 'GNUtoo' Carikli | Then try the reference RIL. You can see debugging things and such by doing: |
180 | 66 | Paul Kocialkowski | <pre> |
181 | 1 | Denis 'GNUtoo' Carikli | ./adb logcat -b radio |
182 | 66 | Paul Kocialkowski | </pre> |
183 | 1 | Denis 'GNUtoo' Carikli | |
184 | 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. |
||
185 | |||
186 | 64 | Paul Kocialkowski | |
187 | 66 | Paul Kocialkowski | h2. Replacing proprietary libraries for real |
188 | |||
189 | |||
190 | 16 | Denis 'GNUtoo' Carikli | On the HTC Dream the following proprietary libraries were replaced: |
191 | 66 | Paul Kocialkowski | (Refer to [[ProprietaryHtcDreamLibsReplacement]] for more up to date details(or fix it if it's less recent)) |
192 | 16 | Denis 'GNUtoo' Carikli | |
193 | 1 | Denis 'GNUtoo' Carikli | The first thing you will have to do is to modify the build system. |
194 | The key thing to do is to change |
||
195 | |||
196 | |||
197 | 66 | Paul Kocialkowski | h3. RIL |
198 | 1 | Denis 'GNUtoo' Carikli | |
199 | 66 | Paul Kocialkowski | |
200 | |||
201 | h4. Android Reference RIL |
||
202 | |||
203 | |||
204 | 1 | Denis 'GNUtoo' Carikli | If the RIL you previously tried works fine, why not switching to it...directly in the build system. |
205 | 16 | Denis 'GNUtoo' Carikli | Here's the diff between A working RIL and a non-working RIL for the htcdream: |
206 | 66 | Paul Kocialkowski | <pre> |
207 | 17 | Denis 'GNUtoo' Carikli | android_device_htc_dream_sapphire$ git diff 5593d2899203ec378c306701788f1c43af9a6935 -- full_dream_sapphire.mk |
208 | diff --git a/full_dream_sapphire.mk b/full_dream_sapphire.mk |
||
209 | 1 | Denis 'GNUtoo' Carikli | index 9ec7feb..eb1b956 100644 |
210 | 17 | Denis 'GNUtoo' Carikli | --- a/full_dream_sapphire.mk |
211 | 1 | Denis 'GNUtoo' Carikli | +++ b/full_dream_sapphire.mk |
212 | 18 | Denis 'GNUtoo' Carikli | @@ -40,7 +40,8 @@ PRODUCT_PROPERTY_OVERRIDES := \ |
213 | ro.media.dec.jpeg.memcap=10000000 |
||
214 | |||
215 | 32 | Michael Haas - | PRODUCT_PROPERTY_OVERRIDES += \ |
216 | 18 | Denis 'GNUtoo' Carikli | - rild.libpath=/system/lib/libhtc_ril.so \ |
217 | 19 | Denis 'GNUtoo' Carikli | + rild.libpath=/system/lib/libreference-ril.so \ |
218 | 1 | Denis 'GNUtoo' Carikli | + rild.libargs=-d/dev/smd0 \ |
219 | wifi.interface=tiwlan0 |
||
220 | |||
221 | # Time between scans in seconds. Keep it high to minimize battery drain. |
||
222 | |||
223 | 66 | Paul Kocialkowski | </pre> |
224 | 64 | Paul Kocialkowski | Note that full_dream_sapphire.mk is located here: |
225 | 66 | Paul Kocialkowski | <pre> |
226 | 64 | Paul Kocialkowski | device/htc/dream_sapphire/full_dream_sapphire.mk |
227 | 66 | Paul Kocialkowski | </pre> |
228 | 65 | Paul Kocialkowski | The diff is self-explanatory and how to do the change is left as an exercise to the reader. |
229 | 64 | Paul Kocialkowski | |
230 | 1 | Denis 'GNUtoo' Carikli | In case the RIL need to be modified the sources are in : |
231 | 66 | Paul Kocialkowski | <pre> |
232 | 1 | Denis 'GNUtoo' Carikli | hardware/ril/reference-ril |
233 | 66 | Paul Kocialkowski | </pre> |
234 | 64 | Paul Kocialkowski | They are written in C. |
235 | |||
236 | |||
237 | 66 | Paul Kocialkowski | h4. HTC Generic RIL |
238 | |||
239 | |||
240 | 64 | Paul Kocialkowski | Another RIL has been written for MSM devices originally running Windows Mobile and is used on the Replicant project as it works better than the Android reference RIL on most devices. |
241 | 66 | Paul Kocialkowski | * It's originally hosted at: "https://gitorious.org/xdandroid/hardware_xdandroid-ril":https://gitorious.org/xdandroid/hardware_xdandroid-ril |
242 | * We made a copy of this with some modifications there: "https://gitorious.org/replicant/hardware_xdandroid-ril":https://gitorious.org/replicant/hardware_xdandroid-ril |
||
243 | 1 | Denis 'GNUtoo' Carikli | |
244 | 66 | Paul Kocialkowski | *hardware/ril/libhtcgeneric-ril/Android.mk* : |
245 | <pre> |
||
246 | 64 | Paul Kocialkowski | BUILD_HTCGENERIC_RIL := false |
247 | |||
248 | 1 | Denis 'GNUtoo' Carikli | ifeq ($(TARGET_BOARD_PLATFORM),qsd8k) |
249 | 64 | Paul Kocialkowski | BUILD_HTCGENERIC_RIL := true |
250 | else ifeq ($(TARGET_BOARD_PLATFORM),msm7x30) |
||
251 | 32 | Michael Haas - | BUILD_HTCGENERIC_RIL := true |
252 | 28 | Denis 'GNUtoo' Carikli | else ifeq ($(TARGET_BOARD_PLATFORM),msm7k) |
253 | BUILD_HTCGENERIC_RIL := true |
||
254 | 32 | Michael Haas - | endif |
255 | 66 | Paul Kocialkowski | </pre> |
256 | 41 | Denis 'GNUtoo' Carikli | |
257 | 1 | Denis 'GNUtoo' Carikli | Then, on your device configuration, switch: |
258 | 66 | Paul Kocialkowski | |
259 | 68 | Paul Kocialkowski | @rild.libpath=/system/lib/libreference-ril.so@ |
260 | 66 | Paul Kocialkowski | to: |
261 | 68 | Paul Kocialkowski | @rild.libpath=/system/lib/libhtcgeneric-ril.so@ |
262 | 66 | Paul Kocialkowski | |
263 | h3. Audio libraries |
||
264 | |||
265 | 56 | Paul Kocialkowski | On the HTC dream the audio libraries were modified. |
266 | 66 | Paul Kocialkowski | If your device is an msm7k "CPU" (in reality it's called a SOC, or system on a chip), it already contain "the routing fix":http://gitorious.org/replicant/android_hardware_msm7k/commit/e0b55a19b2fc004915503ebdfd7c4c02c4264611. |
267 | Note several things on "the commit":http://gitorious.org/replicant/android_hardware_msm7k/commit/e0b55a19b2fc004915503ebdfd7c4c02c4264611: |
||
268 | * the routing was disabled, I had to re-enable it |
||
269 | * 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. |
||
270 | * I had nearly no knowledge of C++ |
||
271 | * it was easy |
||
272 | 1 | Denis 'GNUtoo' Carikli | |
273 | On the nexus one the proprietary libacoustic libraries are only used for bluetooth(all the rest works if you pushed the firmwares). |
||
274 | |||
275 | 66 | Paul Kocialkowski | On the dream (msm7k), libacoustic has been fully replaced, see "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. |
276 | 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. |
277 | |||
278 | 66 | Paul Kocialkowski | *Note that (even if unconfirmed) it should more likely work the same way for every msm7k device, so try the code without any modification first and do the following steps only if the code does not work for your msm7k device! * |
279 | 1 | Denis 'GNUtoo' Carikli | |
280 | 66 | 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, then you should modify replicant code to use the filename of your device and test if it works. |
281 | 1 | Denis 'GNUtoo' Carikli | |
282 | 72 | Paul Kocialkowski | If you don't see any CSV file anywhere, then your device must not work like HTC Dream and 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. |
283 | |||
284 | 56 | Paul Kocialkowski | To make sure it parses the CSV file, run adb logcat | grep Audio and find the following lines: |
285 | 66 | Paul Kocialkowski | <pre> |
286 | 56 | Paul Kocialkowski | D/AudioAcousticMSM72XX( 122): Successfully opened /system/etc/AudioPara4.csv |
287 | D/AudioAcousticMSM72XX( 122): CSV Header: Dream_TMU_20090305 |
||
288 | 1 | Denis 'GNUtoo' Carikli | D/AudioAcousticMSM72XX( 122): Read: |
289 | 56 | Paul Kocialkowski | D/AudioAcousticMSM72XX( 122): 24 Audio_Path_Table entries |
290 | D/AudioAcousticMSM72XX( 122): 24 Audio_Path_Uplink_Table entries |
||
291 | 1 | Denis 'GNUtoo' Carikli | D/AudioAcousticMSM72XX( 122): 35 Phone_Acoustic_Table entries |
292 | 56 | Paul Kocialkowski | D/AudioAcousticMSM72XX( 122): 35 BT_Phone_Acoustic_Table entries |
293 | 1 | Denis 'GNUtoo' Carikli | D/AudioAcousticMSM72XX( 122): 24 HTC_VOC_CAL_CODEC_TABLE_Table entries |
294 | 56 | Paul Kocialkowski | D/AudioAcousticMSM72XX( 122): 0 CE_Acoustic_Table entries |
295 | 1 | Denis 'GNUtoo' Carikli | </pre> |
296 | 66 | Paul Kocialkowski | |
297 | 1 | Denis 'GNUtoo' Carikli | 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. |
298 | 72 | Paul Kocialkowski | 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. |
299 | move the hardware/msm7k/ directory to another place '''not in the build tree''' or it'll fail (@ mv hardware/msm7k/ ../msm7k @. |
||
300 | Then download CyanogenMod code: |
||
301 | @git clone git://github.com/CyanogenMod/android_hardware_msm7k.git -b froyo-stable hardware/msm7k/@ |
||
302 | 68 | Paul Kocialkowski | |
303 | 66 | Paul Kocialkowski | 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: |
304 | 68 | Paul Kocialkowski | |
305 | 66 | Paul Kocialkowski | <pre> |
306 | 56 | Paul Kocialkowski | D(" -- vma dump start --\n"); |
307 | |||
308 | D("vm_start=%x (%d)\n", vma->vm_start, vma->vm_start); |
||
309 | D("vm_end=%x (%d)\n", vma->vm_end, vma->vm_end); |
||
310 | D("vm_page_prot=%x (%d)\n", vma->vm_page_prot,vma->vm_page_prot); |
||
311 | D("vm_flags=%x (%d)\n", vma->vm_flags, vma->vm_flags); |
||
312 | D("vm_pgoff=%x (%d)\n", vma->vm_pgoff, vma->vm_pgoff); |
||
313 | 66 | Paul Kocialkowski | |
314 | 1 | Denis 'GNUtoo' Carikli | D(" -- vma dump end --\n"); |
315 | </pre> |
||
316 | |||
317 | 72 | Paul Kocialkowski | 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: |
318 | |||
319 | 66 | Paul Kocialkowski | <pre> |
320 | 72 | Paul Kocialkowski | <6>[ 22.250274] htc-acoustic: open |
321 | 56 | Paul Kocialkowski | <6>[ 22.252716] htc-acoustic: mmap |
322 | <6>[ 22.253265] htc-acoustic: -- vma dump start -- |
||
323 | <6>[ 22.254028] htc-acoustic: vm_start=4010c000 (1074839552) |
||
324 | 1 | Denis 'GNUtoo' Carikli | <6>[ 22.254699] htc-acoustic: vm_end=40119000 (1074892800) |
325 | <6>[ 22.255310] htc-acoustic: vm_page_prot=38f (911) |
||
326 | 56 | Paul Kocialkowski | <6>[ 22.256011] htc-acoustic: vm_flags=400844ff (1074283775) |
327 | <6>[ 22.256622] htc-acoustic: vm_pgoff=1f4a (8010) |
||
328 | <6>[ 22.257293] htc-acoustic: -- vma dump end -- |
||
329 | <6>[ 22.742675] htc-acoustic: ioctl |
||
330 | <6>[ 22.743103] htc-acoustic: ioctl: ACOUSTIC_ARM11_DONE called 123. |
||
331 | <6>[ 22.746612] htc-acoustic: ioctl: ONCRPC_ACOUSTIC_INIT_PROC success. |
||
332 | 1 | Denis 'GNUtoo' Carikli | <6>[ 22.747344] htc-acoustic: release |
333 | 66 | Paul Kocialkowski | </pre> |
334 | 56 | Paul Kocialkowski | |
335 | 66 | Paul Kocialkowski | Now you can get the size of the dedicated memory area: vm_end - vm_start = 0x40119000 - 0x4010c000 = *0xd000*. |
336 | 72 | Paul Kocialkowski | 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 : |
337 | 66 | Paul Kocialkowski | <pre> |
338 | 56 | Paul Kocialkowski | void acoustic_mmap_dump(void) |
339 | 1 | Denis 'GNUtoo' Carikli | { |
340 | uint8_t *test_map_base; |
||
341 | uint8_t *ptr, nval; |
||
342 | int fd, fdd=0; |
||
343 | 66 | Paul Kocialkowski | off_t [[TargetAddr]]; |
344 | 56 | Paul Kocialkowski | int len; |
345 | |||
346 | fd = open("/dev/htc-acoustic", O_RDWR | O_SYNC); |
||
347 | fdd = open("/data/dump", O_RDWR | O_TRUNC | O_CREAT); |
||
348 | |||
349 | 1 | Denis 'GNUtoo' Carikli | test_map_base = (uint8_t *) |
350 | mmap(0, 0xd000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, |
||
351 | 0); |
||
352 | // test_virt_base = test_map_base + (TargetAddr & MAP_MASK); |
||
353 | 66 | Paul Kocialkowski | // LOGD("virtual base at %p (phys=0x%X)\n", test_virt_base, [[TargetAddr]]); |
354 | 1 | Denis 'GNUtoo' Carikli | |
355 | LOGD(" -- htc-acoustic memory read -- \n"); |
||
356 | LOGD("beginning adress is@%p\n", test_map_base); |
||
357 | 58 | Paul Kocialkowski | for (len = 0; len < 0xd000; len++) |
358 | { |
||
359 | if( write(fdd, test_map_base, sizeof(uint8_t) ) < 0) |
||
360 | 1 | Denis 'GNUtoo' Carikli | { |
361 | 58 | Paul Kocialkowski | LOGE("write failed"); |
362 | 1 | Denis 'GNUtoo' Carikli | break; |
363 | } |
||
364 | 58 | Paul Kocialkowski | //LOGD("0x%x (%d) @%p", *(test_map_base), *(test_map_base), test_map_base); |
365 | 1 | Denis 'GNUtoo' Carikli | test_map_base++; |
366 | 58 | Paul Kocialkowski | } |
367 | |||
368 | |||
369 | munmap(test_map_base, 0xd000); |
||
370 | close(fdd); |
||
371 | 1 | Denis 'GNUtoo' Carikli | close(fd); |
372 | } |
||
373 | 58 | Paul Kocialkowski | </pre> |
374 | |||
375 | 72 | Paul Kocialkowski | replace 0xd000 by the size you found out and call it after @int rc = set_acoustic_parameters();@ on the AudioHardware::AudioHardware() function. |
376 | 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): |
||
377 | 68 | Paul Kocialkowski | |
378 | 66 | Paul Kocialkowski | <pre> |
379 | 58 | Paul Kocialkowski | #define ACOUSTIC_IOCTL_MAGIC 'p' |
380 | #define ACOUSTIC_NOTICE _IOW(ACOUSTIC_IOCTL_MAGIC, 42, unsigned int) |
||
381 | 1 | Denis 'GNUtoo' Carikli | #define ACOUSTIC_ARM11_DONE _IOW(ACOUSTIC_IOCTL_MAGIC, 22, unsigned int) |
382 | 58 | Paul Kocialkowski | |
383 | void acoustic_mmap(void) |
||
384 | { |
||
385 | 1 | Denis 'GNUtoo' Carikli | char *test_map_base; |
386 | volatile int *ptr, nval; |
||
387 | int fd, fdd; |
||
388 | 66 | Paul Kocialkowski | off_t [[TargetAddr]]; |
389 | 58 | Paul Kocialkowski | int len; |
390 | |||
391 | 1 | Denis 'GNUtoo' Carikli | fd = open("/dev/htc-acoustic", O_RDWR | O_SYNC); |
392 | 58 | Paul Kocialkowski | fdd = open("/data/dump", O_RDWR); |
393 | |||
394 | test_map_base = (char *) |
||
395 | mmap(0, 0xd000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, |
||
396 | 0); |
||
397 | 1 | Denis 'GNUtoo' Carikli | // test_virt_base = test_map_base + (TargetAddr & MAP_MASK); |
398 | 66 | Paul Kocialkowski | // LOGD("virtual base at %p (phys=0x%X)\n", test_virt_base, [[TargetAddr]]); |
399 | 58 | Paul Kocialkowski | |
400 | LOGD(" -- htc-acoustic memory write -- \n"); |
||
401 | for (len = 0; len < 0xd000; len++) |
||
402 | 1 | Denis 'GNUtoo' Carikli | { |
403 | read(fdd, test_map_base, sizeof(char) ); |
||
404 | test_map_base++; |
||
405 | } |
||
406 | |||
407 | |||
408 | munmap(test_map_base, 0xd000); |
||
409 | close(fdd); |
||
410 | close(fd); |
||
411 | } |
||
412 | 58 | Paul Kocialkowski | |
413 | 1 | Denis 'GNUtoo' Carikli | void acoustic_done(void) |
414 | { |
||
415 | 58 | Paul Kocialkowski | int fd; |
416 | fd = open("/dev/htc-acoustic",O_RDWR); |
||
417 | |||
418 | 1 | Denis 'GNUtoo' Carikli | if (fd < 0) { |
419 | 58 | Paul Kocialkowski | LOGE("Cannot open htc-acoustic device"); |
420 | close(fd); |
||
421 | return; |
||
422 | } |
||
423 | |||
424 | ioctl(fd,ACOUSTIC_ARM11_DONE, NULL); |
||
425 | close(fd); |
||
426 | } |
||
427 | </pre> |
||
428 | 68 | Paul Kocialkowski | |
429 | 1 | Denis 'GNUtoo' Carikli | Now replace: |
430 | 58 | Paul Kocialkowski | <pre> |
431 | 1 | Denis 'GNUtoo' Carikli | set_acoustic_parameters = (int (*)(void))::dlsym(acoustic, "set_acoustic_parameters"); |
432 | 66 | Paul Kocialkowski | if ((*set_acoustic_parameters) == 0 ) { |
433 | 58 | Paul Kocialkowski | LOGE("Could not open set_acoustic_parameters()"); |
434 | return; |
||
435 | } |
||
436 | |||
437 | 1 | Denis 'GNUtoo' Carikli | int rc = set_acoustic_parameters(); |
438 | if (rc < 0) { |
||
439 | 59 | Paul Kocialkowski | LOGE("Could not set acoustic parameters to share memory: %d", rc); |
440 | // return; |
||
441 | 66 | Paul Kocialkowski | } |
442 | 68 | Paul Kocialkowski | </pre> |
443 | 66 | Paul Kocialkowski | |
444 | 68 | Paul Kocialkowski | with: |
445 | 59 | Paul Kocialkowski | |
446 | 1 | Denis 'GNUtoo' Carikli | <pre> |
447 | acoustic_mmap(); |
||
448 | acoustic_done(); |
||
449 | </pre> |
||
450 | 66 | Paul Kocialkowski | |
451 | 72 | Paul Kocialkowski | 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. |
452 | 66 | Paul Kocialkowski | |
453 | 72 | Paul Kocialkowski | Replace the hardware/msm7k/ folder by the replicant one. The next step is to find the right addresses to write the tables in MSM shared memory. To find this out, you have to read the dump and understand where each table begins. So first, you have to hexdump the dump: |
454 | @hexdump -C dump > dump.txt@. This will create dump.txt, containing the hexedacimal values of dump as text. So now you should be able to understand where each table begins. As an example, here's how it was done with the dream values: consider the following as the beginning of the dump.txt file: |
||
455 | 66 | Paul Kocialkowski | <pre> |
456 | 00000000 35 71 36 61 37 00 38 00 39 03 3a 00 3b 00 3c 00 |5q6a7.8.9.:.;.<.| |
||
457 | 59 | Paul Kocialkowski | 00000010 3d 00 3e 00 3f 00 40 00 41 1c 42 00 43 00 44 00 |=.>.?.@.A.B.C.D.| |
458 | 00000020 45 00 46 00 47 00 48 00 49 00 4a 01 4b 00 4c 00 |E.F.G.H.I.J.K.L.| |
||
459 | 00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| |
||
460 | * |
||
461 | 1 | Denis 'GNUtoo' Carikli | 00000080 35 71 36 61 37 00 38 00 39 03 3a 00 3b 00 3c 00 |5q6a7.8.9.:.;.<.| |
462 | 59 | Paul Kocialkowski | 00000090 3d 00 3e 00 3f 00 40 00 41 1c 42 00 43 00 44 00 |=.>.?.@.A.B.C.D.| |
463 | 000000a0 45 00 46 00 47 00 48 00 49 00 4a 01 4b 00 4c 00 |E.F.G.H.I.J.K.L.| |
||
464 | 000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| |
||
465 | 66 | Paul Kocialkowski | </pre> |
466 | 68 | Paul Kocialkowski | |
467 | 1 | Denis 'GNUtoo' Carikli | it's the 2 first elements of the table we want to find the address (which will be 00000000, the beginning of the table). Now read [[AudioPara]]4.csv. On the dream, you can read: |
468 | <pre> |
||
469 | A0,HTC_VOC_CODEC_EARCUPLE_VOICE,35,71,36,61,37,0,38,0,39,3,3A,0,3B,0,3C,0,3D,0,3E,0,3F,0,40,0,41,1C,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,4A,1,4B,0,4C,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
||
470 | 66 | Paul Kocialkowski | A1,HTC_VOC_CODEC_EARCUPLE_MIDI,35,71,36,61,37,0,38,0,39,3,3A,0,3B,0,3C,0,3D,0,3E,0,3F,0,40,0,41,1C,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,4A,1,4B,0,4C,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
471 | 59 | Paul Kocialkowski | </pre> |
472 | |||
473 | 72 | Paul Kocialkowski | you can see that @35 71 36 61 37 00 38 00 39 03 3a 00 3b 00 3c 00@ is the same as @35,71,36,61,37,0,38,0,39,3,3A,0,3B,0,3C,0@, so @35 71 36 61 37 00 38 00 39 03 3a 00 3b 00 3c 00@ is the beginning of the first element of table A. So table A starts at 0. |
474 | |||
475 | 59 | Paul Kocialkowski | Now if you read the [[ParseAudioParaLine]] function from [[AudioAcoustic]].cpp (on the already existing free audio acoustic code), you can see: |
476 | 66 | Paul Kocialkowski | <pre> |
477 | case 'A': |
||
478 | 59 | Paul Kocialkowski | […] |
479 | 1 | Denis 'GNUtoo' Carikli | while ( (token = strtok(NULL, ",")) ) { |
480 | Audio_Path_Table[table_num].array[field_count++] = strtol(token, &ps, 16); |
||
481 | 59 | Paul Kocialkowski | }; |
482 | break; |
||
483 | </pre> |
||
484 | 66 | Paul Kocialkowski | |
485 | 59 | Paul Kocialkowski | So "A" is for the Audio_Path_Table table. |
486 | Now you have to do the same work for every table. You can see that another tables begins when the table-specific characters change e.g.: |
||
487 | 68 | Paul Kocialkowski | |
488 | 66 | Paul Kocialkowski | <pre> |
489 | 59 | Paul Kocialkowski | 00001780 35 00 36 00 37 ff 38 00 39 00 3a 00 3b 00 3c c4 |5.6.7.8.9.:.;.<.| |
490 | 00001790 3d c4 3e 08 3f 80 40 05 41 00 42 00 43 00 44 00 |=.>.?.@.A.B.C.D.| |
||
491 | 000017a0 45 00 46 00 47 00 48 00 49 00 4a 00 4b 00 4c 00 |E.F.G.H.I.J.K.L.| |
||
492 | 000017b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| |
||
493 | * |
||
494 | 00001800 00 00 00 40 13 20 00 00 b2 7f fd 23 00 00 33 2d |...@. .....#..3-| |
||
495 | 00001810 00 00 80 0c 9a ff 80 1d 33 f3 ec 01 ee ff 0a 20 |........3...... | |
||
496 | 00001820 65 7f 00 00 00 ed 00 00 00 00 d9 3f 00 00 80 0c |e..........?....| |
||
497 | 1 | Denis 'GNUtoo' Carikli | 00001830 9a ff 0c 1b 33 f3 ec 01 ee ff 0a 20 65 7f ff 7f |....3...... e...| |
498 | 59 | Paul Kocialkowski | 00001840 00 08 ff 7f 9f 14 00 00 14 00 00 08 00 20 00 20 |............. . | |
499 | 00001850 fa 00 46 00 02 00 ff 02 40 00 20 00 50 46 40 00 |..F.....@. .PF@.| |
||
500 | 00001860 a0 41 00 08 63 00 ff 4d ff 4d 02 00 00 3f d0 07 |.A..c..M.M...?..| |
||
501 | 00001870 00 00 00 00 00 01 00 01 00 02 50 00 00 03 50 01 |..........P...P.| |
||
502 | 00001880 64 00 a8 1c c2 01 e0 2e a0 0f ff ff 00 00 00 00 |d...............| |
||
503 | 00001890 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 |.........@......| |
||
504 | 000018a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| |
||
505 | </pre> |
||
506 | 66 | Paul Kocialkowski | |
507 | 59 | Paul Kocialkowski | You can see that a new table begins at 0x1800. |
508 | Note that some tables may not start at easy-to-find addresses such as 0x1800 but may start at in the middle of an hexdump line (so it makes the task even harder). |
||
509 | |||
510 | When you have found all the correct addresses for every table in your CSV file, you should check that your tables have the same size than the tables you got from the dump. If it's not, adjust the tables defined in [[AudioAcoustic]].h and the tables defined at the top of [[AudioAcoustic]].cpp. |
||
511 | 66 | Paul Kocialkowski | When all that stuff is ok, it's possible that there is a necessary footer to make it work. On the Dream, it is: |
512 | 42 | Denis 'GNUtoo' Carikli | <pre> |
513 | 66 | Paul Kocialkowski | 0000c8e0 78 56 34 12 00 00 00 00 00 00 00 00 00 00 00 00 |xV4.............| |
514 | 1 | Denis 'GNUtoo' Carikli | </pre> |
515 | 68 | Paul Kocialkowski | |
516 | 42 | Denis 'GNUtoo' Carikli | (present at the end of the dump file). |
517 | 1 | Denis 'GNUtoo' Carikli | |
518 | Now that you found out the size of the memory map, the address of each table, adjusted the size of the tables and found the footer, it's time to put the remaining infos on the free code. |
||
519 | Modify with the values you found out, on the file hardware/msm7k/libaudio/AudioAcoustic.cpp: |
||
520 | 66 | Paul Kocialkowski | <pre> |
521 | 43 | Denis 'GNUtoo' Carikli | static int mmap_size = 0xd000; |
522 | 1 | Denis 'GNUtoo' Carikli | static int mmap_address_audio_path_table = 0x0; |
523 | static int mmap_address_audio_path_uplink_table = 0xc00; |
||
524 | static int mmap_address_phone_acoustic_table = 0x1800; |
||
525 | 43 | Denis 'GNUtoo' Carikli | static int mmap_address_bt_phone_acoustic_table = 0x4a00; |
526 | 1 | Denis 'GNUtoo' Carikli | static int mmap_address_htc_voc_cal_codec_table_table = 0xc700; |
527 | 66 | Paul Kocialkowski | static int mmap_address_htc_acoustic_end = 0xc8e0; |
528 | </pre> |
||
529 | 1 | Denis 'GNUtoo' Carikli | and adapt the array sizes both on the top of [[AudioAcoustic]].cpp and [[AudioAcoustic]].h (if you didn't do it already). |
530 | 43 | Denis 'GNUtoo' Carikli | |
531 | 1 | Denis 'GNUtoo' Carikli | Then build an image (make -j9 systemimage) and it should work. If it does not, please check that you successfully passed all the required steps. |
532 | But the fact is that you replaced Dream values with the correct values for your device, so it will break audio acoustic for Dream. |
||
533 | 66 | Paul Kocialkowski | The solution would be to write a set_device_configuration() which selects the good values for the device we build replciant for and the appropriated tables. |
534 | 1 | Denis 'GNUtoo' Carikli | Nothing like that has been written yet since replicant [[AudioAcoustic]] hasn't been ported to any other device yet. Please notify replicant developers to write such a function (or do it yourself) before you send the code. |
535 | 66 | Paul Kocialkowski | |
536 | h3. GPS |
||
537 | |||
538 | 43 | Denis 'GNUtoo' Carikli | Two GPS libraries exist: |
539 | 66 | Paul Kocialkowski | * libgps |
540 | * libloc_api |
||
541 | 43 | Denis 'GNUtoo' Carikli | Both provide the same functionalities at the application level. |
542 | Choose the one that is supported by your device or that has support for a device close to your device. |
||
543 | 66 | Paul Kocialkowski | |
544 | h4. libgps |
||
545 | |||
546 | For adding support to libgps you need to enable it like in "this commit":http://gitorious.org/replicant/android_device_htc_dream_sapphire/commit/153ab7e8fcf6bfc294b200d60a6f01feb5bb571a: |
||
547 | 1 | Denis 'GNUtoo' Carikli | 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) : |
548 | 66 | Paul Kocialkowski | <pre> |
549 | 43 | Denis 'GNUtoo' Carikli | BOARD_HAVE_GPS_HARDWARE := true |
550 | BOARD_GPS_LIBRARIES := libhardware |
||
551 | 66 | Paul Kocialkowski | </pre> |
552 | 1 | Denis 'GNUtoo' Carikli | I'm not sure if the "BOARD_HAVE_GPS_HARDWARE := true" is really needed. |
553 | |||
554 | If your device is different from the htc dream you may have to modify the GPS library code to match your device, |
||
555 | Here's the adaptation made for the htc dream: |
||
556 | 66 | Paul Kocialkowski | <pre> |
557 | 43 | Denis 'GNUtoo' Carikli | hardware/libhardware_legacy/gps$ diff -u ../../../../repos_external/phh_libhardware_legacy/gps/gps-rpc.c ./gps-rpc.c |
558 | --- ../../../../repos_external/phh_libhardware_legacy/gps/gps-rpc.c 2010-08-15 11:35:03.210095153 +0200 |
||
559 | 1 | Denis 'GNUtoo' Carikli | +++ ./gps-rpc.c 2011-01-06 16:46:45.417685002 +0100 |
560 | @@ -464,8 +464,8 @@ |
||
561 | } |
||
562 | 43 | Denis 'GNUtoo' Carikli | |
563 | 1 | Denis 'GNUtoo' Carikli | int init_gps6125() { |
564 | - struct CLIENT *clnt=clnt_create(NULL, 0x3000005B, 0, NULL); |
||
565 | - struct CLIENT *clnt_atl=clnt_create(NULL, 0x3000001D, 0, NULL); |
||
566 | + struct CLIENT *clnt=clnt_create(NULL, 0x3000005B, 0x90380d3d, NULL); |
||
567 | + struct CLIENT *clnt_atl=clnt_create(NULL, 0x3000001D, 0x51c92bd8, NULL); |
||
568 | 43 | Denis 'GNUtoo' Carikli | int i; |
569 | _clnt=clnt; |
||
570 | 1 | Denis 'GNUtoo' Carikli | SVCXPRT *svc=svcrtr_create(); |
571 | @@ -538,33 +538,21 @@ |
||
572 | |||
573 | |||
574 | int init_gps_rpc() { |
||
575 | - int fd=open("/sys/class/htc_hw/amss", O_RDONLY); |
||
576 | 66 | Paul Kocialkowski | - char bufr32; |
577 | 1 | Denis 'GNUtoo' Carikli | - bzero(buf, 32); |
578 | - read(fd, buf, 32); |
||
579 | - if(strncmp(buf, "6125", 4)==0) |
||
580 | - amss=A6125; |
||
581 | 44 | Denis 'GNUtoo' Carikli | - else if((strncmp(buf, "5225", 4)==0) || (strncmp(buf, "6150", 4)==0)) |
582 | - amss=A5225; |
||
583 | 1 | Denis 'GNUtoo' Carikli | - else |
584 | - amss=A6125; //Fallback to 6125 ATM |
||
585 | - if(amss==A6125) |
||
586 | - init_gps6125(); |
||
587 | - else if(amss==A5225) |
||
588 | - init_gps5225(); |
||
589 | + amss=A6125; |
||
590 | + init_gps6125(); |
||
591 | 44 | Denis 'GNUtoo' Carikli | return 0; |
592 | 1 | Denis 'GNUtoo' Carikli | } |
593 | |||
594 | void gps_get_position() { |
||
595 | 44 | Denis 'GNUtoo' Carikli | int i; |
596 | 1 | Denis 'GNUtoo' Carikli | - for(i=5;i;--i) if(!can_send) sleep(1);//Time out of 5 seconds on can_send |
597 | + for(i=3;i;--i) if(!can_send) sleep(1);//Time out of 5 seconds on can_send |
||
598 | 44 | Denis 'GNUtoo' Carikli | can_send=0; |
599 | 1 | Denis 'GNUtoo' Carikli | 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_IDsr2); |
600 | 66 | Paul Kocialkowski | } |
601 | 1 | Denis 'GNUtoo' Carikli | |
602 | void exit_gps_rpc() { |
||
603 | - if(amss==A6125) |
||
604 | 44 | Denis 'GNUtoo' Carikli | - pdsm_client_end_session(_clnt, 0, 2); |
605 | 1 | Denis 'GNUtoo' Carikli | + //if(amss==A6125) |
606 | 44 | Denis 'GNUtoo' Carikli | + // pdsm_client_end_session(_clnt, 0, 2); |
607 | //5225 doesn't seem to like end_session ? |
||
608 | 1 | Denis 'GNUtoo' Carikli | //Bah it ends session on itself after 10seconds. |
609 | } |
||
610 | </pre> |
||
611 | 66 | Paul Kocialkowski | |
612 | 1 | Denis 'GNUtoo' Carikli | so let's go step by steps on that diff: |
613 | 44 | Denis 'GNUtoo' Carikli | First we see that: |
614 | 1 | Denis 'GNUtoo' Carikli | <pre> |
615 | 66 | Paul Kocialkowski | + struct CLIENT *clnt=clnt_create(NULL, 0x3000005B, 0x90380d3d, NULL); |
616 | 44 | Denis 'GNUtoo' Carikli | + struct CLIENT *clnt_atl=clnt_create(NULL, 0x3000001D, 0x51c92bd8, NULL); |
617 | 1 | Denis 'GNUtoo' Carikli | </pre> |
618 | 68 | Paul Kocialkowski | |
619 | 1 | Denis 'GNUtoo' Carikli | This corresponds to some devices nodes: |
620 | 66 | Paul Kocialkowski | <pre> |
621 | 1 | Denis 'GNUtoo' Carikli | # ls -l /dev/oncrpc |
622 | 44 | Denis 'GNUtoo' Carikli | crw-rw---- 1 radio system 253, 0 Jan 6 16:43 00000000:0 |
623 | crw-rw---- 1 radio system 253, 11 Jan 6 16:43 30000000:5a10cf88 |
||
624 | crw-rw---- 1 radio system 253, 9 Jan 6 16:43 30000002:aa2b1a44 |
||
625 | crw-rw---- 1 radio system 253, 4 Jan 6 16:43 30000003:94103dec |
||
626 | 1 | Denis 'GNUtoo' Carikli | crw-rw---- 1 radio system 253, 30 Jan 6 16:43 3000000a:71d1094b |
627 | crw-rw---- 1 radio system 253, 28 Jan 6 16:43 3000000e:2bf06595 |
||
628 | 44 | Denis 'GNUtoo' Carikli | crw-rw---- 1 radio system 253, 26 Jan 6 16:43 3000000f:46d257e5 |
629 | crw-rw---- 1 radio system 253, 23 Jan 6 16:43 30000013:e94e8f0c |
||
630 | 1 | Denis 'GNUtoo' Carikli | crw-rw---- 1 radio system 253, 22 Jan 6 16:43 30000014:7cfcd2c6 |
631 | crw-rw---- 1 radio system 253, 21 Jan 6 16:43 30000016:c713bd79 |
||
632 | crw-rw---- 1 radio system 253, 19 Jan 6 16:43 30000019:acb4a896 |
||
633 | 44 | Denis 'GNUtoo' Carikli | crw-rw---- 1 radio system 253, 18 Jan 6 16:43 3000001b:97d7b24a |
634 | crw-rw---- 1 radio system 253, 12 Jan 6 16:43 3000001d:51c92bd8 |
||
635 | crw-rw---- 1 radio system 253, 8 Jan 6 16:43 30000021:f330a24e |
||
636 | 1 | Denis 'GNUtoo' Carikli | crw-rw---- 1 radio system 253, 14 Jan 6 16:43 3000003c:03d4377c |
637 | 44 | Denis 'GNUtoo' Carikli | crw-rw---- 1 radio system 253, 29 Jan 6 16:43 30000048:0da5b528 |
638 | crw-rw---- 1 radio system 253, 17 Jan 6 16:43 30000059:00000000 |
||
639 | crw-rw---- 1 radio system 253, 16 Jan 6 16:43 3000005a:00000000 |
||
640 | crw-rw---- 1 radio system 253, 13 Jan 6 16:43 3000005b:90380d3d |
||
641 | crw-rw---- 1 radio system 253, 7 Jan 6 16:43 3000005f:95d1d9f5 |
||
642 | crw-rw---- 1 radio system 253, 5 Jan 6 16:43 30000060:bcfb5d63 |
||
643 | crw-rw---- 1 radio system 253, 2 Jan 6 16:43 30000061:fb837d0b |
||
644 | crw-rw---- 1 radio system 253, 31 Jan 6 16:43 30000066:1f4b343e |
||
645 | crw-rw---- 1 radio system 253, 27 Jan 6 16:43 3000006b:0aabc7a4 |
||
646 | crw-rw---- 1 radio system 253, 25 Jan 6 16:43 3000006c:00000000 |
||
647 | 1 | Denis 'GNUtoo' Carikli | crw-rw---- 1 radio system 253, 20 Jan 6 16:43 30000075:f708938d |
648 | 44 | Denis 'GNUtoo' Carikli | crw-rw---- 1 radio system 253, 15 Jan 6 16:43 30000079:00000000 |
649 | crw-rw---- 1 radio system 253, 1 Jan 6 16:43 30000081:ccc5b439 |
||
650 | crw-rw---- 1 radio system 253, 24 Jan 6 16:43 3000fe00:00000000 |
||
651 | crw-rw---- 1 radio system 253, 10 Jan 6 16:43 3000fffe:00000000 |
||
652 | crw-rw---- 1 radio system 253, 6 Jan 6 16:43 30100001:00000000 |
||
653 | crw-rw---- 1 radio system 253, 3 Jan 6 16:43 30100002:00000000 |
||
654 | 66 | Paul Kocialkowski | </pre> |
655 | 68 | Paul Kocialkowski | |
656 | 66 | Paul Kocialkowski | Theses 2 lines should ring a bell: |
657 | 1 | Denis 'GNUtoo' Carikli | <pre> |
658 | 66 | Paul Kocialkowski | crw-rw---- 1 radio system 253, 13 Jan 6 16:43 3000005b:90380d3d |
659 | 45 | Denis 'GNUtoo' Carikli | crw-rw---- 1 radio system 253, 12 Jan 6 16:43 3000001d:51c92bd8 |
660 | </pre> |
||
661 | 66 | Paul Kocialkowski | |
662 | 45 | Denis 'GNUtoo' Carikli | Next there is that line: |
663 | 66 | Paul Kocialkowski | <pre> |
664 | 45 | Denis 'GNUtoo' Carikli | + for(i=3;i;--i) if(!can_send) sleep(1);//Time out of 5 seconds on can_send |
665 | </pre> |
||
666 | 68 | Paul Kocialkowski | |
667 | 66 | Paul Kocialkowski | This is the time between 2 requests, if you put it too low it can reboot your phone(it will crashes and reboot) |
668 | |||
669 | h4. libloc_api |
||
670 | 50 | Denis 'GNUtoo' Carikli | |
671 | For adding support for libloc_api you need to modify the BOARD_GPS_LIBRARIES variable |
||
672 | 66 | Paul Kocialkowski | |
673 | 50 | Denis 'GNUtoo' Carikli | "That repository":https://github.com/CyanogenMod/android_hardware_qcom_gps should have newer devices support(like in AOSP) and older too(like rmcc's commits) |
674 | 66 | Paul Kocialkowski | |
675 | h4. testing |
||
676 | |||
677 | <pre> |
||
678 | 45 | Denis 'GNUtoo' Carikli | cd hardware/libhardware_legacy/tests/gpstest/ |
679 | 66 | Paul Kocialkowski | mm |
680 | 45 | Denis 'GNUtoo' Carikli | </pre> |
681 | 66 | Paul Kocialkowski | gives you a gpstest binary, copy it to the device and run it, it'll tell you if it has a fix |
682 | |||
683 | h4. Note on the GPS |
||
684 | 45 | Denis 'GNUtoo' Carikli | |
685 | 42 | 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). |
686 | 51 | Denis 'GNUtoo' Carikli | |
687 | The GPS is attached to the modem on the htc dream and the nexus one. |
||
688 | 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. |
||
689 | That RPC mecanism uses shared memory between the modem and the CPU that runs Android. |
||
690 | |||
691 | 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. |
||
692 | 52 | Denis 'GNUtoo' Carikli | So compatibility with applications that understand NMEA is garanteed. |
693 | 51 | Denis 'GNUtoo' Carikli | |
694 | 66 | Paul Kocialkowski | Note that the GPS parsing library doesn't require to use NMEA, it could also uses the RPC directly(to be verified) |
695 | |||
696 | h3. Sensors |
||
697 | 1 | Denis 'GNUtoo' Carikli | |
698 | 52 | Denis 'GNUtoo' Carikli | 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. |
699 | 51 | Denis 'GNUtoo' Carikli | 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. |
700 | |||
701 | The nexusone has akmd.free which is the free implementation of akmd, the sensor daemon(which handle rotation) |
||
702 | 66 | Paul Kocialkowski | |
703 | h4. akmd.free |
||
704 | |||
705 | 52 | Denis 'GNUtoo' Carikli | akmd.free is located in: |
706 | 66 | Paul Kocialkowski | <pre> |
707 | 52 | Denis 'GNUtoo' Carikli | hardware/akmd_free |
708 | 66 | Paul Kocialkowski | </pre> |
709 | 52 | Denis 'GNUtoo' Carikli | it has currently(at the time of writing) support for akm8973+bma150 based sensors. |
710 | akmd.free was made specifically for the htc hero by its authors. |
||
711 | The device supported include the nexus one(tested) and the HTC hero(not tested,not activated). |
||
712 | |||
713 | 66 | Paul Kocialkowski | In order to activate the support for it you must add that in your [[BoardConfig]].mk |
714 | <pre> |
||
715 | BUILD_AKMD := true |
||
716 | 52 | Denis 'GNUtoo' Carikli | </pre> |
717 | 66 | Paul Kocialkowski | |
718 | 32 | Michael Haas - | 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: |
719 | 66 | Paul Kocialkowski | <pre> |
720 | +#ifdef TARGET_DEVICE_NEXUSONE |
||
721 | 63 | Paul Kocialkowski | + abuf[index] = Vector(-bma150_datar0, -bma150_datar1, bma150_datar2); |
722 | 66 | Paul Kocialkowski | +#else |
723 | 63 | Paul Kocialkowski | abuf[index] = Vector(bma150_datar0, -bma150_datar1, bma150_datar2); |
724 | 66 | Paul Kocialkowski | +#endif |
725 | 63 | Paul Kocialkowski | </pre> |
726 | And that: |
||
727 | 66 | Paul Kocialkowski | <pre> |
728 | 63 | Paul Kocialkowski | ifeq ($(TARGET_DEVICE),passion) |
729 | LOCAL_CFLAGS += -DTARGET_DEVICE_NEXUSONE |
||
730 | 66 | Paul Kocialkowski | endif |
731 | 1 | Denis 'GNUtoo' Carikli | </pre> |
732 | |||
733 | h3. Slowness issues |
||
734 | |||
735 | 66 | Paul Kocialkowski | If the device is too slow without non-free libs, there can still be some workarounds: |
736 | 1 | Denis 'GNUtoo' Carikli | * Adding debug.sf.hw=0 in the proprieties: in a makefile on the device files, add: |
737 | 72 | Paul Kocialkowski | <pre> |
738 | PRODUCT_PROPERTY_OVERRIDES += debug.sf.hw=0 |
||
739 | </pre> |
||
740 | * Use a patched gralloc: the "Code Aurora":https://www.codeaurora.org/gitweb/quic/la/ had a fix for a nasty Nexus One graphics bug on the @froyo_almond@ branch. |
||
741 | 66 | Paul Kocialkowski | * Use TARGET_LIBAGL_USE_GRALLOC_COPYBITS with libagl: if your device uses gralloc+copybits, you can try a fix that improved the speed on Nexus One: in a makefile on the device files, add: |
742 | 72 | Paul Kocialkowski | <pre> |
743 | TARGET_LIBAGL_USE_GRALLOC_COPYBITS := true |
||
744 | </pre> |
||
745 | 66 | Paul Kocialkowski | |
746 | 23 | Denis 'GNUtoo' Carikli | The commits with these fixes for Nexus One are: |
747 | 66 | Paul Kocialkowski | * https://gitorious.org/replicant/android_device_htc_passion/commit/86aeb1822a90b71e2cbb1af71200e759d98f4993 |
748 | * https://gitorious.org/replicant/android_hardware_msm7k/commit/d2d79391f10789ed9d2f5dd818aac3b23c48d69e |
||
749 | |||
750 | 24 | Denis 'GNUtoo' Carikli | h2. Re-using source code |
751 | |||
752 | The previous source code re-used some public source code that was licensed under the Apache 2.0 license. |
||
753 | The ril will also re-use some public source code licensed under Apache 2.0. |
||
754 | 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. |
||
755 | 1 | 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. |
756 | 66 | Paul Kocialkowski | |
757 | h3. Ril |
||
758 | |||
759 | * vilvord ril |
||
760 | * openmoko (android on freerunner) ril |
||
761 | |||
762 | h2. Source organization and commit access |
||
763 | |||
764 | 24 | Denis 'GNUtoo' Carikli | Until now we made some changes in the tree, but we want the changes to land upstream in replicant. |
765 | For instance let's say we modified only the ril path like in the ril section in |
||
766 | 66 | Paul Kocialkowski | <pre> |
767 | 24 | Denis 'GNUtoo' Carikli | device/htc/dream_sapphire/full_dream_sapphire.mk |
768 | 1 | Denis 'GNUtoo' Carikli | </pre> |
769 | 70 | Paul Kocialkowski | |
770 | 24 | Denis 'GNUtoo' Carikli | first we save our modifications: |
771 | 66 | Paul Kocialkowski | <pre> |
772 | 24 | Denis 'GNUtoo' Carikli | cd device/htc/dream_sapphire/ |
773 | git diff > git_diff.patch |
||
774 | 1 | Denis 'GNUtoo' Carikli | </pre> |
775 | 70 | Paul Kocialkowski | |
776 | 24 | Denis 'GNUtoo' Carikli | then we find where is the root of the git repository we are in: |
777 | 66 | Paul Kocialkowski | <pre> |
778 | 25 | Denis 'GNUtoo' Carikli | cd replicant-2.2 #top replicant directory where everything is in |
779 | cd .repo |
||
780 | cat manifest.xml |
||
781 | 1 | Denis 'GNUtoo' Carikli | </pre> |
782 | 70 | Paul Kocialkowski | |
783 | 25 | Denis 'GNUtoo' Carikli | and we find that: |
784 | 66 | Paul Kocialkowski | <pre> |
785 | 25 | Denis 'GNUtoo' Carikli | <project path="device/htc/buzz" name="CyanogenMod/android_device_htc_buzz" remote="github" /> |
786 | 1 | Denis 'GNUtoo' Carikli | </pre> |
787 | 70 | Paul Kocialkowski | |
788 | 25 | Denis 'GNUtoo' Carikli | so...now our repository is in device/htc/buzz |
789 | 26 | Denis 'GNUtoo' Carikli | We will now look where the source repository is: |
790 | 66 | Paul Kocialkowski | <pre> |
791 | 27 | Denis 'GNUtoo' Carikli | cd device/htc/buzz |
792 | 26 | Denis 'GNUtoo' Carikli | cd .git |
793 | cat config |
||
794 | 1 | Denis 'GNUtoo' Carikli | </pre> |
795 | 70 | Paul Kocialkowski | |
796 | 26 | Denis 'GNUtoo' Carikli | We find that: |
797 | 66 | Paul Kocialkowski | <pre> |
798 | 26 | Denis 'GNUtoo' Carikli | url = git://github.com/CyanogenMod/android_device_htc_buzz.git |
799 | 66 | Paul Kocialkowski | </pre> |
800 | 32 | Michael Haas - | |
801 | 1 | Denis 'GNUtoo' Carikli | Then create a directory, not under the replicant-2.2 directory that will contain your repositories: |
802 | 66 | Paul Kocialkowski | <pre> |
803 | 27 | Denis 'GNUtoo' Carikli | mkdir repo |
804 | cd repo |
||
805 | 1 | Denis 'GNUtoo' Carikli | </pre> |
806 | 70 | Paul Kocialkowski | |
807 | 27 | Denis 'GNUtoo' Carikli | and clone the source: |
808 | 66 | Paul Kocialkowski | <pre> |
809 | 1 | Denis 'GNUtoo' Carikli | git clone git://github.com/CyanogenMod/android_device_htc_buzz.git |
810 | cd android_device_htc_buzz |
||
811 | </pre> |
||
812 | 70 | Paul Kocialkowski | |
813 | 1 | Denis 'GNUtoo' Carikli | apply the previous patch: |
814 | 66 | Paul Kocialkowski | <pre> |
815 | 1 | Denis 'GNUtoo' Carikli | git apply path/to/git_diff.patch |
816 | </pre> |
||
817 | 70 | Paul Kocialkowski | |
818 | 1 | Denis 'GNUtoo' Carikli | commit locally the result: |
819 | 66 | Paul Kocialkowski | <pre> |
820 | 1 | Denis 'GNUtoo' Carikli | git commit -s |
821 | </pre> |
||
822 | 70 | Paul Kocialkowski | |
823 | 1 | Denis 'GNUtoo' Carikli | Note that the commit message should have the following format: |
824 | The first line should be a summary |
||
825 | Followed by a linebreak |
||
826 | And then the details explaining the commit |
||
827 | 66 | Paul Kocialkowski | If you made an error writing the commit message do |
828 | 1 | Denis 'GNUtoo' Carikli | <pre> |
829 | 66 | Paul Kocialkowski | git commit --amend |
830 | 1 | Denis 'GNUtoo' Carikli | </pre> |
831 | |||
832 | TODO: complete for sending the git patch(git format-patch -1,git send-email) |
||
833 | 66 | Paul Kocialkowski | |
834 | h4. Pushing to replicant |
||
835 | |||
836 | 1 | Denis 'GNUtoo' Carikli | TODO: git remote add+git push |