Project

General

Profile

BCM4751 » History » Version 10

Paul Kocialkowski, 08/14/2012 01:52 PM

1 1 Paul Kocialkowski
h1. Broadcom4751GPS
2
3 9 Paul Kocialkowski
h2. Factory image files
4 1 Paul Kocialkowski
5 2 Paul Kocialkowski
The non-free files holding the GPS infos/code are the following:
6 1 Paul Kocialkowski
<pre>
7
/system/vendor/bin/gpsd
8
/system/vendor/lib/hw/gps.s5pc110.so
9
/system/vendor/etc/gps.xml
10
/system/etc/gps.conf
11
</pre>
12
13 9 Paul Kocialkowski
h3. gps.xml parameters 
14
15
We have tried to change some parameters in gps.xml to see how it behaves:
16
17
|_. Parameter |_. Original |_. Changed to |_. Result |
18
| acPortName | /dev/s3c2410_serial1 | /dev/s3c2410_serial42 | The chip wasn't "booted" |
19
| gpioNStdbyPath | /sys/class/sec/gps/GPS_PWR_EN/value | /sys/class/sec/gps/GPS_PWR_EN/value2 | The chip was booted |
20
| gpioNResetPath | /sys/class/sec/gps/GPS_nRST/value | /sys/class/sec/gps/GPS_nRST/value2 | The chip was booted |
21
22
After all, it seems that when the gpsd binary is running without the gps.s5pc110.so library, the chip isn't started (our test utility doesn't work) whereas when the library is running and connects to the socket when it is created by starting gpsd, the chip is booted. 
23
24
gps.s5pc110.so will actually order bootup via the socket, when the gps is requested by the Android framework. When it's not used anymore, it will request poweroff as well.
25
26 1 Paul Kocialkowski
h2. Protocol
27
28 9 Paul Kocialkowski
According to the logs obtained from gpsd, the chip seems to be using the MEIF protocol at first, then a patch is sent and it starts using another protocol, which doesn't seem related to MEIF according to the logs (there are basically no more references to MEIF after uploading the patch). However, as we have no information about what MEIF is (it's a binary proprietary undocumented protocol), these are just guesses.
29
We decided to implement the first protocol under the name MEIF, but it could also be some sort of BCM4751-specific bootloader protocol that is in charge of making the patch upload.
30 1 Paul Kocialkowski
31 9 Paul Kocialkowski
The GPSD component is in charge of translating the second protocl to standard NMEA that is sent to the gps.s5pc110.so lib via the /dev/socket/gps Unix socket, created by GPSD.
32 1 Paul Kocialkowski
33 9 Paul Kocialkowski
h2. Devices
34 1 Paul Kocialkowski
35 9 Paul Kocialkowski
Here is a list of the devices that are known to use the BCM4751 chip:
36 1 Paul Kocialkowski
37 9 Paul Kocialkowski
|_. Device |_. Vendor |_. BCM4751 revision |
38
| Nexus S | Google/Samsung | 4751A1 |
39
| Galaxy S I9000 | Samsung | 4751A2 |
40
| Galaxy Tab P1000 | Samsung | ? |
41
| Nexus 7 | Google/Asus | ? |
42 1 Paul Kocialkowski
43 9 Paul Kocialkowski
h2. Free software implementation
44 1 Paul Kocialkowski
45 9 Paul Kocialkowski
On January 2012, the work to write a free software implementation that could handle the BCM4751 chip was started.
46
The main target is the Nexus S, even though it should work with few changes on other BCM4751 devices.
47 1 Paul Kocialkowski
48 9 Paul Kocialkowski
The code source is available at: https://gitorious.org/replicant/crespo-gps-utils
49 1 Paul Kocialkowski
50 9 Paul Kocialkowski
h3. Current status
51 1 Paul Kocialkowski
52 9 Paul Kocialkowski
|_. Part |_. Status |_. Comments |
53
| Serial setup | "DONE":https://gitorious.org/replicant/crespo-gps-utils/commit/e4f94e901b9b4c5fef5642ad9580863fc2bfe336 | Magic is: @termios.c_cflag = 0x800018b2;@ |
54
| MEIF parsing | "DONE":https://gitorious.org/replicant/crespo-gps-utils/commit/927c1c92dd092cec8c56351bf663101183f19076 | |
55
| MEIF dispatch | "DONE":https://gitorious.org/replicant/crespo-gps-utils/commit/f952dde8f3a29634be1c8fa19b8eed367c1ad878 | |
56
| MEIF patch upload | "DONE":https://gitorious.org/replicant/crespo-gps-utils/commit/9a5827778189b7e0f91879430a4e160567ee6bbd | Nexus S and Galaxy S patches differ |
57 1 Paul Kocialkowski
58 9 Paul Kocialkowski
h3. Utilities
59
60
|_. Name |_. Task |_. Arguments |
61
| bcm4751_gpsd | Main utility, boots the chip, send the patch, switch protocol | None |
62
| bcm4751_test | Deprecated utility, can be used for poweroff | @stop@: poweroff the chip |
63
| bcm4751_hal | Acts as the framework: permits to trace gps.s5pc110.so | None |
64
| bcm4751_daemon | Acts as (a fake) gpsd to the lib | None |
65
| bcm4751_lib | Acts as (a fake) lib to gpsd | None |
66
67
h3. BCM4751 gpsd
68
69
This is where MEIF is implemented. It currently does the following:
70
* Serial setup
71
* Autobaud
72
* MEIF reader loop
73
* MEIF parsing
74
* MEIF dispatch
75
* MEIF patch upload
76
* Protocol switch (sends unknown bytes in the second protocol to get a response)
77
* Response dump
78
79
Sample output log:
80 1 Paul Kocialkowski
<pre>
81 9 Paul Kocialkowski
Turning the GPS on...
82
Opening the GPS serial...
83
Sending autobaud...
84
Read 17 bytes
85
Read 32 bytes
86
MEIF message: MEIF_STATE_REPORT_MSG with 18 bytes of data:
87
[0000]   01 00 00 00 01 00 00 00   00 00 00 00 00 00 00 00   ........ ........
88
[0010]   1A 00                                               ..
89
Got a STATE_REPORT message
90 1 Paul Kocialkowski
91 9 Paul Kocialkowski
Read 23 bytes
92
Read 32 bytes
93
Read 16 bytes
94
Read 7 bytes
95
MEIF message: MEIF_CONFIG_VALUES_MSG with 70 bytes of data:
96
[0000]   02 00 01 00 01 00 40 00   01 00 02 00 00 00 00 00   ........ ........
97
[0010]   01 00 02 00 00 00 00 00   00 00 06 00 81 11 00 09   ........ ........
98
[0020]   07 07 D9 07 42 52 4F 41   44 43 4F 4D 00 00 00 00   ....BROA DCOM....
99
[0030]   00 00 00 00 34 37 35 31   41 31 00 00 00 00 00 00   ....4751 A1......
100
[0040]   00 00 00 00 B3 05                                   ......
101
Got config values:
102
	vendor: BROADCOM
103
	product: 4751A1
104
105
Sending the first part of the patch...
106
Sending 2054 bytes!
107
MEIF message: MEIF_SEND_PATCH_MSG with 2046 bytes of data:
108
109
Read 14 bytes
110
MEIF message: MEIF_NACK_MSG with 6 bytes of data:
111
[0000]   03 00 03 00 0F 00                                   ......
112
Got a NACK message
113
Reason is: MEIF_NACK_GARBAGE_RECEIVED
114
115
Read 12 bytes
116
MEIF message: MEIF_ACK_MSG with 4 bytes of data:
117
[0000]   04 01 0B 00                                         ....
118
Got an ACK message
119
120
Sending the second part of the patch...
121
Sending 706 bytes!
122
MEIF message: MEIF_SEND_PATCH_MSG with 698 bytes of data:
123
124
Read 12 bytes
125
MEIF message: MEIF_ACK_MSG with 4 bytes of data:
126
[0000]   05 02 0D 00                                         ....
127
Got an ACK message
128
129
Ready to switch protocol!
130
Sending unknown bytes!
131
Read 12 bytes:
132
[0000]   FE 00 FD 40 00 00 F1 B1   12 20 67 FC               ........ ..g.
133
</pre>
134 1 Paul Kocialkowski
135 10 Paul Kocialkowski
h3. BCM4751 patch
136
137
In order to use the same protocol as the non-free gpsd, a patch needs to be sent. It is hardcoded in the non-free gpsd binary.
138
Note that we don't know what that patch exactly is nor what it does. In any case, it must be considered as the propriety of Broadcom (or Samsung maybe) and falls under the non-free gpsd license.
139
140
Here are notes on how to extract the patch from various non-free gpsd binaries:
141
|_. Device |_. Source |_. MD5 |_. Offset |_. Length |_. dd command |
142
| Nexus S | CM 9.0.0 | 4a6c0027e530b5b8a346153a355ef8e3 | 0x15DDEA | 2738 bytes | dd skip=1433066 count=2738 if=gpsd of=bcm4751.fw bs=1 |
143
144
The @bcm4751_gpsd@ utility will attempt to read the patch from @/data/bcm4751.fw@
145
146 1 Paul Kocialkowski
h3. Random notes with the new utility program
147
148
<pre>
149
echo -n "ab" > /dev/s3c2410_serial1
150
</pre>
151
produces:
152
<pre>
153
Read 14 bytes:
154
[0000]   49 27 01 00 10 00 40 00   07 00 58 00 49 D0         I....... ..X.I.
155
Read 14 bytes:
156
[0000]   49 27 01 00 10 00 41 00   07 00 59 00 49 D0         I.....A. ..Y.I.
157
</pre>
158
* The only thing that changes seem to be the 40->41 and the 58->59, so theses seem to be something like a sequence number....