<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.openmoko.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.openmoko.org/api.php?action=feedcontributions&amp;user=Shadowjack&amp;feedformat=atom</id>
		<title>Openmoko - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.openmoko.org/api.php?action=feedcontributions&amp;user=Shadowjack&amp;feedformat=atom"/>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Special:Contributions/Shadowjack"/>
		<updated>2013-05-25T21:06:47Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.19.6</generator>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/BuiltInScriptingLanguage</id>
		<title>Wishlist/BuiltInScriptingLanguage</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/BuiltInScriptingLanguage"/>
				<updated>2007-08-21T17:44:10Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Feature matrix */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Wishlist}}&lt;br /&gt;
Many different scripting languages will be optionally available in the repository.&lt;br /&gt;
However,  developers who choose one of these languages for their applications will not be able to see their applications included in the standard ROM nor available for use by those without an external microSD card.&lt;br /&gt;
&lt;br /&gt;
All core applications and scripting languages must fit into the internal memory, along with some space for user data.&lt;br /&gt;
&lt;br /&gt;
Otherwise it is very difficult for the user to swap the SD.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feature matrix ==&lt;br /&gt;
Since there are a lot of options, the main features of the candidates should be collected in a matrix. &lt;br /&gt;
Fill in and add to this if possible.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;background:#efefef;&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;3&amp;quot; border=&amp;quot;1&amp;quot;  &lt;br /&gt;
! align=&amp;quot;center&amp;quot; |'''Language'''&lt;br /&gt;
! align=&amp;quot;center&amp;quot; |'''Current Status'''&lt;br /&gt;
! align=&amp;quot;center&amp;quot; |'''Disk Footprint'''&lt;br /&gt;
! align=&amp;quot;center&amp;quot; |'''Memory Footprint'''&lt;br /&gt;
! align=&amp;quot;center&amp;quot; |'''Compilable'''&lt;br /&gt;
! align=&amp;quot;center&amp;quot; |'''Scriptable'''&lt;br /&gt;
|-style=&amp;quot;background: #DDFFDD;&amp;quot;&lt;br /&gt;
! align=&amp;quot;center&amp;quot; |Java&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |JIT / gcj&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;center&amp;quot; |Python&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |JIT(Psyco) / Pyrex&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |Y&lt;br /&gt;
|-style=&amp;quot;background: #DDFFDD;&amp;quot;&lt;br /&gt;
!align=&amp;quot;center&amp;quot; |C#/mono&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |JIT&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |N&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;center&amp;quot; |Perl&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|-style=&amp;quot;background: #DDFFDD;&amp;quot;&lt;br /&gt;
!align=&amp;quot;center&amp;quot; |Haskell&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |Y&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |Y&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;center&amp;quot; |LUA&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |Light&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |Light&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |JIT(Lua-JIT)&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |Y&lt;br /&gt;
|-style=&amp;quot;background: #DDFFDD;&amp;quot;&lt;br /&gt;
!align=&amp;quot;center&amp;quot; |Ruby&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://lists.openmoko.org/pipermail/community/2007-January/001909.html There was a discussion on the mailing list about choosing a built-in scripting language.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://lists.openmoko.org/pipermail/community/2007-January/001945.html As expressed by Corey]:&lt;br /&gt;
&lt;br /&gt;
''It's true that you have the ability to add anything to the phone.''&lt;br /&gt;
&lt;br /&gt;
''There's another important consideration to remember: OpenMoko is a platform also; an inherent aspect of such a platform is that it always come shipped with X standard api's available for developers. This is why FIC had to select a group of components: gcc, glibc, xorg/kdrive, dbus and gtk, for instance.''&lt;br /&gt;
&lt;br /&gt;
''They may decide that a scripting language would also be a necessary or beneficial feature to include in the base/standard platform''&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
''Choice is good.''&lt;br /&gt;
&lt;br /&gt;
''And so is having a known/standard/default/static api and platform to build from; when I begin writting commercial and/or free software for the OpenMoko, I will design my software according the existing OpenMoko specs, and thereby circumvent the necessity of having to verify that my customers/end users have first installed the necessary scripting language, which would additionally circumvent the probability that your phone will end up with every scripting language known to man.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''&amp;gt; So having lua on my system would be more or less pointless as I don't use it myself.''&lt;br /&gt;
&lt;br /&gt;
''Less than one meg of space would be potentially wasted, true enough in your case. Know that there is probably plenty of other software on the OpenMoko platform that you, yourself, will not be using.''&lt;br /&gt;
&lt;br /&gt;
''Also realize that though _you_ may not be directly using this hypothetical scripting language, it is more than likely that one or more of the standard apps that ship with the phone will be using it, and that other 3rd party software that you may or may not install may also be using it.''&lt;br /&gt;
&lt;br /&gt;
[http://lists.openmoko.org/pipermail/community/2007-January/001947.html Derek Pressnall also expressed it well:]&lt;br /&gt;
&lt;br /&gt;
''The reason is the same reason the device is being shipped with a given kernel (Linux), a given set of libraries (glibc, gtk), etc.  So that when a developer writes an application, it will be known to be able to run on all shipped devices.  So, in this light, it may be benificial to included a standard interpreted language that can be a known&lt;br /&gt;
target. ''&lt;br /&gt;
&lt;br /&gt;
''The benefits to having an interpreter included (esp. one that has hooks into the gui and other phone functions) are that more apps will be made available -- there are more hackers that can code up quick scripts than ones that will learn &amp;amp; code for a specific gui accessible only from a compiled language.  And, the benefit of having a particular interpreter is that when these little apps / scripts are packaged up, you don't have a dependancy nightmare (even though this can be somewhat mitigated by a good package management system, it is only as good as the backend repository, and having self-contained packages are the simplest of all).  Also, by settling on a single standard, even if it is one that some developers may have to learn, it makes it more worthwhile to learn a new scripting environment that is widely deployed on your target platform.  But for these same reasons, the interpreted language target will need careful consideration, lest we get stuck with something that doesn't adequetly meet most needs.''&lt;br /&gt;
&lt;br /&gt;
''As a secondary issue, if the included interpreter is easily embeddable, then it would be nice to have it as the standard across all the included applets that can use it (i.e., it would be good if the email/sms client, phonebook manager, dialer, etc. were all scriptable).''&lt;br /&gt;
&lt;br /&gt;
''But whatever is decided on (if a single language is picked), a function library should be developed for it that includes access to all the phone specific features (in addition to the gui hooks).''&lt;br /&gt;
&lt;br /&gt;
[[http://lists.openmoko.org/pipermail/community/2007-January/001955.html and Ben Burdette:]]&lt;br /&gt;
&lt;br /&gt;
''That's all well and good when everyone has SPACE for every scripting  language known to man.  But use 10mb here, 10mb there for scripting languages, and suddenly there's nothing left of my 64mb of flash. ''&lt;br /&gt;
&lt;br /&gt;
''I'm all for allowing people to use whatever scripting language they want.  But I'd like the peace of mind of knowing I can write a scripted app that will run on every OpenMoko phone out there, even if they have no memory expansion card.  I don't want the situation where the poor user has to unload someone else's app and scripting environment in order to use mine, or vice versa. ''&lt;br /&gt;
&lt;br /&gt;
Bryan Larsen adds:&lt;br /&gt;
&lt;br /&gt;
''It'll be faster for me to develop my apps in Ruby-GTK2 and then port to C once the application stabilizes, since so much of the actual work involves playing with and discarding various ideas.  Why should I have to go through the totally unnecessary step of transliterating my code into C just so it can be used by mainstream users?  I don't really care if Ruby or Python or even Javascript is chosen, I just want something for rapid development that I can ship without translating!''&lt;br /&gt;
&lt;br /&gt;
For all these reasons, a choice should be made, and it should be made quickly.  A scripting language should be chosen and &amp;quot;blessed&amp;quot;; actual implementation on OpenMoko is a much lower priority as most people will likely be (or should be) prototyping their applications on a PC anyways.&lt;br /&gt;
&lt;br /&gt;
== Factors to Consider ==&lt;br /&gt;
&lt;br /&gt;
# '''How popular is it?''' The fewer people that need to learn a new language, the less whining we'll get on the list when it's chosen.&lt;br /&gt;
# '''How big is the run time environment?'''  This is perhaps the most important question, since we are trying to fit into a very small fraction of the 64MB of space available in the OpenMoko ROM.  We only need the run time environment; it is expected that developers will have a PC or microSD card to compile to the intermediate form used by the scripting language.  It's also presumed that a stripped down, precompiled standard library will be included.&lt;br /&gt;
# '''Is it easy to learn?'''  Assuming that the user has already learned some Algol influenced language, (ie pretty much every language in widespread current use except for Lisp and FORTRAN), how easy is it to learn?&lt;br /&gt;
# '''How advanced is it?'''  We want to include a language that people will use.  Specifically I'm going to look for &amp;quot;closures&amp;quot; and &amp;quot;meta-programming&amp;quot; as a measure of how &amp;quot;advanced&amp;quot; the language is.  These are very arbitrary choices, but they are something I've found useful.  If you have any other pet measures, let me know!&lt;br /&gt;
# '''Does it have bindings to GTK2, OpenMoko-libs and D-BUS?'''  These three things will be required to write applications that look and feel like OpenMoko apps, as well as interact well with the built-in applications.&lt;br /&gt;
# '''How does it perform?'''  Performance is usually not a major concern for a scripting language, but due to the limited horsepower available on phones, it is a concern.&lt;br /&gt;
# '''Is it embeddable?'''  Traditionally in the Unix world, applications were small tools bound together by scripts and pipes.  Traditionally in the Windows world, applications were huge monolothic beasts that were scriptable using a built-in scripting language such as Visual Basic for Applications.  This model is also used in the Unix world, Emacs being the classic example.  A hybrid model has emerged and become popular in modern Unix GUI's such as OSX, Gnome and KDE: applications expose a scripting friendly API via D-BUS, CORBA or Applescript so that external scripts can appear to act as internal scripts.  If the scripting language chosen is easily embeddable, all three models become available on OpenMoko.  It's expected that the third model will be the most popular, but the second model may have size/overhead advantages.&lt;br /&gt;
# '''What major applications of interest''' are available in the language and would be useful on OpenMoko?&lt;br /&gt;
&lt;br /&gt;
== The Languages (already included) ==&lt;br /&gt;
&lt;br /&gt;
=== BASH / Shell scripts ===&lt;br /&gt;
&lt;br /&gt;
# already included, useful for most cases - [http://99-bottles-of-beer.net/language-bash-98.html example]&lt;br /&gt;
# Shell is a very popular scripting language.&lt;br /&gt;
# There will be a shell of some form available on OpenMoko, therefore it is &amp;quot;free&amp;quot;.&lt;br /&gt;
# Shell is idiosyncratic, but all Unix developers know it in at least a very limited degree.&lt;br /&gt;
# Shell is a full language, but can hardly be compared to languages designed monolithically.  :)&lt;br /&gt;
# D-BUS is usable from the command line.  GTK2 may be used via [http://www.gtk-server.org/index.html gtk-server].&lt;br /&gt;
&lt;br /&gt;
=== AWK ===&lt;br /&gt;
&lt;br /&gt;
# already included, very powerful - [http://99-bottles-of-beer.net/language-awk-53.html example]&lt;br /&gt;
&lt;br /&gt;
=== SED ===&lt;br /&gt;
&lt;br /&gt;
# already included, useful together with bash / awk [http://99-bottles-of-beer.net/language-sed-1087.html example1],[http://www.student.northpark.edu/pemente/sed/sed1line.txt example2]&lt;br /&gt;
&lt;br /&gt;
=== Javascript ===&lt;br /&gt;
&lt;br /&gt;
# Javascript is a very popular scripting language because it's the defacto web user-side scripting language.&lt;br /&gt;
# Javascript will be available on whichever web browser is included in the project, therefore it is &amp;quot;free&amp;quot;.&lt;br /&gt;
# Javascript has a straightforward C-style syntax.  Core Javascript is actually a very nice language; it gets a bad rap because of inconsistencies in implementation and bugs in the various browsers.&lt;br /&gt;
# Closures are very popular in Javascript.  Metaprogramming is possible; JSON is an example of a form of such.&lt;br /&gt;
# An incomplete set of bindings for GTK2 are [http://oss.mps.com.sg/GtkJavaScript available here.].  [http://www.gtk-server.org/index.html gtk-server] may be used instead if those bindings are insufficient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The Languages (not included) ==&lt;br /&gt;
&lt;br /&gt;
''Warning: opinions ahead''&lt;br /&gt;
&lt;br /&gt;
=== Lua ===&lt;br /&gt;
&lt;br /&gt;
# [http://www.lua.org/ Lua] is a moderately popular scripting language popular in video games and in Brazil.  &lt;br /&gt;
# It has a tiny footprint: 150K claimed, the run time environment takes up around 400K in OpenZaurus. It's been successfully shoehorned into tiny embedded platforms (&amp;lt;50Kb RAM).&lt;br /&gt;
# Lua has a simple syntax and is easy to learn. Reference the [http://www.lua.org/pil/ online book].&lt;br /&gt;
# It has first class closures and coroutines (a.k.a. greenthreads).  A fundamental building block of Lua is the ability to redefine any defined or undefined aspect of the language; this provides very good runtime metaprogramming ability.  [http://metalua.luaforge.net/ metalua] provides full compile-time metaprogramming (a.k.a. Lisp-style macros), if such extremes are needed.  &lt;br /&gt;
# Bindings are available for GTK2. Reference the [http://lua-users.org/wiki/LibrariesAndBindings Lua Libraries and Bindings] page.&lt;br /&gt;
# Performance are substantially better than [http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&amp;amp;lang=lua&amp;amp;lang2=python Python's] or [http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&amp;amp;lang=lua Perl's].&lt;br /&gt;
# It is very easy to embed: it's designed for seamless integration with C, in both Lua-&amp;gt;C and C-&amp;gt;Lua directions.&lt;br /&gt;
# [http://www.freepoc.org/viewapp.php?id=32 Example Implementation] for Symbian.&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
# Python is an extremely popular scripting language.&lt;br /&gt;
# By stripping down the standard libraries to the edge of usability, it can be made to fit within 1MB.  (claim unverified).   I suspect that 3MB is a more usable number.&lt;br /&gt;
# Designed as an educational language, it is easy to learn.  &lt;br /&gt;
# It has closures, although they were a late addition to the language.  Metaprogramming is very difficult.  &lt;br /&gt;
# Bindings are available for GTK2 and D-BUS.  GTK bindings are part of the Gnome project.&lt;br /&gt;
# Performance is good.  Psyco can make it extremely good, but that is unlikely to be available to OpenMoko.&lt;br /&gt;
# By using '''[http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/ Pyrex]'''/[http://pyinline.sourceforge.net/ PyInline]/Boost/[http://scipy.org/Weave Weave]/[http://www.swig.org/ SWIG], taxing algorithms can get C-like performance. Nice benchmarks [http://scipy.org/PerformancePython here]. &lt;br /&gt;
# Python can be embedded, although not trivially. [http://www.tucs.fi/magazin/output.php?ID=2000.N2.LilDeEmPy DePython] was a stripped-down version of python made for embedded systems, footprint &amp;lt;200k. Project unmaintained, but could be used as a staring point.&lt;br /&gt;
# OLPC uses Python heavily and may produce applications suitable for porting to OpenMoko&lt;br /&gt;
# Python is the only language besides C / C++ mentioned in GNOME Mobile &amp;amp; Embedded Initiative Mobile Platform&lt;br /&gt;
# Python has been successfully used to create well-working and fast programs for the Nokia 770/800 devices, such as [http://konttoristhoughts.blogspot.com/2007/03/uk-media-player-is-nearing-first-public.html this].&lt;br /&gt;
# Jython would make it almost 'free', but it's slower and [http://www.jython.org/docs/differences.html not identical] to CPython.&lt;br /&gt;
# [http://opensource.nokia.com/projects/pythonfors60/ Example implementation] for Symbian. (whole thing under 600kb)&lt;br /&gt;
&lt;br /&gt;
=== Ruby ===&lt;br /&gt;
&lt;br /&gt;
# Ruby is a popular scripting language.  &lt;br /&gt;
# Size is unknown, although comparable to Python, I suspect.  &lt;br /&gt;
# Ruby is seen by many to be an excellent compromise between the terseness and power of Perl and the readability and ease of learning of Python.  &lt;br /&gt;
# It has closures.  Metaprogramming can be hairy, but Rails is an excellent example of the beautiful results it can acheive.  &lt;br /&gt;
# Bindings are available for GTK2 and D-BUS.&lt;br /&gt;
# Performance is worse than Python or Perl in current versions, although the next version of Ruby is likely to be much better.&lt;br /&gt;
&lt;br /&gt;
=== Perl ===&lt;br /&gt;
&lt;br /&gt;
# Perl is an extremely popular scripting language.  &lt;br /&gt;
# Sizewise, it is likely to be a little bit smaller than Python or Ruby.&lt;br /&gt;
# It is not generally considered an easy language to learn.  This is probably mostly due to the idiosyncrasy of typical Perl programs.  Perl is generally easier to write than to read or maintain, most other languages are the other way around.   &lt;br /&gt;
# Perl has first class closures.  Perl's metaprogramming abilities lie between that of Python and Ruby.&lt;br /&gt;
# Perl has existed for a considerable amount of time in comparison to other scripting languages, which means it is stable and boasts an extensive amount of third-party libraries/modules.&lt;br /&gt;
# Bindings are available to GTK2 and D-BUS.  Gtk bindings are part of the GNOME project.&lt;br /&gt;
&lt;br /&gt;
=== Lisp/Scheme/Guile ===&lt;br /&gt;
&lt;br /&gt;
# There are a lot of Lisp variants available.  It is the second oldest high-level programming language available, yet still retains moderate popularity for new projects.&lt;br /&gt;
# Lisp variants have been run on 16K computers.  Usable variants are substantially larger, but will be significantly smaller than Python.&lt;br /&gt;
# Lisp syntax is very simple, and hated by many.  :)&lt;br /&gt;
# Modern lisp variants are more &amp;quot;powerful&amp;quot; than every other language listed here.&lt;br /&gt;
# GTK2 and D-BUS bindings are available&lt;br /&gt;
&lt;br /&gt;
=== Java ===&lt;br /&gt;
&lt;br /&gt;
# Not a scripting language, but Java does offer garbage collection and a few features that make development slightly faster than C.  A J2ME JVM is ubiquitous on competing cell phones so is likely to be included in OpenMoko for purely competitive reasons. (But if we're all lucky, a clear-minded concensus will prevail in everyone's understanding that Java just doesn't belong on an embedded device.)&lt;br /&gt;
# A full J2ME implementation takes about 2 Megabytes of space.  [http://developers.sun.com/techtopics/mobility/getstart/articles/survey/ (reading in between the lines here.  I could be very wrong)].  However since it's likely to be included in the phone for other reasons it can be considered &amp;quot;free&amp;quot;. Also, there's the very small [http://jamvm.sourceforge.net/ JamVM] as an alternative.&lt;br /&gt;
# Java is very C-like.&lt;br /&gt;
# Java is not a scripting language and doesn't support advanced scripting language features. So why is it in this list? &lt;br /&gt;
# libswt-gtk provides uses GTK2 to display SWT java apps, and libgtk-java provides a direct binding.&lt;br /&gt;
# If we're really lucky, people will realize that Java Virtual Machine belongs on embedded devices and has great performance there.  &lt;br /&gt;
# The Java API greatly reduces plumbing work and helps simplify application development greatly.  In addition, we can add to it providing additional APIs for the mobile device and then these would be available to all of the applications.&lt;br /&gt;
# The JVM has built in support for adding scripting languages, so regardless which we choose, it _should_ be on Java Virtual Machine.  Studies have shown that many features of the scripting languages actually run faster on the JVM.  Currently there are many scripting languages that we can use, including: javascript, ruby, python, and javafx.  This would be a huge win for the device.&lt;br /&gt;
# JavaFX is a Multimedia based scripting language that adds wow to devices&lt;br /&gt;
# The Neo1973 was demoed at JavaOne running the JavaFX Mobile so there is already a lot of reusable work in this area.&lt;br /&gt;
# Using gcj, java can be compiled to native binaries and there's no more need for a JVM. However, this means no multiple languages on one JVM and nullifies it's value in this list.&lt;br /&gt;
&lt;br /&gt;
=== JRuby ===&lt;br /&gt;
&lt;br /&gt;
# JRuby is a version of ruby that runs on the JVM.  Jython is also available although it appears that JRuby is being more actively supported by Sun.&lt;br /&gt;
# If a JVM is on the phone, then JRuby is &amp;quot;free&amp;quot;.&lt;br /&gt;
# JRuby can use the Java bindings to GTK2.&lt;br /&gt;
&lt;br /&gt;
=== Mono/C# ===&lt;br /&gt;
&lt;br /&gt;
# Not a scripting language, but offers garbage collection and other nice features.&lt;br /&gt;
# Already used in a similar setup on Nokia 770/800.&lt;br /&gt;
# Nicely cross-platform; same binary could be run on OpenMoko, Nokia 770/800, Linux, Windows (see [http://www.mdk.org.pl/articles/2007/01/28/clone-wars here]).&lt;br /&gt;
# Has anyone got a good quote on runtime size? (One package was 1.7M for runtime, 1.3M for GTK#, and a whopping 22M for the full classlib.)&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
If the space is available, the most popular choices will be Ruby and Python.  Python is currently more popular, however Ruby is gaining ground fast.  The choice between the two is political.  Neither is wrong; you'll offend people making either choice.  However, &amp;quot;both&amp;quot; is a very expensive option, so a choice will have to be made.&lt;br /&gt;
&lt;br /&gt;
If the space is more limited, Lua and Scheme are probably the best choices.  Unless your developers include a large number of grey-bearded Lisp hackers, Lua is probably the best choice.  This may be unfortunate, but it is so.&lt;br /&gt;
&lt;br /&gt;
If an appropriate amount of manpower is available to bring the bindings up to snuff, the &amp;quot;free&amp;quot; choice of Javascript may be the best choice of all.&lt;br /&gt;
&lt;br /&gt;
JRuby is also an interesting choice.  It's very likely that a J2ME JVM will be included in the standard installation for purely competitive reasons, so JRuby is very close to free with a little bit of work.&lt;br /&gt;
&lt;br /&gt;
--[[User:Bryan Larsen|Bryan Larsen]] 21:44, 3 April 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
Well, my beard is still red, and I prefer Common Lisp. Or Scheme. :) --[[User:hrapd|Dmitri Hrapof]] 18 April 2007&lt;br /&gt;
&lt;br /&gt;
By looking at the [http://www.gnome.org/mobile/ GNOME Mobile &amp;amp; Embedded Initiative] page, I see that there is a picture of the [[Neo1973]] and a picture showing the GNOME Mobile Platform with C, C++ and Python mentioned. Is there a strong reason not to pick Python as the language for the device? --[[User:Nakedible|Nakedible]] 12:30, 30 April 2007 (CEST)&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/User:Shadowjack</id>
		<title>User:Shadowjack</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/User:Shadowjack"/>
				<updated>2007-08-18T17:27:06Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dmitry Platonov&lt;br /&gt;
&lt;br /&gt;
Skills: C, C++, Linux, GPS&lt;br /&gt;
&lt;br /&gt;
Location: Russia, Moscow&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/User:Shadowjack</id>
		<title>User:Shadowjack</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/User:Shadowjack"/>
				<updated>2007-08-18T17:26:02Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dmtiry Platonov&lt;br /&gt;
&lt;br /&gt;
Skills: C, C++, Linux, GPS&lt;br /&gt;
&lt;br /&gt;
Location: Russia, Moscow&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/User:Shadowjack</id>
		<title>User:Shadowjack</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/User:Shadowjack"/>
				<updated>2007-08-18T17:25:50Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dmtiry Platonov&lt;br /&gt;
Skills: C, C++, Linux, GPS&lt;br /&gt;
Location: Russia, Moscow&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Openmoko_Local_Groups:_Moscow</id>
		<title>Openmoko Local Groups: Moscow</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Openmoko_Local_Groups:_Moscow"/>
				<updated>2007-08-18T17:25:09Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Possible Participants ===&lt;br /&gt;
{|border=1&lt;br /&gt;
!Name&lt;br /&gt;
!Skills&lt;br /&gt;
!Level of Interest&lt;br /&gt;
!Location&lt;br /&gt;
!Other&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Shadowjack|Shadowjack]]&lt;br /&gt;
|C, C++, Linux, GPS&lt;br /&gt;
|High&lt;br /&gt;
|Moscow&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Openmoko_Local_Groups</id>
		<title>Openmoko Local Groups</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Openmoko_Local_Groups"/>
				<updated>2007-08-18T17:22:24Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* EU */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
'''OpenMoko Local Groups...'''&lt;br /&gt;
&lt;br /&gt;
* can be used for developers to meet and get to know each other&lt;br /&gt;
* can be used for developing&lt;br /&gt;
* may provide the room for real-life discussions away from mailinglists/wiki&lt;br /&gt;
* can support early support handling their GTA01Bv4 and exchange experiences&lt;br /&gt;
* fasten the community's cohesion&lt;br /&gt;
* give motivation&lt;br /&gt;
&lt;br /&gt;
== EU ==&lt;br /&gt;
&lt;br /&gt;
* Austria&lt;br /&gt;
** [[OpenMoko_Local_Groups: Vienna|Vienna]] &lt;br /&gt;
&lt;br /&gt;
* Belgium&lt;br /&gt;
** [[OpenMoko_local_Groups: Antwerp|Antwerp]]&lt;br /&gt;
&lt;br /&gt;
* Denmark&lt;br /&gt;
** [[OpenMoko_local_Groups: Copenhagen|Copenhagen]]&lt;br /&gt;
&lt;br /&gt;
* Finland &lt;br /&gt;
** [[OpenMoko_Local_Groups: Helsinki|Helsinki]] &lt;br /&gt;
&lt;br /&gt;
* France &lt;br /&gt;
** [[OpenMoko_Local_Groups: Paris|Paris]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Toulouse|Toulouse]] &lt;br /&gt;
&lt;br /&gt;
* Germany &lt;br /&gt;
** [[OpenMoko_Local_Groups: Berlin|Berlin]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Braunschweig|Braunschweig]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Duesseldorf|Duesseldorf]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: Frankfurt Main|Frankfurt Main]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: OWL|OWL]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Ingolstadt|Ingolstadt]]&lt;br /&gt;
&lt;br /&gt;
* [[OpenMoko_Local_Groups:_Netherlands|Netherlands]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: Amsterdam|Amsterdam]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: Den Haag|Den Haag/The Hague]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: Eindhoven|Eindhoven]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: Ede|Ede]]&lt;br /&gt;
&lt;br /&gt;
* Italy&lt;br /&gt;
** [[OpenMoko_Local_Groups: Milan|Milan]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: Turin|Turin]] &lt;br /&gt;
&lt;br /&gt;
* [[OpenMoko_Local_Groups:_Norway|Norway]]&lt;br /&gt;
** [[OpenMoko_Local_Groups:_Oslo|Oslo]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Trondheim|Trondheim]] &lt;br /&gt;
&lt;br /&gt;
* Poland &lt;br /&gt;
** [[OpenMoko_Local_Groups: Warsaw|Warsaw]] &lt;br /&gt;
&lt;br /&gt;
* [[OpenMoko_Local_Groups:_Portugal|Portugal]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Braga|Braga]] &lt;br /&gt;
&lt;br /&gt;
* Romania&lt;br /&gt;
** [[OpenMoko_Local_Groups: Bucharest|Bucharest]]&lt;br /&gt;
&lt;br /&gt;
* Russia&lt;br /&gt;
** [[OpenMoko_Local_Groups: Moscow|Moscow]]&lt;br /&gt;
&lt;br /&gt;
* Slovakia&lt;br /&gt;
** [[OpenMoko_Local_Groups: Bratislava|Bratislava]]&lt;br /&gt;
&lt;br /&gt;
* Spain &lt;br /&gt;
** [[OpenMoko_Local_Groups: Madrid|Madrid]] &lt;br /&gt;
&lt;br /&gt;
* Sweden &lt;br /&gt;
** [[OpenMoko_Local_Groups: Gothenburg|Gothenburg]] &lt;br /&gt;
&lt;br /&gt;
* [[OpenMoko_Local_Groups: Switzerland|Switzerland]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Bern|Bern]] &lt;br /&gt;
&lt;br /&gt;
* UK&lt;br /&gt;
** England&lt;br /&gt;
*** [[OpenMoko_Local_Groups: Birmingham|Birmingham]] &lt;br /&gt;
*** [[OpenMoko_Local_Groups: London|London]]&lt;br /&gt;
** Scotland&lt;br /&gt;
*** [[OpenMoko_Local_Groups: Fife|Fife]]&lt;br /&gt;
*** [[OpenMoko_Local_Groups: Edinburgh|Edinburgh]]&lt;br /&gt;
&lt;br /&gt;
* Ukraine&lt;br /&gt;
** [[OpenMoko_Local_Groups: Lugansk|Lugansk]]&lt;br /&gt;
&lt;br /&gt;
== Oceania ==&lt;br /&gt;
&lt;br /&gt;
* Australia &lt;br /&gt;
** [[OpenMoko_Local_Groups: Adelaide|Adelaide]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Canberra|Canberra]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Melbourne|Melbourne]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Sydney|Sydney]]&lt;br /&gt;
&lt;br /&gt;
* New Zealand&lt;br /&gt;
** [[OpenMoko_Local_Groups: Auckland|Auckland]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Christchurch|Christchurch]]&lt;br /&gt;
&lt;br /&gt;
== Asia ==&lt;br /&gt;
* India&lt;br /&gt;
** [[OpenMoko_Local_Groups: Delhi|Delhi]]&lt;br /&gt;
* Singapore&lt;br /&gt;
** [[OpenMoko_Local_Groups: Singapore|Singapore]]&lt;br /&gt;
&lt;br /&gt;
== USA ==&lt;br /&gt;
* Alabama&lt;br /&gt;
** [[OpenMoko_Local_Groups: Alabama|Alabama]]&lt;br /&gt;
&lt;br /&gt;
* Arizona&lt;br /&gt;
** [[OpenMoko_Local_Groups: Arizona|Arizona]]&lt;br /&gt;
&lt;br /&gt;
* California &lt;br /&gt;
** [[OpenMoko_Local_Groups: San Diego|San Diego]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: San Francisco|San Francisco]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: Sacramento|Sacramento]]&lt;br /&gt;
&lt;br /&gt;
* Colorado&lt;br /&gt;
** [[OpenMoko_Local_Groups: Colorado Springs|Colorado Springs]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Denver|Denver]]&lt;br /&gt;
&lt;br /&gt;
* District of Columbia&lt;br /&gt;
** [[OpenMoko_Local_Groups: Washington DC Metro | Washington DC Metro]]&lt;br /&gt;
&lt;br /&gt;
* Florida&lt;br /&gt;
** [[OpenMoko_Local_Groups: Central Florida | Central Florida]]&lt;br /&gt;
&lt;br /&gt;
* Georgia&lt;br /&gt;
** [[OpenMoko_Local_Groups: Atlanta | Atlanta]]&lt;br /&gt;
&lt;br /&gt;
* Illinois &lt;br /&gt;
** [[OpenMoko_Local_Groups: Chicago|Chicago]]&lt;br /&gt;
&lt;br /&gt;
* Indiana&lt;br /&gt;
** [[OpenMoko_Local_Groups: Bloomington|Bloomington]]&lt;br /&gt;
&lt;br /&gt;
* Iowa&lt;br /&gt;
** [[OpenMoko_Local_Groups: Iowa-Ames | Iowa-Ames]] &lt;br /&gt;
&lt;br /&gt;
* Massachusetts&lt;br /&gt;
** [[OpenMoko_Local_groups: Boston|Boston]]&lt;br /&gt;
&lt;br /&gt;
* Michigan &lt;br /&gt;
** [[OpenMoko_Local_Groups: Detroit|Detroit]] &lt;br /&gt;
&lt;br /&gt;
* New Jersey&lt;br /&gt;
** [[OpenMoko_Local_Groups: Stevens Institute of Technology, Hoboken NJ | Stevens Institute of Technology, Hoboken NJ  ]]&lt;br /&gt;
&lt;br /&gt;
* New York&lt;br /&gt;
** [[OpenMoko_Local_Groups: NYC Metro | NYC Metro]]&lt;br /&gt;
&lt;br /&gt;
* North Carolina&lt;br /&gt;
** [[OpenMoko Local_Groups: Charlotte | Charlotte]]&lt;br /&gt;
&lt;br /&gt;
* Ohio &lt;br /&gt;
** [[OpenMoko_Local_Groups: Cleveland|Cleveland]] &lt;br /&gt;
&lt;br /&gt;
* Oregon &lt;br /&gt;
** [[OpenMoko_Local_Groups: Eugene|Eugene]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: Portland|Portland]] &lt;br /&gt;
&lt;br /&gt;
* Texas &lt;br /&gt;
** [[OpenMoko_Local_Groups: North Texas|North Texas]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Central Texas|Central Texas]]&lt;br /&gt;
&lt;br /&gt;
* Utah&lt;br /&gt;
** [[OpenMoko_Local_Groups: Salt Lake|Salt Lake]]&lt;br /&gt;
&lt;br /&gt;
* Virginia&lt;br /&gt;
** [[OpenMoko_Local_Groups: Virginia|Virginia]]&lt;br /&gt;
&lt;br /&gt;
== Canada ==&lt;br /&gt;
* Alberta&lt;br /&gt;
** [[OpenMoko_Local_Groups: Calgary|Calgary]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Edmonton|Edmonton]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Pincher Creek|Pincher Creek]]&lt;br /&gt;
* British Columbia&lt;br /&gt;
** [[OpenMoko_Local_Groups: Vancouver|Vancouver]]&lt;br /&gt;
* Ontario&lt;br /&gt;
** [[OpenMoko_Local_Groups: Ottawa|Ottawa]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Toronto|Toronto]]&lt;br /&gt;
* Quebec &lt;br /&gt;
** [[OpenMoko_Local_Groups: Montreal|Montreal]]&lt;br /&gt;
&lt;br /&gt;
== Colombia ==&lt;br /&gt;
* Bogotá&lt;br /&gt;
** [[OpenMoko_Local_Groups: Bogota|Bogotá]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Community]]&lt;br /&gt;
[[Category:Neo1973 Phase 1 related]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/OpenMoko2007.2</id>
		<title>OpenMoko2007.2</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/OpenMoko2007.2"/>
				<updated>2007-08-14T10:57:09Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== FAQ ==&lt;br /&gt;
=== What is 2007.2? ===&lt;br /&gt;
&lt;br /&gt;
As of 2007-07-26 the development of the next version of the OpenMoko distribution has begun. &lt;br /&gt;
&lt;br /&gt;
Goals of the new version are an improved set of PIM applications, improved theming that fixes a lot of the usability problems of the 1st generation design, more formalized UI guidelines and a number of changes in the build system. The latter should introduce more recent software by staying closer in sync with upstream org.openembedded.dev.&lt;br /&gt;
&lt;br /&gt;
An official announcement is expected soon (Aug 19).&lt;br /&gt;
&lt;br /&gt;
(Initially this was named OM-2008 in SVN but renamed shortly after that.)&lt;br /&gt;
&lt;br /&gt;
=== What are differences between 2007.1 and 2007.2? ===&lt;br /&gt;
&lt;br /&gt;
=== Where to get images? ===&lt;br /&gt;
&lt;br /&gt;
=== Where are official images? ===&lt;br /&gt;
&lt;br /&gt;
No official images yet.&lt;br /&gt;
&lt;br /&gt;
=== My mrxvt (terminal) fonts are huge. ===&lt;br /&gt;
&lt;br /&gt;
Edit src/feature.h to set MIN_XFT_FONT_SIZE to lower value:&lt;br /&gt;
 #define MIN_XFT_FONT_SIZE           (2)&lt;br /&gt;
and rebuild mrxvt &amp;amp; openmoko-devel-image.&lt;br /&gt;
&lt;br /&gt;
End edit /etc/mrxvt/mrxvt.conf&lt;br /&gt;
 Mrxvt.xftSize: 4&lt;br /&gt;
 Mrxvt.xftHint: 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to build ==&lt;br /&gt;
'''Please note that this is no official guide on how to build OM-2007.2. I am just making my first steps getting this to compile and think it would be a [http://en.wikipedia.org/wiki/Proprietary_software waste of time] of I keep problems I found for my own. Additionally it would be good if the new distro gets more exposure and testing so less things will break after the official announcement.'''&lt;br /&gt;
&lt;br /&gt;
Follow the [http://www.openembedded.org/wiki/GettingStarted getting started] steps of OpenEmbedded. Use Bitbake 1.8.6 not a SVN version from the stable branch (otherwise you will get problems with checking out repositories) and the ''org.openembedded.dev'' branch of OE.&lt;br /&gt;
&lt;br /&gt;
Put the following in your local.conf&lt;br /&gt;
&lt;br /&gt;
 BBFILES = &amp;quot;${HOME}/oe/org.openembedded.dev/packages/*/*.bb&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 MACHINE = &amp;quot;fic-gta01&amp;quot;&lt;br /&gt;
 DISTRO = &amp;quot;openmoko&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 ENABLE_BINARY_LOCALE_GENERATION = &amp;quot;1&amp;quot;&lt;br /&gt;
 GLIBC_GENERATE_LOCALES = &amp;quot;en_GB.UTF-8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;quot;${HOME}/oe&amp;quot; with the path to where your &amp;quot;org.openembeded.dev&amp;quot; folder lives. For the other entries have a look at ''conf/local.conf.sample'' about their meaning.&lt;br /&gt;
&lt;br /&gt;
Run ''bitbake &amp;lt;package name&amp;gt;'' (e.g. openmoko-devel-image).&lt;br /&gt;
&lt;br /&gt;
Hopefully the MokoMakeFile is soon upgraded to be used for OM-2007.2. Since OpenMoko is not using the overlay any more that makefile should be simpler then. :-)&lt;br /&gt;
&lt;br /&gt;
=== Build issues ===&lt;br /&gt;
&lt;br /&gt;
==== Wrong certificate ====&lt;br /&gt;
You may get something like this while the bitbake recipes are parsed:&lt;br /&gt;
&lt;br /&gt;
 Error validating server certificate for 'https://libw100.svn.sf.net:443':&lt;br /&gt;
  - The certificate hostname does not match.&lt;br /&gt;
  Certificate information:&lt;br /&gt;
   - Hostname: *.svn.sourceforge.net&lt;br /&gt;
   - Valid: from Fri, 27 Oct 2006 12:05:58 GMT until Sun, 28 Oct 2007 13:05:58 GMT&lt;br /&gt;
   - Issuer: Equifax Secure Certificate Authority, Equifax, US&lt;br /&gt;
   - Fingerprint: f2:6c:fe:bb:82:92:30:09:72:dd:1c:b3:e7:56:69:c7:7a:df:67:3e&lt;br /&gt;
&lt;br /&gt;
That is an issue in a bitbake file. One should not use the short-name for sourceforge (sf.net) when certificates are only for exact host names. Accept the certificate and everything is fine for now.&lt;br /&gt;
&lt;br /&gt;
==== openmoko-libs FTBFS ====&lt;br /&gt;
Some applications have not been fully modified to build with the new libraries of OpenMoko and still need the old-style ''openmoko-libs'' package. ''libmokogsm'' which is needed for ''openmoko-libs'' then fails to build. As a workaround you can remove the not yet ported applications that need ''openmoko-libs'' making it unneccessary itself. To do this edit ''packages/tasks/openmoko-taks.bb'' and find the following lines:&lt;br /&gt;
&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
  openmoko-terminal \&lt;br /&gt;
  matchbox-panel-2 \&lt;br /&gt;
  matchbox-panel-2-applets \&lt;br /&gt;
  matchbox-applet-inputmanager \&lt;br /&gt;
 #  openmoko-appmanager \&lt;br /&gt;
  matchbox-keyboard \&lt;br /&gt;
  matchbox-stroke \&lt;br /&gt;
  openmoko-keyboard \&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
&lt;br /&gt;
Now put a hash (''#'') before ''openmoko-terminal'' and ''openmoko-keyboard''. You can verify that ''openmoko-libs'' is not needed any more by issuing ''bitbake -g openmoko-devel-image'' (= creates a dependency graph). There should be no mentioning of ''openmoko-libs'' in the file ''task-depends.dot''. '''Please note that the graphicall terminal and the virtual keyboard will be missing now.''' You can still have terminal access by following the [[USB Networking]] guide. For keyboard input in Qemu add the ''-usbdevice keyboard'' switch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== gtk+ fails building w/ gtkcombobox.c ====&lt;br /&gt;
&lt;br /&gt;
If you get these errors:&lt;br /&gt;
&lt;br /&gt;
 gtkcombobox.c: In function 'gtk_combo_box_size_request':&lt;br /&gt;
 gtkcombobox.c:1859: warning: unused variable 'font_desc'&lt;br /&gt;
 gtkcombobox.c:1858: warning: unused variable 'metrics'&lt;br /&gt;
 gtkcombobox.c:1857: warning: unused variable 'context'&lt;br /&gt;
 gtkcombobox.c:1855: warning: unused variable 'arrow_size'&lt;br /&gt;
 gtkcombobox.c:1854: warning: unused variable 'font_size'&lt;br /&gt;
 gtkcombobox.c: In function 'gtk_combo_box_size_allocate':&lt;br /&gt;
 gtkcombobox.c:1962: error: 'arrow_size' undeclared (first use in this function)&lt;br /&gt;
 gtkcombobox.c:1962: error: (Each undeclared identifier is reported only once&lt;br /&gt;
 gtkcombobox.c:1962: error: for each function it appears in.)&lt;br /&gt;
 gtkcombobox.c:1965: error: 'font_desc' undeclared (first use in this function)&lt;br /&gt;
 gtkcombobox.c:1966: error: 'context' undeclared (first use in this function)&lt;br /&gt;
 gtkcombobox.c:1967: error: 'metrics' undeclared (first use in this function)&lt;br /&gt;
 gtkcombobox.c:1969: error: 'font_size' undeclared (first use in this function) &lt;br /&gt;
&lt;br /&gt;
Go to your /build/tmp/work/fic-gta01-angstrom-linux-gnueabi/gtk+-2.10.14-r3/gtk+-2.10.14/gtk directory, and patch gtkcombobox.c with the following:&lt;br /&gt;
&lt;br /&gt;
Thanks to rmoravcik in #openmoko (patch was taken from http://pastebin.ca/654717 )&lt;br /&gt;
&lt;br /&gt;
 --- gtkcombobox.c       2007-08-12 20:30:07.000000000 +0200&lt;br /&gt;
 +++ gtkcombobox.c       2007-08-12 20:29:58.000000000 +0200&lt;br /&gt;
 @@ -1948,6 +1948,12 @@&lt;br /&gt;
  gtk_combo_box_size_allocate (GtkWidget     *widget,&lt;br /&gt;
                              GtkAllocation *allocation)&lt;br /&gt;
  {&lt;br /&gt;
 +  gint font_size;&lt;br /&gt;
 +  gint arrow_size;&lt;br /&gt;
 +  PangoContext *context;&lt;br /&gt;
 +  PangoFontMetrics *metrics;&lt;br /&gt;
 +  PangoFontDescription *font_desc;&lt;br /&gt;
 +&lt;br /&gt;
    GtkComboBox *combo_box = GTK_COMBO_BOX (widget);&lt;br /&gt;
    gint focus_width, focus_pad;&lt;br /&gt;
    GtkAllocation child;&lt;br /&gt;
&lt;br /&gt;
=== Flashing with MokoMakefile ===&lt;br /&gt;
Since MokoMakefile has not been adjusted to use the new build layout you cannot use it. As a quick hack to make flashing local built image possible again try this:&lt;br /&gt;
&lt;br /&gt;
Find the following lines in the MokoMakefile:&lt;br /&gt;
&lt;br /&gt;
 flash-qemu-local: stamps/qemu stamps/openmoko-devel-image&lt;br /&gt;
       ( cd build/qemu &amp;amp;&amp;amp; openmoko/flash.sh ../tmp/deploy/images )&lt;br /&gt;
&lt;br /&gt;
And replace them with:&lt;br /&gt;
&lt;br /&gt;
 flash-qemu-local: stamps/qemu&lt;br /&gt;
        ( cd build/qemu &amp;amp;&amp;amp; openmoko/flash.sh &amp;lt;MY_NEW_BUILD_DIR&amp;gt;/tmp/deploy/glibc/images/fic-gta01 )&lt;br /&gt;
&lt;br /&gt;
Where you should replace &amp;lt;MY_NEW_BUILD_DIR&amp;gt; with the full path to your build directory (the one where ''conf/local.conf'' lives in). Running the image should work, too. :-)&lt;br /&gt;
&lt;br /&gt;
With this changes kernel and uboot image are picked up correctly. However the name of the root filesystem image has changed in OM-2007.2 and the current scripts will not pick it up any more. Just edit ''$OM_DIR/build/qemu/openmoko/env'' and change the line saying:&lt;br /&gt;
&lt;br /&gt;
 rootfs_wildcard=&amp;quot;openmoko-*.rootfs.jffs2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
to&lt;br /&gt;
&lt;br /&gt;
 rootfs_wildcard=&amp;quot;OpenMoko-*.rootfs.jffs2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Now it will work correctly again.&lt;br /&gt;
&lt;br /&gt;
== How to build using nslu2-linux MasterMakefile (Ubuntu 7.04) ==&lt;br /&gt;
[disclaimer]&lt;br /&gt;
&lt;br /&gt;
'''Check that your /bin/sh (ls -l /bin/sh) is not linked to dash rather than bash.''' Using dash will cause you pain. This is true for a standard install of Ubuntu 7.04 (at least when installing from Live CD). If your /bin/sh points to /bin/dash, correct it with (as root):&lt;br /&gt;
 ln -sf /bin/bash /bin/sh&lt;br /&gt;
&lt;br /&gt;
Note: on  http://www.openembedded.org/wiki/OEandYourDistro are better instructions for Ubuntu to make sh be bash.&lt;br /&gt;
&lt;br /&gt;
Create your $OMDIR directory (note that you can change ~/OM-2007.2 to any directory you like): &lt;br /&gt;
 mkdir ~/OM-2007.2 ; cd  ~/OM-2007.2&lt;br /&gt;
&lt;br /&gt;
Grab the nslu2-linux [http://www.nslu2-linux.org/wiki/Development/MasterMakefile MasterMakefile]:&lt;br /&gt;
 wget http://www.nslu2-linux.org/Makefile&lt;br /&gt;
&lt;br /&gt;
This will make sure you'll have all the required packages:&lt;br /&gt;
 sudo apt-get install \&lt;br /&gt;
                autoconf automake automake1.9 \&lt;br /&gt;
                bison \&lt;br /&gt;
                ccache cogito \&lt;br /&gt;
                cvs \&lt;br /&gt;
                diffstat \&lt;br /&gt;
                docbook \&lt;br /&gt;
                flex \&lt;br /&gt;
                gcc g++ gawk gcj gettext git-core \&lt;br /&gt;
                help2man \&lt;br /&gt;
                libc6-dev libglib2.0-dev libtool libxext-dev\&lt;br /&gt;
                m4 make \&lt;br /&gt;
                patch pkg-config \&lt;br /&gt;
                python python-dev python2.4 python2.4-dev python-psyco \&lt;br /&gt;
                sed \&lt;br /&gt;
                sharutils \&lt;br /&gt;
                texinfo texi2html \&lt;br /&gt;
                unzip \&lt;br /&gt;
                subversion \&lt;br /&gt;
                sysutils \&lt;br /&gt;
                texinfo \&lt;br /&gt;
                bzip2&lt;br /&gt;
&lt;br /&gt;
Ubuntu 7.04 comes with monotone 0.31. You could just go with that and do a mtn db migrate but this takes hours so the easier way would be to download a suitable mtn db from http://www.openembedded.org/snapshots/ and use this.&lt;br /&gt;
 mkdir -p monotone&lt;br /&gt;
 wget http://www.openembedded.org/snapshots/\&lt;br /&gt;
 OE-this-is-for-mtn-&amp;lt;your mtn version&amp;gt;.mtn.bz2 -O monotone/nslu2-linux.mtn.bz2&lt;br /&gt;
 bunzip2 monotone/nslu2-linux.mtn.bz2&lt;br /&gt;
&lt;br /&gt;
Go build ;)&lt;br /&gt;
 make openmoko-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If you an encounter an error with monotone similar to the following: &lt;br /&gt;
&lt;br /&gt;
  mtn: misuse: database monotone/nslu2-linux.mtn is laid out according to an old schema&lt;br /&gt;
&lt;br /&gt;
Then you need to upgrade nslu2-linux.mtn Use the following command:&lt;br /&gt;
&lt;br /&gt;
  # mtn --db monotone/nslu2-linux.mtn db migrate&lt;br /&gt;
&lt;br /&gt;
== Pre-built snapshot images ==&lt;br /&gt;
http://ipkg.nslu2-linux.org/feeds/openmoko/images/&lt;br /&gt;
&lt;br /&gt;
http://people.openmoko.org/mickey/images/ (Confirmed working)&lt;br /&gt;
&lt;br /&gt;
http://buildhost.openmoko.org/tmp2/deploy/glibc/images/fic-gta01/&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenMoko2007.2| ]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/OpenMoko2007.2</id>
		<title>OpenMoko2007.2</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/OpenMoko2007.2"/>
				<updated>2007-08-09T11:13:47Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Pre-built snapshot images */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As of 2007-07-26 the development of the next version of the OpenMoko distribution has begun. &lt;br /&gt;
&lt;br /&gt;
Goals of the new version are an improved set of PIM applications, improved theming that fixes a lot of the usability problems of the 1st generation design, more formalized UI guidelines and a number of changes in the build system. The latter should introduce more recent software by staying closer in sync with upstream org.openembedded.dev.&lt;br /&gt;
&lt;br /&gt;
An official announcement is expected soon.&lt;br /&gt;
&lt;br /&gt;
(Initially this was named OM-2008 in SVN but renamed shortly after that.)&lt;br /&gt;
&lt;br /&gt;
== How to build ==&lt;br /&gt;
'''Please note that this is no official guide on how to build OM-2007.2. I am just making my first steps getting this to compile and think it would be a [http://en.wikipedia.org/wiki/Proprietary_software waste of time] of I keep problems I found for my own. Additionally it would be good if the new distro gets more exposure and testing so less things will break after the official announcement.'''&lt;br /&gt;
&lt;br /&gt;
Follow the [http://www.openembedded.org/wiki/GettingStarted getting started] steps of OpenEmbedded. Use Bitbake 1.8.6 not a SVN version from the stable branch (otherwise you will get problems with checking out repositories) and the ''org.openembedded.dev'' branch of OE.&lt;br /&gt;
&lt;br /&gt;
Put the following in your local.conf&lt;br /&gt;
&lt;br /&gt;
 BBFILES = &amp;quot;${HOME}/oe/org.openembedded.dev/packages/*/*.bb&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 MACHINE = &amp;quot;fic-gta01&amp;quot;&lt;br /&gt;
 DISTRO = &amp;quot;openmoko&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 ENABLE_BINARY_LOCALE_GENERATION = &amp;quot;1&amp;quot;&lt;br /&gt;
 GLIBC_GENERATE_LOCALES = &amp;quot;en_GB.UTF-8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;quot;${HOME}/oe&amp;quot; with the path to where your &amp;quot;org.openembeded.dev&amp;quot; folder lives. For the other entries have a look at ''conf/local.conf.sample'' about their meaning.&lt;br /&gt;
&lt;br /&gt;
Run ''bitbake &amp;lt;package name&amp;gt;'' (e.g. openmoko-devel-image).&lt;br /&gt;
&lt;br /&gt;
Hopefully the MokoMakeFile is soon upgraded to be used for OM-2007.2. Since OpenMoko is not using the overlay any more that makefile should be simpler then. :-)&lt;br /&gt;
&lt;br /&gt;
=== Build issues ===&lt;br /&gt;
&lt;br /&gt;
==== Wrong certificate ====&lt;br /&gt;
You may get something like this while the bitbake recipes are parsed:&lt;br /&gt;
&lt;br /&gt;
 Error validating server certificate for 'https://libw100.svn.sf.net:443':&lt;br /&gt;
  - The certificate hostname does not match.&lt;br /&gt;
  Certificate information:&lt;br /&gt;
   - Hostname: *.svn.sourceforge.net&lt;br /&gt;
   - Valid: from Fri, 27 Oct 2006 12:05:58 GMT until Sun, 28 Oct 2007 13:05:58 GMT&lt;br /&gt;
   - Issuer: Equifax Secure Certificate Authority, Equifax, US&lt;br /&gt;
   - Fingerprint: f2:6c:fe:bb:82:92:30:09:72:dd:1c:b3:e7:56:69:c7:7a:df:67:3e&lt;br /&gt;
&lt;br /&gt;
That is an issue in a bitbake file. One should not use the short-name for sourceforge (sf.net) when certificates are only for exact host names. Accept the certificate and everything is fine for now.&lt;br /&gt;
&lt;br /&gt;
==== openmoko-libs FTBFS ====&lt;br /&gt;
Some applications have not been fully modified to build with the new libraries of OpenMoko and still need the old-style ''openmoko-libs'' package. ''libmokogsm'' which is needed for ''openmoko-libs'' then fails to build. As a workaround you can remove the not yet ported applications that need ''openmoko-libs'' making it unneccessary itself. To do this edit ''packages/tasks/openmoko-taks.bb'' and find the following lines:&lt;br /&gt;
&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
  openmoko-terminal \&lt;br /&gt;
  matchbox-panel-2 \&lt;br /&gt;
  matchbox-panel-2-applets \&lt;br /&gt;
  matchbox-applet-inputmanager \&lt;br /&gt;
 #  openmoko-appmanager \&lt;br /&gt;
  matchbox-keyboard \&lt;br /&gt;
  matchbox-stroke \&lt;br /&gt;
  openmoko-keyboard \&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
&lt;br /&gt;
Now put a dash (''#'') before ''openmoko-terminal'' and ''openmoko-keyboard''. You can verify that ''openmoko-libs'' is not needed any more by issuing ''bitbake -g openmoko-devel-image'' (= creates a dependency graph). There should be no mentioning of ''openmoko-libs'' in the file ''task-depends.dot''. '''Please note that the graphicall terminal and the virtual keyboard will be missing now.''' You can still have terminal access by following the [[USB Networking]] guide. For keyboard input in Qemu add the ''-usbdevice keyboard'' switch.&lt;br /&gt;
&lt;br /&gt;
=== Flashing with MokoMakefile ===&lt;br /&gt;
Since MokoMakefile has not been adjusted to use the new build layout you cannot use it. As a quick hack to make flashing local built image possible again try this:&lt;br /&gt;
&lt;br /&gt;
Find the following lines in the MokoMakefile:&lt;br /&gt;
&lt;br /&gt;
 flash-qemu-local: stamps/qemu stamps/openmoko-devel-image&lt;br /&gt;
       ( cd build/qemu &amp;amp;&amp;amp; openmoko/flash.sh ../tmp/deploy/images )&lt;br /&gt;
&lt;br /&gt;
And replace them with:&lt;br /&gt;
&lt;br /&gt;
 flash-qemu-local: stamps/qemu&lt;br /&gt;
        ( cd build/qemu &amp;amp;&amp;amp; openmoko/flash.sh &amp;lt;MY_NEW_BUILD_DIR&amp;gt;/tmp/deploy/glibc/images/fic-gta01 )&lt;br /&gt;
&lt;br /&gt;
Where you should replace &amp;lt;MY_NEW_BUILD_DIR&amp;gt; with the full path to your build directory (the one where ''conf/local.conf'' lives in). Running the image should work, too. :-)&lt;br /&gt;
&lt;br /&gt;
With this changes kernel and uboot image are picked up correctly. However the name of the root filesystem image has changed in OM-2007.2 and the current scripts will not pick it up any more. Just edit ''$OM_DIR/build/qemu/openmoko/env'' and change the line saying:&lt;br /&gt;
&lt;br /&gt;
 rootfs_wildcard=&amp;quot;openmoko-*.rootfs.jffs2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
to&lt;br /&gt;
&lt;br /&gt;
 rootfs_wildcard=&amp;quot;OpenMoko-*.rootfs.jffs2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Now it will work correctly again.&lt;br /&gt;
&lt;br /&gt;
== How to build using nslu2-linux MasterMakefile (Ubuntu 7.04) ==&lt;br /&gt;
[disclaimer]&lt;br /&gt;
&lt;br /&gt;
'''Check that your /bin/sh (ls -l /bin/sh) is not linked to dash rather than bash.''' Using dash will cause you pain. This is true for a standard install of Ubuntu 7.04 (at least when installing from Live CD). If your /bin/sh points to /bin/dash, correct it with (as root):&lt;br /&gt;
 ln -sf /bin/bash /bin/sh&lt;br /&gt;
&lt;br /&gt;
Note: on  http://www.openembedded.org/wiki/OEandYourDistro are better instructions for Ubuntu to make sh be bash.&lt;br /&gt;
&lt;br /&gt;
Create your $OMDIR directory (note that you can change ~/OM-2007.2 to any directory you like): &lt;br /&gt;
 mkdir ~/OM-2007.2 ; cd  ~/OM-2007.2&lt;br /&gt;
&lt;br /&gt;
Grab the nslu2-linux [http://www.nslu2-linux.org/wiki/Development/MasterMakefile MasterMakefile]:&lt;br /&gt;
 wget http://www.nslu2-linux.org/Makefile&lt;br /&gt;
&lt;br /&gt;
This will make sure you'll have all the required packages:&lt;br /&gt;
 sudo apt-get install \&lt;br /&gt;
                autoconf automake automake1.9 \&lt;br /&gt;
                bison \&lt;br /&gt;
                ccache cogito \&lt;br /&gt;
                cvs \&lt;br /&gt;
                diffstat \&lt;br /&gt;
                docbook \&lt;br /&gt;
                flex \&lt;br /&gt;
                gcc g++ gawk gcj gettext git-core \&lt;br /&gt;
                libc6-dev libglib2.0-dev libtool \&lt;br /&gt;
                m4 make \&lt;br /&gt;
                patch pkg-config \&lt;br /&gt;
                python python-dev python2.4 python2.4-dev python-psyco \&lt;br /&gt;
                sed \&lt;br /&gt;
                sharutils \&lt;br /&gt;
                texinfo texi2html \&lt;br /&gt;
                unzip \&lt;br /&gt;
                subversion \&lt;br /&gt;
                sysutils \&lt;br /&gt;
                texinfo \&lt;br /&gt;
                bzip2&lt;br /&gt;
&lt;br /&gt;
Ubuntu 7.04 comes with monotone 0.31. You could just go with that and do a mtn db migrate but this takes hours so the easier way would be to downgrade to monotone 0.28.&lt;br /&gt;
 sudo apt-get remove monotone #if there is one allready&lt;br /&gt;
 sudo apt-get install \&lt;br /&gt;
                libboost-date-time1.33.1 libboost-filesystem1.33.1 libboost-regex1.33.1&lt;br /&gt;
 wget http://monotone.ca/downloads/0.28/monotone_0.28-dapper0.1_i386.deb&lt;br /&gt;
 sudo dpkg -i monotone_0.28-dapper0.1_i386.deb&lt;br /&gt;
 echo monotone &amp;quot;hold&amp;quot; | sudo dpkg --set-selections&lt;br /&gt;
&lt;br /&gt;
Another possible solution for this is to download a suitable mtn db from http://www.openembedded.org/snapshots/ and use this.&lt;br /&gt;
 mkdir -p monotone&lt;br /&gt;
 wget http://www.openembedded.org/snapshots/\&lt;br /&gt;
 OE-this-is-for-mtn-&amp;lt;your mtn version&amp;gt;.mtn.bz2 -O monotone/nslu2-linux.mtn.bz2&lt;br /&gt;
 bunzip2 monotone/nslu2-linux.mtn.bz2&lt;br /&gt;
&lt;br /&gt;
Go build ;)&lt;br /&gt;
 make openmoko-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If you an encounter an error with monotone similar to the following: &lt;br /&gt;
&lt;br /&gt;
  mtn: misuse: database monotone/nslu2-linux.mtn is laid out according to an old schema&lt;br /&gt;
&lt;br /&gt;
Then you need to upgrade nslu2-linux.mtn Use the following command:&lt;br /&gt;
&lt;br /&gt;
  # mtn --db monotone/nslu2-linux.mtn db migrate&lt;br /&gt;
&lt;br /&gt;
== Pre-built snapshot images ==&lt;br /&gt;
http://ipkg.nslu2-linux.org/feeds/openmoko/images/&lt;br /&gt;
&lt;br /&gt;
http://daxxar.slask.no/om/ (Confirmed working)&lt;br /&gt;
&lt;br /&gt;
http://people.openmoko.org/mickey/images/ (Confirmed working)&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenMoko2007.2| ]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/OpenMoko2007.2</id>
		<title>OpenMoko2007.2</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/OpenMoko2007.2"/>
				<updated>2007-08-08T12:39:42Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As of 2007-07-26 the development of the next version of the OpenMoko distribution has begun. &lt;br /&gt;
&lt;br /&gt;
Goals of the new version are an improved set of PIM applications, improved theming that fixes a lot of the usability problems of the 1st generation design, more formalized UI guidelines and a number of changes in the build system. The latter should introduce more recent software by staying closer in sync with upstream org.openembedded.dev.&lt;br /&gt;
&lt;br /&gt;
An official announcement is expected soon.&lt;br /&gt;
&lt;br /&gt;
(Initially this was named OM-2008 in SVN but renamed shortly after that.)&lt;br /&gt;
&lt;br /&gt;
== How to build ==&lt;br /&gt;
'''Please note that this is no official guide on how to build OM-2007.2. I am just making my first steps getting this to compile and think it would be a [http://en.wikipedia.org/wiki/Proprietary_software waste of time] of I keep problems I found for my own. Additionally it would be good if the new distro gets more exposure and testing so less things will break after the official announcement.'''&lt;br /&gt;
&lt;br /&gt;
Follow the [http://www.openembedded.org/wiki/GettingStarted getting started] steps of OpenEmbedded. Use Bitbake 1.8.6 not a SVN version from the stable branch (otherwise you will get problems with checking out repositories) and the ''org.openembedded.dev'' branch of OE.&lt;br /&gt;
&lt;br /&gt;
Put the following in your local.conf&lt;br /&gt;
&lt;br /&gt;
 BBFILES = &amp;quot;${HOME}/oe/org.openembedded.dev/packages/*/*.bb&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 MACHINE = &amp;quot;fic-gta01&amp;quot;&lt;br /&gt;
 DISTRO = &amp;quot;openmoko&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 ENABLE_BINARY_LOCALE_GENERATION = &amp;quot;1&amp;quot;&lt;br /&gt;
 GLIBC_GENERATE_LOCALES = &amp;quot;en_GB.UTF-8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;quot;${HOME}/oe&amp;quot; with the path to where your &amp;quot;org.openembeded.dev&amp;quot; folder lives. For the other entries have a look at ''conf/local.conf.sample'' about their meaning.&lt;br /&gt;
&lt;br /&gt;
Run ''bitbake &amp;lt;package name&amp;gt;'' (e.g. openmoko-devel-image).&lt;br /&gt;
&lt;br /&gt;
Hopefully the MokoMakeFile is soon upgraded to be used for OM-2007.2. Since OpenMoko is not using the overlay any more that makefile should be simpler then. :-)&lt;br /&gt;
&lt;br /&gt;
=== Build issues ===&lt;br /&gt;
&lt;br /&gt;
==== Wrong certificate ====&lt;br /&gt;
You may get something like this while the bitbake recipes are parsed:&lt;br /&gt;
&lt;br /&gt;
 Error validating server certificate for 'https://libw100.svn.sf.net:443':&lt;br /&gt;
  - The certificate hostname does not match.&lt;br /&gt;
  Certificate information:&lt;br /&gt;
   - Hostname: *.svn.sourceforge.net&lt;br /&gt;
   - Valid: from Fri, 27 Oct 2006 12:05:58 GMT until Sun, 28 Oct 2007 13:05:58 GMT&lt;br /&gt;
   - Issuer: Equifax Secure Certificate Authority, Equifax, US&lt;br /&gt;
   - Fingerprint: f2:6c:fe:bb:82:92:30:09:72:dd:1c:b3:e7:56:69:c7:7a:df:67:3e&lt;br /&gt;
&lt;br /&gt;
That is an issue in a bitbake file. One should not use the short-name for sourceforge (sf.net) when certificates are only for exact host names. Accept the certificate and everything is fine for now.&lt;br /&gt;
&lt;br /&gt;
==== openmoko-libs FTBFS ====&lt;br /&gt;
Some applications have not been fully modified to build with the new libraries of OpenMoko and still need the old-style ''openmoko-libs'' package. ''libmokogsm'' which is needed for ''openmoko-libs'' then fails to build. As a workaround you can remove the not yet ported applications that need ''openmoko-libs'' making it unneccessary itself. To do this edit ''packages/tasks/openmoko-taks.bb'' and find the following lines:&lt;br /&gt;
&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
  openmoko-terminal \&lt;br /&gt;
  matchbox-panel-2 \&lt;br /&gt;
  matchbox-panel-2-applets \&lt;br /&gt;
  matchbox-applet-inputmanager \&lt;br /&gt;
 #  openmoko-appmanager \&lt;br /&gt;
  matchbox-keyboard \&lt;br /&gt;
  matchbox-stroke \&lt;br /&gt;
  openmoko-keyboard \&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
&lt;br /&gt;
Now put a dash (''#'') before ''openmoko-terminal'' and ''openmoko-keyboard''. You can verify that ''openmoko-libs'' is not needed any more by issuing ''bitbake -g openmoko-devel-image'' (= creates a dependency graph). There should be no mentioning of ''openmoko-libs'' in the file ''task-depends.dot''. '''Please note that the graphicall terminal and the virtual keyboard will be missing now.''' You can still have terminal access by following the [[USB Networking]] guide. For keyboard input in Qemu add the ''-usbdevice keyboard'' switch.&lt;br /&gt;
&lt;br /&gt;
=== Flashing with MokoMakefile ===&lt;br /&gt;
Since MokoMakefile has not been adjusted to use the new build layout you cannot use it. As a quick hack to make flashing local built image possible again try this:&lt;br /&gt;
&lt;br /&gt;
Find the following lines in the MokoMakefile:&lt;br /&gt;
&lt;br /&gt;
 flash-qemu-local: stamps/qemu stamps/openmoko-devel-image&lt;br /&gt;
       ( cd build/qemu &amp;amp;&amp;amp; openmoko/flash.sh ../tmp/deploy/images )&lt;br /&gt;
&lt;br /&gt;
And replace them with:&lt;br /&gt;
&lt;br /&gt;
 flash-qemu-local: stamps/qemu&lt;br /&gt;
        ( cd build/qemu &amp;amp;&amp;amp; openmoko/flash.sh &amp;lt;MY_NEW_BUILD_DIR&amp;gt;/tmp/deploy/glibc/images/fic-gta01 )&lt;br /&gt;
&lt;br /&gt;
Where you should replace &amp;lt;MY_NEW_BUILD_DIR&amp;gt; with the full path to your build directory (the one where ''conf/local.conf'' lives in). Running the image should work, too. :-)&lt;br /&gt;
&lt;br /&gt;
With this changes kernel and uboot image are picked up correctly. However the name of the root filesystem image has changed in OM-2007.2 and the current scripts will not pick it up any more. Just edit ''$OM_DIR/build/qemu/openmoko/env'' and change the line saying:&lt;br /&gt;
&lt;br /&gt;
 rootfs_wildcard=&amp;quot;openmoko-*.rootfs.jffs2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
to&lt;br /&gt;
&lt;br /&gt;
 rootfs_wildcard=&amp;quot;OpenMoko-*.rootfs.jffs2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Now it will work correctly again.&lt;br /&gt;
&lt;br /&gt;
== How to build using nslu2-linux MasterMakefile (Ubuntu 7.04) ==&lt;br /&gt;
[disclaimer]&lt;br /&gt;
&lt;br /&gt;
'''Check that your /bin/sh (ls -l /bin/sh) is not linked to dash rather than bash.''' Using dash will cause you pain. This is true for a standard install of Ubuntu 7.04 (at least when installing from Live CD). If your /bin/sh points to /bin/dash, correct it with (as root):&lt;br /&gt;
 ln -sf /bin/bash /bin/sh&lt;br /&gt;
&lt;br /&gt;
Note: on  http://www.openembedded.org/wiki/OEandYourDistro are better instructions for Ubuntu to make sh be bash.&lt;br /&gt;
&lt;br /&gt;
Create your $OMDIR directory (note that you can change ~/OM-2007.2 to any directory you like): &lt;br /&gt;
 mkdir ~/OM-2007.2 ; cd  ~/OM-2007.2&lt;br /&gt;
&lt;br /&gt;
Grab the nslu2-linux [http://www.nslu2-linux.org/wiki/Development/MasterMakefile MasterMakefile]:&lt;br /&gt;
 wget http://www.nslu2-linux.org/Makefile&lt;br /&gt;
&lt;br /&gt;
This will make sure you'll have all the required packages:&lt;br /&gt;
 sudo apt-get install \&lt;br /&gt;
                autoconf automake automake1.9 \&lt;br /&gt;
                bison \&lt;br /&gt;
                ccache cogito \&lt;br /&gt;
                cvs \&lt;br /&gt;
                diffstat \&lt;br /&gt;
                docbook \&lt;br /&gt;
                flex \&lt;br /&gt;
                gcc g++ gawk gcj gettext git-core \&lt;br /&gt;
                libc6-dev libglib2.0-dev libtool \&lt;br /&gt;
                m4 make \&lt;br /&gt;
                patch pkg-config \&lt;br /&gt;
                python python-dev python2.4 python2.4-dev python-psyco \&lt;br /&gt;
                sed \&lt;br /&gt;
                sharutils \&lt;br /&gt;
                texinfo texi2html \&lt;br /&gt;
                unzip \&lt;br /&gt;
                subversion \&lt;br /&gt;
                sysutils \&lt;br /&gt;
                texinfo \&lt;br /&gt;
                bzip2&lt;br /&gt;
&lt;br /&gt;
Ubuntu 7.04 comes with monotone 0.31. You could just go with that and do a mtn db migrate but this takes hours so the easier way would be to downgrade to monotone 0.28.&lt;br /&gt;
 sudo apt-get remove monotone #if there is one allready&lt;br /&gt;
 sudo apt-get install \&lt;br /&gt;
                libboost-date-time1.33.1 libboost-filesystem1.33.1 libboost-regex1.33.1&lt;br /&gt;
 wget http://monotone.ca/downloads/0.28/monotone_0.28-dapper0.1_i386.deb&lt;br /&gt;
 sudo dpkg -i monotone_0.28-dapper0.1_i386.deb&lt;br /&gt;
 echo monotone &amp;quot;hold&amp;quot; | sudo dpkg --set-selections&lt;br /&gt;
&lt;br /&gt;
Another possible solution for this is to download a suitable mtn db from http://www.openembedded.org/snapshots/ and use this.&lt;br /&gt;
 mkdir -p monotone&lt;br /&gt;
 wget http://www.openembedded.org/snapshots/\&lt;br /&gt;
 OE-this-is-for-mtn-&amp;lt;your mtn version&amp;gt;.mtn.bz2 -O monotone/nslu2-linux.mtn.bz2&lt;br /&gt;
 bunzip2 monotone/nslu2-linux.mtn.bz2&lt;br /&gt;
&lt;br /&gt;
Go build ;)&lt;br /&gt;
 make openmoko-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If you an encounter an error with monotone similar to the following: &lt;br /&gt;
&lt;br /&gt;
  mtn: misuse: database monotone/nslu2-linux.mtn is laid out according to an old schema&lt;br /&gt;
&lt;br /&gt;
Then you need to upgrade nslu2-linux.mtn Use the following command:&lt;br /&gt;
&lt;br /&gt;
  # mtn --db monotone/nslu2-linux.mtn db migrate&lt;br /&gt;
&lt;br /&gt;
== Pre-built snapshot images ==&lt;br /&gt;
&lt;br /&gt;
http://daxxar.slask.no/om/ (Confirmed to work)&lt;br /&gt;
&lt;br /&gt;
http://people.openmoko.org/mickey/images/&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenMoko2007.2| ]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/User:Shadowjack</id>
		<title>User:Shadowjack</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/User:Shadowjack"/>
				<updated>2007-08-05T06:24:03Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dmtiry Platonov&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Main_Page</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Main_Page"/>
				<updated>2007-08-05T05:50:56Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Hands-on Guides */ Added link to OpenMoko 2007.2 build page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|Main_Page}}&lt;br /&gt;
&amp;lt;big&amp;gt;'''Welcome to the [[OpenMoko]] public Wiki'''&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:FIC-neo1973_small.jpg|200px|right|frontside]]&lt;br /&gt;
OpenMoko is an [http://en.wikipedia.org/wiki/Open_source Open Source] project to create the world's first free mobile phone operating system.&lt;br /&gt;
&lt;br /&gt;
The [[OpenMoko]] project is a community that anyone can join, to help design their ideal phone.&lt;br /&gt;
&lt;br /&gt;
Eventually, phone software won't be tied to any particular phone. You can install any OpenMoko software over the whole range of [[Supported Hardware|supported phones]], and if you upgrade your phone, you don't lose that software. Bugs fixed on any phone are fixed on all. &lt;br /&gt;
&lt;br /&gt;
'''Currently it is not suitable for users.''' The state of the software at the moment is pre-alpha. If you order a Neo1973, DO NOT expect to be able to use it as an everyday phone for several months.&lt;br /&gt;
&lt;br /&gt;
The [[Neo1973]] from [[FIC]] is the first of many phones that OpenMoko will run on; indeed, some people erroneously use the terms Neo1973 and OpenMoko as interchangeable. If you are willing to have the alpha test experience, you can order Neo1973 hardware now from the [https://direct.openmoko.com/ Openmoko Online Shop]. You may wish to see the [[SH1 FAQ|Shipment 1 FAQ]].&lt;br /&gt;
&lt;br /&gt;
Please join us in collaborating on the OpenMoko project through any of the [[Development resources | project resources]] including this OpenMoko wiki. Please see the [[Help:Contents | wiki editing help]] page for information on making contributions to this wiki. A [[Meet the Core Team | core team]] of developers funded by FIC, Inc. leads the project.&lt;br /&gt;
&lt;br /&gt;
An [[introduction]] page is available, with [[Introduction#Photos|photos]] and [[Introduction#Videos|videos]]. Moreover, the usual [[FAQ | Frequently Asked Questions]] (FAQ) page might be helpful. Developers may find the [[ChangeLog | change log]] an important resource.&lt;br /&gt;
&lt;br /&gt;
Update 2007-07-25:  The [http://forums.makeopensource.com/ Unofficial OpenMoko Forums] are now open!  Everyone is invited to participate!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The members of the OpenMoko community would like to thank FIC Inc. for showing leadership and initiating the OpenMoko project.&lt;br /&gt;
&lt;br /&gt;
== OpenMoko Areas of Interest ==&lt;br /&gt;
* [[Basic End-user]] - Information for end users that want basic functionality and no surprises&lt;br /&gt;
* [[Advanced End-user]] - Information for advanced end-users that want advanced and experimental functionality but who are not programmers&lt;br /&gt;
* [[Development resources | Project Resources]] - Provides a centralized location of all resources such as [[Development resources#Mailing_Lists|mailing lists]], [[Development resources#IRC | communication tools]], and other software development oriented resources.&lt;br /&gt;
* [[Application Developer]] - Information for application developers, including ideas and specifications for applications, and tools to build them&lt;br /&gt;
* [[System Developer]] - Information for system developers, including bootloader, kernel, and libraries&lt;br /&gt;
* [[Hardware Developer]] - Information for hardware developers, including hardware specs and debug board&lt;br /&gt;
* [[Current events]] - Information on both past and future events where FIC or OpenMoko had or will have a presence.&lt;br /&gt;
* [http://forums.makeopensource.com/ Unofficial OpenMoko Forums] - Everyone is invited to collaborate with OpenMoko users and developers on the forums.&lt;br /&gt;
&lt;br /&gt;
== Developer's Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== Hands-on Guides ===&lt;br /&gt;
* [[Getting Started with your Neo1973]]&lt;br /&gt;
* [[MokoMakefile|Building OpenMoko using the MokoMakefile]] &lt;br /&gt;
* [[OpenMoko2007.2|Building OpenMoko 2007.2]]&lt;br /&gt;
* [[Building OpenMoko from scratch]]&lt;br /&gt;
** [[Building a hello world application]]&lt;br /&gt;
** Old [[Building OpenMoko from scratch (pre-BBT)]]&lt;br /&gt;
* [[Migration to bad block tolerant builds]]&lt;br /&gt;
* [[Running OpenMoko on PC]]&lt;br /&gt;
** [[Getting OpenMoko working on host with Xoo]]&lt;br /&gt;
** [[Getting OpenMoko working on host with Xephyr]]&lt;br /&gt;
** [[How to run OpenMoko Apps on PC]]&lt;br /&gt;
** [[OpenMoko under QEMU]]&lt;br /&gt;
** [[Test Openmoko Emulation with chroot image|Test Openmoko Emulation with a Prebuilt chroot Image]]&lt;br /&gt;
* [[Booting from SD]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Reference Documentation ===&lt;br /&gt;
* All [[:Category:Hardware|Hardware]] related documentation and specifications are found on the [[:Category:Hardware|Hardware page]].&lt;br /&gt;
* The [[Neo1973 Hardware]] page provides an overview of the hardware components used by the [[:Category:Neo1973 Hardware|Neo1973 hardware platform]]. PCB photographs are also included. A [[Disassembling Neo1973 | photo disassembly story]] may be an interesting starting place.&lt;br /&gt;
* [[:Category:Neo1973 Hardware Debugging | Neo1973 Hardware Debugging]] is assisted with the [[Debug Board | Neo1973 debug board]].   A page discussing [[Connecting Neo1973 with Debug Board v2 | debug board and Neo1973 configurations]] is also provided.&lt;br /&gt;
&lt;br /&gt;
=== Software Reference Documentation ===&lt;br /&gt;
* Architectural&lt;br /&gt;
** [[OpenMokoFramework]] - The OpenMoko Application Framework&lt;br /&gt;
* [[Neo1973 host software]]&lt;br /&gt;
* Device Software&lt;br /&gt;
** Low-Level&lt;br /&gt;
*** [[u-boot]] - The bootloader we use, including documentation for our modifications&lt;br /&gt;
*** [[kernel]] - The Linux kernel we use, including documentation for our modifications&lt;br /&gt;
** Userspace&lt;br /&gt;
*** [[binary compatibility]]&lt;br /&gt;
*** [[gsmd]] - the GSM daemon managing the GSM Modem&lt;br /&gt;
*** [[gpsd]] - the AGPS (Assisted GPS) daemon&lt;br /&gt;
&lt;br /&gt;
=== OpenMoko ===&lt;br /&gt;
* [[OpenEmbedded]] - The distribution-building framework&lt;br /&gt;
* [[Toolchain]] - The toolchain we use for compilation&lt;br /&gt;
* [[OpenMoko]] - The OpenMoko distribution&lt;br /&gt;
** [[OpenMoko2007]] - The first intended release of it&lt;br /&gt;
** [[OpenMoko2007.2]] - An improved release with more formalized style guidelines.&lt;br /&gt;
** [[Userspace root image]]&lt;br /&gt;
&lt;br /&gt;
==== User Interface Related ====&lt;br /&gt;
* [[Look &amp;amp; Feel]]&lt;br /&gt;
** [[Artwork]]&lt;br /&gt;
* [[Applications]]&lt;br /&gt;
* [[Widgets]]&lt;br /&gt;
** [[Widget Inheritance Graph]]&lt;br /&gt;
* [[Application UI Design Recommendations]]&lt;br /&gt;
&lt;br /&gt;
=== Misc. Development Related ===&lt;br /&gt;
* [[Freshman todo]]&lt;br /&gt;
* [[Templates]]&lt;br /&gt;
* [[PIM Storage]]&lt;br /&gt;
* [[Coding Guidelines]]&lt;br /&gt;
* [[OpenMoko#Setting_up_an_OpenMoko_SDK|How to setup the OpenMoko SDK]]&lt;br /&gt;
* [[Application Development Crash Course]] -A very basic how-to for the new people.&lt;br /&gt;
* Alternative distributions for [[Neo1973]] GTA01: [[Angstrom on Neo1973]], [http://pokylinux.org Poky] (instructions needed!)&lt;br /&gt;
* [[License]] - How we license our code&lt;br /&gt;
* [[Development resources]] - Describes resources for developers (lists, svn, ...)&lt;br /&gt;
* [[Neo1973 Phase 0]] - Information for Phase 0 device owners&lt;br /&gt;
* [[Wishlist:Neo1973 P0 Review]] - Impressions of the Phase 0 hardware device, also the Phase 0 FAQ&lt;br /&gt;
* [[Neo1973 Phase 1]] - Information for Phase 1 device owners&lt;br /&gt;
* [[Wishlist:Neo1973 P1 Review]] - Impressions of the Phase 1 hardware device&lt;br /&gt;
* [[External Feeds]] - List of feeds from people blogging about OpenMoko&lt;br /&gt;
&lt;br /&gt;
== Administrative / Organizational ==&lt;br /&gt;
&lt;br /&gt;
* [[Shipping Notes]] - Information to help FIC figure out how to ship products to you, and how much it might cost.&lt;br /&gt;
* [[My Account]] - Ideas for what sort of account-based services FIC should provide with the phone.&lt;br /&gt;
* [[Hear Me FIC]] - Information to help FIC know what the community wants.&lt;br /&gt;
* [[Listen Up Community]] - Community's To-Do-List&lt;br /&gt;
* [[Wiki Issues]] - problems/requests regarding this Wiki&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
* [[WiFi support in OpenMoko]]&lt;br /&gt;
* [[Neo1973 and Windows]] - If you want to commit that offence ;)  (does not work, help!)&lt;br /&gt;
* [[Press Coverage]] - What the press says about the OpenMoko project&lt;br /&gt;
* [[mFAQ]] - The OpenMoko Misinformation FAQ ('''mFAQ''') - What the press '''''incorrectly''''' says about the OpenMoko project&lt;br /&gt;
* [[Wish List]] - A collection of ideas and ideals we'd like to see implemented some day&lt;br /&gt;
* [[Wish List - Hardware]] - A collection of ideas we'd like to see in the next Neo release&lt;br /&gt;
* [[Wishlist:BuiltInScriptingLanguage|Wish List - Built-in Scripting Language]] - Discussion on a suitable scripting language to be included&lt;br /&gt;
* [[Media Content]] - What types of media on the device can we use (that is non-software)?&lt;br /&gt;
* [[Testimonials]] - How did you get to OpenMoko?&lt;br /&gt;
* [[Buying Interest List]] - (Not official and not a pre-order page) Have you put money aside for Neo1973? Put your nick here.&lt;br /&gt;
* [[iPhone]] -  Comparison between Apple iPhone and FIC Neo1973&lt;br /&gt;
* [[Translation]] -  Translation of OpenMoko&lt;br /&gt;
* [[Summer of code]] - Our page with project applications for Google's Summer of Code&lt;br /&gt;
* [[SWAG]] - Where to purchase openmoko swag (T-Shirts!)&lt;br /&gt;
* [[Trademark Policy]] -- The OpenMoko Trademark Policy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bottom&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Information| ]]&lt;br /&gt;
[[Category:Categories| ]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Manually_using_GSM</id>
		<title>Manually using GSM</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Manually_using_GSM"/>
				<updated>2007-08-02T07:40:06Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: Fixed link to GSM headset state&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''When men were real men and typed their own AT commands...'''&lt;br /&gt;
&lt;br /&gt;
Thankfully, this may now be partially obsolete.&lt;br /&gt;
The [[Dialer|dialer]] now works!&lt;br /&gt;
&lt;br /&gt;
This is a short guide how to manually get GSM going.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* GTA01Bv2 or GTA01Bv3 with very recent u-boot bootloader, providing usbtty (serial over USB) support)&lt;br /&gt;
* Do not connect any debug board!&lt;br /&gt;
&lt;br /&gt;
== Walk-Through ==&lt;br /&gt;
&lt;br /&gt;
=== Booting the system ===&lt;br /&gt;
&lt;br /&gt;
* Make sure the rootfs you use has 'auto usb0' in /etc/network/interfaces&lt;br /&gt;
* Configure the host's usb0 interface to 192.168.0.200 netmask 255.255.255.0&lt;br /&gt;
* ssh to root@192.168.0.201&lt;br /&gt;
&lt;br /&gt;
=== Disabling the getty ===&lt;br /&gt;
&lt;br /&gt;
Our default images all have a getty running on /dev/ttySAC0, please edit /etc/inittab and disable the getty on that port&lt;br /&gt;
&lt;br /&gt;
=== Reducing the loglevel ===&lt;br /&gt;
&lt;br /&gt;
{{note|You don't need this in kernel builds with patchset &amp;amp;ge; 1288}}&lt;br /&gt;
&lt;br /&gt;
To keep the kernel from writing to /dev/ttySAC0, you need to use &amp;lt;code&amp;gt;dmesg -n1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Powering up the GSM Modem ===&lt;br /&gt;
&lt;br /&gt;
* verify there is no getty or any other app running on /dev/ttySAC0 &lt;br /&gt;
 root@fic-gta01:~$ lsof | grep ttySAC0&lt;br /&gt;
* power-up the GSM Modem&lt;br /&gt;
 root@fic-gta01:~$ echo &amp;quot;1&amp;quot; &amp;gt; /sys/bus/platform/devices/gta01-pm-gsm.0/power_on&lt;br /&gt;
&lt;br /&gt;
=== Connecting to GSM Modem ===&lt;br /&gt;
&lt;br /&gt;
* change permissions on ttySAC0&lt;br /&gt;
 root@fic-gta01:~$ chown uucp.uucp /dev/ttySAC0&lt;br /&gt;
* setup /usr/spool/uucp&lt;br /&gt;
 root@fic-gta01:~$ mkdir /usr/spool&lt;br /&gt;
 root@fic-gta01:~$ mkdir /usr/spool/uucp&lt;br /&gt;
 root@fic-gta01:~$ chown uucp.uucp /usr/spool/uucp&lt;br /&gt;
* enable CTS/RTS flow control&lt;br /&gt;
 root@fic-gta01:~$ stty -F /dev/ttySAC0 crtscts&lt;br /&gt;
* access the GSM Modem UART&lt;br /&gt;
 root@fic-gta01:~$ cu -l /dev/ttySAC0&lt;br /&gt;
 Connected.&lt;br /&gt;
 AT-Command Interpreter Ready&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
''If it will hang on &amp;quot;Connected&amp;quot; message then probably your device has nonworking GSM modem - check [http://bugzilla.openmoko.org/cgi-bin/bugzilla/show_bug.cgi?id=256 Bug #256]''&lt;br /&gt;
&lt;br /&gt;
'''cu seems to have problems with the hardware flow control. The one way I always managed to get GSM working is to start cu first and then on a different console issue the stty command.'''&lt;br /&gt;
--[[User:DanielWillmann|DanielWillmann]] 01:15, 20 March 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
=== Using it manually ===&lt;br /&gt;
==== Registering with the Network ====&lt;br /&gt;
&lt;br /&gt;
* enter the following [[Hardware:AT_Commands]]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ATE1&lt;br /&gt;
OK&lt;br /&gt;
AT+CFUN=1&lt;br /&gt;
ERROR&lt;br /&gt;
AT+CPIN=&amp;quot;....&amp;quot;&lt;br /&gt;
OK&lt;br /&gt;
AT+COPS&lt;br /&gt;
OK&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Answering an incoming call ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RING&lt;br /&gt;
ATA&lt;br /&gt;
OK&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Dialling an outgoing call ====&lt;br /&gt;
&lt;br /&gt;
To actually be able to talk you have to configure your audio accordingly&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@fic-gta01:~$ cd /etc/alsa/&lt;br /&gt;
root@fic-gta01:/etc/alsa$ wget http://opensource.wolfsonmicro.com/~gg/neo1973/gsmheadset.working.state&lt;br /&gt;
root@fic-gta01:/etc/alsa$ alsactl -f /etc/alsa/gsmheadset.working.state restore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Up the &amp;quot;Amp right&amp;quot; volume to hear the speaker on both ears, then dial&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ATD012340234;   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get NO CARRIER, try...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ATD+xxyzzzzzzz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ie, ATD+&amp;lt;country_code&amp;gt;&amp;lt;area_code&amp;gt;&amp;lt;phone_number&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Hanging up ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ATH&lt;br /&gt;
OK&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using [[gsmd]] ===&lt;br /&gt;
&lt;br /&gt;
You can use the [[gsmd]] and [[libgsmd-util]] programs to have a slightly more high-level interface to the GSM Modem.  It's still console based, though.&lt;br /&gt;
&lt;br /&gt;
For further instructions, see [[gsmd]]&lt;br /&gt;
&lt;br /&gt;
=== Using tui ===&lt;br /&gt;
&lt;br /&gt;
Tui (available from www.sf.net/projects/tui) is able to do all this. It is still text-based, but input-rxvt can take data from touchscreen, so you can actually do the calls using your finger. It also plays wav file on incoming call, so it is theoretically usable. It even does caller id.&lt;br /&gt;
&lt;br /&gt;
=== Manually using GPRS ===&lt;br /&gt;
&lt;br /&gt;
See [[Manually using GPRS]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;br /&gt;
[[Category:Developer software]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Translation</id>
		<title>Translation</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Translation"/>
				<updated>2007-08-01T12:02:05Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Russian */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{todo|{{PAGENAME}}}}&lt;br /&gt;
&lt;br /&gt;
Let us spread the popularity of OpenMoko/Neo1973 by localization of the software and translation of documentation and wiki.&lt;br /&gt;
&lt;br /&gt;
Just as an overview who is able and willing to translate parts into other languages,&lt;br /&gt;
please join and add your Language and name. The source for the translation will&lt;br /&gt;
be English. If you have good English skills then you could contribute by correcting&lt;br /&gt;
the sources :)&lt;br /&gt;
&lt;br /&gt;
A good point to start would be to continuous translating of &lt;br /&gt;
http://en.wikipedia.org/wiki/OpenMoko into more languages on the other language sites of wikipedia.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;...it is easy to join and spend some minutes for translating,&lt;br /&gt;
and when someone finds some mistakes in any languages don't&lt;br /&gt;
blame the translator - just be productive and fix it yourself!&amp;quot; -[[User:RobertMichel|Robert Michel]]&lt;br /&gt;
&lt;br /&gt;
Please take a look at [[Translation HOWTO]] and improve it if possible.&lt;br /&gt;
&lt;br /&gt;
Languages already offered on our community mailinglist, please add your name yourself and join community mailinglist (until we'll have a proper mailinglist) to discuss about translations:&lt;br /&gt;
&lt;br /&gt;
== Afrikaans ==&lt;br /&gt;
&lt;br /&gt;
== Amharic ==&lt;br /&gt;
* [[User:ethiopia|Ethiopia Alemayehu]]&lt;br /&gt;
&lt;br /&gt;
== Armenian ==&lt;br /&gt;
* [[User:surenk|Suren Karapetyan]]&lt;br /&gt;
&lt;br /&gt;
== Arabic عربي == &lt;br /&gt;
* Hossam Mahmoud حسام محمود&lt;br /&gt;
* [[User:ترجمان05|ترجمان05]]&lt;br /&gt;
* [[User:Lixy|Lixy]] 17:54, 21 July 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Bulgarian == &lt;br /&gt;
* [[User:Mr700|Doncho Nicolaev Gunchev]]&lt;br /&gt;
&lt;br /&gt;
== Catalan ==&lt;br /&gt;
&lt;br /&gt;
* [[User:montxovs|Montxo Vicente i Sempere]]&lt;br /&gt;
&lt;br /&gt;
* [[User:Mandarino|Mandarino]]&lt;br /&gt;
&lt;br /&gt;
* [[User:RafaelCarreras|Rafael Carreras]]&lt;br /&gt;
&lt;br /&gt;
== Chinese (Simplified)== &lt;br /&gt;
* [[User:JarodWang|JarodWang]]&lt;br /&gt;
* xyb&lt;br /&gt;
&lt;br /&gt;
== Czech ==&lt;br /&gt;
* [[User:Mikesh|Michal Heczko]]&lt;br /&gt;
* [[User:Vatoz|Vaclav Cerny]]&lt;br /&gt;
&lt;br /&gt;
== Danish == &lt;br /&gt;
* [[User:EsbenDamgaard|Esben Damgaard]]&lt;br /&gt;
* [[User:UlrikRasmussen|Ulrik Rasmussen]]&lt;br /&gt;
* [[User:miki|Mikkel Kirkgaard Nielsen]]&lt;br /&gt;
&lt;br /&gt;
== Dutch == &lt;br /&gt;
* [[User:MarcVerwerft|Marc Verwerft]]&lt;br /&gt;
* [[User:Madjo|Marcel De Jong]]&lt;br /&gt;
* [[User:OliverH|Oliver Heesakkers]]&lt;br /&gt;
* [[User:LuitvD|Luit van Drongelen]]&lt;br /&gt;
* [[User:reinouts|Reinout van Schouwen]]&lt;br /&gt;
&lt;br /&gt;
([[User:Madjo|Marcel]] 18/04) Misschien is het handig om alvast te beginnen met vertalen van de Wiki? Of hebben jullie andere ideeen? Ik heb al een start gemaakt van de voorpagina van de wiki, maar ben nog niet veel verder gekomen&lt;br /&gt;
([[User:reinouts|Reinout]] 21/04) Valt er verder nog niks te vertalen? De wiki is niet echt boeiend.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esperanto ==&lt;br /&gt;
* [[User:Antono|Antono Vasiljev]]&lt;br /&gt;
* [[User:Alekcxjo|Alekĉjo Rajmondo]]&lt;br /&gt;
&lt;br /&gt;
== Estonian ==&lt;br /&gt;
* [[User:Hadara|Sven Petai]]&lt;br /&gt;
* [[User:Myoldryn|Jaan Nigul]]&lt;br /&gt;
&lt;br /&gt;
== Finnish == &lt;br /&gt;
* [[User:Jani-Matti_Hätinen|Jani-Matti Hätinen]]&lt;br /&gt;
* [[User:TuomoSipola|Tuomo Sipola]]&lt;br /&gt;
* [[User:Eyec|Samuli Perttula]]&lt;br /&gt;
* [[User:gua|Atte Hinkka]]&lt;br /&gt;
&lt;br /&gt;
== French ==&lt;br /&gt;
* [[User:SebastienJolicoeur|Sebastien Jolicoeur]]&lt;br /&gt;
* [[User:MarcSert|Marc Sert]]&lt;br /&gt;
* [[User:FoucaultdeBonneval|Foucault deBonneval]]&lt;br /&gt;
* [[User:Sufflope|Jean-Sébastien Bour]]&lt;br /&gt;
* [[User:Ymahe|Yves Mahé]]&lt;br /&gt;
* [[User:opampca|Richard Lussier, Canada]]&lt;br /&gt;
* [[User:Kheldar|Guillaume Maiano]]&lt;br /&gt;
* [[User:Thomas01|Thomas Leclere]]&lt;br /&gt;
* [[User:fredlala|Frédéric Lasnier]]&lt;br /&gt;
* [[User:alekcxjo|Alexandre Raymond]]&lt;br /&gt;
&lt;br /&gt;
== German ==&lt;br /&gt;
* [[User:RobertMichel|Robert Michel]]&lt;br /&gt;
* [[User:FabianOff|Fabian Off]]&lt;br /&gt;
* [[User:Denis std|Denis]]&lt;br /&gt;
* Lars C.&lt;br /&gt;
* [[User:AndreasHochsteger|Andreas Hochsteger]]&lt;br /&gt;
* [[User:Christophloew|Christoph Löw]]&lt;br /&gt;
* [[User:dFence|Daniel Zauner]]&lt;br /&gt;
* [[User:Imitation|Thomas Sanladerer]]&lt;br /&gt;
&lt;br /&gt;
== Greek ==&lt;br /&gt;
* [[User:Chronix|Polychronis Papadakis]]&lt;br /&gt;
&lt;br /&gt;
== Hebrew ==&lt;br /&gt;
* [[User:OlegSverdlov|Oleg Sverdlov]]&lt;br /&gt;
* [[User:Any_Key|Any_Key]]&lt;br /&gt;
* [[User:Koala|Koala]]&lt;br /&gt;
&lt;br /&gt;
== Indonesian ==&lt;br /&gt;
* [[User:Hcblue|Hcblue]]&lt;br /&gt;
&lt;br /&gt;
== Italian ==&lt;br /&gt;
* per il momento useremo [http://www.openmokoboard.org/ita/index.php?getforum=24 questo forum] per organizzarci. iscrivetevi e partecipate.&lt;br /&gt;
* [[User:SergioTota|Sergio Tota]]&lt;br /&gt;
* [[User:Franco|Franco Rimoldi]]&lt;br /&gt;
* [[User:Filippo|Filippo]]&lt;br /&gt;
* [[User:Massi|Massimiliano]]&lt;br /&gt;
* [[User:Markk0|Marco Cattaneo]]&lt;br /&gt;
* [[User:Cga|Callea Gaetano Andrea]]&lt;br /&gt;
* [[User:Herod2k|Alessandro]]&lt;br /&gt;
* [[User:shainer|Lisa Vitolo]]&lt;br /&gt;
* [[User:tia1982|Mattia]]&lt;br /&gt;
* [[User:azanutta|abe]]&lt;br /&gt;
* [[User:Gualti|Gualtiero]]&lt;br /&gt;
* [[User:Milo|Milo Casagrande]]&lt;br /&gt;
* [[User:White|Marco Celeri]]&lt;br /&gt;
* [[User:Aegis|Maurizio Scorianz]]&lt;br /&gt;
&lt;br /&gt;
== Japanese ==&lt;br /&gt;
*[[User:WilliamLai|William Lai]]&lt;br /&gt;
*[[Momoko Matsuzaki]]&lt;br /&gt;
&lt;br /&gt;
== Norwegian ==&lt;br /&gt;
*[[User:Hanscats|Hans Cats]]&lt;br /&gt;
*[[User:Vegar|Vegar Storvann]]&lt;br /&gt;
&lt;br /&gt;
== Polish ==&lt;br /&gt;
* [[User:KrzysztofKajkowski|Krzysztof Kajkowski]]&lt;br /&gt;
* Tomasz Zieliński&lt;br /&gt;
* [[User:MaciejLigenza|Maciej Ligenza]]&lt;br /&gt;
* [[User:PiotrDuda|Piotr Duda]]&lt;br /&gt;
* [[User:Zbraniecki|Zbigniew Braniecki]]&lt;br /&gt;
&lt;br /&gt;
== Portuguese ==&lt;br /&gt;
*[[User:Skull Death|James Côrtes]]&lt;br /&gt;
* Sergio Bessa&lt;br /&gt;
* Mario Costa&lt;br /&gt;
* Tiago Saraiva&lt;br /&gt;
&lt;br /&gt;
== Punjabi ==&lt;br /&gt;
* [[User:aalam|A S Alam]]&lt;br /&gt;
&lt;br /&gt;
== Romanian ==&lt;br /&gt;
&lt;br /&gt;
* [[User:alexxed|Alexandru Szasz]]&lt;br /&gt;
* [[User:sin|Lucian]]&lt;br /&gt;
&lt;br /&gt;
== Russian ==&lt;br /&gt;
* [[User:OlegSverdlov|Oleg Sverdlov]]&lt;br /&gt;
* [[User:DenisBY|Denis Kot]]&lt;br /&gt;
* [[User:MikhailGusarov|Mikhail Gusarov]]&lt;br /&gt;
* [[User:x-demon|Alexander Sokolow]]&lt;br /&gt;
* [[User:Any_Key|Any_Key]]&lt;br /&gt;
* [[User:Dmitri|Dmitri]]&lt;br /&gt;
* [[User:Buffet|Denis Kaledin]]&lt;br /&gt;
* [[User:Nes|Mike Drapolyuk]]&lt;br /&gt;
* [[User:vase|Vasiliy Tolstov]]&lt;br /&gt;
* [[User:Shadowjack|Shadowjack]]&lt;br /&gt;
Можем начинать переводить wiki :)&lt;br /&gt;
К любой странице добавляете /ru и переводите. В конце оригинальной страницы и переведенной добавляете ссылку на шаблон &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Languages|Имя_страницы_оригинала}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slovak == &lt;br /&gt;
* [[User:Cezz|Cezz]]&lt;br /&gt;
* [[User:PipBoy2000|PipBoy2000]]&lt;br /&gt;
&lt;br /&gt;
== Spanish ==&lt;br /&gt;
* [[User:RosangelaCaninoKoning|Rosangela CaninoKoning]]&lt;br /&gt;
* [[User:kresp0|Santiago Crespo (kresp0)]]&lt;br /&gt;
* [[User:José_Suárez|José Suárez]]&lt;br /&gt;
* [[User:Rafa_Couto|Rafa Couto (caligari)]]&lt;br /&gt;
* [[User:NeoMorfeo|Guillermo Santos (NeoMorfeo)]]&lt;br /&gt;
* [[User:Mandarino|Mandarino]]&lt;br /&gt;
* [[User:pptudela|Pepe Tudela]]&lt;br /&gt;
* [[User:avathar|Fernando González (Avathar)]]&lt;br /&gt;
* [[User:Rbruzz|Rbruzz]]&lt;br /&gt;
&lt;br /&gt;
== Swedish ==&lt;br /&gt;
* [[User:yeager|Daniel Nylander]]&lt;br /&gt;
&lt;br /&gt;
== Turkish ==&lt;br /&gt;
* [[User:EnginErenturk|Engin Erenturk]]&lt;br /&gt;
* [[User:Supernova|İsmail AŞCI]]&lt;br /&gt;
&lt;br /&gt;
== Welsh ==&lt;br /&gt;
* [[User:Rhoslyn_Prys|Rhoslyn Prys]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And feel free to join and add an new language to this list above.&lt;br /&gt;
&lt;br /&gt;
{{Languages|Translation}}&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/GSM</id>
		<title>GSM</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/GSM"/>
				<updated>2007-07-30T18:56:26Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: Added languages block&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''GSM''', ([http://en.wikipedia.com/wiki/GSM Global System for Mobile communications]) is the phone standard and network type supported by the [[Neo1973]]. Future phones may support other standards.&lt;br /&gt;
&lt;br /&gt;
GSM covers making phone calls, sending '''SMS''' text messages, and access to Internet via '''GPRS'''. A '''SIM''' ([http://en.wikipedia.org/wiki/Subscriber_Identity_Module Subscriber Identity Module]) card is given along the contract with an operator, and the customer inserts the card in the phone to authorize it. The card is plastic (approximately 15mm*23mm*1mm) with several gold contacts on, and it determines the mobile phone 'number' and what network the phone is on.&lt;br /&gt;
&lt;br /&gt;
The Neo1973 phone can be used with any operator that has a GSM network; it is quad-band and thus supports every frequency (850, 900, 1800, and 1900 MHz). Thus it will work in most countries, with the exception of some of the US and some other parts of the world that completely lack GSM coverage.&lt;br /&gt;
&lt;br /&gt;
== Applications ==&lt;br /&gt;
&lt;br /&gt;
Calls can be placed using the graphical [[Dialer]] or the textual gsmd-tool.&lt;br /&gt;
&lt;br /&gt;
Rest needs to be done on the command-line [[manually using GSM]] and [[manually using GPRS]], until [[gsmd]] supports more.&lt;br /&gt;
&lt;br /&gt;
== Programming ==&lt;br /&gt;
&lt;br /&gt;
The GSM features (including dialing, SMS, GPRS, and SIM access) will be programmed via [[gsmd]].&lt;br /&gt;
&lt;br /&gt;
== Standards information ==&lt;br /&gt;
&lt;br /&gt;
You can find a full list of GSM/3GPP standards at [http://webapp.etsi.org/key/key.asp?full_list=y this ETSI site] (attention! more than 2000 entries) or at [http://pda.etsi.org/pda/queryform.asp the light-weight ETSI site].&lt;br /&gt;
&lt;br /&gt;
=== GSM 02.07 - Required features ===&lt;br /&gt;
&lt;br /&gt;
See [[GSM02.07]].&lt;br /&gt;
&lt;br /&gt;
=== GSM 07.07 - Main AT commands ===&lt;br /&gt;
&lt;br /&gt;
07.07 describes the main commands used by the [[Gsmd]] software of the Openmoko system to communicate via a serial interface with the [[GSM]] subsystem of the phone.&lt;br /&gt;
&lt;br /&gt;
* http://www.ctiforum.com/standard/standard/etsi/0707.pdf&lt;br /&gt;
&lt;br /&gt;
For more, see [[Hardware:AT Commands]].&lt;br /&gt;
&lt;br /&gt;
Note that the descendant of this specification is [http://www.3gpp.org/ftp/Specs/html-info/27007.htm 3GPP TS 27.007 - AT command set for User Equipment (UE)]. (Does OpenMoko support any of these newer versions?)&lt;br /&gt;
&lt;br /&gt;
=== GSM 07.05 - Additional AT commands (SMS and CBS) ===&lt;br /&gt;
&lt;br /&gt;
* http://www.ctiforum.com/standard/standard/etsi/0705.pdf&lt;br /&gt;
&lt;br /&gt;
=== GSM 07.10 - Multiplexing ===&lt;br /&gt;
&lt;br /&gt;
* direct link?&lt;br /&gt;
&lt;br /&gt;
{{Languages|SIM}}&lt;br /&gt;
[[Category:Applications]]&lt;br /&gt;
[[Category:Hardware]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Devirginator/it</id>
		<title>Devirginator/it</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Devirginator/it"/>
				<updated>2007-07-30T18:14:33Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: Added languages block&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il '''devirginator''' un è un programma utilizzato in combinazione con [[dfu-util]], [[OpenOCD]] e [[Debug Board]] per reporogrammare alle impostazioni di fabbrica il telefono from scratch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Codice sorgente ==&lt;br /&gt;
&lt;br /&gt;
Il codice sorgente di devirginator è disponibile qui http://svn.openmoko.org/trunk/src/host/devirginator/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Documentazione ==&lt;br /&gt;
&lt;br /&gt;
{{nota|Questa deriva da http://svn.openmoko.org/trunk/src/host/devirginator/README rev. 1215 e potrebbe essere obsoleta}}&lt;br /&gt;
&lt;br /&gt;
=== Iniziare ===&lt;br /&gt;
&lt;br /&gt;
Per iniziare,&lt;br /&gt;
 % cp config.example config&lt;br /&gt;
e fai le modifiche necessarie. In particulare, devi configurare SNAPSHOT.&lt;br /&gt;
Quindi&lt;br /&gt;
 % make&lt;br /&gt;
Questo richiede Netpbm e transfig. Infine assicurati che openocd sia attivo,&lt;br /&gt;
accendi il dispositivo, diventa root, ed esegui&lt;br /&gt;
 # ./devirginate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Prerequisiti ===&lt;br /&gt;
&lt;br /&gt;
Il dispositivo deve essere connesso con:&lt;br /&gt;
&lt;br /&gt;
* JTAG, con un'interfaccia supportatata da OpenOCD (necessaria per tutti gli stages)&lt;br /&gt;
* USB, connesso alla su cui è in funzione &amp;quot;devirginate&amp;quot; (richiesto solo per lo stage 2 e successivi)&lt;br /&gt;
&lt;br /&gt;
Inoltre, se una serial console è connessa al dispositivo, la progressione&lt;br /&gt;
dell'installazione può essere monitorata.&lt;br /&gt;
&lt;br /&gt;
Sono bnecessari i seguenti programmi:&lt;br /&gt;
&lt;br /&gt;
==== dfu-util ====&lt;br /&gt;
&lt;br /&gt;
* dfu-util deve essere accessibile dalla macchina su chui è attivo &amp;quot;devirginate&amp;quot;. Se dfu-util non è nel PATH, puoi selezionare un path specifico in &amp;quot;config&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
Per fara il build di dfu-util, esegui:&lt;br /&gt;
 cd $OMDIR/openmoko/trunk/src/host/dfu-util&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
 ./configure&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
==== OpenOCD ====&lt;br /&gt;
&lt;br /&gt;
OpenOCD SVN revision 130 con libftdi 0.8 funziona. Altre&lt;br /&gt;
combinazioni possono anche funzionarec. E' richiesto il seguente patch:&lt;br /&gt;
&lt;br /&gt;
http://svn.openmoko.org/developers/werner/openocd-wait-patiently.patch&lt;br /&gt;
&lt;br /&gt;
Per el istruzioni per il build, vedi http://svn.openmoko.org/developers/werner/notes/openocd&lt;br /&gt;
&lt;br /&gt;
  Se stai usando la build di OpenOCD fatta dalla OpenMoko&lt;br /&gt;
  distribution (SVN revision 1180 o successiva), il patch è già&lt;br /&gt;
  applicato.&lt;br /&gt;
&lt;br /&gt;
==== telnet ====&lt;br /&gt;
&lt;br /&gt;
Oltre a tutto ciò, &amp;quot;devirginate&amp;quot; necessita di telnet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== netpbm, transfig, wget, perl ====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;setup.sh&amp;quot; può essere eseguito da un'altra macchian che ha in share la stessa gerarchia del&lt;br /&gt;
file system. Necessita di Netpbm, transfig, wget, e Perl.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
&lt;br /&gt;
Innazitutto devirginator necessita di essere configurato. Questo include&lt;br /&gt;
&lt;br /&gt;
* scaricare i binari per u-boot, kernel, etc.&lt;br /&gt;
* generare/convertire diversi files usando il processo di setup&lt;br /&gt;
&lt;br /&gt;
Per il momento il setup deve essere fatto nella directory contente tutti i&lt;br /&gt;
files riferiti a devirginator. I files generati durante il setup&lt;br /&gt;
sono posizionati nella directory tmp/. I files in tmp/ sono inoltre usati&lt;br /&gt;
durante l'uso di devirginator.&lt;br /&gt;
&lt;br /&gt;
Per iniziare, copia config.example su &amp;quot;config&amp;quot; e applica le modifiche necessarie.&lt;br /&gt;
Quasi tutte le configurazioni necessarie sono di defaults, ma una cosa che potresti&lt;br /&gt;
voler fare è configurare SNAPSHOT con il date code dello the snapshot che desideri.&lt;br /&gt;
&lt;br /&gt;
Poi esegui  ./setup.sh o semplicemente make .&lt;br /&gt;
&lt;br /&gt;
setup.sh ora scaricherà ogni file perduto ed eseguirà le varie&lt;br /&gt;
conversioni. Se apapre qualche errore durante questo processo, ad esempio a causa della&lt;br /&gt;
mancanza di strumenti o di un errore di configurazione, setup.sh si fermerà con un errore.&lt;br /&gt;
Potrai quindi correggere l'errore e riprovare. I files già scaricati in tmp/ verranno&lt;br /&gt;
saltati quando riprovi (setup.sh lo farà lo stessose i files avranno subito dei&lt;br /&gt;
cambiamenti).&lt;br /&gt;
&lt;br /&gt;
setup.sh inoltre controlla se gli esguibili sono disponibili durante l'uso di devirgination&lt;br /&gt;
e segnalerà se manca qualcosa. In generale, si può eseguire setup.sh su una macchina diversa che &amp;quot;devirginate&amp;quot;, in&lt;br /&gt;
questo caso questi avvisi saranno ignorati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Script ====&lt;br /&gt;
* crc32.pl -Permette la funzione crc32 che comanda la IEEE CRC-32. Questo script è usato da altri script Perl, con &amp;quot;do&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* envedit.pl&lt;br /&gt;
* openocdcmd.pl&lt;br /&gt;
* scriptify.pl&lt;br /&gt;
* setup.sh&lt;br /&gt;
&lt;br /&gt;
==== Configurazione utente ====&lt;br /&gt;
&lt;br /&gt;
===== File di configiurazione statici =====&lt;br /&gt;
&lt;br /&gt;
I file seguenti contengono script ed altra informazioni di configurazione&lt;br /&gt;
&amp;quot;statici&amp;quot; che sono usati nel processo di devirgination. Normalmente basta&lt;br /&gt;
editare questi file per cambiare le funzioni del processo di setup.&lt;br /&gt;
&lt;br /&gt;
Ognuno di questi file è convertito in qualche maniera da setup.sh.&lt;br /&gt;
Qui sotto dopo la freccia sono indicati i rispettivi file risultanti.&lt;br /&gt;
&lt;br /&gt;
* openocd.in -&amp;gt; tmp/script.ocd&lt;br /&gt;
&lt;br /&gt;
Commands to execute by OpenOCD in phase 0. To perform variable&lt;br /&gt;
expansion, each line of this file is processed by the shell with&lt;br /&gt;
eval &amp;quot;echo $line&amp;quot;. Due to this, shell meta-characters should be&lt;br /&gt;
avoided.&lt;br /&gt;
&lt;br /&gt;
If changing any addresses in openocd.in, you also need to update&lt;br /&gt;
u-boot.in.&lt;br /&gt;
&lt;br /&gt;
*  u-boot.in -&amp;gt; tmp/u-boot.out&lt;br /&gt;
&lt;br /&gt;
Commands to execute in u-boot during stage 0. This file is converted&lt;br /&gt;
to an image understood by u-boot, and then executed from memory with&lt;br /&gt;
u-boot's &amp;quot;autoscr&amp;quot; command.&lt;br /&gt;
&lt;br /&gt;
* environment.in -&amp;gt; tmp/environment&lt;br /&gt;
&lt;br /&gt;
Environment settings for the regular u-boot environment. Note that&lt;br /&gt;
the changes in this file are made on top of the interim environment&lt;br /&gt;
produced in stage 0. In particular, the &amp;quot;mtdparts&amp;quot; variable is&lt;br /&gt;
retained from that stage.&lt;br /&gt;
&lt;br /&gt;
Long lines can be split in environment.in by simply indenting the&lt;br /&gt;
continuation. Note that the newline and the indentation are replaced&lt;br /&gt;
with one space. E.g.,&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
foo=some&lt;br /&gt;
    thing&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
would yield  foo=some thing&lt;br /&gt;
&lt;br /&gt;
* smiley.fig -&amp;gt; tmp/smiley.gz&lt;br /&gt;
The stage 0 splash screen, a smiling face on a green background.&lt;br /&gt;
&lt;br /&gt;
==== Download cache ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* tmp/System_boot.png -&amp;gt; tmp/splash.gz&lt;br /&gt;
This is a copy of the OpenMoko logo, which then gets converted to a&lt;br /&gt;
gzip-ed raw framebuffer image.&lt;br /&gt;
&lt;br /&gt;
* tmp/openmoko-devel-image-*.rootfs.jffs2&lt;br /&gt;
* tmp/lowlevel_foo-*.bin&lt;br /&gt;
* tmp/u-boot-*.bin&lt;br /&gt;
* tmp/uImage-*.bin&lt;br /&gt;
&lt;br /&gt;
* tmp/env.old&lt;br /&gt;
* tmp/env.new&lt;br /&gt;
* tmp/preboot_override&lt;br /&gt;
* tmp/preboot_override.noscrub&lt;br /&gt;
* tmp/preboot_override.scrub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Script ====&lt;br /&gt;
&lt;br /&gt;
I primi messaggi saranno qualcosa di simile a questo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Open On-Chip Debugger&lt;br /&gt;
&amp;gt; script /home/moko/om/trunk/src/host/devirginator/tmp/script.ocd&lt;br /&gt;
reset halt&lt;br /&gt;
wait_halt&lt;br /&gt;
waiting for target halted...&lt;br /&gt;
Target 0 halted&lt;br /&gt;
target halted in ARM state due to debug request, current mode: Supervisor&lt;br /&gt;
cpsr: 0x400000d3 pc: 0x00000000&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E' importante &amp;quot;pc: 0x00000000&amp;quot;. Se il numero è differente, ad esempio&lt;br /&gt;
qualcosa del tipo &amp;quot;pc: 0xffffffed&amp;quot;, il dispositivo probabilmente non&lt;br /&gt;
è acceso. In questo caso puoi provare a farlo ripartire, o se openocd&lt;br /&gt;
è bloccato,&lt;br /&gt;
&lt;br /&gt;
* chiudi openocd&lt;br /&gt;
* togli e reinserisci il connettore USB nel JTAGkey o nel debug v2 board&lt;br /&gt;
* apri openocd&lt;br /&gt;
&lt;br /&gt;
=== Stage ===&lt;br /&gt;
&lt;br /&gt;
The setup process is divided into three stages (plus a special zero&lt;br /&gt;
stage, see below). Each stage leaves the device in a stable state.&lt;br /&gt;
An installation run can include all or only some stages. Each stage&lt;br /&gt;
requires successful completion of all previous ones.&lt;br /&gt;
&lt;br /&gt;
* Stage 1: erases all previous NAND content, installs u-boot, and makes the device ready to receive further updates by DFU.&lt;br /&gt;
* Stage 2: installs Linux and the root file system.&lt;br /&gt;
* Stage 3: To be defined.&lt;br /&gt;
&lt;br /&gt;
Note that you most likely require privileges for some of the USB&lt;br /&gt;
operations &amp;quot;devirginate&amp;quot; performs. Therefore, do all this as &amp;quot;root&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To perform all stages, run&lt;br /&gt;
 # ./devirginate&lt;br /&gt;
from the trunk/src/host/devirginator/ directory.&lt;br /&gt;
&lt;br /&gt;
To run only individual stages, specify the stage numbers, each prefixed&lt;br /&gt;
by &amp;quot;-&amp;quot;, e.g.,&lt;br /&gt;
 # ./devirginate -1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Stage 0 ====&lt;br /&gt;
&lt;br /&gt;
Se la tabella dei bad block NAND è invalida, può essere cancellata all'inzio&lt;br /&gt;
dello stage 1. Questo è chiamato &amp;quot;stage 0&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Non è un'opzione ideale, perchè se l'ultimo blocco NAND è corrotto,&lt;br /&gt;
queste informazioni andranno perse.&lt;br /&gt;
Di default, lo stage 0 non viene eseguito.&lt;br /&gt;
&lt;br /&gt;
==== Stage 1 ====&lt;br /&gt;
&lt;br /&gt;
Immediately after starting, the screen lights up, showing random junk.&lt;br /&gt;
This is an indication that the setup process has started. Note that the&lt;br /&gt;
screen content may change (&amp;quot;decay&amp;quot;) during all this. This is normal.&lt;br /&gt;
&lt;br /&gt;
After 10-30 seconds, the screen will go dark. This indicates that we&lt;br /&gt;
now a have u-boot running on the device.&lt;br /&gt;
&lt;br /&gt;
About 60-90 seconds later, the screen will light up again and show a&lt;br /&gt;
smiling face on a green background. This indicates that the first stage&lt;br /&gt;
has completed. The smiling face will appear each time you activate the&lt;br /&gt;
device.&lt;br /&gt;
&lt;br /&gt;
The device now contains:&lt;br /&gt;
* a bad block table (BBT)&lt;br /&gt;
* u-boot, with DFU capability&lt;br /&gt;
* a basic set of u-boot environment variables&lt;br /&gt;
* the interim splash screen&lt;br /&gt;
&lt;br /&gt;
What is still missing:&lt;br /&gt;
* the Linux kernel&lt;br /&gt;
* the root file system&lt;br /&gt;
* the final environment&lt;br /&gt;
* the final splash screen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Stage 2 ====&lt;br /&gt;
&lt;br /&gt;
To begin phase 2, activate the device. The stage 1 smiley will show.&lt;br /&gt;
&lt;br /&gt;
Phase 2 can take several minutes. Progress of the download procedure&lt;br /&gt;
is indicated by hash signs (#) printed on the terminal where&lt;br /&gt;
&amp;quot;devirginate&amp;quot; runs.&lt;br /&gt;
&lt;br /&gt;
At the end of phase 2, the device resets, displays a partial OpenMoko&lt;br /&gt;
splash screen, then resets again, displays the correct splash screen&lt;br /&gt;
and finally boots Linux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Stage 3 ====&lt;br /&gt;
&lt;br /&gt;
TBD.&lt;br /&gt;
{{Languages|Devirginator}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer software]]&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Devirginator</id>
		<title>Devirginator</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Devirginator"/>
				<updated>2007-07-30T18:11:51Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: Added languages block&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The '''devirginator''' is a program that can be used in combination with [[dfu-util]], [[OpenOCD]] and [[Debug Board]] to completely (factory-re-)program a phone from scratch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
The source code of devirginator is available at http://svn.openmoko.org/trunk/src/host/devirginator/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
{{note|This is derived from http://svn.openmoko.org/trunk/src/host/devirginator/README rev. 1215 and might be outdated}}&lt;br /&gt;
&lt;br /&gt;
=== Quick start ===&lt;br /&gt;
&lt;br /&gt;
First,&lt;br /&gt;
 % cp config.example config&lt;br /&gt;
and may changes as needed. In particular, you must set SNAPSHOT.&lt;br /&gt;
Then&lt;br /&gt;
 % make&lt;br /&gt;
This requires Netpbm and transfig. Finally, make sure that openocd runs,&lt;br /&gt;
power the device up, become root, and run&lt;br /&gt;
 # ./devirginate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
&lt;br /&gt;
The device must be connected to:&lt;br /&gt;
&lt;br /&gt;
* JTAG, with an interface supported by OpenOCD (required for all stages)&lt;br /&gt;
* USB, connected to the machine running &amp;quot;devirginate&amp;quot; (only required for stage 2 and beyond)&lt;br /&gt;
&lt;br /&gt;
Furthermore, if a serial console is connected to the device, installation&lt;br /&gt;
progress can be monitored.&lt;br /&gt;
&lt;br /&gt;
The following programs are needed:&lt;br /&gt;
&lt;br /&gt;
==== dfu-util ====&lt;br /&gt;
&lt;br /&gt;
* dfu-util must be accessible from the machine running &amp;quot;devirginate&amp;quot;. If dfu-util is not in PATH, you can set an explicit path in &amp;quot;config&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
To build dfu-util, do this:&lt;br /&gt;
 cd $OMDIR/openmoko/trunk/src/host/dfu-util&lt;br /&gt;
 ./autogen.sh&lt;br /&gt;
 ./configure&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
==== OpenOCD ====&lt;br /&gt;
&lt;br /&gt;
OpenOCD SVN revision 130 with libftdi 0.8 is known to work. Other&lt;br /&gt;
combinations may also work. The following patch is required:&lt;br /&gt;
&lt;br /&gt;
http://svn.openmoko.org/developers/werner/openocd-wait-patiently.patch&lt;br /&gt;
&lt;br /&gt;
For build instructions, see http://svn.openmoko.org/developers/werner/notes/openocd&lt;br /&gt;
&lt;br /&gt;
  If you're using the version of OpenOCD built by the OpenMoko&lt;br /&gt;
  distribution (SVN revision 1180 or later), the patch is already&lt;br /&gt;
  applied.&lt;br /&gt;
&lt;br /&gt;
==== telnet ====&lt;br /&gt;
&lt;br /&gt;
Furthermore, &amp;quot;devirginate&amp;quot; requires telnet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== netpbm, transfig, wget, perl ====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;setup.sh&amp;quot; can be run from a different machine sharing the same file&lt;br /&gt;
system hierarchy. It requires Netpbm, transfig, wget, and Perl.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
&lt;br /&gt;
The devirginator first needs to be set up. This includes&lt;br /&gt;
&lt;br /&gt;
* downloading binaries for u-boot, kernel, etc.&lt;br /&gt;
* generating/converting various files used during the setup process&lt;br /&gt;
&lt;br /&gt;
At the moment, the setup must be done in the directory containing all&lt;br /&gt;
files belonging to the devirginator. The files generated during setup&lt;br /&gt;
are stored in the directory tmp/. The files in tmp/ are also used&lt;br /&gt;
during devirgination.&lt;br /&gt;
&lt;br /&gt;
First, copy config.example to &amp;quot;config&amp;quot; and make the necessary changes.&lt;br /&gt;
Almost all settings have reasonable defaults, but the least thing you&lt;br /&gt;
will have to do is set SNAPSHOT to the date code of the snapshot you&lt;br /&gt;
desire.&lt;br /&gt;
&lt;br /&gt;
Next, run either  ./setup.sh  or just  make .&lt;br /&gt;
&lt;br /&gt;
setup.sh will now download any missing files, and perform the various&lt;br /&gt;
conversions. If any error occur during this, e.g., because of missing&lt;br /&gt;
tools or a configuration error, setup.sh will stop with an error. You&lt;br /&gt;
then have to correct the problem and retry. Files already downloaded&lt;br /&gt;
to tmp/ will be skipped in the retry (setup.sh will still probe if&lt;br /&gt;
they have changed).&lt;br /&gt;
&lt;br /&gt;
setup.sh also checks if executables used during devirgination are&lt;br /&gt;
available and prints a warning if it finds anything missing. In general,&lt;br /&gt;
one can run setup.sh on a different machine than &amp;quot;devirginate&amp;quot;, in&lt;br /&gt;
which case these warnings can be ignored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scripts ====&lt;br /&gt;
* crc32.pl -Provides the function crc32, which computes the IEEE CRC-32. This script is used by other Perl scripts, with &amp;quot;do&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* envedit.pl&lt;br /&gt;
* openocdcmd.pl&lt;br /&gt;
* scriptify.pl&lt;br /&gt;
* setup.sh&lt;br /&gt;
&lt;br /&gt;
==== User configuration ====&lt;br /&gt;
&lt;br /&gt;
===== Static configuration files =====&lt;br /&gt;
&lt;br /&gt;
The following files contain scripts and other &amp;quot;static&amp;quot; configuration&lt;br /&gt;
information that is used in the devirgination process. In general,&lt;br /&gt;
it is only necessary to edit these files when changing functionality&lt;br /&gt;
of the setup process.&lt;br /&gt;
&lt;br /&gt;
Each of these files is converted in some way by setup.sh. Below, we&lt;br /&gt;
indicate the name of the respective resulting file after the arrow.&lt;br /&gt;
&lt;br /&gt;
* openocd.in -&amp;gt; tmp/script.ocd&lt;br /&gt;
&lt;br /&gt;
Commands to execute by OpenOCD in phase 0. To perform variable&lt;br /&gt;
expansion, each line of this file is processed by the shell with&lt;br /&gt;
eval &amp;quot;echo $line&amp;quot;. Due to this, shell meta-characters should be&lt;br /&gt;
avoided.&lt;br /&gt;
&lt;br /&gt;
If changing any addresses in openocd.in, you also need to update&lt;br /&gt;
u-boot.in.&lt;br /&gt;
&lt;br /&gt;
*  u-boot.in -&amp;gt; tmp/u-boot.out&lt;br /&gt;
&lt;br /&gt;
Commands to execute in u-boot during stage 0. This file is converted&lt;br /&gt;
to an image understood by u-boot, and then executed from memory with&lt;br /&gt;
u-boot's &amp;quot;autoscr&amp;quot; command.&lt;br /&gt;
&lt;br /&gt;
* environment.in -&amp;gt; tmp/environment&lt;br /&gt;
&lt;br /&gt;
Environment settings for the regular u-boot environment. Note that&lt;br /&gt;
the changes in this file are made on top of the interim environment&lt;br /&gt;
produced in stage 0. In particular, the &amp;quot;mtdparts&amp;quot; variable is&lt;br /&gt;
retained from that stage.&lt;br /&gt;
&lt;br /&gt;
Long lines can be split in environment.in by simply indenting the&lt;br /&gt;
continuation. Note that the newline and the indentation are replaced&lt;br /&gt;
with one space. E.g.,&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
foo=some&lt;br /&gt;
    thing&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
would yield  foo=some thing&lt;br /&gt;
&lt;br /&gt;
* smiley.fig -&amp;gt; tmp/smiley.gz&lt;br /&gt;
The stage 0 splash screen, a smiling face on a green background.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Download cache ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* tmp/System_boot.png -&amp;gt; tmp/splash.gz&lt;br /&gt;
This is a copy of the OpenMoko logo, which then gets converted to a&lt;br /&gt;
gzip-ed raw framebuffer image.&lt;br /&gt;
&lt;br /&gt;
* tmp/openmoko-devel-image-*.rootfs.jffs2&lt;br /&gt;
* tmp/lowlevel_foo-*.bin&lt;br /&gt;
* tmp/u-boot-*.bin&lt;br /&gt;
* tmp/uImage-*.bin&lt;br /&gt;
&lt;br /&gt;
* tmp/env.old&lt;br /&gt;
* tmp/env.new&lt;br /&gt;
* tmp/preboot_override&lt;br /&gt;
* tmp/preboot_override.noscrub&lt;br /&gt;
* tmp/preboot_override.scrub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scripts ====&lt;br /&gt;
&lt;br /&gt;
The first few messages should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Open On-Chip Debugger&lt;br /&gt;
&amp;gt; script /home/moko/om/trunk/src/host/devirginator/tmp/script.ocd&lt;br /&gt;
reset halt&lt;br /&gt;
wait_halt&lt;br /&gt;
waiting for target halted...&lt;br /&gt;
Target 0 halted&lt;br /&gt;
target halted in ARM state due to debug request, current mode: Supervisor&lt;br /&gt;
cpsr: 0x400000d3 pc: 0x00000000&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;pc: 0x00000000&amp;quot; is important. If the number is different, e.g.,&lt;br /&gt;
something like &amp;quot;pc: 0xffffffed&amp;quot;, the device is probably not turned&lt;br /&gt;
on. In this case, you can try to restart, or, if openocd is stuck,&lt;br /&gt;
&lt;br /&gt;
* kill openocd&lt;br /&gt;
* pull and then replace the USB plug of the JTAGkey or debug v2 board&lt;br /&gt;
* start openocd&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stages ===&lt;br /&gt;
&lt;br /&gt;
The setup process is divided into three stages (plus a special zero&lt;br /&gt;
stage, see below). Each stage leaves the device in a stable state.&lt;br /&gt;
An installation run can include all or only some stages. Each stage&lt;br /&gt;
requires successful completion of all previous ones.&lt;br /&gt;
&lt;br /&gt;
* Stage 1: erases all previous NAND content, installs u-boot, and makes the device ready to receive further updates by DFU.&lt;br /&gt;
* Stage 2: installs Linux and the root file system.&lt;br /&gt;
* Stage 3: To be defined.&lt;br /&gt;
&lt;br /&gt;
Note that you most likely require privileges for some of the USB&lt;br /&gt;
operations &amp;quot;devirginate&amp;quot; performs. Therefore, do all this as &amp;quot;root&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To perform all stages, run&lt;br /&gt;
 # ./devirginate&lt;br /&gt;
from the trunk/src/host/devirginator/ directory.&lt;br /&gt;
&lt;br /&gt;
To run only individual stages, specify the stage numbers, each prefixed&lt;br /&gt;
by &amp;quot;-&amp;quot;, e.g.,&lt;br /&gt;
 # ./devirginate -1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Stage 0 ====&lt;br /&gt;
&lt;br /&gt;
If the NAND bad block table is invalid, it can be erased at the beginning&lt;br /&gt;
of stage 1. We call this &amp;quot;stage 0&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In general, this is not a desirable option, because if the last NAND blocks&lt;br /&gt;
are defective, this information will be lost, and unreliable operation may&lt;br /&gt;
result. By default, stage 0 is not performed.&lt;br /&gt;
&lt;br /&gt;
==== Stage 1 ====&lt;br /&gt;
&lt;br /&gt;
Immediately after starting, the screen lights up, showing random junk.&lt;br /&gt;
This is an indication that the setup process has started. Note that the&lt;br /&gt;
screen content may change (&amp;quot;decay&amp;quot;) during all this. This is normal.&lt;br /&gt;
&lt;br /&gt;
After 10-30 seconds, the screen will go dark. This indicates that we&lt;br /&gt;
now a have u-boot running on the device.&lt;br /&gt;
&lt;br /&gt;
About 60-90 seconds later, the screen will light up again and show a&lt;br /&gt;
smiling face on a green background. This indicates that the first stage&lt;br /&gt;
has completed. The smiling face will appear each time you activate the&lt;br /&gt;
device.&lt;br /&gt;
&lt;br /&gt;
The device now contains:&lt;br /&gt;
* a bad block table (BBT)&lt;br /&gt;
* u-boot, with DFU capability&lt;br /&gt;
* a basic set of u-boot environment variables&lt;br /&gt;
* the interim splash screen&lt;br /&gt;
&lt;br /&gt;
What is still missing:&lt;br /&gt;
* the Linux kernel&lt;br /&gt;
* the root file system&lt;br /&gt;
* the final environment&lt;br /&gt;
* the final splash screen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Stage 2 ====&lt;br /&gt;
&lt;br /&gt;
To begin phase 2, activate the device. The stage 1 smiley will show.&lt;br /&gt;
&lt;br /&gt;
Phase 2 can take several minutes. Progress of the download procedure&lt;br /&gt;
is indicated by hash signs (#) printed on the terminal where&lt;br /&gt;
&amp;quot;devirginate&amp;quot; runs.&lt;br /&gt;
&lt;br /&gt;
At the end of phase 2, the device resets, displays a partial OpenMoko&lt;br /&gt;
splash screen, then resets again, displays the correct splash screen&lt;br /&gt;
and finally boots Linux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Stage 3 ====&lt;br /&gt;
&lt;br /&gt;
TBD.&lt;br /&gt;
&lt;br /&gt;
{{Languages|Devirginator}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer software]]&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Hardware:Neo1973:Alternate_Cases:Camera</id>
		<title>Hardware:Neo1973:Alternate Cases:Camera</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Hardware:Neo1973:Alternate_Cases:Camera"/>
				<updated>2007-07-30T17:59:56Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: Fixed table formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Alternate case for the Neo1973, with rear-mounted camera module.&lt;br /&gt;
&lt;br /&gt;
==Concept==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rendered images==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3D model==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Materials==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Processes==&lt;br /&gt;
Stereolithography&lt;br /&gt;
&lt;br /&gt;
==Components==&lt;br /&gt;
Camera module&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Interest==&lt;br /&gt;
Leave your nickname here if you are interested in having one made. This is not an order form, but is intended to gauge interest before effort is expended designing the case.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!No  !! Nick &lt;br /&gt;
|-&lt;br /&gt;
|1.     ||[[User:Bootlessjam|Bootlessjam]]&lt;br /&gt;
|-&lt;br /&gt;
|2.     ||[[User:Diatessaron|Diatessaron]]&lt;br /&gt;
|-&lt;br /&gt;
|3.     ||[[User:Thomas Mathiesen|Thomas Mathiesen]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Neo1973_alternate_cases]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Hammerhead/Protocol</id>
		<title>Hammerhead/Protocol</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Hammerhead/Protocol"/>
				<updated>2007-07-17T11:34:37Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Global packets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We have set up a SCM repository for experimental code and documentation at http://projects.linuxtogo.org/projects/sphyrna.&lt;br /&gt;
&lt;br /&gt;
Christian did some stracing on TomTom device, and result is great logs at http://www.maintech.de/download/hammerhead-strace.log . 'pH5' on IRC has put up some traces at http://linuxtogo.org/~ph5/tmp/gllin (a cold start, a hot start and a somewhat longer trace). He even has a software that can init and send command to phase-1 openmoko device in http://linuxtogo.org/~ph5/tmp/hhtest.c . (Please use strace -s9999 -x to produce traces).&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/GPS_signals GPS signals at wikipedia] seems to be required reading for very basics, along with  [http://www.colorado.edu/geography/gcraft/notes/gps/gps.html this page from University of Colorado] for more in depth stuff.&lt;br /&gt;
&lt;br /&gt;
http://home.earthlink.net/~cwkelley/ has sources for open-source GPS receiver, and &lt;br /&gt;
http://home.earthlink.net/~cwkelley/documentation.htm is its documentation.&lt;br /&gt;
&lt;br /&gt;
GP2021 is &amp;quot;dumb&amp;quot; GPS receiver, similar to hammerhead. (But I think it communicates over ISA bus, not over serial). However, its data sheets are freely available. Well, hammerhead marketing tells us that their GPS chip is something special, http://www.gpsworld.com/gpsworld/article/articleDetail.jsp?id=3053 . It seems to differ from &amp;quot;dumb&amp;quot; receivers by doing code phase search in hardware, directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Possible lock scheme that it may use ==&lt;br /&gt;
&lt;br /&gt;
From reading the published brief information sheets on global locates products, not the patents.&lt;br /&gt;
The global locate chip has massively parallel correlators, and configurable integrators to integrate over a given time.&lt;br /&gt;
I would expect it to do something like - in this case.&lt;br /&gt;
*Load orbit data from file (or download from net).&lt;br /&gt;
*Look at time.&lt;br /&gt;
*Get apriori position.&lt;br /&gt;
*Compute positions of satellites. Using apriori position, compute satellite visibility and relative speeds.&lt;br /&gt;
*Init the GPS.&lt;br /&gt;
*Set the hardware to expect to receive from the  set of visible satellites (the hardware is unlikely to be designed to receive them all at once, as you'll never see more than around 16 of the nominal 32).&lt;br /&gt;
*Set the integration time at 10ms-20ms or so - around, or a bit under a data bit.&lt;br /&gt;
*Now, read back the outputs of the integrators, to see if we've got possible data (carrier lock?).&lt;br /&gt;
*If we do have data, spend a bit of time working out the exact relative phase of the PRN with regard to the carrier - each 'chip' of the PRN is around a thousand cycles of the carrier - you need to work this out exactly to get psuedoranges with a resolution of under a meter.&lt;br /&gt;
**it's possible this is done in hardware&lt;br /&gt;
*Now that we've got all the satellites locked in the hardware, simply interrogate the hardware regularly, so that we can read out the 50bps datastream from each satellite.&lt;br /&gt;
**It seems this step takes 19s or so. From the first timestamp in the file, to the first GPGSV line - satellites in view, and their actual signal strengths.&lt;br /&gt;
*Read the navigation messages from each satellite, which cycles every 6 seconds.&lt;br /&gt;
*Compute a position.&lt;br /&gt;
*Output it to NMEA&lt;br /&gt;
** It seems this takes 22 seconds.&lt;br /&gt;
&lt;br /&gt;
== Enhancements ==&lt;br /&gt;
&lt;br /&gt;
To keep to the datasheet of 1s position times, it cannot read the whole navigation message, but significantly under 50 bits of it.&lt;br /&gt;
It must:&lt;br /&gt;
*Use 'AGPS' data to initialise the hardware to a condition where it can get a rapid lock - perhaps telling it the Doppler - then compute what the navigation message from each satellite may be, based on the internal clock.&lt;br /&gt;
*Work out at what point in this navigation message the 20-30 bits that it's received come. &lt;br /&gt;
*Compute the time that was in the navigation message, though it may not have picked it up (from the internal clock) and add it to the information on where the bit edges are from the hardware.&lt;br /&gt;
**If the uncertainty in relative time - due to local clock drift and movement of the GPS device - is under 10ms, then you know immediately as you detect the satellite signal the current satellite time - you simply snap the time to the nearest bit-edge, letting you immediately compute a position, without waiting for more data.&lt;br /&gt;
***With typical crystal accuracy, this implies you need to take a position every 3 minutes or so in order to keep the clock set correctly enough for this to work.&lt;br /&gt;
**This gives you a psuedorange to the satellite to within several meters. &lt;br /&gt;
*Compute a position.&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
Looks like there were 8 satellites overhead at the time that log was made.&lt;br /&gt;
&lt;br /&gt;
The protocol appears to be oriented around 32-bit words (the single-byte markers notwithstanding.) LSB-first, as can be seen on negative numbers.&lt;br /&gt;
&lt;br /&gt;
The first stream of 0x80's to the GPS is simply to synch up the UART in the GPS to the correct baudrate.&lt;br /&gt;
&lt;br /&gt;
=== Packet format ===&lt;br /&gt;
Packet format (same format in both directions):&lt;br /&gt;
* The start of a packet is marked by FF or FE.&lt;br /&gt;
** FF in packets that do not carry data, but rather explicitly request a response.  (This isn't used very often.  More often we receive data without explicitly requesting it.)  The response will be an FE-packet with the same length and type as the FF-packet.  The GPS does not send any FF packets, only gltt does.&lt;br /&gt;
** FE in packets that carry data sections.&lt;br /&gt;
* The first word (32 bits) following the start-of-packet marker is the header.&lt;br /&gt;
** The first byte (if it's indeed little-endian, the least significant byte) gives the data length, measured as ''the number of data words minus 1.''  For FE-packets, this is the length of the data section of this packet.  For FF-packets, it's the length of the data section in the expected response.&lt;br /&gt;
** The second byte of the header is always FD.&lt;br /&gt;
** MS nibble of the third byte might be flags for the packet.&lt;br /&gt;
*** 0x4 set: The words are for increasing register numbers&lt;br /&gt;
*** 0x4 not set: The words are for/from the same register. The register is probably something like a FIFO&lt;br /&gt;
** LS nibble of the third byte is an identifying number of the channel (1-8), 0 in case this is not channel-specific&lt;br /&gt;
** The fourth byte is the packet type. It seems to be more like a register (start) number.&lt;br /&gt;
* In FE-packets only, the data section (''n'' 32-bit words) follows.&lt;br /&gt;
* Finally, FC is sent to mark the end of the packet.&lt;br /&gt;
* After the FC in an FF-packet, gltt sends a bunch of zeros.  In some cases it sends a number of zeros equal to the number of bytes in the response packet; in some cases it sends more.  I would guess that these have no effect.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 ff 04fdc00c fc&lt;br /&gt;
(possibly followed by zeros), is a request for a packet of type 0C, with length 20d ((4 + 1) * 4), and flags C0.&lt;br /&gt;
&lt;br /&gt;
 fe 04fdc00c 0025102a 45dbdd4e 36030000 4b260000 16010000 fc&lt;br /&gt;
would be an appropriate response.&lt;br /&gt;
&lt;br /&gt;
=== Packet statistics ===&lt;br /&gt;
====Packet types====&lt;br /&gt;
&lt;br /&gt;
(Ugh, I do not understand this. Is it SEND or RECEIVED packets? [[User:Pavel|Pavel]] 22:26, 6 May 2007 (CEST))&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| Frequency || Type || Max length || Min length&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 16 || 73 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 86 || 08 || 19 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 8 || e2 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 23 || 133 || 101&lt;br /&gt;
|-&lt;br /&gt;
| 63 || 0a || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 24 || 71 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 52 || 0b || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 01 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 263 || 05 || 19 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 24 || 9d || 315 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 06 || 25 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 16 || e0 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 20 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 10 || 577 || 59&lt;br /&gt;
|-&lt;br /&gt;
| 128 || 18 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 9e || 303 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 117 || 00 || 65 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 11 || 0c || 33 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 9f || 477 || 61&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 0e || 541 || 31&lt;br /&gt;
|-&lt;br /&gt;
| 1 || e5 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 80 || 17 || 17&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 13 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 04 || 23 || 23&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 02 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Analysis of FF packets====&lt;br /&gt;
found in [http://linuxtogo.org/~ph5/tmp/gllin/cold1.log.gz cold1.log.gz] (gz archive seems to be incomplete).&lt;br /&gt;
&amp;quot;Reply packet length&amp;quot; (RPL) reported as raw value seen in packet.&lt;br /&gt;
Total packets: 61.&lt;br /&gt;
Unique packets: 10.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Frequency !! Type !! RPL !! Flags !!  Channels&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 00 || 0c || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 06 || 02 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0c || 04 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0e || 05 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:2, (CH:4)*4, CH:5&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 16 || 00 || 8 || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 49 || 23 || 07 || 8 || (CH:2)*12, (CH:4)*17, (CH:5)*20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Global packets ===&lt;br /&gt;
&lt;br /&gt;
All packets in this category have the &amp;quot;channel&amp;quot; (or &amp;quot;ID&amp;quot;) field set to 0.&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 02 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
Seen only once per session at the start, during init.&lt;br /&gt;
This packet is identical in cold1.log and cold2.log&lt;br /&gt;
Comes right after SEND TYPE:04.&lt;br /&gt;
&lt;br /&gt;
Usual layout:&lt;br /&gt;
&lt;br /&gt;
 SEND: L:00 CH:0 FL:4 TYPE:02  00 10 01 00&lt;br /&gt;
&lt;br /&gt;
Possibly, some kind of bitfield/flag.&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 04 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
In cold2.log this packet comes only once at the start.&lt;br /&gt;
Part of this packet seems to setup the timestamp clock (see packet 16).&lt;br /&gt;
&lt;br /&gt;
Usual layout:&lt;br /&gt;
&lt;br /&gt;
 SEND: L:03 CH:0 FL:4 TYPE:04  92 24 11 02  7b 39 8e 23  00 00 00 00  7b 39 8e 23&lt;br /&gt;
&lt;br /&gt;
Word 2 and 4 (both are 0x238e397b = 596523387) seem to control the timestamp clock. Multipliying this value by say 0.99 makes the timestamp clock run at 0.99 its normal speed. So this value is some sort of &amp;quot;frequency&amp;quot;. This packet is identical in cold1.log and cold2.log&lt;br /&gt;
&lt;br /&gt;
==== SEND Register/Packet 08 ====&lt;br /&gt;
&lt;br /&gt;
One 32 bit word bitmask&lt;br /&gt;
&lt;br /&gt;
* 0x4 resets the timestamp clock to 0. (putting a 0x4 will reset the clock. The bit is self-resetting to 0. This only works, if 0x2000 is set at the same time.&lt;br /&gt;
* 0x40: Unknown&lt;br /&gt;
* 0x2000 lets the timstamp clock (See 16) run. One can start and stop it using this bit.&lt;br /&gt;
* 0x4000 triggers a measurement on channels, that have been setup. This needs an edge, so you have to unset and then set this bit.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0c ====&lt;br /&gt;
&lt;br /&gt;
Flags = 0&lt;br /&gt;
&lt;br /&gt;
Is global -- not about particular sattelite, probably fixed length and rare.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 13 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
Seen only once per session at the start, during init.&lt;br /&gt;
This packet is identical in cold1.log and cold2.log&lt;br /&gt;
Comes right after SEND TYPE:02.&lt;br /&gt;
&lt;br /&gt;
Usual layout:&lt;br /&gt;
&lt;br /&gt;
 SEND: L:00 CH:0 FL:4 TYPE:13  ef cd 21 43&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 16 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 8;&lt;br /&gt;
Comes only after request for it.&lt;br /&gt;
&lt;br /&gt;
The chip seems to have an internal 1ms clock. This returns the counter for this clock. 1ms is also period of C/A PRN code.&lt;br /&gt;
&lt;br /&gt;
It seems, that the clock can be widely tuned (probably using divider or so): At least I saw 1000 ticks and 2000 ticks per second.&lt;br /&gt;
&lt;br /&gt;
CMD-04 and CMd-08 seem to be needed to init and start it.&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet e5 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
Seen only once per session at the start, during init.&lt;br /&gt;
This packet is identical in cold1.log and cold2.log&lt;br /&gt;
Comes right after SEND TYPE:13.&lt;br /&gt;
&lt;br /&gt;
Usual layout:&lt;br /&gt;
&lt;br /&gt;
 SEND: L:00 CH:0 FL:4 TYPE:e5  00 03 00 00&lt;br /&gt;
&lt;br /&gt;
Possibly, some kind of bitfield/flag.&lt;br /&gt;
&lt;br /&gt;
=== Satelite / channel specific packets ===&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 00 ====&lt;br /&gt;
&lt;br /&gt;
Packet type 00 (with the exception of the very first FE-packet in the log) appears to specify a particular satellite to track.  It also seems that this specifies the &amp;quot;ID&amp;quot; field (LS nibble of the third header byte) that will be used for future packets concerning this satellite.  (Non-satellite-specific packets have ID=0.)&lt;br /&gt;
&lt;br /&gt;
Bits 3-7 of the 11th byte of the packet -- third byte of the third data word -- are the satellite PRN number.  In this log only 8 satellites appear to be tracked (2, 4, 8, 10, 13, 23, 27, 29).  If I'm reading the GPGSV messages correctly, 24 should also be visible, but it doesn't appear gltt even attempts to track it.&lt;br /&gt;
&lt;br /&gt;
As for the rest of the packet... There's a lot that gets repeated, information common to all the satellites, at least initially.  When a batch of 8 of these packets gets sent, usually only the PRN and two other words differ among the 8.  So those two words contain whatever satellite-specific info is needed, it seems.  They both appear to be little-endian integers, one around -10^8 and one around 10^8.&lt;br /&gt;
&lt;br /&gt;
(Info needed to search for sattelite... doppler frequency range and phase range is useful).&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 10 ====&lt;br /&gt;
&lt;br /&gt;
Last four bytes are the little endian timestamp, in miliseconds. (Ok, it may actually be number of frames or something on that particular channel).&lt;br /&gt;
&lt;br /&gt;
Packet length is constant (always 16 bytes.)&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 23 ====&lt;br /&gt;
&lt;br /&gt;
It carries variable-length array of  16-bit integers... 6 to 32 entries were seen.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 06, 08 ====&lt;br /&gt;
&lt;br /&gt;
short packets, 06 has varying length, and both are rare.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9d ====&lt;br /&gt;
&lt;br /&gt;
Okay, so packets 10, 23 and 9d come in groups, for each sattelite, and they seem to contain enough info to compute position.  (9d seems to come later than the other two, perhaps only after sending a packet 08?)&lt;br /&gt;
&lt;br /&gt;
Packet 9d seems to contain 2 32-bit integers (second one is  signed), then 3, 0, 0 and flags (?) -- so the packet length is constant.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 24 bytes.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 8 bytes.  Satellite-specific.  First 4 bytes are a signed 32-bit integer.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9f ====&lt;br /&gt;
&lt;br /&gt;
Comes in variants of differing lengths: 20, 36, and 84-byte packets were seen.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
== NMEA ==&lt;br /&gt;
&lt;br /&gt;
It is possible to translate NMEA messages into something readable using script from http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hhdecode , and using c decoder http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hh.c .&lt;br /&gt;
&lt;br /&gt;
NMEA description is available at http://www.gpsinformation.org/dale/nmea.htm .&lt;br /&gt;
&lt;br /&gt;
At this point:&lt;br /&gt;
&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x47\x41\x2c\x31\x35\x34\x31\x30\x34\x2e\x39\x35\x2c\x34\x39\x34\x38\x2e\x39\x35\x30\x33\x33\x39\x2c\x4e\x2c\x30\x30\x39\x35\x37\x2e\x39\x35\x35\x39\x37\x39\x2c\x45\x2c\x31\x2c\x30\x36\x2c\x35\x2e\x30\x2c\x32\x32\x30\x2e\x30\x2c\x4d\x2c\x2d\x30\x2e\x35\x38\x31\x30\x31\x34\x2c\x4d\x2c\x2d\x30\x2e\x31\x39\x30\x30\x31\x39\x30\x2c\x2a\x34\x30\x0d\x0a&amp;quot;, 91) = 91&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
&amp;quot;, 91) = 91&lt;br /&gt;
&lt;br /&gt;
...6 satelitte GPS fix was obtained. (And yes, there's big read few lines before that in the log). &lt;br /&gt;
&lt;br /&gt;
GSA sentence looks interesting, too. It tells us satellites #02, #04, #08, #10, #13 and #27 were used at this point.&lt;br /&gt;
&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x53\x41\x2c\x41\x2c\x33\x2c\x30\x32\x2c\x30\x34\x2c\x30\x38\x2c\x31\x30\x2c\x31\x33\x2c\x32\x37\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x36\x2e\x37\x2c\x33\x2e\x30\x2c\x36\x2e\x30\x2a\x33\x45\x0d\x0a&amp;quot;, 51) = 51&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The whole log is&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$GPGGA,154035.21,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6A&lt;br /&gt;
$GPRMC,154035.24,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154035.61,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6E&lt;br /&gt;
$GPRMC,154035.63,V,,,,,,,240407,,*19&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154038.24,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4B&lt;br /&gt;
$GPRMC,154038.29,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154038.54,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4C&lt;br /&gt;
$GPRMC,154038.56,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154042.72,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*46&lt;br /&gt;
$GPRMC,154042.74,V,,,,,,,240407,,*1F&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,33,10,46,302,33,02,33,244,34*7E&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,33,13,42,076,25,29,11,271,29,24,243,352,*49&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154043.67,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*43&lt;br /&gt;
$GPRMC,154043.69,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154046.89,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154046.93,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154047.14,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*42&lt;br /&gt;
$GPRMC,154047.19,V,,,,,,,240407,,*11&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154050.07,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154050.10,V,,,,,,,240407,,*1E&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154050.45,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*41&lt;br /&gt;
$GPRMC,154050.47,V,,,,,,,240407,,*1C&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,26,10,46,302,25,13,42,076,16*78&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,26,04,18,206,25,29,11,271,25,24,243,352,*44&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154053.35,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*45&lt;br /&gt;
$GPRMC,154053.37,V,,,,,,,240407,,*18&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154058.70,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*49&lt;br /&gt;
$GPRMC,154058.72,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154058.97,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*40&lt;br /&gt;
$GPRMC,154058.98,V,,,,,,,240407,,*16&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154059.38,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*44&lt;br /&gt;
$GPRMC,154059.40,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,13,,,,,,,,,,,669.0,300.0,600.0*3C&lt;br /&gt;
$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
$GPRMC,154104.95,A,4948.950339,N,00957.955979,E,000.0,000.0,240407,,*3E&lt;br /&gt;
$GPGSV,3,1,09,08,59,192,42,10,46,302,42,04,18,206,41,27,77,114,16*74&lt;br /&gt;
$GPGSV,3,2,09,13,42,076,18,02,33,244,18,29,11,271,40,24,243,352,*48&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,04,08,10,,,,,,,,,,11.2,5.0,10.0*39&lt;br /&gt;
$GPGGA,154106.52,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.581025,M,-0.1900190,*4A&lt;br /&gt;
$GPRMC,154111.60,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154122.94,,,,,00,06,3.0,,M,-0.581010,M,-0.1900190,*62&lt;br /&gt;
$GPRMC,154122.96,V,,,,,,,240407,,*14&lt;br /&gt;
$GPGSA,A,1,13,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
$GPGGA,154119.10,4948.936977,N,00957.930742,E,1,05,3.0,245.0,M,-0.576004,M,-0.1870190,*4D&lt;br /&gt;
$GPRMC,154119.10,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3A&lt;br /&gt;
$GPGSA,A,3,04,08,10,27,,,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154128.15,4948.936977,N,00957.930742,E,1,06,5.0,245.0,M,-0.587003,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154128.15,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3D&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,22,08,59,192,39,10,46,302,39,02,33,244,40*7B&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,38,13,42,076,11,24,243,352,,23,14,085,*48&lt;br /&gt;
$GPGSV,3,3,09,29,11,271,*4F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,11.2,5.0,10.0*3E&lt;br /&gt;
$GPGGA,154131.86,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578004,M,-0.1860190,*44&lt;br /&gt;
$GPRMC,154131.86,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154138.55,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578000,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154138.55,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*38&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154141.69,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.583002,M,-0.1840190,*42&lt;br /&gt;
$GPRMC,154141.69,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*39&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154146.16,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.595000,M,-0.1830190,*4F&lt;br /&gt;
$GPRMC,154146.16,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*36&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154151.34,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*4D&lt;br /&gt;
$GPRMC,154151.34,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*30&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,26,08,59,192,42,10,46,302,41,13,42,076,25*7A&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,42,04,18,206,37,29,11,271,37,24,243,352,*46&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154200.05,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*48&lt;br /&gt;
$GPRMC,154200.05,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:GPS]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Hammerhead/Protocol</id>
		<title>Hammerhead/Protocol</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Hammerhead/Protocol"/>
				<updated>2007-07-17T11:19:43Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Global packets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We have set up a SCM repository for experimental code and documentation at http://projects.linuxtogo.org/projects/sphyrna.&lt;br /&gt;
&lt;br /&gt;
Christian did some stracing on TomTom device, and result is great logs at http://www.maintech.de/download/hammerhead-strace.log . 'pH5' on IRC has put up some traces at http://linuxtogo.org/~ph5/tmp/gllin (a cold start, a hot start and a somewhat longer trace). He even has a software that can init and send command to phase-1 openmoko device in http://linuxtogo.org/~ph5/tmp/hhtest.c . (Please use strace -s9999 -x to produce traces).&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/GPS_signals GPS signals at wikipedia] seems to be required reading for very basics, along with  [http://www.colorado.edu/geography/gcraft/notes/gps/gps.html this page from University of Colorado] for more in depth stuff.&lt;br /&gt;
&lt;br /&gt;
http://home.earthlink.net/~cwkelley/ has sources for open-source GPS receiver, and &lt;br /&gt;
http://home.earthlink.net/~cwkelley/documentation.htm is its documentation.&lt;br /&gt;
&lt;br /&gt;
GP2021 is &amp;quot;dumb&amp;quot; GPS receiver, similar to hammerhead. (But I think it communicates over ISA bus, not over serial). However, its data sheets are freely available. Well, hammerhead marketing tells us that their GPS chip is something special, http://www.gpsworld.com/gpsworld/article/articleDetail.jsp?id=3053 . It seems to differ from &amp;quot;dumb&amp;quot; receivers by doing code phase search in hardware, directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Possible lock scheme that it may use ==&lt;br /&gt;
&lt;br /&gt;
From reading the published brief information sheets on global locates products, not the patents.&lt;br /&gt;
The global locate chip has massively parallel correlators, and configurable integrators to integrate over a given time.&lt;br /&gt;
I would expect it to do something like - in this case.&lt;br /&gt;
*Load orbit data from file (or download from net).&lt;br /&gt;
*Look at time.&lt;br /&gt;
*Get apriori position.&lt;br /&gt;
*Compute positions of satellites. Using apriori position, compute satellite visibility and relative speeds.&lt;br /&gt;
*Init the GPS.&lt;br /&gt;
*Set the hardware to expect to receive from the  set of visible satellites (the hardware is unlikely to be designed to receive them all at once, as you'll never see more than around 16 of the nominal 32).&lt;br /&gt;
*Set the integration time at 10ms-20ms or so - around, or a bit under a data bit.&lt;br /&gt;
*Now, read back the outputs of the integrators, to see if we've got possible data (carrier lock?).&lt;br /&gt;
*If we do have data, spend a bit of time working out the exact relative phase of the PRN with regard to the carrier - each 'chip' of the PRN is around a thousand cycles of the carrier - you need to work this out exactly to get psuedoranges with a resolution of under a meter.&lt;br /&gt;
**it's possible this is done in hardware&lt;br /&gt;
*Now that we've got all the satellites locked in the hardware, simply interrogate the hardware regularly, so that we can read out the 50bps datastream from each satellite.&lt;br /&gt;
**It seems this step takes 19s or so. From the first timestamp in the file, to the first GPGSV line - satellites in view, and their actual signal strengths.&lt;br /&gt;
*Read the navigation messages from each satellite, which cycles every 6 seconds.&lt;br /&gt;
*Compute a position.&lt;br /&gt;
*Output it to NMEA&lt;br /&gt;
** It seems this takes 22 seconds.&lt;br /&gt;
&lt;br /&gt;
== Enhancements ==&lt;br /&gt;
&lt;br /&gt;
To keep to the datasheet of 1s position times, it cannot read the whole navigation message, but significantly under 50 bits of it.&lt;br /&gt;
It must:&lt;br /&gt;
*Use 'AGPS' data to initialise the hardware to a condition where it can get a rapid lock - perhaps telling it the Doppler - then compute what the navigation message from each satellite may be, based on the internal clock.&lt;br /&gt;
*Work out at what point in this navigation message the 20-30 bits that it's received come. &lt;br /&gt;
*Compute the time that was in the navigation message, though it may not have picked it up (from the internal clock) and add it to the information on where the bit edges are from the hardware.&lt;br /&gt;
**If the uncertainty in relative time - due to local clock drift and movement of the GPS device - is under 10ms, then you know immediately as you detect the satellite signal the current satellite time - you simply snap the time to the nearest bit-edge, letting you immediately compute a position, without waiting for more data.&lt;br /&gt;
***With typical crystal accuracy, this implies you need to take a position every 3 minutes or so in order to keep the clock set correctly enough for this to work.&lt;br /&gt;
**This gives you a psuedorange to the satellite to within several meters. &lt;br /&gt;
*Compute a position.&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
Looks like there were 8 satellites overhead at the time that log was made.&lt;br /&gt;
&lt;br /&gt;
The protocol appears to be oriented around 32-bit words (the single-byte markers notwithstanding.) LSB-first, as can be seen on negative numbers.&lt;br /&gt;
&lt;br /&gt;
The first stream of 0x80's to the GPS is simply to synch up the UART in the GPS to the correct baudrate.&lt;br /&gt;
&lt;br /&gt;
=== Packet format ===&lt;br /&gt;
Packet format (same format in both directions):&lt;br /&gt;
* The start of a packet is marked by FF or FE.&lt;br /&gt;
** FF in packets that do not carry data, but rather explicitly request a response.  (This isn't used very often.  More often we receive data without explicitly requesting it.)  The response will be an FE-packet with the same length and type as the FF-packet.  The GPS does not send any FF packets, only gltt does.&lt;br /&gt;
** FE in packets that carry data sections.&lt;br /&gt;
* The first word (32 bits) following the start-of-packet marker is the header.&lt;br /&gt;
** The first byte (if it's indeed little-endian, the least significant byte) gives the data length, measured as ''the number of data words minus 1.''  For FE-packets, this is the length of the data section of this packet.  For FF-packets, it's the length of the data section in the expected response.&lt;br /&gt;
** The second byte of the header is always FD.&lt;br /&gt;
** MS nibble of the third byte might be flags for the packet.&lt;br /&gt;
*** 0x4 set: The words are for increasing register numbers&lt;br /&gt;
*** 0x4 not set: The words are for/from the same register. The register is probably something like a FIFO&lt;br /&gt;
** LS nibble of the third byte is an identifying number of the channel (1-8), 0 in case this is not channel-specific&lt;br /&gt;
** The fourth byte is the packet type. It seems to be more like a register (start) number.&lt;br /&gt;
* In FE-packets only, the data section (''n'' 32-bit words) follows.&lt;br /&gt;
* Finally, FC is sent to mark the end of the packet.&lt;br /&gt;
* After the FC in an FF-packet, gltt sends a bunch of zeros.  In some cases it sends a number of zeros equal to the number of bytes in the response packet; in some cases it sends more.  I would guess that these have no effect.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 ff 04fdc00c fc&lt;br /&gt;
(possibly followed by zeros), is a request for a packet of type 0C, with length 20d ((4 + 1) * 4), and flags C0.&lt;br /&gt;
&lt;br /&gt;
 fe 04fdc00c 0025102a 45dbdd4e 36030000 4b260000 16010000 fc&lt;br /&gt;
would be an appropriate response.&lt;br /&gt;
&lt;br /&gt;
=== Packet statistics ===&lt;br /&gt;
====Packet types====&lt;br /&gt;
&lt;br /&gt;
(Ugh, I do not understand this. Is it SEND or RECEIVED packets? [[User:Pavel|Pavel]] 22:26, 6 May 2007 (CEST))&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| Frequency || Type || Max length || Min length&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 16 || 73 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 86 || 08 || 19 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 8 || e2 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 23 || 133 || 101&lt;br /&gt;
|-&lt;br /&gt;
| 63 || 0a || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 24 || 71 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 52 || 0b || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 01 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 263 || 05 || 19 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 24 || 9d || 315 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 06 || 25 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 16 || e0 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 20 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 10 || 577 || 59&lt;br /&gt;
|-&lt;br /&gt;
| 128 || 18 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 9e || 303 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 117 || 00 || 65 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 11 || 0c || 33 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 9f || 477 || 61&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 0e || 541 || 31&lt;br /&gt;
|-&lt;br /&gt;
| 1 || e5 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 80 || 17 || 17&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 13 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 04 || 23 || 23&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 02 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Analysis of FF packets====&lt;br /&gt;
found in [http://linuxtogo.org/~ph5/tmp/gllin/cold1.log.gz cold1.log.gz] (gz archive seems to be incomplete).&lt;br /&gt;
&amp;quot;Reply packet length&amp;quot; (RPL) reported as raw value seen in packet.&lt;br /&gt;
Total packets: 61.&lt;br /&gt;
Unique packets: 10.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Frequency !! Type !! RPL !! Flags !!  Channels&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 00 || 0c || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 06 || 02 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0c || 04 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0e || 05 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:2, (CH:4)*4, CH:5&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 16 || 00 || 8 || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 49 || 23 || 07 || 8 || (CH:2)*12, (CH:4)*17, (CH:5)*20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Global packets ===&lt;br /&gt;
&lt;br /&gt;
All packets in this category have the &amp;quot;channel&amp;quot; (or &amp;quot;ID&amp;quot;) field set to 0.&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 02 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
Seen only once per session at the start, during init.&lt;br /&gt;
This packet is identical in cold1.log and cold2.log&lt;br /&gt;
Comes right after SEND TYPE:04.&lt;br /&gt;
&lt;br /&gt;
Usual layout:&lt;br /&gt;
&lt;br /&gt;
 SEND: L:00 CH:0 FL:4 TYPE:02  00 10 01 00&lt;br /&gt;
&lt;br /&gt;
Possibly, some kind of bitfield/flag.&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 04 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
In cold2.log this packet comes only once at the start.&lt;br /&gt;
Part of this packet seems to setup the timestamp clock (see packet 16).&lt;br /&gt;
&lt;br /&gt;
Usual layout:&lt;br /&gt;
&lt;br /&gt;
 SEND: L:03 CH:0 FL:4 TYPE:04  92 24 11 02  7b 39 8e 23  00 00 00 00  7b 39 8e 23&lt;br /&gt;
&lt;br /&gt;
Word 2 and 4 (both are 0x238e397b = 596523387) seem to control the timestamp clock. Multipliying this value by say 0.99 makes the timestamp clock run at 0.99 its normal speed. So this value is some sort of &amp;quot;frequency&amp;quot;. This packet is identical in cold1.log and cold2.log&lt;br /&gt;
&lt;br /&gt;
==== SEND Register/Packet 08 ====&lt;br /&gt;
&lt;br /&gt;
One 32 bit word bitmask&lt;br /&gt;
&lt;br /&gt;
* 0x4 resets the timestamp clock to 0. (putting a 0x4 will reset the clock. The bit is self-resetting to 0. This only works, if 0x2000 is set at the same time.&lt;br /&gt;
* 0x40: Unknown&lt;br /&gt;
* 0x2000 lets the timstamp clock (See 16) run. One can start and stop it using this bit.&lt;br /&gt;
* 0x4000 triggers a measurement on channels, that have been setup. This needs an edge, so you have to unset and then set this bit.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0c ====&lt;br /&gt;
&lt;br /&gt;
Flags = 0&lt;br /&gt;
&lt;br /&gt;
Is global -- not about particular sattelite, probably fixed length and rare.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 13 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
Seen only once per session at the start, during init.&lt;br /&gt;
This packet is identical in cold1.log and cold2.log&lt;br /&gt;
Comes right after SEND TYPE:02.&lt;br /&gt;
&lt;br /&gt;
Usual layout:&lt;br /&gt;
&lt;br /&gt;
 SEND: L:00 CH:0 FL:4 TYPE:13  ef cd 21 43&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 16 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 8;&lt;br /&gt;
Comes only after request for it.&lt;br /&gt;
&lt;br /&gt;
The chip seems to have an internal 1ms clock. This returns the counter for this clock. 1ms is also period of C/A PRN code.&lt;br /&gt;
&lt;br /&gt;
It seems, that the clock can be widely tuned (probably using divider or so): At least I saw 1000 ticks and 2000 ticks per second.&lt;br /&gt;
&lt;br /&gt;
CMD-04 and CMd-08 seem to be needed to init and start it.&lt;br /&gt;
&lt;br /&gt;
=== Satelite / channel specific packets ===&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 00 ====&lt;br /&gt;
&lt;br /&gt;
Packet type 00 (with the exception of the very first FE-packet in the log) appears to specify a particular satellite to track.  It also seems that this specifies the &amp;quot;ID&amp;quot; field (LS nibble of the third header byte) that will be used for future packets concerning this satellite.  (Non-satellite-specific packets have ID=0.)&lt;br /&gt;
&lt;br /&gt;
Bits 3-7 of the 11th byte of the packet -- third byte of the third data word -- are the satellite PRN number.  In this log only 8 satellites appear to be tracked (2, 4, 8, 10, 13, 23, 27, 29).  If I'm reading the GPGSV messages correctly, 24 should also be visible, but it doesn't appear gltt even attempts to track it.&lt;br /&gt;
&lt;br /&gt;
As for the rest of the packet... There's a lot that gets repeated, information common to all the satellites, at least initially.  When a batch of 8 of these packets gets sent, usually only the PRN and two other words differ among the 8.  So those two words contain whatever satellite-specific info is needed, it seems.  They both appear to be little-endian integers, one around -10^8 and one around 10^8.&lt;br /&gt;
&lt;br /&gt;
(Info needed to search for sattelite... doppler frequency range and phase range is useful).&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 10 ====&lt;br /&gt;
&lt;br /&gt;
Last four bytes are the little endian timestamp, in miliseconds. (Ok, it may actually be number of frames or something on that particular channel).&lt;br /&gt;
&lt;br /&gt;
Packet length is constant (always 16 bytes.)&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 23 ====&lt;br /&gt;
&lt;br /&gt;
It carries variable-length array of  16-bit integers... 6 to 32 entries were seen.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 06, 08 ====&lt;br /&gt;
&lt;br /&gt;
short packets, 06 has varying length, and both are rare.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9d ====&lt;br /&gt;
&lt;br /&gt;
Okay, so packets 10, 23 and 9d come in groups, for each sattelite, and they seem to contain enough info to compute position.  (9d seems to come later than the other two, perhaps only after sending a packet 08?)&lt;br /&gt;
&lt;br /&gt;
Packet 9d seems to contain 2 32-bit integers (second one is  signed), then 3, 0, 0 and flags (?) -- so the packet length is constant.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 24 bytes.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 8 bytes.  Satellite-specific.  First 4 bytes are a signed 32-bit integer.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9f ====&lt;br /&gt;
&lt;br /&gt;
Comes in variants of differing lengths: 20, 36, and 84-byte packets were seen.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
== NMEA ==&lt;br /&gt;
&lt;br /&gt;
It is possible to translate NMEA messages into something readable using script from http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hhdecode , and using c decoder http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hh.c .&lt;br /&gt;
&lt;br /&gt;
NMEA description is available at http://www.gpsinformation.org/dale/nmea.htm .&lt;br /&gt;
&lt;br /&gt;
At this point:&lt;br /&gt;
&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x47\x41\x2c\x31\x35\x34\x31\x30\x34\x2e\x39\x35\x2c\x34\x39\x34\x38\x2e\x39\x35\x30\x33\x33\x39\x2c\x4e\x2c\x30\x30\x39\x35\x37\x2e\x39\x35\x35\x39\x37\x39\x2c\x45\x2c\x31\x2c\x30\x36\x2c\x35\x2e\x30\x2c\x32\x32\x30\x2e\x30\x2c\x4d\x2c\x2d\x30\x2e\x35\x38\x31\x30\x31\x34\x2c\x4d\x2c\x2d\x30\x2e\x31\x39\x30\x30\x31\x39\x30\x2c\x2a\x34\x30\x0d\x0a&amp;quot;, 91) = 91&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
&amp;quot;, 91) = 91&lt;br /&gt;
&lt;br /&gt;
...6 satelitte GPS fix was obtained. (And yes, there's big read few lines before that in the log). &lt;br /&gt;
&lt;br /&gt;
GSA sentence looks interesting, too. It tells us satellites #02, #04, #08, #10, #13 and #27 were used at this point.&lt;br /&gt;
&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x53\x41\x2c\x41\x2c\x33\x2c\x30\x32\x2c\x30\x34\x2c\x30\x38\x2c\x31\x30\x2c\x31\x33\x2c\x32\x37\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x36\x2e\x37\x2c\x33\x2e\x30\x2c\x36\x2e\x30\x2a\x33\x45\x0d\x0a&amp;quot;, 51) = 51&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The whole log is&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$GPGGA,154035.21,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6A&lt;br /&gt;
$GPRMC,154035.24,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154035.61,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6E&lt;br /&gt;
$GPRMC,154035.63,V,,,,,,,240407,,*19&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154038.24,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4B&lt;br /&gt;
$GPRMC,154038.29,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154038.54,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4C&lt;br /&gt;
$GPRMC,154038.56,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154042.72,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*46&lt;br /&gt;
$GPRMC,154042.74,V,,,,,,,240407,,*1F&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,33,10,46,302,33,02,33,244,34*7E&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,33,13,42,076,25,29,11,271,29,24,243,352,*49&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154043.67,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*43&lt;br /&gt;
$GPRMC,154043.69,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154046.89,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154046.93,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154047.14,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*42&lt;br /&gt;
$GPRMC,154047.19,V,,,,,,,240407,,*11&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154050.07,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154050.10,V,,,,,,,240407,,*1E&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154050.45,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*41&lt;br /&gt;
$GPRMC,154050.47,V,,,,,,,240407,,*1C&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,26,10,46,302,25,13,42,076,16*78&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,26,04,18,206,25,29,11,271,25,24,243,352,*44&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154053.35,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*45&lt;br /&gt;
$GPRMC,154053.37,V,,,,,,,240407,,*18&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154058.70,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*49&lt;br /&gt;
$GPRMC,154058.72,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154058.97,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*40&lt;br /&gt;
$GPRMC,154058.98,V,,,,,,,240407,,*16&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154059.38,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*44&lt;br /&gt;
$GPRMC,154059.40,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,13,,,,,,,,,,,669.0,300.0,600.0*3C&lt;br /&gt;
$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
$GPRMC,154104.95,A,4948.950339,N,00957.955979,E,000.0,000.0,240407,,*3E&lt;br /&gt;
$GPGSV,3,1,09,08,59,192,42,10,46,302,42,04,18,206,41,27,77,114,16*74&lt;br /&gt;
$GPGSV,3,2,09,13,42,076,18,02,33,244,18,29,11,271,40,24,243,352,*48&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,04,08,10,,,,,,,,,,11.2,5.0,10.0*39&lt;br /&gt;
$GPGGA,154106.52,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.581025,M,-0.1900190,*4A&lt;br /&gt;
$GPRMC,154111.60,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154122.94,,,,,00,06,3.0,,M,-0.581010,M,-0.1900190,*62&lt;br /&gt;
$GPRMC,154122.96,V,,,,,,,240407,,*14&lt;br /&gt;
$GPGSA,A,1,13,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
$GPGGA,154119.10,4948.936977,N,00957.930742,E,1,05,3.0,245.0,M,-0.576004,M,-0.1870190,*4D&lt;br /&gt;
$GPRMC,154119.10,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3A&lt;br /&gt;
$GPGSA,A,3,04,08,10,27,,,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154128.15,4948.936977,N,00957.930742,E,1,06,5.0,245.0,M,-0.587003,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154128.15,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3D&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,22,08,59,192,39,10,46,302,39,02,33,244,40*7B&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,38,13,42,076,11,24,243,352,,23,14,085,*48&lt;br /&gt;
$GPGSV,3,3,09,29,11,271,*4F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,11.2,5.0,10.0*3E&lt;br /&gt;
$GPGGA,154131.86,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578004,M,-0.1860190,*44&lt;br /&gt;
$GPRMC,154131.86,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154138.55,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578000,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154138.55,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*38&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154141.69,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.583002,M,-0.1840190,*42&lt;br /&gt;
$GPRMC,154141.69,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*39&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154146.16,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.595000,M,-0.1830190,*4F&lt;br /&gt;
$GPRMC,154146.16,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*36&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154151.34,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*4D&lt;br /&gt;
$GPRMC,154151.34,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*30&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,26,08,59,192,42,10,46,302,41,13,42,076,25*7A&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,42,04,18,206,37,29,11,271,37,24,243,352,*46&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154200.05,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*48&lt;br /&gt;
$GPRMC,154200.05,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:GPS]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Hammerhead/Protocol</id>
		<title>Hammerhead/Protocol</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Hammerhead/Protocol"/>
				<updated>2007-07-17T11:15:56Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* SEND Packet 02 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We have set up a SCM repository for experimental code and documentation at http://projects.linuxtogo.org/projects/sphyrna.&lt;br /&gt;
&lt;br /&gt;
Christian did some stracing on TomTom device, and result is great logs at http://www.maintech.de/download/hammerhead-strace.log . 'pH5' on IRC has put up some traces at http://linuxtogo.org/~ph5/tmp/gllin (a cold start, a hot start and a somewhat longer trace). He even has a software that can init and send command to phase-1 openmoko device in http://linuxtogo.org/~ph5/tmp/hhtest.c . (Please use strace -s9999 -x to produce traces).&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/GPS_signals GPS signals at wikipedia] seems to be required reading for very basics, along with  [http://www.colorado.edu/geography/gcraft/notes/gps/gps.html this page from University of Colorado] for more in depth stuff.&lt;br /&gt;
&lt;br /&gt;
http://home.earthlink.net/~cwkelley/ has sources for open-source GPS receiver, and &lt;br /&gt;
http://home.earthlink.net/~cwkelley/documentation.htm is its documentation.&lt;br /&gt;
&lt;br /&gt;
GP2021 is &amp;quot;dumb&amp;quot; GPS receiver, similar to hammerhead. (But I think it communicates over ISA bus, not over serial). However, its data sheets are freely available. Well, hammerhead marketing tells us that their GPS chip is something special, http://www.gpsworld.com/gpsworld/article/articleDetail.jsp?id=3053 . It seems to differ from &amp;quot;dumb&amp;quot; receivers by doing code phase search in hardware, directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Possible lock scheme that it may use ==&lt;br /&gt;
&lt;br /&gt;
From reading the published brief information sheets on global locates products, not the patents.&lt;br /&gt;
The global locate chip has massively parallel correlators, and configurable integrators to integrate over a given time.&lt;br /&gt;
I would expect it to do something like - in this case.&lt;br /&gt;
*Load orbit data from file (or download from net).&lt;br /&gt;
*Look at time.&lt;br /&gt;
*Get apriori position.&lt;br /&gt;
*Compute positions of satellites. Using apriori position, compute satellite visibility and relative speeds.&lt;br /&gt;
*Init the GPS.&lt;br /&gt;
*Set the hardware to expect to receive from the  set of visible satellites (the hardware is unlikely to be designed to receive them all at once, as you'll never see more than around 16 of the nominal 32).&lt;br /&gt;
*Set the integration time at 10ms-20ms or so - around, or a bit under a data bit.&lt;br /&gt;
*Now, read back the outputs of the integrators, to see if we've got possible data (carrier lock?).&lt;br /&gt;
*If we do have data, spend a bit of time working out the exact relative phase of the PRN with regard to the carrier - each 'chip' of the PRN is around a thousand cycles of the carrier - you need to work this out exactly to get psuedoranges with a resolution of under a meter.&lt;br /&gt;
**it's possible this is done in hardware&lt;br /&gt;
*Now that we've got all the satellites locked in the hardware, simply interrogate the hardware regularly, so that we can read out the 50bps datastream from each satellite.&lt;br /&gt;
**It seems this step takes 19s or so. From the first timestamp in the file, to the first GPGSV line - satellites in view, and their actual signal strengths.&lt;br /&gt;
*Read the navigation messages from each satellite, which cycles every 6 seconds.&lt;br /&gt;
*Compute a position.&lt;br /&gt;
*Output it to NMEA&lt;br /&gt;
** It seems this takes 22 seconds.&lt;br /&gt;
&lt;br /&gt;
== Enhancements ==&lt;br /&gt;
&lt;br /&gt;
To keep to the datasheet of 1s position times, it cannot read the whole navigation message, but significantly under 50 bits of it.&lt;br /&gt;
It must:&lt;br /&gt;
*Use 'AGPS' data to initialise the hardware to a condition where it can get a rapid lock - perhaps telling it the Doppler - then compute what the navigation message from each satellite may be, based on the internal clock.&lt;br /&gt;
*Work out at what point in this navigation message the 20-30 bits that it's received come. &lt;br /&gt;
*Compute the time that was in the navigation message, though it may not have picked it up (from the internal clock) and add it to the information on where the bit edges are from the hardware.&lt;br /&gt;
**If the uncertainty in relative time - due to local clock drift and movement of the GPS device - is under 10ms, then you know immediately as you detect the satellite signal the current satellite time - you simply snap the time to the nearest bit-edge, letting you immediately compute a position, without waiting for more data.&lt;br /&gt;
***With typical crystal accuracy, this implies you need to take a position every 3 minutes or so in order to keep the clock set correctly enough for this to work.&lt;br /&gt;
**This gives you a psuedorange to the satellite to within several meters. &lt;br /&gt;
*Compute a position.&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
Looks like there were 8 satellites overhead at the time that log was made.&lt;br /&gt;
&lt;br /&gt;
The protocol appears to be oriented around 32-bit words (the single-byte markers notwithstanding.) LSB-first, as can be seen on negative numbers.&lt;br /&gt;
&lt;br /&gt;
The first stream of 0x80's to the GPS is simply to synch up the UART in the GPS to the correct baudrate.&lt;br /&gt;
&lt;br /&gt;
=== Packet format ===&lt;br /&gt;
Packet format (same format in both directions):&lt;br /&gt;
* The start of a packet is marked by FF or FE.&lt;br /&gt;
** FF in packets that do not carry data, but rather explicitly request a response.  (This isn't used very often.  More often we receive data without explicitly requesting it.)  The response will be an FE-packet with the same length and type as the FF-packet.  The GPS does not send any FF packets, only gltt does.&lt;br /&gt;
** FE in packets that carry data sections.&lt;br /&gt;
* The first word (32 bits) following the start-of-packet marker is the header.&lt;br /&gt;
** The first byte (if it's indeed little-endian, the least significant byte) gives the data length, measured as ''the number of data words minus 1.''  For FE-packets, this is the length of the data section of this packet.  For FF-packets, it's the length of the data section in the expected response.&lt;br /&gt;
** The second byte of the header is always FD.&lt;br /&gt;
** MS nibble of the third byte might be flags for the packet.&lt;br /&gt;
*** 0x4 set: The words are for increasing register numbers&lt;br /&gt;
*** 0x4 not set: The words are for/from the same register. The register is probably something like a FIFO&lt;br /&gt;
** LS nibble of the third byte is an identifying number of the channel (1-8), 0 in case this is not channel-specific&lt;br /&gt;
** The fourth byte is the packet type. It seems to be more like a register (start) number.&lt;br /&gt;
* In FE-packets only, the data section (''n'' 32-bit words) follows.&lt;br /&gt;
* Finally, FC is sent to mark the end of the packet.&lt;br /&gt;
* After the FC in an FF-packet, gltt sends a bunch of zeros.  In some cases it sends a number of zeros equal to the number of bytes in the response packet; in some cases it sends more.  I would guess that these have no effect.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 ff 04fdc00c fc&lt;br /&gt;
(possibly followed by zeros), is a request for a packet of type 0C, with length 20d ((4 + 1) * 4), and flags C0.&lt;br /&gt;
&lt;br /&gt;
 fe 04fdc00c 0025102a 45dbdd4e 36030000 4b260000 16010000 fc&lt;br /&gt;
would be an appropriate response.&lt;br /&gt;
&lt;br /&gt;
=== Packet statistics ===&lt;br /&gt;
====Packet types====&lt;br /&gt;
&lt;br /&gt;
(Ugh, I do not understand this. Is it SEND or RECEIVED packets? [[User:Pavel|Pavel]] 22:26, 6 May 2007 (CEST))&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| Frequency || Type || Max length || Min length&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 16 || 73 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 86 || 08 || 19 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 8 || e2 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 23 || 133 || 101&lt;br /&gt;
|-&lt;br /&gt;
| 63 || 0a || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 24 || 71 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 52 || 0b || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 01 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 263 || 05 || 19 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 24 || 9d || 315 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 06 || 25 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 16 || e0 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 20 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 10 || 577 || 59&lt;br /&gt;
|-&lt;br /&gt;
| 128 || 18 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 9e || 303 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 117 || 00 || 65 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 11 || 0c || 33 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 9f || 477 || 61&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 0e || 541 || 31&lt;br /&gt;
|-&lt;br /&gt;
| 1 || e5 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 80 || 17 || 17&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 13 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 04 || 23 || 23&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 02 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Analysis of FF packets====&lt;br /&gt;
found in [http://linuxtogo.org/~ph5/tmp/gllin/cold1.log.gz cold1.log.gz] (gz archive seems to be incomplete).&lt;br /&gt;
&amp;quot;Reply packet length&amp;quot; (RPL) reported as raw value seen in packet.&lt;br /&gt;
Total packets: 61.&lt;br /&gt;
Unique packets: 10.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Frequency !! Type !! RPL !! Flags !!  Channels&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 00 || 0c || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 06 || 02 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0c || 04 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0e || 05 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:2, (CH:4)*4, CH:5&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 16 || 00 || 8 || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 49 || 23 || 07 || 8 || (CH:2)*12, (CH:4)*17, (CH:5)*20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Global packets ===&lt;br /&gt;
&lt;br /&gt;
All packets in this category have the &amp;quot;channel&amp;quot; (or &amp;quot;ID&amp;quot;) field set to 0.&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 02 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
Seen only once per session at the start, during init.&lt;br /&gt;
This packet is identical in cold1.log and cold2.log&lt;br /&gt;
Comes right after SEND TYPE:04.&lt;br /&gt;
&lt;br /&gt;
Usual layout:&lt;br /&gt;
&lt;br /&gt;
 SEND: L:00 CH:0 FL:4 TYPE:02  00 10 01 00&lt;br /&gt;
&lt;br /&gt;
Possibly, some kind of bitfield/flag.&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 04 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
In cold2.log this packet comes only once at the start.&lt;br /&gt;
Part of this packet seems to setup the timestamp clock (see packet 16).&lt;br /&gt;
&lt;br /&gt;
Usual layout:&lt;br /&gt;
&lt;br /&gt;
 SEND: L:03 CH:0 FL:4 TYPE:04  92 24 11 02  7b 39 8e 23  00 00 00 00  7b 39 8e 23&lt;br /&gt;
&lt;br /&gt;
Word 2 and 4 (both are 0x238e397b = 596523387) seem to control the timestamp clock. Multipliying this value by say 0.99 makes the timestamp clock run at 0.99 its normal speed. So this value is some sort of &amp;quot;frequency&amp;quot;. This packet is identical in cold1.log and cold2.log&lt;br /&gt;
&lt;br /&gt;
==== SEND Register/Packet 08 ====&lt;br /&gt;
&lt;br /&gt;
One 32 bit word bitmask&lt;br /&gt;
&lt;br /&gt;
* 0x4 resets the timestamp clock to 0. (putting a 0x4 will reset the clock. The bit is self-resetting to 0. This only works, if 0x2000 is set at the same time.&lt;br /&gt;
* 0x40: Unknown&lt;br /&gt;
* 0x2000 lets the timstamp clock (See 16) run. One can start and stop it using this bit.&lt;br /&gt;
* 0x4000 triggers a measurement on channels, that have been setup. This needs an edge, so you have to unset and then set this bit.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0c ====&lt;br /&gt;
&lt;br /&gt;
Flags = 0&lt;br /&gt;
&lt;br /&gt;
Is global -- not about particular sattelite, probably fixed length and rare.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 16 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 8;&lt;br /&gt;
Comes only after request for it.&lt;br /&gt;
&lt;br /&gt;
The chip seems to have an internal 1ms clock. This returns the counter for this clock. 1ms is also period of C/A PRN code.&lt;br /&gt;
&lt;br /&gt;
It seems, that the clock can be widely tuned (probably using divider or so): At least I saw 1000 ticks and 2000 ticks per second.&lt;br /&gt;
&lt;br /&gt;
CMD-04 and CMd-08 seem to be needed to init and start it.&lt;br /&gt;
&lt;br /&gt;
=== Satelite / channel specific packets ===&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 00 ====&lt;br /&gt;
&lt;br /&gt;
Packet type 00 (with the exception of the very first FE-packet in the log) appears to specify a particular satellite to track.  It also seems that this specifies the &amp;quot;ID&amp;quot; field (LS nibble of the third header byte) that will be used for future packets concerning this satellite.  (Non-satellite-specific packets have ID=0.)&lt;br /&gt;
&lt;br /&gt;
Bits 3-7 of the 11th byte of the packet -- third byte of the third data word -- are the satellite PRN number.  In this log only 8 satellites appear to be tracked (2, 4, 8, 10, 13, 23, 27, 29).  If I'm reading the GPGSV messages correctly, 24 should also be visible, but it doesn't appear gltt even attempts to track it.&lt;br /&gt;
&lt;br /&gt;
As for the rest of the packet... There's a lot that gets repeated, information common to all the satellites, at least initially.  When a batch of 8 of these packets gets sent, usually only the PRN and two other words differ among the 8.  So those two words contain whatever satellite-specific info is needed, it seems.  They both appear to be little-endian integers, one around -10^8 and one around 10^8.&lt;br /&gt;
&lt;br /&gt;
(Info needed to search for sattelite... doppler frequency range and phase range is useful).&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 10 ====&lt;br /&gt;
&lt;br /&gt;
Last four bytes are the little endian timestamp, in miliseconds. (Ok, it may actually be number of frames or something on that particular channel).&lt;br /&gt;
&lt;br /&gt;
Packet length is constant (always 16 bytes.)&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 23 ====&lt;br /&gt;
&lt;br /&gt;
It carries variable-length array of  16-bit integers... 6 to 32 entries were seen.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 06, 08 ====&lt;br /&gt;
&lt;br /&gt;
short packets, 06 has varying length, and both are rare.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9d ====&lt;br /&gt;
&lt;br /&gt;
Okay, so packets 10, 23 and 9d come in groups, for each sattelite, and they seem to contain enough info to compute position.  (9d seems to come later than the other two, perhaps only after sending a packet 08?)&lt;br /&gt;
&lt;br /&gt;
Packet 9d seems to contain 2 32-bit integers (second one is  signed), then 3, 0, 0 and flags (?) -- so the packet length is constant.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 24 bytes.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 8 bytes.  Satellite-specific.  First 4 bytes are a signed 32-bit integer.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9f ====&lt;br /&gt;
&lt;br /&gt;
Comes in variants of differing lengths: 20, 36, and 84-byte packets were seen.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
== NMEA ==&lt;br /&gt;
&lt;br /&gt;
It is possible to translate NMEA messages into something readable using script from http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hhdecode , and using c decoder http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hh.c .&lt;br /&gt;
&lt;br /&gt;
NMEA description is available at http://www.gpsinformation.org/dale/nmea.htm .&lt;br /&gt;
&lt;br /&gt;
At this point:&lt;br /&gt;
&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x47\x41\x2c\x31\x35\x34\x31\x30\x34\x2e\x39\x35\x2c\x34\x39\x34\x38\x2e\x39\x35\x30\x33\x33\x39\x2c\x4e\x2c\x30\x30\x39\x35\x37\x2e\x39\x35\x35\x39\x37\x39\x2c\x45\x2c\x31\x2c\x30\x36\x2c\x35\x2e\x30\x2c\x32\x32\x30\x2e\x30\x2c\x4d\x2c\x2d\x30\x2e\x35\x38\x31\x30\x31\x34\x2c\x4d\x2c\x2d\x30\x2e\x31\x39\x30\x30\x31\x39\x30\x2c\x2a\x34\x30\x0d\x0a&amp;quot;, 91) = 91&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
&amp;quot;, 91) = 91&lt;br /&gt;
&lt;br /&gt;
...6 satelitte GPS fix was obtained. (And yes, there's big read few lines before that in the log). &lt;br /&gt;
&lt;br /&gt;
GSA sentence looks interesting, too. It tells us satellites #02, #04, #08, #10, #13 and #27 were used at this point.&lt;br /&gt;
&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x53\x41\x2c\x41\x2c\x33\x2c\x30\x32\x2c\x30\x34\x2c\x30\x38\x2c\x31\x30\x2c\x31\x33\x2c\x32\x37\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x36\x2e\x37\x2c\x33\x2e\x30\x2c\x36\x2e\x30\x2a\x33\x45\x0d\x0a&amp;quot;, 51) = 51&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The whole log is&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$GPGGA,154035.21,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6A&lt;br /&gt;
$GPRMC,154035.24,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154035.61,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6E&lt;br /&gt;
$GPRMC,154035.63,V,,,,,,,240407,,*19&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154038.24,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4B&lt;br /&gt;
$GPRMC,154038.29,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154038.54,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4C&lt;br /&gt;
$GPRMC,154038.56,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154042.72,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*46&lt;br /&gt;
$GPRMC,154042.74,V,,,,,,,240407,,*1F&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,33,10,46,302,33,02,33,244,34*7E&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,33,13,42,076,25,29,11,271,29,24,243,352,*49&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154043.67,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*43&lt;br /&gt;
$GPRMC,154043.69,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154046.89,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154046.93,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154047.14,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*42&lt;br /&gt;
$GPRMC,154047.19,V,,,,,,,240407,,*11&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154050.07,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154050.10,V,,,,,,,240407,,*1E&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154050.45,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*41&lt;br /&gt;
$GPRMC,154050.47,V,,,,,,,240407,,*1C&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,26,10,46,302,25,13,42,076,16*78&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,26,04,18,206,25,29,11,271,25,24,243,352,*44&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154053.35,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*45&lt;br /&gt;
$GPRMC,154053.37,V,,,,,,,240407,,*18&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154058.70,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*49&lt;br /&gt;
$GPRMC,154058.72,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154058.97,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*40&lt;br /&gt;
$GPRMC,154058.98,V,,,,,,,240407,,*16&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154059.38,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*44&lt;br /&gt;
$GPRMC,154059.40,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,13,,,,,,,,,,,669.0,300.0,600.0*3C&lt;br /&gt;
$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
$GPRMC,154104.95,A,4948.950339,N,00957.955979,E,000.0,000.0,240407,,*3E&lt;br /&gt;
$GPGSV,3,1,09,08,59,192,42,10,46,302,42,04,18,206,41,27,77,114,16*74&lt;br /&gt;
$GPGSV,3,2,09,13,42,076,18,02,33,244,18,29,11,271,40,24,243,352,*48&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,04,08,10,,,,,,,,,,11.2,5.0,10.0*39&lt;br /&gt;
$GPGGA,154106.52,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.581025,M,-0.1900190,*4A&lt;br /&gt;
$GPRMC,154111.60,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154122.94,,,,,00,06,3.0,,M,-0.581010,M,-0.1900190,*62&lt;br /&gt;
$GPRMC,154122.96,V,,,,,,,240407,,*14&lt;br /&gt;
$GPGSA,A,1,13,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
$GPGGA,154119.10,4948.936977,N,00957.930742,E,1,05,3.0,245.0,M,-0.576004,M,-0.1870190,*4D&lt;br /&gt;
$GPRMC,154119.10,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3A&lt;br /&gt;
$GPGSA,A,3,04,08,10,27,,,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154128.15,4948.936977,N,00957.930742,E,1,06,5.0,245.0,M,-0.587003,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154128.15,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3D&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,22,08,59,192,39,10,46,302,39,02,33,244,40*7B&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,38,13,42,076,11,24,243,352,,23,14,085,*48&lt;br /&gt;
$GPGSV,3,3,09,29,11,271,*4F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,11.2,5.0,10.0*3E&lt;br /&gt;
$GPGGA,154131.86,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578004,M,-0.1860190,*44&lt;br /&gt;
$GPRMC,154131.86,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154138.55,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578000,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154138.55,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*38&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154141.69,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.583002,M,-0.1840190,*42&lt;br /&gt;
$GPRMC,154141.69,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*39&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154146.16,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.595000,M,-0.1830190,*4F&lt;br /&gt;
$GPRMC,154146.16,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*36&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154151.34,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*4D&lt;br /&gt;
$GPRMC,154151.34,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*30&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,26,08,59,192,42,10,46,302,41,13,42,076,25*7A&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,42,04,18,206,37,29,11,271,37,24,243,352,*46&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154200.05,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*48&lt;br /&gt;
$GPRMC,154200.05,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:GPS]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Hammerhead/Protocol</id>
		<title>Hammerhead/Protocol</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Hammerhead/Protocol"/>
				<updated>2007-07-17T11:15:11Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* SEND Packet 04 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We have set up a SCM repository for experimental code and documentation at http://projects.linuxtogo.org/projects/sphyrna.&lt;br /&gt;
&lt;br /&gt;
Christian did some stracing on TomTom device, and result is great logs at http://www.maintech.de/download/hammerhead-strace.log . 'pH5' on IRC has put up some traces at http://linuxtogo.org/~ph5/tmp/gllin (a cold start, a hot start and a somewhat longer trace). He even has a software that can init and send command to phase-1 openmoko device in http://linuxtogo.org/~ph5/tmp/hhtest.c . (Please use strace -s9999 -x to produce traces).&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/GPS_signals GPS signals at wikipedia] seems to be required reading for very basics, along with  [http://www.colorado.edu/geography/gcraft/notes/gps/gps.html this page from University of Colorado] for more in depth stuff.&lt;br /&gt;
&lt;br /&gt;
http://home.earthlink.net/~cwkelley/ has sources for open-source GPS receiver, and &lt;br /&gt;
http://home.earthlink.net/~cwkelley/documentation.htm is its documentation.&lt;br /&gt;
&lt;br /&gt;
GP2021 is &amp;quot;dumb&amp;quot; GPS receiver, similar to hammerhead. (But I think it communicates over ISA bus, not over serial). However, its data sheets are freely available. Well, hammerhead marketing tells us that their GPS chip is something special, http://www.gpsworld.com/gpsworld/article/articleDetail.jsp?id=3053 . It seems to differ from &amp;quot;dumb&amp;quot; receivers by doing code phase search in hardware, directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Possible lock scheme that it may use ==&lt;br /&gt;
&lt;br /&gt;
From reading the published brief information sheets on global locates products, not the patents.&lt;br /&gt;
The global locate chip has massively parallel correlators, and configurable integrators to integrate over a given time.&lt;br /&gt;
I would expect it to do something like - in this case.&lt;br /&gt;
*Load orbit data from file (or download from net).&lt;br /&gt;
*Look at time.&lt;br /&gt;
*Get apriori position.&lt;br /&gt;
*Compute positions of satellites. Using apriori position, compute satellite visibility and relative speeds.&lt;br /&gt;
*Init the GPS.&lt;br /&gt;
*Set the hardware to expect to receive from the  set of visible satellites (the hardware is unlikely to be designed to receive them all at once, as you'll never see more than around 16 of the nominal 32).&lt;br /&gt;
*Set the integration time at 10ms-20ms or so - around, or a bit under a data bit.&lt;br /&gt;
*Now, read back the outputs of the integrators, to see if we've got possible data (carrier lock?).&lt;br /&gt;
*If we do have data, spend a bit of time working out the exact relative phase of the PRN with regard to the carrier - each 'chip' of the PRN is around a thousand cycles of the carrier - you need to work this out exactly to get psuedoranges with a resolution of under a meter.&lt;br /&gt;
**it's possible this is done in hardware&lt;br /&gt;
*Now that we've got all the satellites locked in the hardware, simply interrogate the hardware regularly, so that we can read out the 50bps datastream from each satellite.&lt;br /&gt;
**It seems this step takes 19s or so. From the first timestamp in the file, to the first GPGSV line - satellites in view, and their actual signal strengths.&lt;br /&gt;
*Read the navigation messages from each satellite, which cycles every 6 seconds.&lt;br /&gt;
*Compute a position.&lt;br /&gt;
*Output it to NMEA&lt;br /&gt;
** It seems this takes 22 seconds.&lt;br /&gt;
&lt;br /&gt;
== Enhancements ==&lt;br /&gt;
&lt;br /&gt;
To keep to the datasheet of 1s position times, it cannot read the whole navigation message, but significantly under 50 bits of it.&lt;br /&gt;
It must:&lt;br /&gt;
*Use 'AGPS' data to initialise the hardware to a condition where it can get a rapid lock - perhaps telling it the Doppler - then compute what the navigation message from each satellite may be, based on the internal clock.&lt;br /&gt;
*Work out at what point in this navigation message the 20-30 bits that it's received come. &lt;br /&gt;
*Compute the time that was in the navigation message, though it may not have picked it up (from the internal clock) and add it to the information on where the bit edges are from the hardware.&lt;br /&gt;
**If the uncertainty in relative time - due to local clock drift and movement of the GPS device - is under 10ms, then you know immediately as you detect the satellite signal the current satellite time - you simply snap the time to the nearest bit-edge, letting you immediately compute a position, without waiting for more data.&lt;br /&gt;
***With typical crystal accuracy, this implies you need to take a position every 3 minutes or so in order to keep the clock set correctly enough for this to work.&lt;br /&gt;
**This gives you a psuedorange to the satellite to within several meters. &lt;br /&gt;
*Compute a position.&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
Looks like there were 8 satellites overhead at the time that log was made.&lt;br /&gt;
&lt;br /&gt;
The protocol appears to be oriented around 32-bit words (the single-byte markers notwithstanding.) LSB-first, as can be seen on negative numbers.&lt;br /&gt;
&lt;br /&gt;
The first stream of 0x80's to the GPS is simply to synch up the UART in the GPS to the correct baudrate.&lt;br /&gt;
&lt;br /&gt;
=== Packet format ===&lt;br /&gt;
Packet format (same format in both directions):&lt;br /&gt;
* The start of a packet is marked by FF or FE.&lt;br /&gt;
** FF in packets that do not carry data, but rather explicitly request a response.  (This isn't used very often.  More often we receive data without explicitly requesting it.)  The response will be an FE-packet with the same length and type as the FF-packet.  The GPS does not send any FF packets, only gltt does.&lt;br /&gt;
** FE in packets that carry data sections.&lt;br /&gt;
* The first word (32 bits) following the start-of-packet marker is the header.&lt;br /&gt;
** The first byte (if it's indeed little-endian, the least significant byte) gives the data length, measured as ''the number of data words minus 1.''  For FE-packets, this is the length of the data section of this packet.  For FF-packets, it's the length of the data section in the expected response.&lt;br /&gt;
** The second byte of the header is always FD.&lt;br /&gt;
** MS nibble of the third byte might be flags for the packet.&lt;br /&gt;
*** 0x4 set: The words are for increasing register numbers&lt;br /&gt;
*** 0x4 not set: The words are for/from the same register. The register is probably something like a FIFO&lt;br /&gt;
** LS nibble of the third byte is an identifying number of the channel (1-8), 0 in case this is not channel-specific&lt;br /&gt;
** The fourth byte is the packet type. It seems to be more like a register (start) number.&lt;br /&gt;
* In FE-packets only, the data section (''n'' 32-bit words) follows.&lt;br /&gt;
* Finally, FC is sent to mark the end of the packet.&lt;br /&gt;
* After the FC in an FF-packet, gltt sends a bunch of zeros.  In some cases it sends a number of zeros equal to the number of bytes in the response packet; in some cases it sends more.  I would guess that these have no effect.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 ff 04fdc00c fc&lt;br /&gt;
(possibly followed by zeros), is a request for a packet of type 0C, with length 20d ((4 + 1) * 4), and flags C0.&lt;br /&gt;
&lt;br /&gt;
 fe 04fdc00c 0025102a 45dbdd4e 36030000 4b260000 16010000 fc&lt;br /&gt;
would be an appropriate response.&lt;br /&gt;
&lt;br /&gt;
=== Packet statistics ===&lt;br /&gt;
====Packet types====&lt;br /&gt;
&lt;br /&gt;
(Ugh, I do not understand this. Is it SEND or RECEIVED packets? [[User:Pavel|Pavel]] 22:26, 6 May 2007 (CEST))&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| Frequency || Type || Max length || Min length&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 16 || 73 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 86 || 08 || 19 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 8 || e2 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 23 || 133 || 101&lt;br /&gt;
|-&lt;br /&gt;
| 63 || 0a || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 24 || 71 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 52 || 0b || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 01 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 263 || 05 || 19 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 24 || 9d || 315 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 06 || 25 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 16 || e0 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 20 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 10 || 577 || 59&lt;br /&gt;
|-&lt;br /&gt;
| 128 || 18 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 9e || 303 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 117 || 00 || 65 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 11 || 0c || 33 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 9f || 477 || 61&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 0e || 541 || 31&lt;br /&gt;
|-&lt;br /&gt;
| 1 || e5 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 80 || 17 || 17&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 13 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 04 || 23 || 23&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 02 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Analysis of FF packets====&lt;br /&gt;
found in [http://linuxtogo.org/~ph5/tmp/gllin/cold1.log.gz cold1.log.gz] (gz archive seems to be incomplete).&lt;br /&gt;
&amp;quot;Reply packet length&amp;quot; (RPL) reported as raw value seen in packet.&lt;br /&gt;
Total packets: 61.&lt;br /&gt;
Unique packets: 10.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Frequency !! Type !! RPL !! Flags !!  Channels&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 00 || 0c || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 06 || 02 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0c || 04 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0e || 05 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:2, (CH:4)*4, CH:5&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 16 || 00 || 8 || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 49 || 23 || 07 || 8 || (CH:2)*12, (CH:4)*17, (CH:5)*20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Global packets ===&lt;br /&gt;
&lt;br /&gt;
All packets in this category have the &amp;quot;channel&amp;quot; (or &amp;quot;ID&amp;quot;) field set to 0.&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 02 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
Seen only once per session at the start, during init.&lt;br /&gt;
This packet is identical in cold1.log and cold2.log&lt;br /&gt;
Comes right after SEND TYPE:04.&lt;br /&gt;
&lt;br /&gt;
Usual layout&lt;br /&gt;
SEND: L:00 CH:0 FL:4 TYPE:02  00 10 01 00&lt;br /&gt;
&lt;br /&gt;
Possibly, some kind of bitfield/flag.&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 04 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
In cold2.log this packet comes only once at the start.&lt;br /&gt;
Part of this packet seems to setup the timestamp clock (see packet 16).&lt;br /&gt;
&lt;br /&gt;
Usual layout:&lt;br /&gt;
&lt;br /&gt;
 SEND: L:03 CH:0 FL:4 TYPE:04  92 24 11 02  7b 39 8e 23  00 00 00 00  7b 39 8e 23&lt;br /&gt;
&lt;br /&gt;
Word 2 and 4 (both are 0x238e397b = 596523387) seem to control the timestamp clock. Multipliying this value by say 0.99 makes the timestamp clock run at 0.99 its normal speed. So this value is some sort of &amp;quot;frequency&amp;quot;. This packet is identical in cold1.log and cold2.log&lt;br /&gt;
&lt;br /&gt;
==== SEND Register/Packet 08 ====&lt;br /&gt;
&lt;br /&gt;
One 32 bit word bitmask&lt;br /&gt;
&lt;br /&gt;
* 0x4 resets the timestamp clock to 0. (putting a 0x4 will reset the clock. The bit is self-resetting to 0. This only works, if 0x2000 is set at the same time.&lt;br /&gt;
* 0x40: Unknown&lt;br /&gt;
* 0x2000 lets the timstamp clock (See 16) run. One can start and stop it using this bit.&lt;br /&gt;
* 0x4000 triggers a measurement on channels, that have been setup. This needs an edge, so you have to unset and then set this bit.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0c ====&lt;br /&gt;
&lt;br /&gt;
Flags = 0&lt;br /&gt;
&lt;br /&gt;
Is global -- not about particular sattelite, probably fixed length and rare.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 16 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 8;&lt;br /&gt;
Comes only after request for it.&lt;br /&gt;
&lt;br /&gt;
The chip seems to have an internal 1ms clock. This returns the counter for this clock. 1ms is also period of C/A PRN code.&lt;br /&gt;
&lt;br /&gt;
It seems, that the clock can be widely tuned (probably using divider or so): At least I saw 1000 ticks and 2000 ticks per second.&lt;br /&gt;
&lt;br /&gt;
CMD-04 and CMd-08 seem to be needed to init and start it.&lt;br /&gt;
&lt;br /&gt;
=== Satelite / channel specific packets ===&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 00 ====&lt;br /&gt;
&lt;br /&gt;
Packet type 00 (with the exception of the very first FE-packet in the log) appears to specify a particular satellite to track.  It also seems that this specifies the &amp;quot;ID&amp;quot; field (LS nibble of the third header byte) that will be used for future packets concerning this satellite.  (Non-satellite-specific packets have ID=0.)&lt;br /&gt;
&lt;br /&gt;
Bits 3-7 of the 11th byte of the packet -- third byte of the third data word -- are the satellite PRN number.  In this log only 8 satellites appear to be tracked (2, 4, 8, 10, 13, 23, 27, 29).  If I'm reading the GPGSV messages correctly, 24 should also be visible, but it doesn't appear gltt even attempts to track it.&lt;br /&gt;
&lt;br /&gt;
As for the rest of the packet... There's a lot that gets repeated, information common to all the satellites, at least initially.  When a batch of 8 of these packets gets sent, usually only the PRN and two other words differ among the 8.  So those two words contain whatever satellite-specific info is needed, it seems.  They both appear to be little-endian integers, one around -10^8 and one around 10^8.&lt;br /&gt;
&lt;br /&gt;
(Info needed to search for sattelite... doppler frequency range and phase range is useful).&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 10 ====&lt;br /&gt;
&lt;br /&gt;
Last four bytes are the little endian timestamp, in miliseconds. (Ok, it may actually be number of frames or something on that particular channel).&lt;br /&gt;
&lt;br /&gt;
Packet length is constant (always 16 bytes.)&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 23 ====&lt;br /&gt;
&lt;br /&gt;
It carries variable-length array of  16-bit integers... 6 to 32 entries were seen.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 06, 08 ====&lt;br /&gt;
&lt;br /&gt;
short packets, 06 has varying length, and both are rare.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9d ====&lt;br /&gt;
&lt;br /&gt;
Okay, so packets 10, 23 and 9d come in groups, for each sattelite, and they seem to contain enough info to compute position.  (9d seems to come later than the other two, perhaps only after sending a packet 08?)&lt;br /&gt;
&lt;br /&gt;
Packet 9d seems to contain 2 32-bit integers (second one is  signed), then 3, 0, 0 and flags (?) -- so the packet length is constant.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 24 bytes.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 8 bytes.  Satellite-specific.  First 4 bytes are a signed 32-bit integer.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9f ====&lt;br /&gt;
&lt;br /&gt;
Comes in variants of differing lengths: 20, 36, and 84-byte packets were seen.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
== NMEA ==&lt;br /&gt;
&lt;br /&gt;
It is possible to translate NMEA messages into something readable using script from http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hhdecode , and using c decoder http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hh.c .&lt;br /&gt;
&lt;br /&gt;
NMEA description is available at http://www.gpsinformation.org/dale/nmea.htm .&lt;br /&gt;
&lt;br /&gt;
At this point:&lt;br /&gt;
&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x47\x41\x2c\x31\x35\x34\x31\x30\x34\x2e\x39\x35\x2c\x34\x39\x34\x38\x2e\x39\x35\x30\x33\x33\x39\x2c\x4e\x2c\x30\x30\x39\x35\x37\x2e\x39\x35\x35\x39\x37\x39\x2c\x45\x2c\x31\x2c\x30\x36\x2c\x35\x2e\x30\x2c\x32\x32\x30\x2e\x30\x2c\x4d\x2c\x2d\x30\x2e\x35\x38\x31\x30\x31\x34\x2c\x4d\x2c\x2d\x30\x2e\x31\x39\x30\x30\x31\x39\x30\x2c\x2a\x34\x30\x0d\x0a&amp;quot;, 91) = 91&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
&amp;quot;, 91) = 91&lt;br /&gt;
&lt;br /&gt;
...6 satelitte GPS fix was obtained. (And yes, there's big read few lines before that in the log). &lt;br /&gt;
&lt;br /&gt;
GSA sentence looks interesting, too. It tells us satellites #02, #04, #08, #10, #13 and #27 were used at this point.&lt;br /&gt;
&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x53\x41\x2c\x41\x2c\x33\x2c\x30\x32\x2c\x30\x34\x2c\x30\x38\x2c\x31\x30\x2c\x31\x33\x2c\x32\x37\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x36\x2e\x37\x2c\x33\x2e\x30\x2c\x36\x2e\x30\x2a\x33\x45\x0d\x0a&amp;quot;, 51) = 51&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The whole log is&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$GPGGA,154035.21,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6A&lt;br /&gt;
$GPRMC,154035.24,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154035.61,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6E&lt;br /&gt;
$GPRMC,154035.63,V,,,,,,,240407,,*19&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154038.24,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4B&lt;br /&gt;
$GPRMC,154038.29,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154038.54,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4C&lt;br /&gt;
$GPRMC,154038.56,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154042.72,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*46&lt;br /&gt;
$GPRMC,154042.74,V,,,,,,,240407,,*1F&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,33,10,46,302,33,02,33,244,34*7E&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,33,13,42,076,25,29,11,271,29,24,243,352,*49&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154043.67,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*43&lt;br /&gt;
$GPRMC,154043.69,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154046.89,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154046.93,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154047.14,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*42&lt;br /&gt;
$GPRMC,154047.19,V,,,,,,,240407,,*11&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154050.07,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154050.10,V,,,,,,,240407,,*1E&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154050.45,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*41&lt;br /&gt;
$GPRMC,154050.47,V,,,,,,,240407,,*1C&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,26,10,46,302,25,13,42,076,16*78&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,26,04,18,206,25,29,11,271,25,24,243,352,*44&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154053.35,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*45&lt;br /&gt;
$GPRMC,154053.37,V,,,,,,,240407,,*18&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154058.70,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*49&lt;br /&gt;
$GPRMC,154058.72,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154058.97,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*40&lt;br /&gt;
$GPRMC,154058.98,V,,,,,,,240407,,*16&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154059.38,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*44&lt;br /&gt;
$GPRMC,154059.40,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,13,,,,,,,,,,,669.0,300.0,600.0*3C&lt;br /&gt;
$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
$GPRMC,154104.95,A,4948.950339,N,00957.955979,E,000.0,000.0,240407,,*3E&lt;br /&gt;
$GPGSV,3,1,09,08,59,192,42,10,46,302,42,04,18,206,41,27,77,114,16*74&lt;br /&gt;
$GPGSV,3,2,09,13,42,076,18,02,33,244,18,29,11,271,40,24,243,352,*48&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,04,08,10,,,,,,,,,,11.2,5.0,10.0*39&lt;br /&gt;
$GPGGA,154106.52,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.581025,M,-0.1900190,*4A&lt;br /&gt;
$GPRMC,154111.60,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154122.94,,,,,00,06,3.0,,M,-0.581010,M,-0.1900190,*62&lt;br /&gt;
$GPRMC,154122.96,V,,,,,,,240407,,*14&lt;br /&gt;
$GPGSA,A,1,13,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
$GPGGA,154119.10,4948.936977,N,00957.930742,E,1,05,3.0,245.0,M,-0.576004,M,-0.1870190,*4D&lt;br /&gt;
$GPRMC,154119.10,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3A&lt;br /&gt;
$GPGSA,A,3,04,08,10,27,,,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154128.15,4948.936977,N,00957.930742,E,1,06,5.0,245.0,M,-0.587003,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154128.15,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3D&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,22,08,59,192,39,10,46,302,39,02,33,244,40*7B&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,38,13,42,076,11,24,243,352,,23,14,085,*48&lt;br /&gt;
$GPGSV,3,3,09,29,11,271,*4F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,11.2,5.0,10.0*3E&lt;br /&gt;
$GPGGA,154131.86,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578004,M,-0.1860190,*44&lt;br /&gt;
$GPRMC,154131.86,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154138.55,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578000,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154138.55,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*38&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154141.69,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.583002,M,-0.1840190,*42&lt;br /&gt;
$GPRMC,154141.69,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*39&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154146.16,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.595000,M,-0.1830190,*4F&lt;br /&gt;
$GPRMC,154146.16,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*36&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154151.34,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*4D&lt;br /&gt;
$GPRMC,154151.34,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*30&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,26,08,59,192,42,10,46,302,41,13,42,076,25*7A&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,42,04,18,206,37,29,11,271,37,24,243,352,*46&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154200.05,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*48&lt;br /&gt;
$GPRMC,154200.05,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:GPS]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Hammerhead/Protocol</id>
		<title>Hammerhead/Protocol</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Hammerhead/Protocol"/>
				<updated>2007-07-17T11:13:18Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Global packets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We have set up a SCM repository for experimental code and documentation at http://projects.linuxtogo.org/projects/sphyrna.&lt;br /&gt;
&lt;br /&gt;
Christian did some stracing on TomTom device, and result is great logs at http://www.maintech.de/download/hammerhead-strace.log . 'pH5' on IRC has put up some traces at http://linuxtogo.org/~ph5/tmp/gllin (a cold start, a hot start and a somewhat longer trace). He even has a software that can init and send command to phase-1 openmoko device in http://linuxtogo.org/~ph5/tmp/hhtest.c . (Please use strace -s9999 -x to produce traces).&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/GPS_signals GPS signals at wikipedia] seems to be required reading for very basics, along with  [http://www.colorado.edu/geography/gcraft/notes/gps/gps.html this page from University of Colorado] for more in depth stuff.&lt;br /&gt;
&lt;br /&gt;
http://home.earthlink.net/~cwkelley/ has sources for open-source GPS receiver, and &lt;br /&gt;
http://home.earthlink.net/~cwkelley/documentation.htm is its documentation.&lt;br /&gt;
&lt;br /&gt;
GP2021 is &amp;quot;dumb&amp;quot; GPS receiver, similar to hammerhead. (But I think it communicates over ISA bus, not over serial). However, its data sheets are freely available. Well, hammerhead marketing tells us that their GPS chip is something special, http://www.gpsworld.com/gpsworld/article/articleDetail.jsp?id=3053 . It seems to differ from &amp;quot;dumb&amp;quot; receivers by doing code phase search in hardware, directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Possible lock scheme that it may use ==&lt;br /&gt;
&lt;br /&gt;
From reading the published brief information sheets on global locates products, not the patents.&lt;br /&gt;
The global locate chip has massively parallel correlators, and configurable integrators to integrate over a given time.&lt;br /&gt;
I would expect it to do something like - in this case.&lt;br /&gt;
*Load orbit data from file (or download from net).&lt;br /&gt;
*Look at time.&lt;br /&gt;
*Get apriori position.&lt;br /&gt;
*Compute positions of satellites. Using apriori position, compute satellite visibility and relative speeds.&lt;br /&gt;
*Init the GPS.&lt;br /&gt;
*Set the hardware to expect to receive from the  set of visible satellites (the hardware is unlikely to be designed to receive them all at once, as you'll never see more than around 16 of the nominal 32).&lt;br /&gt;
*Set the integration time at 10ms-20ms or so - around, or a bit under a data bit.&lt;br /&gt;
*Now, read back the outputs of the integrators, to see if we've got possible data (carrier lock?).&lt;br /&gt;
*If we do have data, spend a bit of time working out the exact relative phase of the PRN with regard to the carrier - each 'chip' of the PRN is around a thousand cycles of the carrier - you need to work this out exactly to get psuedoranges with a resolution of under a meter.&lt;br /&gt;
**it's possible this is done in hardware&lt;br /&gt;
*Now that we've got all the satellites locked in the hardware, simply interrogate the hardware regularly, so that we can read out the 50bps datastream from each satellite.&lt;br /&gt;
**It seems this step takes 19s or so. From the first timestamp in the file, to the first GPGSV line - satellites in view, and their actual signal strengths.&lt;br /&gt;
*Read the navigation messages from each satellite, which cycles every 6 seconds.&lt;br /&gt;
*Compute a position.&lt;br /&gt;
*Output it to NMEA&lt;br /&gt;
** It seems this takes 22 seconds.&lt;br /&gt;
&lt;br /&gt;
== Enhancements ==&lt;br /&gt;
&lt;br /&gt;
To keep to the datasheet of 1s position times, it cannot read the whole navigation message, but significantly under 50 bits of it.&lt;br /&gt;
It must:&lt;br /&gt;
*Use 'AGPS' data to initialise the hardware to a condition where it can get a rapid lock - perhaps telling it the Doppler - then compute what the navigation message from each satellite may be, based on the internal clock.&lt;br /&gt;
*Work out at what point in this navigation message the 20-30 bits that it's received come. &lt;br /&gt;
*Compute the time that was in the navigation message, though it may not have picked it up (from the internal clock) and add it to the information on where the bit edges are from the hardware.&lt;br /&gt;
**If the uncertainty in relative time - due to local clock drift and movement of the GPS device - is under 10ms, then you know immediately as you detect the satellite signal the current satellite time - you simply snap the time to the nearest bit-edge, letting you immediately compute a position, without waiting for more data.&lt;br /&gt;
***With typical crystal accuracy, this implies you need to take a position every 3 minutes or so in order to keep the clock set correctly enough for this to work.&lt;br /&gt;
**This gives you a psuedorange to the satellite to within several meters. &lt;br /&gt;
*Compute a position.&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
Looks like there were 8 satellites overhead at the time that log was made.&lt;br /&gt;
&lt;br /&gt;
The protocol appears to be oriented around 32-bit words (the single-byte markers notwithstanding.) LSB-first, as can be seen on negative numbers.&lt;br /&gt;
&lt;br /&gt;
The first stream of 0x80's to the GPS is simply to synch up the UART in the GPS to the correct baudrate.&lt;br /&gt;
&lt;br /&gt;
=== Packet format ===&lt;br /&gt;
Packet format (same format in both directions):&lt;br /&gt;
* The start of a packet is marked by FF or FE.&lt;br /&gt;
** FF in packets that do not carry data, but rather explicitly request a response.  (This isn't used very often.  More often we receive data without explicitly requesting it.)  The response will be an FE-packet with the same length and type as the FF-packet.  The GPS does not send any FF packets, only gltt does.&lt;br /&gt;
** FE in packets that carry data sections.&lt;br /&gt;
* The first word (32 bits) following the start-of-packet marker is the header.&lt;br /&gt;
** The first byte (if it's indeed little-endian, the least significant byte) gives the data length, measured as ''the number of data words minus 1.''  For FE-packets, this is the length of the data section of this packet.  For FF-packets, it's the length of the data section in the expected response.&lt;br /&gt;
** The second byte of the header is always FD.&lt;br /&gt;
** MS nibble of the third byte might be flags for the packet.&lt;br /&gt;
*** 0x4 set: The words are for increasing register numbers&lt;br /&gt;
*** 0x4 not set: The words are for/from the same register. The register is probably something like a FIFO&lt;br /&gt;
** LS nibble of the third byte is an identifying number of the channel (1-8), 0 in case this is not channel-specific&lt;br /&gt;
** The fourth byte is the packet type. It seems to be more like a register (start) number.&lt;br /&gt;
* In FE-packets only, the data section (''n'' 32-bit words) follows.&lt;br /&gt;
* Finally, FC is sent to mark the end of the packet.&lt;br /&gt;
* After the FC in an FF-packet, gltt sends a bunch of zeros.  In some cases it sends a number of zeros equal to the number of bytes in the response packet; in some cases it sends more.  I would guess that these have no effect.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 ff 04fdc00c fc&lt;br /&gt;
(possibly followed by zeros), is a request for a packet of type 0C, with length 20d ((4 + 1) * 4), and flags C0.&lt;br /&gt;
&lt;br /&gt;
 fe 04fdc00c 0025102a 45dbdd4e 36030000 4b260000 16010000 fc&lt;br /&gt;
would be an appropriate response.&lt;br /&gt;
&lt;br /&gt;
=== Packet statistics ===&lt;br /&gt;
====Packet types====&lt;br /&gt;
&lt;br /&gt;
(Ugh, I do not understand this. Is it SEND or RECEIVED packets? [[User:Pavel|Pavel]] 22:26, 6 May 2007 (CEST))&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| Frequency || Type || Max length || Min length&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 16 || 73 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 86 || 08 || 19 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 8 || e2 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 23 || 133 || 101&lt;br /&gt;
|-&lt;br /&gt;
| 63 || 0a || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 24 || 71 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 52 || 0b || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 01 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 263 || 05 || 19 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 24 || 9d || 315 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 06 || 25 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 16 || e0 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 20 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 10 || 577 || 59&lt;br /&gt;
|-&lt;br /&gt;
| 128 || 18 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 9e || 303 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 117 || 00 || 65 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 11 || 0c || 33 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 9f || 477 || 61&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 0e || 541 || 31&lt;br /&gt;
|-&lt;br /&gt;
| 1 || e5 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 80 || 17 || 17&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 13 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 04 || 23 || 23&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 02 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Analysis of FF packets====&lt;br /&gt;
found in [http://linuxtogo.org/~ph5/tmp/gllin/cold1.log.gz cold1.log.gz] (gz archive seems to be incomplete).&lt;br /&gt;
&amp;quot;Reply packet length&amp;quot; (RPL) reported as raw value seen in packet.&lt;br /&gt;
Total packets: 61.&lt;br /&gt;
Unique packets: 10.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Frequency !! Type !! RPL !! Flags !!  Channels&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 00 || 0c || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 06 || 02 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0c || 04 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0e || 05 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:2, (CH:4)*4, CH:5&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 16 || 00 || 8 || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 49 || 23 || 07 || 8 || (CH:2)*12, (CH:4)*17, (CH:5)*20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Global packets ===&lt;br /&gt;
&lt;br /&gt;
All packets in this category have the &amp;quot;channel&amp;quot; (or &amp;quot;ID&amp;quot;) field set to 0.&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 02 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
Seen only once per session at the start, during init.&lt;br /&gt;
This packet is identical in cold1.log and cold2.log&lt;br /&gt;
Comes right after SEND TYPE:04.&lt;br /&gt;
&lt;br /&gt;
Usual layout&lt;br /&gt;
SEND: L:00 CH:0 FL:4 TYPE:02  00 10 01 00&lt;br /&gt;
&lt;br /&gt;
Possibly, some kind of bitfield/flag.&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 04 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
In cold2.log this packet comes only once at the start.&lt;br /&gt;
Part of this packet seems to setup the timestamp clock (see packet 16).&lt;br /&gt;
&lt;br /&gt;
Usual layout&lt;br /&gt;
SEND: L:03 CH:0 FL:4 TYPE:04  92 24 11 02  7b 39 8e 23  00 00 00 00  7b 39 8e 23&lt;br /&gt;
&lt;br /&gt;
Word 2 and 4 (both are 0x238e397b = 596523387) seem to control the timestamp clock. Multipliying this value by say 0.99 makes the timestamp clock run at 0.99 its normal speed. So this value is some sort of &amp;quot;frequency&amp;quot;. This packet is identical in cold1.log and cold2.log&lt;br /&gt;
&lt;br /&gt;
==== SEND Register/Packet 08 ====&lt;br /&gt;
&lt;br /&gt;
One 32 bit word bitmask&lt;br /&gt;
&lt;br /&gt;
* 0x4 resets the timestamp clock to 0. (putting a 0x4 will reset the clock. The bit is self-resetting to 0. This only works, if 0x2000 is set at the same time.&lt;br /&gt;
* 0x40: Unknown&lt;br /&gt;
* 0x2000 lets the timstamp clock (See 16) run. One can start and stop it using this bit.&lt;br /&gt;
* 0x4000 triggers a measurement on channels, that have been setup. This needs an edge, so you have to unset and then set this bit.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0c ====&lt;br /&gt;
&lt;br /&gt;
Flags = 0&lt;br /&gt;
&lt;br /&gt;
Is global -- not about particular sattelite, probably fixed length and rare.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 16 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 8;&lt;br /&gt;
Comes only after request for it.&lt;br /&gt;
&lt;br /&gt;
The chip seems to have an internal 1ms clock. This returns the counter for this clock. 1ms is also period of C/A PRN code.&lt;br /&gt;
&lt;br /&gt;
It seems, that the clock can be widely tuned (probably using divider or so): At least I saw 1000 ticks and 2000 ticks per second.&lt;br /&gt;
&lt;br /&gt;
CMD-04 and CMd-08 seem to be needed to init and start it.&lt;br /&gt;
&lt;br /&gt;
=== Satelite / channel specific packets ===&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 00 ====&lt;br /&gt;
&lt;br /&gt;
Packet type 00 (with the exception of the very first FE-packet in the log) appears to specify a particular satellite to track.  It also seems that this specifies the &amp;quot;ID&amp;quot; field (LS nibble of the third header byte) that will be used for future packets concerning this satellite.  (Non-satellite-specific packets have ID=0.)&lt;br /&gt;
&lt;br /&gt;
Bits 3-7 of the 11th byte of the packet -- third byte of the third data word -- are the satellite PRN number.  In this log only 8 satellites appear to be tracked (2, 4, 8, 10, 13, 23, 27, 29).  If I'm reading the GPGSV messages correctly, 24 should also be visible, but it doesn't appear gltt even attempts to track it.&lt;br /&gt;
&lt;br /&gt;
As for the rest of the packet... There's a lot that gets repeated, information common to all the satellites, at least initially.  When a batch of 8 of these packets gets sent, usually only the PRN and two other words differ among the 8.  So those two words contain whatever satellite-specific info is needed, it seems.  They both appear to be little-endian integers, one around -10^8 and one around 10^8.&lt;br /&gt;
&lt;br /&gt;
(Info needed to search for sattelite... doppler frequency range and phase range is useful).&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 10 ====&lt;br /&gt;
&lt;br /&gt;
Last four bytes are the little endian timestamp, in miliseconds. (Ok, it may actually be number of frames or something on that particular channel).&lt;br /&gt;
&lt;br /&gt;
Packet length is constant (always 16 bytes.)&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 23 ====&lt;br /&gt;
&lt;br /&gt;
It carries variable-length array of  16-bit integers... 6 to 32 entries were seen.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 06, 08 ====&lt;br /&gt;
&lt;br /&gt;
short packets, 06 has varying length, and both are rare.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9d ====&lt;br /&gt;
&lt;br /&gt;
Okay, so packets 10, 23 and 9d come in groups, for each sattelite, and they seem to contain enough info to compute position.  (9d seems to come later than the other two, perhaps only after sending a packet 08?)&lt;br /&gt;
&lt;br /&gt;
Packet 9d seems to contain 2 32-bit integers (second one is  signed), then 3, 0, 0 and flags (?) -- so the packet length is constant.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 24 bytes.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 8 bytes.  Satellite-specific.  First 4 bytes are a signed 32-bit integer.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9f ====&lt;br /&gt;
&lt;br /&gt;
Comes in variants of differing lengths: 20, 36, and 84-byte packets were seen.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
== NMEA ==&lt;br /&gt;
&lt;br /&gt;
It is possible to translate NMEA messages into something readable using script from http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hhdecode , and using c decoder http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hh.c .&lt;br /&gt;
&lt;br /&gt;
NMEA description is available at http://www.gpsinformation.org/dale/nmea.htm .&lt;br /&gt;
&lt;br /&gt;
At this point:&lt;br /&gt;
&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x47\x41\x2c\x31\x35\x34\x31\x30\x34\x2e\x39\x35\x2c\x34\x39\x34\x38\x2e\x39\x35\x30\x33\x33\x39\x2c\x4e\x2c\x30\x30\x39\x35\x37\x2e\x39\x35\x35\x39\x37\x39\x2c\x45\x2c\x31\x2c\x30\x36\x2c\x35\x2e\x30\x2c\x32\x32\x30\x2e\x30\x2c\x4d\x2c\x2d\x30\x2e\x35\x38\x31\x30\x31\x34\x2c\x4d\x2c\x2d\x30\x2e\x31\x39\x30\x30\x31\x39\x30\x2c\x2a\x34\x30\x0d\x0a&amp;quot;, 91) = 91&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
&amp;quot;, 91) = 91&lt;br /&gt;
&lt;br /&gt;
...6 satelitte GPS fix was obtained. (And yes, there's big read few lines before that in the log). &lt;br /&gt;
&lt;br /&gt;
GSA sentence looks interesting, too. It tells us satellites #02, #04, #08, #10, #13 and #27 were used at this point.&lt;br /&gt;
&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x53\x41\x2c\x41\x2c\x33\x2c\x30\x32\x2c\x30\x34\x2c\x30\x38\x2c\x31\x30\x2c\x31\x33\x2c\x32\x37\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x36\x2e\x37\x2c\x33\x2e\x30\x2c\x36\x2e\x30\x2a\x33\x45\x0d\x0a&amp;quot;, 51) = 51&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The whole log is&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$GPGGA,154035.21,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6A&lt;br /&gt;
$GPRMC,154035.24,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154035.61,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6E&lt;br /&gt;
$GPRMC,154035.63,V,,,,,,,240407,,*19&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154038.24,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4B&lt;br /&gt;
$GPRMC,154038.29,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154038.54,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4C&lt;br /&gt;
$GPRMC,154038.56,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154042.72,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*46&lt;br /&gt;
$GPRMC,154042.74,V,,,,,,,240407,,*1F&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,33,10,46,302,33,02,33,244,34*7E&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,33,13,42,076,25,29,11,271,29,24,243,352,*49&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154043.67,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*43&lt;br /&gt;
$GPRMC,154043.69,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154046.89,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154046.93,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154047.14,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*42&lt;br /&gt;
$GPRMC,154047.19,V,,,,,,,240407,,*11&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154050.07,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154050.10,V,,,,,,,240407,,*1E&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154050.45,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*41&lt;br /&gt;
$GPRMC,154050.47,V,,,,,,,240407,,*1C&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,26,10,46,302,25,13,42,076,16*78&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,26,04,18,206,25,29,11,271,25,24,243,352,*44&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154053.35,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*45&lt;br /&gt;
$GPRMC,154053.37,V,,,,,,,240407,,*18&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154058.70,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*49&lt;br /&gt;
$GPRMC,154058.72,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154058.97,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*40&lt;br /&gt;
$GPRMC,154058.98,V,,,,,,,240407,,*16&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154059.38,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*44&lt;br /&gt;
$GPRMC,154059.40,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,13,,,,,,,,,,,669.0,300.0,600.0*3C&lt;br /&gt;
$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
$GPRMC,154104.95,A,4948.950339,N,00957.955979,E,000.0,000.0,240407,,*3E&lt;br /&gt;
$GPGSV,3,1,09,08,59,192,42,10,46,302,42,04,18,206,41,27,77,114,16*74&lt;br /&gt;
$GPGSV,3,2,09,13,42,076,18,02,33,244,18,29,11,271,40,24,243,352,*48&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,04,08,10,,,,,,,,,,11.2,5.0,10.0*39&lt;br /&gt;
$GPGGA,154106.52,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.581025,M,-0.1900190,*4A&lt;br /&gt;
$GPRMC,154111.60,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154122.94,,,,,00,06,3.0,,M,-0.581010,M,-0.1900190,*62&lt;br /&gt;
$GPRMC,154122.96,V,,,,,,,240407,,*14&lt;br /&gt;
$GPGSA,A,1,13,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
$GPGGA,154119.10,4948.936977,N,00957.930742,E,1,05,3.0,245.0,M,-0.576004,M,-0.1870190,*4D&lt;br /&gt;
$GPRMC,154119.10,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3A&lt;br /&gt;
$GPGSA,A,3,04,08,10,27,,,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154128.15,4948.936977,N,00957.930742,E,1,06,5.0,245.0,M,-0.587003,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154128.15,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3D&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,22,08,59,192,39,10,46,302,39,02,33,244,40*7B&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,38,13,42,076,11,24,243,352,,23,14,085,*48&lt;br /&gt;
$GPGSV,3,3,09,29,11,271,*4F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,11.2,5.0,10.0*3E&lt;br /&gt;
$GPGGA,154131.86,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578004,M,-0.1860190,*44&lt;br /&gt;
$GPRMC,154131.86,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154138.55,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578000,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154138.55,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*38&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154141.69,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.583002,M,-0.1840190,*42&lt;br /&gt;
$GPRMC,154141.69,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*39&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154146.16,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.595000,M,-0.1830190,*4F&lt;br /&gt;
$GPRMC,154146.16,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*36&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154151.34,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*4D&lt;br /&gt;
$GPRMC,154151.34,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*30&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,26,08,59,192,42,10,46,302,41,13,42,076,25*7A&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,42,04,18,206,37,29,11,271,37,24,243,352,*46&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154200.05,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*48&lt;br /&gt;
$GPRMC,154200.05,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:GPS]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Advertising</id>
		<title>Advertising</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Advertising"/>
				<updated>2007-07-16T18:33:55Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* General Ideas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Text ==&lt;br /&gt;
* There could be a description of OpenMoko/Neo1973 features&lt;br /&gt;
* There could be a short story about what OpenMoko/the Neo1973 does different:&lt;br /&gt;
** e.g.: &lt;br /&gt;
 After leaving work your Neo's GPS automatically switches your Alarm Profile from &lt;br /&gt;
 Silent to Loud and guides you to the next gas station. At home, your Neo automatically &lt;br /&gt;
 deploys its WiFi functionality, retrieves your email (free of charge) and activates &lt;br /&gt;
 voice over ip capabilities (free of charge). &lt;br /&gt;
And so on...&lt;br /&gt;
** e.g.: &lt;br /&gt;
 Neo: Hi, I'm an Neo.&lt;br /&gt;
 iPhone: And I'm an iPhone.&lt;br /&gt;
 * iPhone looks on a big map and tries to orientate himself&lt;br /&gt;
 Neo: What are you doing?&lt;br /&gt;
 iPhone: I try to locate myself by using Google Maps.&lt;br /&gt;
 Neo: Oh, that doesn't seem to be very exciting. I use GPS for that kind of stuff. &lt;br /&gt;
 Works automatically.&lt;br /&gt;
 iPhone: GPS, yeah?&lt;br /&gt;
 Neo: Yes. Oh, wait, I'm entering the cinema. I think, it's better for me, to &lt;br /&gt;
 switch to stand-by now. See you after the movie.&lt;br /&gt;
 iPhone: Oh, bye.&lt;br /&gt;
 * Neo leaves, iPhone looks on the map again.&lt;br /&gt;
 iPhone: Oh, here we are! Finally... &lt;br /&gt;
[http://lists.openmoko.org/pipermail/community/2007-July/006141.html]&lt;br /&gt;
** e.g.: &lt;br /&gt;
 Scene: Completely blank white background.&lt;br /&gt;
 Two people enter the frame.&lt;br /&gt;
 Moko: Hi, I'm an OpenMoko&lt;br /&gt;
 iPhone: And I'm an iPhone&lt;br /&gt;
 * OpenMoko looks like he's enjoying himself&lt;br /&gt;
 iPhone: What are you doing?&lt;br /&gt;
 Moko: Oh, I just downloaded this great new game I came across. Want to try it?&lt;br /&gt;
 iPhone: I, er, I can't play new games. I've got this great game of solitaire, though!&lt;br /&gt;
 Moko: That's a shame. Nothing at all?&lt;br /&gt;
 iPhone: Well, I can play games off the web. Some of them. Want a game of bejeweled?&lt;br /&gt;
 Moko: ...thanks, no. I'm fine.&lt;br /&gt;
[http://lists.openmoko.org/pipermail/community/2007-July/006110.html]&lt;br /&gt;
* There ''should'' be some pre-composed basic information that can be copy'n'pasted into one's Myspace/Facebook/whatever/-profile.&lt;br /&gt;
* There ''should'' be some pre-composed advanced information for press/blogs/mobile service providers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Printed Advertisement ===&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Video ==&lt;br /&gt;
&lt;br /&gt;
Adam Krikstone did some nice OpenMoko video ads: (youtube)&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/view_play_list?p=472DE700A3CC70A4 Playlist]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=DCQ7dmGuAU8]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=tQPjfUqp-dk]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=4qP-K1HOMHk]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=S--2HeQqjq4]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=dpwxzEopg60]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=EuG2hYiO9AU]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=lGjY7tigdkA]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=YR4ezMgRlWo]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=OZC3mjRW5Tg]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=GxsVFG7jHI8]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=62kLhNngE20]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=kR-4VhlsiV8]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound empathy / Jingle ==&lt;br /&gt;
* There should be some kind of jingle for OpenMoko, just like this &amp;quot;Hello Moto&amp;quot; thing from Motorola&lt;br /&gt;
** [http://tetraden.te.funpic.de/openmoko/OpenMoko_free_your_phone02.ogg Number one] (suggestions/whishes? franzkautz@yahoo.de Topic: sth. with OpenMoko)&lt;br /&gt;
** [http://tetraden.te.funpic.de/openmoko/OpenMoko_free_your_phone04.ogg Number two] (franzkautz@yahoo.de)&lt;br /&gt;
&lt;br /&gt;
== Thoughts, Notions ==&lt;br /&gt;
=== General Ideas ===&lt;br /&gt;
* '''What is advertised?'''&lt;br /&gt;
* If we advertise a phone by claiming it can do everything maybe no one will buy it.&lt;br /&gt;
* '''Question''': Who is supposed to buy this phone?&lt;br /&gt;
# '''Average Phone User''' probably only wants a phone to make calls. Why would he buy an opensource linux phone with additional command line? We ''need'' reasons for ''him'' to buy a phone running OpenMoko:&lt;br /&gt;
#* Easy to use (not implemented though ;-)&lt;br /&gt;
#* Rich and powerfull text input methods&lt;br /&gt;
#* MS Outlook/whatever Sync&lt;br /&gt;
#* (please add)&lt;br /&gt;
# '''Advanced Phone User''': won't be hard to persuade him. As we likely are all advanced phone users it will be easy to find reasons/features for him to buy this phone:&lt;br /&gt;
#* GPS-based profiles&lt;br /&gt;
#* Seamless GPS-based GSM/WiFi/VoIP-switching&lt;br /&gt;
#* (please add)&lt;br /&gt;
# '''Technophobe Phone User''' really needs some reasons for this phone:&lt;br /&gt;
#* Really easy to use (really not implemented ;-)&lt;br /&gt;
#* Flashy UI look&lt;br /&gt;
#* (please add)&lt;br /&gt;
&lt;br /&gt;
=== Further Ideas ===&lt;br /&gt;
Something that came to me passing some mobile service provider's outlet today. This should be done when GTA_02 is available and software running.&lt;br /&gt;
&lt;br /&gt;
''A guy walks into a mobile service provider's outlet or approached by the outlet's staff. The guy asks the clerk about their phones and ends up showing him his Neo. He explains him the Neo's features that stand unrivaled to any of the mobile service provider's offered phones and eventually leaves him completly flabbergasted and pondering about the meaning of life and mobile connectivity/whatever'' &lt;br /&gt;
&lt;br /&gt;
--[[User:Minime|Minime]] 16:58, 7 July 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
=== Controversial Issues ===&lt;br /&gt;
* We need to be careful about using copyrighted material (e.g. youtube)&lt;br /&gt;
** Other legal issues...?&lt;br /&gt;
** Be aware of what we are advertising: What functions does OpenMoko currently feature, what is planned and what not? Are functions advertised protected by patents?&lt;br /&gt;
* What is the community's goal in advertising? &lt;br /&gt;
** Are we advertising OpenMoko?&lt;br /&gt;
** Are we advertising the Neo1973? And if so, is this our job? The Neo1973 is after all, a commerical product.&lt;br /&gt;
&lt;br /&gt;
[[Category:Community]]&lt;br /&gt;
[[Category:Information]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Advertising</id>
		<title>Advertising</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Advertising"/>
				<updated>2007-07-16T18:33:14Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Thoughts, Notions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Text ==&lt;br /&gt;
* There could be a description of OpenMoko/Neo1973 features&lt;br /&gt;
* There could be a short story about what OpenMoko/the Neo1973 does different:&lt;br /&gt;
** e.g.: &lt;br /&gt;
 After leaving work your Neo's GPS automatically switches your Alarm Profile from &lt;br /&gt;
 Silent to Loud and guides you to the next gas station. At home, your Neo automatically &lt;br /&gt;
 deploys its WiFi functionality, retrieves your email (free of charge) and activates &lt;br /&gt;
 voice over ip capabilities (free of charge). &lt;br /&gt;
And so on...&lt;br /&gt;
** e.g.: &lt;br /&gt;
 Neo: Hi, I'm an Neo.&lt;br /&gt;
 iPhone: And I'm an iPhone.&lt;br /&gt;
 * iPhone looks on a big map and tries to orientate himself&lt;br /&gt;
 Neo: What are you doing?&lt;br /&gt;
 iPhone: I try to locate myself by using Google Maps.&lt;br /&gt;
 Neo: Oh, that doesn't seem to be very exciting. I use GPS for that kind of stuff. &lt;br /&gt;
 Works automatically.&lt;br /&gt;
 iPhone: GPS, yeah?&lt;br /&gt;
 Neo: Yes. Oh, wait, I'm entering the cinema. I think, it's better for me, to &lt;br /&gt;
 switch to stand-by now. See you after the movie.&lt;br /&gt;
 iPhone: Oh, bye.&lt;br /&gt;
 * Neo leaves, iPhone looks on the map again.&lt;br /&gt;
 iPhone: Oh, here we are! Finally... &lt;br /&gt;
[http://lists.openmoko.org/pipermail/community/2007-July/006141.html]&lt;br /&gt;
** e.g.: &lt;br /&gt;
 Scene: Completely blank white background.&lt;br /&gt;
 Two people enter the frame.&lt;br /&gt;
 Moko: Hi, I'm an OpenMoko&lt;br /&gt;
 iPhone: And I'm an iPhone&lt;br /&gt;
 * OpenMoko looks like he's enjoying himself&lt;br /&gt;
 iPhone: What are you doing?&lt;br /&gt;
 Moko: Oh, I just downloaded this great new game I came across. Want to try it?&lt;br /&gt;
 iPhone: I, er, I can't play new games. I've got this great game of solitaire, though!&lt;br /&gt;
 Moko: That's a shame. Nothing at all?&lt;br /&gt;
 iPhone: Well, I can play games off the web. Some of them. Want a game of bejeweled?&lt;br /&gt;
 Moko: ...thanks, no. I'm fine.&lt;br /&gt;
[http://lists.openmoko.org/pipermail/community/2007-July/006110.html]&lt;br /&gt;
* There ''should'' be some pre-composed basic information that can be copy'n'pasted into one's Myspace/Facebook/whatever/-profile.&lt;br /&gt;
* There ''should'' be some pre-composed advanced information for press/blogs/mobile service providers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Printed Advertisement ===&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Video ==&lt;br /&gt;
&lt;br /&gt;
Adam Krikstone did some nice OpenMoko video ads: (youtube)&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/view_play_list?p=472DE700A3CC70A4 Playlist]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=DCQ7dmGuAU8]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=tQPjfUqp-dk]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=4qP-K1HOMHk]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=S--2HeQqjq4]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=dpwxzEopg60]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=EuG2hYiO9AU]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=lGjY7tigdkA]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=YR4ezMgRlWo]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=OZC3mjRW5Tg]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=GxsVFG7jHI8]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=62kLhNngE20]&lt;br /&gt;
&lt;br /&gt;
[http://www.youtube.com/watch?v=kR-4VhlsiV8]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sound empathy / Jingle ==&lt;br /&gt;
* There should be some kind of jingle for OpenMoko, just like this &amp;quot;Hello Moto&amp;quot; thing from Motorola&lt;br /&gt;
** [http://tetraden.te.funpic.de/openmoko/OpenMoko_free_your_phone02.ogg Number one] (suggestions/whishes? franzkautz@yahoo.de Topic: sth. with OpenMoko)&lt;br /&gt;
** [http://tetraden.te.funpic.de/openmoko/OpenMoko_free_your_phone04.ogg Number two] (franzkautz@yahoo.de)&lt;br /&gt;
&lt;br /&gt;
== Thoughts, Notions ==&lt;br /&gt;
=== General Ideas ===&lt;br /&gt;
* '''What is advertised?'''&lt;br /&gt;
* If we advertise a phone by claiming it can do everything maybe no one will buy it.&lt;br /&gt;
* '''Question''': Who is supposed to buy this phone?&lt;br /&gt;
# '''Average Phone User''' probably only wants a phone to make calls. Why would he buy an opensource linux phone with additional command line? We ''need'' reasons for ''him'' to buy a phone running OpenMoko:&lt;br /&gt;
#* Easy to use (not implemented though ;-)&lt;br /&gt;
#* Rich and powerfull text input methods&lt;br /&gt;
#* MS Outlook/whatever Sync&lt;br /&gt;
#* (please add)&lt;br /&gt;
# '''Advanced Phone User''': won't be hard to persuade him. As we likely are all advanced phone users it will be easy to find reasons/features for him to buy this phone:&lt;br /&gt;
#* GPS-based profiles&lt;br /&gt;
#* Seamless GPS-based GSM/WiFi/VoIP-switching&lt;br /&gt;
#* (please add)&lt;br /&gt;
# '''Technophobe Phone User''' really needs some reasons for this phone:&lt;br /&gt;
#* Really easy to use (really not implemented ;-)&lt;br /&gt;
#* (please add)&lt;br /&gt;
&lt;br /&gt;
=== Further Ideas ===&lt;br /&gt;
Something that came to me passing some mobile service provider's outlet today. This should be done when GTA_02 is available and software running.&lt;br /&gt;
&lt;br /&gt;
''A guy walks into a mobile service provider's outlet or approached by the outlet's staff. The guy asks the clerk about their phones and ends up showing him his Neo. He explains him the Neo's features that stand unrivaled to any of the mobile service provider's offered phones and eventually leaves him completly flabbergasted and pondering about the meaning of life and mobile connectivity/whatever'' &lt;br /&gt;
&lt;br /&gt;
--[[User:Minime|Minime]] 16:58, 7 July 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
=== Controversial Issues ===&lt;br /&gt;
* We need to be careful about using copyrighted material (e.g. youtube)&lt;br /&gt;
** Other legal issues...?&lt;br /&gt;
** Be aware of what we are advertising: What functions does OpenMoko currently feature, what is planned and what not? Are functions advertised protected by patents?&lt;br /&gt;
* What is the community's goal in advertising? &lt;br /&gt;
** Are we advertising OpenMoko?&lt;br /&gt;
** Are we advertising the Neo1973? And if so, is this our job? The Neo1973 is after all, a commerical product.&lt;br /&gt;
&lt;br /&gt;
[[Category:Community]]&lt;br /&gt;
[[Category:Information]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Hammerhead/Protocol</id>
		<title>Hammerhead/Protocol</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Hammerhead/Protocol"/>
				<updated>2007-07-16T17:18:17Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* RECEIVED Packet 16 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We have set up a SCM repository for experimental code and documentation at http://projects.linuxtogo.org/projects/sphyrna.&lt;br /&gt;
&lt;br /&gt;
Christian did some stracing on TomTom device, and result is great logs at http://www.maintech.de/download/hammerhead-strace.log . 'pH5' on IRC has put up some traces at http://linuxtogo.org/~ph5/tmp/gllin (a cold start, a hot start and a somewhat longer trace). He even has a software that can init and send command to phase-1 openmoko device in http://linuxtogo.org/~ph5/tmp/hhtest.c . (Please use strace -s9999 -x to produce traces).&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/GPS_signals GPS signals at wikipedia] seems to be required reading for very basics, along with  [http://www.colorado.edu/geography/gcraft/notes/gps/gps.html this page from University of Colorado] for more in depth stuff.&lt;br /&gt;
&lt;br /&gt;
http://home.earthlink.net/~cwkelley/ has sources for open-source GPS receiver, and &lt;br /&gt;
http://home.earthlink.net/~cwkelley/documentation.htm is its documentation.&lt;br /&gt;
&lt;br /&gt;
GP2021 is &amp;quot;dumb&amp;quot; GPS receiver, similar to hammerhead. (But I think it communicates over ISA bus, not over serial). However, its data sheets are freely available. Well, hammerhead marketing tells us that their GPS chip is something special, http://www.gpsworld.com/gpsworld/article/articleDetail.jsp?id=3053 . It seems to differ from &amp;quot;dumb&amp;quot; receivers by doing code phase search in hardware, directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Possible lock scheme that it may use ==&lt;br /&gt;
&lt;br /&gt;
From reading the published brief information sheets on global locates products, not the patents.&lt;br /&gt;
The global locate chip has massively parallel correlators, and configurable integrators to integrate over a given time.&lt;br /&gt;
I would expect it to do something like - in this case.&lt;br /&gt;
*Load orbit data from file (or download from net).&lt;br /&gt;
*Look at time.&lt;br /&gt;
*Get apriori position.&lt;br /&gt;
*Compute positions of satellites. Using apriori position, compute satellite visibility and relative speeds.&lt;br /&gt;
*Init the GPS.&lt;br /&gt;
*Set the hardware to expect to receive from the  set of visible satellites (the hardware is unlikely to be designed to receive them all at once, as you'll never see more than around 16 of the nominal 32).&lt;br /&gt;
*Set the integration time at 10ms-20ms or so - around, or a bit under a data bit.&lt;br /&gt;
*Now, read back the outputs of the integrators, to see if we've got possible data (carrier lock?).&lt;br /&gt;
*If we do have data, spend a bit of time working out the exact relative phase of the PRN with regard to the carrier - each 'chip' of the PRN is around a thousand cycles of the carrier - you need to work this out exactly to get psuedoranges with a resolution of under a meter.&lt;br /&gt;
**it's possible this is done in hardware&lt;br /&gt;
*Now that we've got all the satellites locked in the hardware, simply interrogate the hardware regularly, so that we can read out the 50bps datastream from each satellite.&lt;br /&gt;
**It seems this step takes 19s or so. From the first timestamp in the file, to the first GPGSV line - satellites in view, and their actual signal strengths.&lt;br /&gt;
*Read the navigation messages from each satellite, which cycles every 6 seconds.&lt;br /&gt;
*Compute a position.&lt;br /&gt;
*Output it to NMEA&lt;br /&gt;
** It seems this takes 22 seconds.&lt;br /&gt;
&lt;br /&gt;
== Enhancements ==&lt;br /&gt;
&lt;br /&gt;
To keep to the datasheet of 1s position times, it cannot read the whole navigation message, but significantly under 50 bits of it.&lt;br /&gt;
It must:&lt;br /&gt;
*Use 'AGPS' data to initialise the hardware to a condition where it can get a rapid lock - perhaps telling it the Doppler - then compute what the navigation message from each satellite may be, based on the internal clock.&lt;br /&gt;
*Work out at what point in this navigation message the 20-30 bits that it's received come. &lt;br /&gt;
*Compute the time that was in the navigation message, though it may not have picked it up (from the internal clock) and add it to the information on where the bit edges are from the hardware.&lt;br /&gt;
**If the uncertainty in relative time - due to local clock drift and movement of the GPS device - is under 10ms, then you know immediately as you detect the satellite signal the current satellite time - you simply snap the time to the nearest bit-edge, letting you immediately compute a position, without waiting for more data.&lt;br /&gt;
***With typical crystal accuracy, this implies you need to take a position every 3 minutes or so in order to keep the clock set correctly enough for this to work.&lt;br /&gt;
**This gives you a psuedorange to the satellite to within several meters. &lt;br /&gt;
*Compute a position.&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
Looks like there were 8 satellites overhead at the time that log was made.&lt;br /&gt;
&lt;br /&gt;
The protocol appears to be oriented around 32-bit words (the single-byte markers notwithstanding.) LSB-first, as can be seen on negative numbers.&lt;br /&gt;
&lt;br /&gt;
The first stream of 0x80's to the GPS is simply to synch up the UART in the GPS to the correct baudrate.&lt;br /&gt;
&lt;br /&gt;
=== Packet format ===&lt;br /&gt;
Packet format (same format in both directions):&lt;br /&gt;
* The start of a packet is marked by FF or FE.&lt;br /&gt;
** FF in packets that do not carry data, but rather explicitly request a response.  (This isn't used very often.  More often we receive data without explicitly requesting it.)  The response will be an FE-packet with the same length and type as the FF-packet.  The GPS does not send any FF packets, only gltt does.&lt;br /&gt;
** FE in packets that carry data sections.&lt;br /&gt;
* The first word (32 bits) following the start-of-packet marker is the header.&lt;br /&gt;
** The first byte (if it's indeed little-endian, the least significant byte) gives the data length, measured as ''the number of data words minus 1.''  For FE-packets, this is the length of the data section of this packet.  For FF-packets, it's the length of the data section in the expected response.&lt;br /&gt;
** The second byte of the header is always FD.&lt;br /&gt;
** MS nibble of the third byte might be flags for the packet.&lt;br /&gt;
*** 0x4 set: The words are for increasing register numbers&lt;br /&gt;
*** 0x4 not set: The words are for/from the same register. The register is probably something like a FIFO&lt;br /&gt;
** LS nibble of the third byte is an identifying number of the channel (1-8), 0 in case this is not channel-specific&lt;br /&gt;
** The fourth byte is the packet type. It seems to be more like a register (start) number.&lt;br /&gt;
* In FE-packets only, the data section (''n'' 32-bit words) follows.&lt;br /&gt;
* Finally, FC is sent to mark the end of the packet.&lt;br /&gt;
* After the FC in an FF-packet, gltt sends a bunch of zeros.  In some cases it sends a number of zeros equal to the number of bytes in the response packet; in some cases it sends more.  I would guess that these have no effect.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 ff 04fdc00c fc&lt;br /&gt;
(possibly followed by zeros), is a request for a packet of type 0C, with length 20d ((4 + 1) * 4), and flags C0.&lt;br /&gt;
&lt;br /&gt;
 fe 04fdc00c 0025102a 45dbdd4e 36030000 4b260000 16010000 fc&lt;br /&gt;
would be an appropriate response.&lt;br /&gt;
&lt;br /&gt;
=== Packet statistics ===&lt;br /&gt;
====Packet types====&lt;br /&gt;
&lt;br /&gt;
(Ugh, I do not understand this. Is it SEND or RECEIVED packets? [[User:Pavel|Pavel]] 22:26, 6 May 2007 (CEST))&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| Frequency || Type || Max length || Min length&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 16 || 73 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 86 || 08 || 19 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 8 || e2 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 23 || 133 || 101&lt;br /&gt;
|-&lt;br /&gt;
| 63 || 0a || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 24 || 71 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 52 || 0b || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 01 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 263 || 05 || 19 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 24 || 9d || 315 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 06 || 25 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 16 || e0 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 20 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 10 || 577 || 59&lt;br /&gt;
|-&lt;br /&gt;
| 128 || 18 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 9e || 303 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 117 || 00 || 65 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 11 || 0c || 33 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 9f || 477 || 61&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 0e || 541 || 31&lt;br /&gt;
|-&lt;br /&gt;
| 1 || e5 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 80 || 17 || 17&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 13 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 04 || 23 || 23&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 02 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Analysis of FF packets====&lt;br /&gt;
found in [http://linuxtogo.org/~ph5/tmp/gllin/cold1.log.gz cold1.log.gz] (gz archive seems to be incomplete).&lt;br /&gt;
&amp;quot;Reply packet length&amp;quot; (RPL) reported as raw value seen in packet.&lt;br /&gt;
Total packets: 61.&lt;br /&gt;
Unique packets: 10.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Frequency !! Type !! RPL !! Flags !!  Channels&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 00 || 0c || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 06 || 02 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0c || 04 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0e || 05 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:2, (CH:4)*4, CH:5&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 16 || 00 || 8 || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 49 || 23 || 07 || 8 || (CH:2)*12, (CH:4)*17, (CH:5)*20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Global packets ===&lt;br /&gt;
&lt;br /&gt;
All packets in this category have the &amp;quot;channel&amp;quot; (or &amp;quot;ID&amp;quot;) field set to 0.&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 04 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
In cold2.log this packet comes only once at the start.&lt;br /&gt;
Part of this packet seems to setup the timestamp clock (see packet 16).&lt;br /&gt;
&lt;br /&gt;
Usual layout&lt;br /&gt;
 92 24 11 02  7b 39 8e 23  00 00 00 00  7b 39 8e 23&lt;br /&gt;
&lt;br /&gt;
Word 2 and 4 (both are 0x238e397b = 596523387) seem to control the timestamp clock. Multipliying this value by say 0.99 makes the timestamp clock run at 0.99 its normal speed. So this value is some sort of &amp;quot;frequency&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== SEND Register/Packet 08 ====&lt;br /&gt;
&lt;br /&gt;
One 32 bit word bitmask&lt;br /&gt;
&lt;br /&gt;
* 0x4 resets the timestamp clock to 0. (putting a 0x4 will reset the clock. The bit is self-resetting to 0. This only works, if 0x2000 is set at the same time.&lt;br /&gt;
* 0x40: Unknown&lt;br /&gt;
* 0x2000 lets the timstamp clock (See 16) run. One can start and stop it using this bit.&lt;br /&gt;
* 0x4000 triggers a measurement on channels, that have been setup. This needs an edge, so you have to unset and then set this bit.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0c ====&lt;br /&gt;
&lt;br /&gt;
Flags = 0&lt;br /&gt;
&lt;br /&gt;
Is global -- not about particular sattelite, probably fixed length and rare.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 16 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 8;&lt;br /&gt;
Comes only after request for it.&lt;br /&gt;
&lt;br /&gt;
The chip seems to have an internal 1ms clock. This returns the counter for this clock. 1ms is also period of C/A PRN code.&lt;br /&gt;
&lt;br /&gt;
It seems, that the clock can be widely tuned (probably using divider or so): At least I saw 1000 ticks and 2000 ticks per second.&lt;br /&gt;
&lt;br /&gt;
CMD-04 and CMd-08 seem to be needed to init and start it.&lt;br /&gt;
&lt;br /&gt;
=== Satelite / channel specific packets ===&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 00 ====&lt;br /&gt;
&lt;br /&gt;
Packet type 00 (with the exception of the very first FE-packet in the log) appears to specify a particular satellite to track.  It also seems that this specifies the &amp;quot;ID&amp;quot; field (LS nibble of the third header byte) that will be used for future packets concerning this satellite.  (Non-satellite-specific packets have ID=0.)&lt;br /&gt;
&lt;br /&gt;
Bits 3-7 of the 11th byte of the packet -- third byte of the third data word -- are the satellite PRN number.  In this log only 8 satellites appear to be tracked (2, 4, 8, 10, 13, 23, 27, 29).  If I'm reading the GPGSV messages correctly, 24 should also be visible, but it doesn't appear gltt even attempts to track it.&lt;br /&gt;
&lt;br /&gt;
As for the rest of the packet... There's a lot that gets repeated, information common to all the satellites, at least initially.  When a batch of 8 of these packets gets sent, usually only the PRN and two other words differ among the 8.  So those two words contain whatever satellite-specific info is needed, it seems.  They both appear to be little-endian integers, one around -10^8 and one around 10^8.&lt;br /&gt;
&lt;br /&gt;
(Info needed to search for sattelite... doppler frequency range and phase range is useful).&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 10 ====&lt;br /&gt;
&lt;br /&gt;
Last four bytes are the little endian timestamp, in miliseconds. (Ok, it may actually be number of frames or something on that particular channel).&lt;br /&gt;
&lt;br /&gt;
Packet length is constant (always 16 bytes.)&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 23 ====&lt;br /&gt;
&lt;br /&gt;
It carries variable-length array of  16-bit integers... 6 to 32 entries were seen.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 06, 08 ====&lt;br /&gt;
&lt;br /&gt;
short packets, 06 has varying length, and both are rare.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9d ====&lt;br /&gt;
&lt;br /&gt;
Okay, so packets 10, 23 and 9d come in groups, for each sattelite, and they seem to contain enough info to compute position.  (9d seems to come later than the other two, perhaps only after sending a packet 08?)&lt;br /&gt;
&lt;br /&gt;
Packet 9d seems to contain 2 32-bit integers (second one is  signed), then 3, 0, 0 and flags (?) -- so the packet length is constant.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 24 bytes.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 8 bytes.  Satellite-specific.  First 4 bytes are a signed 32-bit integer.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9f ====&lt;br /&gt;
&lt;br /&gt;
Comes in variants of differing lengths: 20, 36, and 84-byte packets were seen.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
== NMEA ==&lt;br /&gt;
&lt;br /&gt;
It is possible to translate NMEA messages into something readable using script from http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hhdecode , and using c decoder http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hh.c .&lt;br /&gt;
&lt;br /&gt;
NMEA description is available at http://www.gpsinformation.org/dale/nmea.htm .&lt;br /&gt;
&lt;br /&gt;
At this point:&lt;br /&gt;
&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x47\x41\x2c\x31\x35\x34\x31\x30\x34\x2e\x39\x35\x2c\x34\x39\x34\x38\x2e\x39\x35\x30\x33\x33\x39\x2c\x4e\x2c\x30\x30\x39\x35\x37\x2e\x39\x35\x35\x39\x37\x39\x2c\x45\x2c\x31\x2c\x30\x36\x2c\x35\x2e\x30\x2c\x32\x32\x30\x2e\x30\x2c\x4d\x2c\x2d\x30\x2e\x35\x38\x31\x30\x31\x34\x2c\x4d\x2c\x2d\x30\x2e\x31\x39\x30\x30\x31\x39\x30\x2c\x2a\x34\x30\x0d\x0a&amp;quot;, 91) = 91&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
&amp;quot;, 91) = 91&lt;br /&gt;
&lt;br /&gt;
...6 satelitte GPS fix was obtained. (And yes, there's big read few lines before that in the log). &lt;br /&gt;
&lt;br /&gt;
GSA sentence looks interesting, too. It tells us satellites #02, #04, #08, #10, #13 and #27 were used at this point.&lt;br /&gt;
&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x53\x41\x2c\x41\x2c\x33\x2c\x30\x32\x2c\x30\x34\x2c\x30\x38\x2c\x31\x30\x2c\x31\x33\x2c\x32\x37\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x36\x2e\x37\x2c\x33\x2e\x30\x2c\x36\x2e\x30\x2a\x33\x45\x0d\x0a&amp;quot;, 51) = 51&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The whole log is&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$GPGGA,154035.21,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6A&lt;br /&gt;
$GPRMC,154035.24,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154035.61,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6E&lt;br /&gt;
$GPRMC,154035.63,V,,,,,,,240407,,*19&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154038.24,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4B&lt;br /&gt;
$GPRMC,154038.29,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154038.54,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4C&lt;br /&gt;
$GPRMC,154038.56,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154042.72,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*46&lt;br /&gt;
$GPRMC,154042.74,V,,,,,,,240407,,*1F&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,33,10,46,302,33,02,33,244,34*7E&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,33,13,42,076,25,29,11,271,29,24,243,352,*49&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154043.67,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*43&lt;br /&gt;
$GPRMC,154043.69,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154046.89,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154046.93,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154047.14,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*42&lt;br /&gt;
$GPRMC,154047.19,V,,,,,,,240407,,*11&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154050.07,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154050.10,V,,,,,,,240407,,*1E&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154050.45,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*41&lt;br /&gt;
$GPRMC,154050.47,V,,,,,,,240407,,*1C&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,26,10,46,302,25,13,42,076,16*78&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,26,04,18,206,25,29,11,271,25,24,243,352,*44&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154053.35,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*45&lt;br /&gt;
$GPRMC,154053.37,V,,,,,,,240407,,*18&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154058.70,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*49&lt;br /&gt;
$GPRMC,154058.72,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154058.97,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*40&lt;br /&gt;
$GPRMC,154058.98,V,,,,,,,240407,,*16&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154059.38,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*44&lt;br /&gt;
$GPRMC,154059.40,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,13,,,,,,,,,,,669.0,300.0,600.0*3C&lt;br /&gt;
$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
$GPRMC,154104.95,A,4948.950339,N,00957.955979,E,000.0,000.0,240407,,*3E&lt;br /&gt;
$GPGSV,3,1,09,08,59,192,42,10,46,302,42,04,18,206,41,27,77,114,16*74&lt;br /&gt;
$GPGSV,3,2,09,13,42,076,18,02,33,244,18,29,11,271,40,24,243,352,*48&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,04,08,10,,,,,,,,,,11.2,5.0,10.0*39&lt;br /&gt;
$GPGGA,154106.52,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.581025,M,-0.1900190,*4A&lt;br /&gt;
$GPRMC,154111.60,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154122.94,,,,,00,06,3.0,,M,-0.581010,M,-0.1900190,*62&lt;br /&gt;
$GPRMC,154122.96,V,,,,,,,240407,,*14&lt;br /&gt;
$GPGSA,A,1,13,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
$GPGGA,154119.10,4948.936977,N,00957.930742,E,1,05,3.0,245.0,M,-0.576004,M,-0.1870190,*4D&lt;br /&gt;
$GPRMC,154119.10,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3A&lt;br /&gt;
$GPGSA,A,3,04,08,10,27,,,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154128.15,4948.936977,N,00957.930742,E,1,06,5.0,245.0,M,-0.587003,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154128.15,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3D&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,22,08,59,192,39,10,46,302,39,02,33,244,40*7B&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,38,13,42,076,11,24,243,352,,23,14,085,*48&lt;br /&gt;
$GPGSV,3,3,09,29,11,271,*4F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,11.2,5.0,10.0*3E&lt;br /&gt;
$GPGGA,154131.86,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578004,M,-0.1860190,*44&lt;br /&gt;
$GPRMC,154131.86,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154138.55,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578000,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154138.55,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*38&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154141.69,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.583002,M,-0.1840190,*42&lt;br /&gt;
$GPRMC,154141.69,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*39&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154146.16,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.595000,M,-0.1830190,*4F&lt;br /&gt;
$GPRMC,154146.16,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*36&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154151.34,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*4D&lt;br /&gt;
$GPRMC,154151.34,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*30&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,26,08,59,192,42,10,46,302,41,13,42,076,25*7A&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,42,04,18,206,37,29,11,271,37,24,243,352,*46&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154200.05,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*48&lt;br /&gt;
$GPRMC,154200.05,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:GPS]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Gpsd</id>
		<title>Gpsd</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Gpsd"/>
				<updated>2007-07-16T16:53:10Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Q: Can gpsd support Differential GPS. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is GPS ==&lt;br /&gt;
&lt;br /&gt;
The Global Positioning System (GPS) is a worldwide radio-navigation system formed from a constellation of 24 satellites and their ground stations. &lt;br /&gt;
&lt;br /&gt;
GPS uses these &amp;quot;man-made stars&amp;quot; as reference points to calculate positions accurate to a matter of meters. In fact, with advanced forms of GPS you can make measurements to better than a centimeter! &lt;br /&gt;
&lt;br /&gt;
In a sense it's like giving every square meter on the planet a unique address. &lt;br /&gt;
&lt;br /&gt;
GPS receivers have been miniaturized to just a few integrated circuits and so are becoming very economical. And that makes the technology accessible to virtually everyone. &lt;br /&gt;
&lt;br /&gt;
These days GPS is finding its way into cars, boats, planes, construction equipment, movie making gear, farm machinery, even laptop computers. &lt;br /&gt;
&lt;br /&gt;
Soon GPS will become almost as basic as the telephone. Indeed, at Trimble, we think it just may become a universal utility. &lt;br /&gt;
&lt;br /&gt;
(from the [http://www.trimble.com/gps/index.shtml GPS Tutorial])&lt;br /&gt;
&lt;br /&gt;
(Another helpful overview [http://www.colorado.edu/geography/gcraft/notes/gps/gps_f.html Global Positioning System Overview])&lt;br /&gt;
&lt;br /&gt;
== [[Hardware:AGPS|AGPS]] ==&lt;br /&gt;
is described on a [[Hardware:AGPS|page of its own]].&lt;br /&gt;
&lt;br /&gt;
== PMB 2520 Hammerhead ==&lt;br /&gt;
The PMB 2520 Hammerhead is a one-chip solution for GPS that is produced by Infineon Technologies in cooperation with Global Locate. It allows the usage of assistance data by supporting A-GPS standards. &lt;br /&gt;
&lt;br /&gt;
(all infomation is coming from the datasheet of PMB 2520)&lt;br /&gt;
[http://www.infineon.com/upload/Document/cmc_upload/documents/011/4061/pmb2520-pb-200505.pdf short datasheet]&lt;br /&gt;
=== Modules of the Hammerhead===&lt;br /&gt;
&lt;br /&gt;
The Hammerhead consists of the following modules:&lt;br /&gt;
*RF front-end with on-chip, high gain and low noise, LNA, I/Q mixers, on-chip polyphase complex IF filter, digitally controlled AGC, and 3-bits ADC for the I and Q paths.&lt;br /&gt;
*Sigma-Delta RF PLL with on-chip PCO and on-chip loop filter.&lt;br /&gt;
*Embedded PLL and NCO for baseband clock generation.&lt;br /&gt;
*Multiple channels digital mixers and parallel correlator engines to enable real time correlation of the PRN code for up to 14 satellites.&lt;br /&gt;
*Post processor including peak detection logic&lt;br /&gt;
*SRAM for storing correlation results&lt;br /&gt;
&lt;br /&gt;
=== Host Interface ===&lt;br /&gt;
&lt;br /&gt;
The Hammerhead integrates 3 serial interfaces:&lt;br /&gt;
*UART&lt;br /&gt;
*I2C&lt;br /&gt;
*SPI&lt;br /&gt;
&lt;br /&gt;
The UART in the Hammerhead is a full-duplex UART interface. It is fixed in 8N1(8 data bits, no parity, 1 stop bit) mode. On the GTA01, the host processor connect with the Hammerhead through the UART.&lt;br /&gt;
&lt;br /&gt;
=== Host software Architecture ===&lt;br /&gt;
&lt;br /&gt;
The Hammerhead driver software is delivered as a plugin for [http://gpsd.davisnetworks.com/bin/view/Main/GpsdHome gpsd].&lt;br /&gt;
It provides both high level positioning information in a number of formats, and an interface to feed in the AGPS data.&lt;br /&gt;
&lt;br /&gt;
The gpsd libraries provide the following infomation to the high level software:&lt;br /&gt;
*Position data&lt;br /&gt;
*Library status&lt;br /&gt;
*Time-out and Packet Available&lt;br /&gt;
&lt;br /&gt;
The high level software sends the following messages to the plugin:&lt;br /&gt;
*Assistance data&lt;br /&gt;
*Positioning Commands&lt;br /&gt;
*Configuration Commands&lt;br /&gt;
&lt;br /&gt;
Gpsd communicates with the system at the following part:&lt;br /&gt;
*Communications Drivers&lt;br /&gt;
*System Timer&lt;br /&gt;
*NV storage&lt;br /&gt;
*Log buffer&lt;br /&gt;
&lt;br /&gt;
== GPS on GTA01 ==&lt;br /&gt;
&lt;br /&gt;
At the GTA01, the host processor is a S3C2410.&lt;br /&gt;
&lt;br /&gt;
=== Hammerhead on the GTA01 ===&lt;br /&gt;
&lt;br /&gt;
On the GTA01, the Hammerhead are configured that connected with the host processor through the UART. The UART of data output/input is connected to the UART 1 of the SC2410. The UART of the hardware flow control is connected to the UART 2 of the SC2410.&lt;br /&gt;
&lt;br /&gt;
== Q &amp;amp; A ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Q: Can gpsd support Differential GPS.====&lt;br /&gt;
*While the neo does not have any means of receiving [http://en.wikipedia.org/wiki/Differential_GPS DGPS signals] directly, it can be streamed from the internet server. Peer-peer from stationary (charging?) neos that have GPS signal and cheap internet connections will now work, because we need precise coordinates of base station. However, we can use wide-area corrections (WAAS, SDCM), if someone will stream them. We even can setup own wide-area correction system. &lt;br /&gt;
*This can generate positions accurate to well under a metre, compared to (probably) 2-3m without.&lt;br /&gt;
*The gpsd plugin is the place that these corrections would need to be done, as they need to be performed on a per-satellite basis, before generating the position.&lt;br /&gt;
*This is separate from AGPS - AGPS gives information on current satellite position. DGPS is a local minute by minute 'ionospheric weather' for your region.&lt;br /&gt;
&lt;br /&gt;
====Q: Can someone upload somewhere an strace of the interaction between gpsd, and the hammerhead chip?====&lt;br /&gt;
*Ideally this would be requesting a GPS position every second, starting from 'cold', with no AGPS data, for at least half an hour, in an area where the reciever can see the sky.&lt;br /&gt;
*To aid in reverse engineering efforts.&lt;br /&gt;
*A reverse-engineering page has been created: [[Hammerhead/Protocol]]&lt;br /&gt;
&lt;br /&gt;
====Q: Can I get NMEA data from the GPS?====&lt;br /&gt;
&lt;br /&gt;
A: Not directly. However, the gpsd program 'gpspipe', with the -r switch will output NMEA data with the current position information. The right way to do it is to use libgpsd in your program if possible.&lt;br /&gt;
&lt;br /&gt;
[[Category:GPS]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Hammerhead/Protocol</id>
		<title>Hammerhead/Protocol</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Hammerhead/Protocol"/>
				<updated>2007-07-16T13:25:38Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Analysis of FF packets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We have set up a SCM repository for experimental code and documentation at http://projects.linuxtogo.org/projects/sphyrna.&lt;br /&gt;
&lt;br /&gt;
Christian did some stracing on TomTom device, and result is great logs at http://www.maintech.de/download/hammerhead-strace.log . 'pH5' on IRC has put up some traces at http://linuxtogo.org/~ph5/tmp/gllin (a cold start, a hot start and a somewhat longer trace). He even has a software that can init and send command to phase-1 openmoko device in http://linuxtogo.org/~ph5/tmp/hhtest.c . (Please use strace -s9999 -x to produce traces).&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/GPS_signals GPS signals at wikipedia] seems to be required reading for very basics, along with  [http://www.colorado.edu/geography/gcraft/notes/gps/gps.html this page from University of Colorado] for more in depth stuff.&lt;br /&gt;
&lt;br /&gt;
http://home.earthlink.net/~cwkelley/ has sources for open-source GPS receiver, and &lt;br /&gt;
http://home.earthlink.net/~cwkelley/documentation.htm is its documentation.&lt;br /&gt;
&lt;br /&gt;
GP2021 is &amp;quot;dumb&amp;quot; GPS receiver, similar to hammerhead. (But I think it communicates over ISA bus, not over serial). However, its data sheets are freely available. Well, hammerhead marketing tells us that their GPS chip is something special, http://www.gpsworld.com/gpsworld/article/articleDetail.jsp?id=3053 . It seems to differ from &amp;quot;dumb&amp;quot; receivers by doing code phase search in hardware, directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Possible lock scheme that it may use ==&lt;br /&gt;
&lt;br /&gt;
From reading the published brief information sheets on global locates products, not the patents.&lt;br /&gt;
The global locate chip has massively parallel correlators, and configurable integrators to integrate over a given time.&lt;br /&gt;
I would expect it to do something like - in this case.&lt;br /&gt;
*Load orbit data from file (or download from net).&lt;br /&gt;
*Look at time.&lt;br /&gt;
*Get apriori position.&lt;br /&gt;
*Compute positions of satellites. Using apriori position, compute satellite visibility and relative speeds.&lt;br /&gt;
*Init the GPS.&lt;br /&gt;
*Set the hardware to expect to receive from the  set of visible satellites (the hardware is unlikely to be designed to receive them all at once, as you'll never see more than around 16 of the nominal 32).&lt;br /&gt;
*Set the integration time at 10ms-20ms or so - around, or a bit under a data bit.&lt;br /&gt;
*Now, read back the outputs of the integrators, to see if we've got possible data (carrier lock?).&lt;br /&gt;
*If we do have data, spend a bit of time working out the exact relative phase of the PRN with regard to the carrier - each 'chip' of the PRN is around a thousand cycles of the carrier - you need to work this out exactly to get psuedoranges with a resolution of under a meter.&lt;br /&gt;
**it's possible this is done in hardware&lt;br /&gt;
*Now that we've got all the satellites locked in the hardware, simply interrogate the hardware regularly, so that we can read out the 50bps datastream from each satellite.&lt;br /&gt;
**It seems this step takes 19s or so. From the first timestamp in the file, to the first GPGSV line - satellites in view, and their actual signal strengths.&lt;br /&gt;
*Read the navigation messages from each satellite, which cycles every 6 seconds.&lt;br /&gt;
*Compute a position.&lt;br /&gt;
*Output it to NMEA&lt;br /&gt;
** It seems this takes 22 seconds.&lt;br /&gt;
&lt;br /&gt;
== Enhancements ==&lt;br /&gt;
&lt;br /&gt;
To keep to the datasheet of 1s position times, it cannot read the whole navigation message, but significantly under 50 bits of it.&lt;br /&gt;
It must:&lt;br /&gt;
*Use 'AGPS' data to initialise the hardware to a condition where it can get a rapid lock - perhaps telling it the Doppler - then compute what the navigation message from each satellite may be, based on the internal clock.&lt;br /&gt;
*Work out at what point in this navigation message the 20-30 bits that it's received come. &lt;br /&gt;
*Compute the time that was in the navigation message, though it may not have picked it up (from the internal clock) and add it to the information on where the bit edges are from the hardware.&lt;br /&gt;
**If the uncertainty in relative time - due to local clock drift and movement of the GPS device - is under 10ms, then you know immediately as you detect the satellite signal the current satellite time - you simply snap the time to the nearest bit-edge, letting you immediately compute a position, without waiting for more data.&lt;br /&gt;
***With typical crystal accuracy, this implies you need to take a position every 3 minutes or so in order to keep the clock set correctly enough for this to work.&lt;br /&gt;
**This gives you a psuedorange to the satellite to within several meters. &lt;br /&gt;
*Compute a position.&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
Looks like there were 8 satellites overhead at the time that log was made.&lt;br /&gt;
&lt;br /&gt;
The protocol appears to be oriented around 32-bit words (the single-byte markers notwithstanding.) LSB-first, as can be seen on negative numbers.&lt;br /&gt;
&lt;br /&gt;
The first stream of 0x80's to the GPS is simply to synch up the UART in the GPS to the correct baudrate.&lt;br /&gt;
&lt;br /&gt;
=== Packet format ===&lt;br /&gt;
Packet format (same format in both directions):&lt;br /&gt;
* The start of a packet is marked by FF or FE.&lt;br /&gt;
** FF in packets that do not carry data, but rather explicitly request a response.  (This isn't used very often.  More often we receive data without explicitly requesting it.)  The response will be an FE-packet with the same length and type as the FF-packet.  The GPS does not send any FF packets, only gltt does.&lt;br /&gt;
** FE in packets that carry data sections.&lt;br /&gt;
* The first word (32 bits) following the start-of-packet marker is the header.&lt;br /&gt;
** The first byte (if it's indeed little-endian, the least significant byte) gives the data length, measured as ''the number of data words minus 1.''  For FE-packets, this is the length of the data section of this packet.  For FF-packets, it's the length of the data section in the expected response.&lt;br /&gt;
** The second byte of the header is always FD.&lt;br /&gt;
** MS nibble of the third byte might be flags for the packet.&lt;br /&gt;
*** 0x4 set: The words are for increasing register numbers&lt;br /&gt;
*** 0x4 not set: The words are for/from the same register. The register is probably something like a FIFO&lt;br /&gt;
** LS nibble of the third byte is an identifying number of the channel (1-8), 0 in case this is not channel-specific&lt;br /&gt;
** The fourth byte is the packet type. It seems to be more like a register (start) number.&lt;br /&gt;
* In FE-packets only, the data section (''n'' 32-bit words) follows.&lt;br /&gt;
* Finally, FC is sent to mark the end of the packet.&lt;br /&gt;
* After the FC in an FF-packet, gltt sends a bunch of zeros.  In some cases it sends a number of zeros equal to the number of bytes in the response packet; in some cases it sends more.  I would guess that these have no effect.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 ff 04fdc00c fc&lt;br /&gt;
(possibly followed by zeros), is a request for a packet of type 0C, with length 20d ((4 + 1) * 4), and flags C0.&lt;br /&gt;
&lt;br /&gt;
 fe 04fdc00c 0025102a 45dbdd4e 36030000 4b260000 16010000 fc&lt;br /&gt;
would be an appropriate response.&lt;br /&gt;
&lt;br /&gt;
=== Packet statistics ===&lt;br /&gt;
====Packet types====&lt;br /&gt;
&lt;br /&gt;
(Ugh, I do not understand this. Is it SEND or RECEIVED packets? [[User:Pavel|Pavel]] 22:26, 6 May 2007 (CEST))&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| Frequency || Type || Max length || Min length&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 16 || 73 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 86 || 08 || 19 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 8 || e2 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 23 || 133 || 101&lt;br /&gt;
|-&lt;br /&gt;
| 63 || 0a || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 24 || 71 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 52 || 0b || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 01 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 263 || 05 || 19 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 24 || 9d || 315 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 06 || 25 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 16 || e0 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 20 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 10 || 577 || 59&lt;br /&gt;
|-&lt;br /&gt;
| 128 || 18 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 9e || 303 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 117 || 00 || 65 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 11 || 0c || 33 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 9f || 477 || 61&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 0e || 541 || 31&lt;br /&gt;
|-&lt;br /&gt;
| 1 || e5 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 80 || 17 || 17&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 13 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 04 || 23 || 23&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 02 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Analysis of FF packets====&lt;br /&gt;
found in [http://linuxtogo.org/~ph5/tmp/gllin/cold1.log.gz cold1.log.gz] (gz archive seems to be incomplete).&lt;br /&gt;
&amp;quot;Reply packet length&amp;quot; (RPL) reported as raw value seen in packet.&lt;br /&gt;
Total packets: 61.&lt;br /&gt;
Unique packets: 10.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Frequency !! Type !! RPL !! Flags !!  Channels&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 00 || 0c || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 06 || 02 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0c || 04 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0e || 05 || &amp;lt;nowiki&amp;gt;c=8|4&amp;lt;/nowiki&amp;gt; || CH:2, (CH:4)*4, CH:5&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 16 || 00 || 8 || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 49 || 23 || 07 || 8 || (CH:2)*12, (CH:4)*17, (CH:5)*20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Global packets ===&lt;br /&gt;
&lt;br /&gt;
All packets in this category have the &amp;quot;channel&amp;quot; (or &amp;quot;ID&amp;quot;) field set to 0.&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 04 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
In cold2.log this packet comes only once at the start.&lt;br /&gt;
Part of this packet seems to setup the timestamp clock (see packet 16).&lt;br /&gt;
&lt;br /&gt;
Usual layout&lt;br /&gt;
 92 24 11 02  7b 39 8e 23  00 00 00 00  7b 39 8e 23&lt;br /&gt;
&lt;br /&gt;
Word 2 and 4 (both are 0x238e397b = 596523387) seem to control the timestamp clock. Multipliying this value by say 0.99 makes the timestamp clock run at 0.99 its normal speed. So this value is some sort of &amp;quot;frequency&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== SEND Register/Packet 08 ====&lt;br /&gt;
&lt;br /&gt;
One 32 bit word bitmask&lt;br /&gt;
&lt;br /&gt;
* 0x4 resets the timestamp clock to 0. (putting a 0x4 will reset the clock. The bit is self-resetting to 0. This only works, if 0x2000 is set at the same time.&lt;br /&gt;
* 0x40: Unknown&lt;br /&gt;
* 0x2000 lets the timstamp clock (See 16) run. One can start and stop it using this bit.&lt;br /&gt;
* 0x4000 triggers a measurement on channels, that have been setup. This needs an edge, so you have to unset and then set this bit.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0c ====&lt;br /&gt;
&lt;br /&gt;
Flags = 0&lt;br /&gt;
&lt;br /&gt;
Is global -- not about particular sattelite, probably fixed length and rare.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 16 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 8;&lt;br /&gt;
Comes only after request for it.&lt;br /&gt;
&lt;br /&gt;
The chip seems to have an internal 1ms clock. This returns the counter for this clock.&lt;br /&gt;
&lt;br /&gt;
It seems, that the clock can be widely tuned (probably using divider or so): At least I saw 1000 ticks and 2000 ticks per second.&lt;br /&gt;
&lt;br /&gt;
CMD-04 and CMd-08 seem to be needed to init and start it.&lt;br /&gt;
&lt;br /&gt;
=== Satelite / channel specific packets ===&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 00 ====&lt;br /&gt;
&lt;br /&gt;
Packet type 00 (with the exception of the very first FE-packet in the log) appears to specify a particular satellite to track.  It also seems that this specifies the &amp;quot;ID&amp;quot; field (LS nibble of the third header byte) that will be used for future packets concerning this satellite.  (Non-satellite-specific packets have ID=0.)&lt;br /&gt;
&lt;br /&gt;
Bits 3-7 of the 11th byte of the packet -- third byte of the third data word -- are the satellite PRN number.  In this log only 8 satellites appear to be tracked (2, 4, 8, 10, 13, 23, 27, 29).  If I'm reading the GPGSV messages correctly, 24 should also be visible, but it doesn't appear gltt even attempts to track it.&lt;br /&gt;
&lt;br /&gt;
As for the rest of the packet... There's a lot that gets repeated, information common to all the satellites, at least initially.  When a batch of 8 of these packets gets sent, usually only the PRN and two other words differ among the 8.  So those two words contain whatever satellite-specific info is needed, it seems.  They both appear to be little-endian integers, one around -10^8 and one around 10^8.&lt;br /&gt;
&lt;br /&gt;
(Info needed to search for sattelite... doppler frequency range and phase range is useful).&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 10 ====&lt;br /&gt;
&lt;br /&gt;
Last four bytes are the little endian timestamp, in miliseconds. (Ok, it may actually be number of frames or something on that particular channel).&lt;br /&gt;
&lt;br /&gt;
Packet length is constant (always 16 bytes.)&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 23 ====&lt;br /&gt;
&lt;br /&gt;
It carries variable-length array of  16-bit integers... 6 to 32 entries were seen.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 06, 08 ====&lt;br /&gt;
&lt;br /&gt;
short packets, 06 has varying length, and both are rare.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9d ====&lt;br /&gt;
&lt;br /&gt;
Okay, so packets 10, 23 and 9d come in groups, for each sattelite, and they seem to contain enough info to compute position.  (9d seems to come later than the other two, perhaps only after sending a packet 08?)&lt;br /&gt;
&lt;br /&gt;
Packet 9d seems to contain 2 32-bit integers (second one is  signed), then 3, 0, 0 and flags (?) -- so the packet length is constant.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 24 bytes.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 8 bytes.  Satellite-specific.  First 4 bytes are a signed 32-bit integer.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9f ====&lt;br /&gt;
&lt;br /&gt;
Comes in variants of differing lengths: 20, 36, and 84-byte packets were seen.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
== NMEA ==&lt;br /&gt;
&lt;br /&gt;
It is possible to translate NMEA messages into something readable using script from http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hhdecode , and using c decoder http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hh.c .&lt;br /&gt;
&lt;br /&gt;
NMEA description is available at http://www.gpsinformation.org/dale/nmea.htm .&lt;br /&gt;
&lt;br /&gt;
At this point:&lt;br /&gt;
&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x47\x41\x2c\x31\x35\x34\x31\x30\x34\x2e\x39\x35\x2c\x34\x39\x34\x38\x2e\x39\x35\x30\x33\x33\x39\x2c\x4e\x2c\x30\x30\x39\x35\x37\x2e\x39\x35\x35\x39\x37\x39\x2c\x45\x2c\x31\x2c\x30\x36\x2c\x35\x2e\x30\x2c\x32\x32\x30\x2e\x30\x2c\x4d\x2c\x2d\x30\x2e\x35\x38\x31\x30\x31\x34\x2c\x4d\x2c\x2d\x30\x2e\x31\x39\x30\x30\x31\x39\x30\x2c\x2a\x34\x30\x0d\x0a&amp;quot;, 91) = 91&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
&amp;quot;, 91) = 91&lt;br /&gt;
&lt;br /&gt;
...6 satelitte GPS fix was obtained. (And yes, there's big read few lines before that in the log). &lt;br /&gt;
&lt;br /&gt;
GSA sentence looks interesting, too. It tells us satellites #02, #04, #08, #10, #13 and #27 were used at this point.&lt;br /&gt;
&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x53\x41\x2c\x41\x2c\x33\x2c\x30\x32\x2c\x30\x34\x2c\x30\x38\x2c\x31\x30\x2c\x31\x33\x2c\x32\x37\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x36\x2e\x37\x2c\x33\x2e\x30\x2c\x36\x2e\x30\x2a\x33\x45\x0d\x0a&amp;quot;, 51) = 51&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The whole log is&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$GPGGA,154035.21,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6A&lt;br /&gt;
$GPRMC,154035.24,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154035.61,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6E&lt;br /&gt;
$GPRMC,154035.63,V,,,,,,,240407,,*19&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154038.24,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4B&lt;br /&gt;
$GPRMC,154038.29,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154038.54,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4C&lt;br /&gt;
$GPRMC,154038.56,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154042.72,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*46&lt;br /&gt;
$GPRMC,154042.74,V,,,,,,,240407,,*1F&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,33,10,46,302,33,02,33,244,34*7E&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,33,13,42,076,25,29,11,271,29,24,243,352,*49&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154043.67,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*43&lt;br /&gt;
$GPRMC,154043.69,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154046.89,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154046.93,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154047.14,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*42&lt;br /&gt;
$GPRMC,154047.19,V,,,,,,,240407,,*11&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154050.07,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154050.10,V,,,,,,,240407,,*1E&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154050.45,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*41&lt;br /&gt;
$GPRMC,154050.47,V,,,,,,,240407,,*1C&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,26,10,46,302,25,13,42,076,16*78&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,26,04,18,206,25,29,11,271,25,24,243,352,*44&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154053.35,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*45&lt;br /&gt;
$GPRMC,154053.37,V,,,,,,,240407,,*18&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154058.70,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*49&lt;br /&gt;
$GPRMC,154058.72,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154058.97,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*40&lt;br /&gt;
$GPRMC,154058.98,V,,,,,,,240407,,*16&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154059.38,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*44&lt;br /&gt;
$GPRMC,154059.40,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,13,,,,,,,,,,,669.0,300.0,600.0*3C&lt;br /&gt;
$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
$GPRMC,154104.95,A,4948.950339,N,00957.955979,E,000.0,000.0,240407,,*3E&lt;br /&gt;
$GPGSV,3,1,09,08,59,192,42,10,46,302,42,04,18,206,41,27,77,114,16*74&lt;br /&gt;
$GPGSV,3,2,09,13,42,076,18,02,33,244,18,29,11,271,40,24,243,352,*48&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,04,08,10,,,,,,,,,,11.2,5.0,10.0*39&lt;br /&gt;
$GPGGA,154106.52,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.581025,M,-0.1900190,*4A&lt;br /&gt;
$GPRMC,154111.60,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154122.94,,,,,00,06,3.0,,M,-0.581010,M,-0.1900190,*62&lt;br /&gt;
$GPRMC,154122.96,V,,,,,,,240407,,*14&lt;br /&gt;
$GPGSA,A,1,13,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
$GPGGA,154119.10,4948.936977,N,00957.930742,E,1,05,3.0,245.0,M,-0.576004,M,-0.1870190,*4D&lt;br /&gt;
$GPRMC,154119.10,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3A&lt;br /&gt;
$GPGSA,A,3,04,08,10,27,,,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154128.15,4948.936977,N,00957.930742,E,1,06,5.0,245.0,M,-0.587003,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154128.15,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3D&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,22,08,59,192,39,10,46,302,39,02,33,244,40*7B&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,38,13,42,076,11,24,243,352,,23,14,085,*48&lt;br /&gt;
$GPGSV,3,3,09,29,11,271,*4F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,11.2,5.0,10.0*3E&lt;br /&gt;
$GPGGA,154131.86,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578004,M,-0.1860190,*44&lt;br /&gt;
$GPRMC,154131.86,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154138.55,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578000,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154138.55,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*38&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154141.69,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.583002,M,-0.1840190,*42&lt;br /&gt;
$GPRMC,154141.69,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*39&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154146.16,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.595000,M,-0.1830190,*4F&lt;br /&gt;
$GPRMC,154146.16,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*36&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154151.34,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*4D&lt;br /&gt;
$GPRMC,154151.34,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*30&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,26,08,59,192,42,10,46,302,41,13,42,076,25*7A&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,42,04,18,206,37,29,11,271,37,24,243,352,*46&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154200.05,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*48&lt;br /&gt;
$GPRMC,154200.05,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:GPS]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Hammerhead/Protocol</id>
		<title>Hammerhead/Protocol</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Hammerhead/Protocol"/>
				<updated>2007-07-16T13:20:07Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Packet statistics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We have set up a SCM repository for experimental code and documentation at http://projects.linuxtogo.org/projects/sphyrna.&lt;br /&gt;
&lt;br /&gt;
Christian did some stracing on TomTom device, and result is great logs at http://www.maintech.de/download/hammerhead-strace.log . 'pH5' on IRC has put up some traces at http://linuxtogo.org/~ph5/tmp/gllin (a cold start, a hot start and a somewhat longer trace). He even has a software that can init and send command to phase-1 openmoko device in http://linuxtogo.org/~ph5/tmp/hhtest.c . (Please use strace -s9999 -x to produce traces).&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/GPS_signals GPS signals at wikipedia] seems to be required reading for very basics, along with  [http://www.colorado.edu/geography/gcraft/notes/gps/gps.html this page from University of Colorado] for more in depth stuff.&lt;br /&gt;
&lt;br /&gt;
http://home.earthlink.net/~cwkelley/ has sources for open-source GPS receiver, and &lt;br /&gt;
http://home.earthlink.net/~cwkelley/documentation.htm is its documentation.&lt;br /&gt;
&lt;br /&gt;
GP2021 is &amp;quot;dumb&amp;quot; GPS receiver, similar to hammerhead. (But I think it communicates over ISA bus, not over serial). However, its data sheets are freely available. Well, hammerhead marketing tells us that their GPS chip is something special, http://www.gpsworld.com/gpsworld/article/articleDetail.jsp?id=3053 . It seems to differ from &amp;quot;dumb&amp;quot; receivers by doing code phase search in hardware, directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Possible lock scheme that it may use ==&lt;br /&gt;
&lt;br /&gt;
From reading the published brief information sheets on global locates products, not the patents.&lt;br /&gt;
The global locate chip has massively parallel correlators, and configurable integrators to integrate over a given time.&lt;br /&gt;
I would expect it to do something like - in this case.&lt;br /&gt;
*Load orbit data from file (or download from net).&lt;br /&gt;
*Look at time.&lt;br /&gt;
*Get apriori position.&lt;br /&gt;
*Compute positions of satellites. Using apriori position, compute satellite visibility and relative speeds.&lt;br /&gt;
*Init the GPS.&lt;br /&gt;
*Set the hardware to expect to receive from the  set of visible satellites (the hardware is unlikely to be designed to receive them all at once, as you'll never see more than around 16 of the nominal 32).&lt;br /&gt;
*Set the integration time at 10ms-20ms or so - around, or a bit under a data bit.&lt;br /&gt;
*Now, read back the outputs of the integrators, to see if we've got possible data (carrier lock?).&lt;br /&gt;
*If we do have data, spend a bit of time working out the exact relative phase of the PRN with regard to the carrier - each 'chip' of the PRN is around a thousand cycles of the carrier - you need to work this out exactly to get psuedoranges with a resolution of under a meter.&lt;br /&gt;
**it's possible this is done in hardware&lt;br /&gt;
*Now that we've got all the satellites locked in the hardware, simply interrogate the hardware regularly, so that we can read out the 50bps datastream from each satellite.&lt;br /&gt;
**It seems this step takes 19s or so. From the first timestamp in the file, to the first GPGSV line - satellites in view, and their actual signal strengths.&lt;br /&gt;
*Read the navigation messages from each satellite, which cycles every 6 seconds.&lt;br /&gt;
*Compute a position.&lt;br /&gt;
*Output it to NMEA&lt;br /&gt;
** It seems this takes 22 seconds.&lt;br /&gt;
&lt;br /&gt;
== Enhancements ==&lt;br /&gt;
&lt;br /&gt;
To keep to the datasheet of 1s position times, it cannot read the whole navigation message, but significantly under 50 bits of it.&lt;br /&gt;
It must:&lt;br /&gt;
*Use 'AGPS' data to initialise the hardware to a condition where it can get a rapid lock - perhaps telling it the Doppler - then compute what the navigation message from each satellite may be, based on the internal clock.&lt;br /&gt;
*Work out at what point in this navigation message the 20-30 bits that it's received come. &lt;br /&gt;
*Compute the time that was in the navigation message, though it may not have picked it up (from the internal clock) and add it to the information on where the bit edges are from the hardware.&lt;br /&gt;
**If the uncertainty in relative time - due to local clock drift and movement of the GPS device - is under 10ms, then you know immediately as you detect the satellite signal the current satellite time - you simply snap the time to the nearest bit-edge, letting you immediately compute a position, without waiting for more data.&lt;br /&gt;
***With typical crystal accuracy, this implies you need to take a position every 3 minutes or so in order to keep the clock set correctly enough for this to work.&lt;br /&gt;
**This gives you a psuedorange to the satellite to within several meters. &lt;br /&gt;
*Compute a position.&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
Looks like there were 8 satellites overhead at the time that log was made.&lt;br /&gt;
&lt;br /&gt;
The protocol appears to be oriented around 32-bit words (the single-byte markers notwithstanding.) LSB-first, as can be seen on negative numbers.&lt;br /&gt;
&lt;br /&gt;
The first stream of 0x80's to the GPS is simply to synch up the UART in the GPS to the correct baudrate.&lt;br /&gt;
&lt;br /&gt;
=== Packet format ===&lt;br /&gt;
Packet format (same format in both directions):&lt;br /&gt;
* The start of a packet is marked by FF or FE.&lt;br /&gt;
** FF in packets that do not carry data, but rather explicitly request a response.  (This isn't used very often.  More often we receive data without explicitly requesting it.)  The response will be an FE-packet with the same length and type as the FF-packet.  The GPS does not send any FF packets, only gltt does.&lt;br /&gt;
** FE in packets that carry data sections.&lt;br /&gt;
* The first word (32 bits) following the start-of-packet marker is the header.&lt;br /&gt;
** The first byte (if it's indeed little-endian, the least significant byte) gives the data length, measured as ''the number of data words minus 1.''  For FE-packets, this is the length of the data section of this packet.  For FF-packets, it's the length of the data section in the expected response.&lt;br /&gt;
** The second byte of the header is always FD.&lt;br /&gt;
** MS nibble of the third byte might be flags for the packet.&lt;br /&gt;
*** 0x4 set: The words are for increasing register numbers&lt;br /&gt;
*** 0x4 not set: The words are for/from the same register. The register is probably something like a FIFO&lt;br /&gt;
** LS nibble of the third byte is an identifying number of the channel (1-8), 0 in case this is not channel-specific&lt;br /&gt;
** The fourth byte is the packet type. It seems to be more like a register (start) number.&lt;br /&gt;
* In FE-packets only, the data section (''n'' 32-bit words) follows.&lt;br /&gt;
* Finally, FC is sent to mark the end of the packet.&lt;br /&gt;
* After the FC in an FF-packet, gltt sends a bunch of zeros.  In some cases it sends a number of zeros equal to the number of bytes in the response packet; in some cases it sends more.  I would guess that these have no effect.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 ff 04fdc00c fc&lt;br /&gt;
(possibly followed by zeros), is a request for a packet of type 0C, with length 20d ((4 + 1) * 4), and flags C0.&lt;br /&gt;
&lt;br /&gt;
 fe 04fdc00c 0025102a 45dbdd4e 36030000 4b260000 16010000 fc&lt;br /&gt;
would be an appropriate response.&lt;br /&gt;
&lt;br /&gt;
=== Packet statistics ===&lt;br /&gt;
====Packet types====&lt;br /&gt;
&lt;br /&gt;
(Ugh, I do not understand this. Is it SEND or RECEIVED packets? [[User:Pavel|Pavel]] 22:26, 6 May 2007 (CEST))&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| Frequency || Type || Max length || Min length&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 16 || 73 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 86 || 08 || 19 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 8 || e2 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 23 || 133 || 101&lt;br /&gt;
|-&lt;br /&gt;
| 63 || 0a || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 24 || 71 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 52 || 0b || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 01 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 263 || 05 || 19 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 24 || 9d || 315 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 06 || 25 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 16 || e0 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 20 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 10 || 577 || 59&lt;br /&gt;
|-&lt;br /&gt;
| 128 || 18 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 9e || 303 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 117 || 00 || 65 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 11 || 0c || 33 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 9f || 477 || 61&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 0e || 541 || 31&lt;br /&gt;
|-&lt;br /&gt;
| 1 || e5 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 80 || 17 || 17&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 13 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 04 || 23 || 23&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 02 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Analysis of FF packets====&lt;br /&gt;
found in [http://linuxtogo.org/~ph5/tmp/gllin/cold1.log.gz cold1.log.gz] (gz archive seems to be incomplete).&lt;br /&gt;
&amp;quot;Reply packet length&amp;quot; (RPL) reported as raw value seen in packet.&lt;br /&gt;
Total packets: 61.&lt;br /&gt;
Unique packets: 10.&lt;br /&gt;
{|&lt;br /&gt;
! Frequency !! Type !! RPL !! Flags !!  Channels&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 00 || 0c || c=8|4 || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 06 || 02 || c=8|4 || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0c || 04 || c=8|4 || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0e || 05 || c=8|4 || CH:2, (CH:4)*4, CH:5&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 16 || 00 || 8 || CH:0 (global)&lt;br /&gt;
|-&lt;br /&gt;
| 49 || 23 || 07 || 8 || (CH:2)*12, (CH:4)*17, (CH:5)*20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Global packets ===&lt;br /&gt;
&lt;br /&gt;
All packets in this category have the &amp;quot;channel&amp;quot; (or &amp;quot;ID&amp;quot;) field set to 0.&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 04 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
In cold2.log this packet comes only once at the start.&lt;br /&gt;
Part of this packet seems to setup the timestamp clock (see packet 16).&lt;br /&gt;
&lt;br /&gt;
Usual layout&lt;br /&gt;
 92 24 11 02  7b 39 8e 23  00 00 00 00  7b 39 8e 23&lt;br /&gt;
&lt;br /&gt;
Word 2 and 4 (both are 0x238e397b = 596523387) seem to control the timestamp clock. Multipliying this value by say 0.99 makes the timestamp clock run at 0.99 its normal speed. So this value is some sort of &amp;quot;frequency&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== SEND Register/Packet 08 ====&lt;br /&gt;
&lt;br /&gt;
One 32 bit word bitmask&lt;br /&gt;
&lt;br /&gt;
* 0x4 resets the timestamp clock to 0. (putting a 0x4 will reset the clock. The bit is self-resetting to 0. This only works, if 0x2000 is set at the same time.&lt;br /&gt;
* 0x40: Unknown&lt;br /&gt;
* 0x2000 lets the timstamp clock (See 16) run. One can start and stop it using this bit.&lt;br /&gt;
* 0x4000 triggers a measurement on channels, that have been setup. This needs an edge, so you have to unset and then set this bit.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0c ====&lt;br /&gt;
&lt;br /&gt;
Flags = 0&lt;br /&gt;
&lt;br /&gt;
Is global -- not about particular sattelite, probably fixed length and rare.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 16 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 8;&lt;br /&gt;
Comes only after request for it.&lt;br /&gt;
&lt;br /&gt;
The chip seems to have an internal 1ms clock. This returns the counter for this clock.&lt;br /&gt;
&lt;br /&gt;
It seems, that the clock can be widely tuned (probably using divider or so): At least I saw 1000 ticks and 2000 ticks per second.&lt;br /&gt;
&lt;br /&gt;
CMD-04 and CMd-08 seem to be needed to init and start it.&lt;br /&gt;
&lt;br /&gt;
=== Satelite / channel specific packets ===&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 00 ====&lt;br /&gt;
&lt;br /&gt;
Packet type 00 (with the exception of the very first FE-packet in the log) appears to specify a particular satellite to track.  It also seems that this specifies the &amp;quot;ID&amp;quot; field (LS nibble of the third header byte) that will be used for future packets concerning this satellite.  (Non-satellite-specific packets have ID=0.)&lt;br /&gt;
&lt;br /&gt;
Bits 3-7 of the 11th byte of the packet -- third byte of the third data word -- are the satellite PRN number.  In this log only 8 satellites appear to be tracked (2, 4, 8, 10, 13, 23, 27, 29).  If I'm reading the GPGSV messages correctly, 24 should also be visible, but it doesn't appear gltt even attempts to track it.&lt;br /&gt;
&lt;br /&gt;
As for the rest of the packet... There's a lot that gets repeated, information common to all the satellites, at least initially.  When a batch of 8 of these packets gets sent, usually only the PRN and two other words differ among the 8.  So those two words contain whatever satellite-specific info is needed, it seems.  They both appear to be little-endian integers, one around -10^8 and one around 10^8.&lt;br /&gt;
&lt;br /&gt;
(Info needed to search for sattelite... doppler frequency range and phase range is useful).&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 10 ====&lt;br /&gt;
&lt;br /&gt;
Last four bytes are the little endian timestamp, in miliseconds. (Ok, it may actually be number of frames or something on that particular channel).&lt;br /&gt;
&lt;br /&gt;
Packet length is constant (always 16 bytes.)&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 23 ====&lt;br /&gt;
&lt;br /&gt;
It carries variable-length array of  16-bit integers... 6 to 32 entries were seen.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 06, 08 ====&lt;br /&gt;
&lt;br /&gt;
short packets, 06 has varying length, and both are rare.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9d ====&lt;br /&gt;
&lt;br /&gt;
Okay, so packets 10, 23 and 9d come in groups, for each sattelite, and they seem to contain enough info to compute position.  (9d seems to come later than the other two, perhaps only after sending a packet 08?)&lt;br /&gt;
&lt;br /&gt;
Packet 9d seems to contain 2 32-bit integers (second one is  signed), then 3, 0, 0 and flags (?) -- so the packet length is constant.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 24 bytes.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 8 bytes.  Satellite-specific.  First 4 bytes are a signed 32-bit integer.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9f ====&lt;br /&gt;
&lt;br /&gt;
Comes in variants of differing lengths: 20, 36, and 84-byte packets were seen.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
== NMEA ==&lt;br /&gt;
&lt;br /&gt;
It is possible to translate NMEA messages into something readable using script from http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hhdecode , and using c decoder http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hh.c .&lt;br /&gt;
&lt;br /&gt;
NMEA description is available at http://www.gpsinformation.org/dale/nmea.htm .&lt;br /&gt;
&lt;br /&gt;
At this point:&lt;br /&gt;
&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x47\x41\x2c\x31\x35\x34\x31\x30\x34\x2e\x39\x35\x2c\x34\x39\x34\x38\x2e\x39\x35\x30\x33\x33\x39\x2c\x4e\x2c\x30\x30\x39\x35\x37\x2e\x39\x35\x35\x39\x37\x39\x2c\x45\x2c\x31\x2c\x30\x36\x2c\x35\x2e\x30\x2c\x32\x32\x30\x2e\x30\x2c\x4d\x2c\x2d\x30\x2e\x35\x38\x31\x30\x31\x34\x2c\x4d\x2c\x2d\x30\x2e\x31\x39\x30\x30\x31\x39\x30\x2c\x2a\x34\x30\x0d\x0a&amp;quot;, 91) = 91&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
&amp;quot;, 91) = 91&lt;br /&gt;
&lt;br /&gt;
...6 satelitte GPS fix was obtained. (And yes, there's big read few lines before that in the log). &lt;br /&gt;
&lt;br /&gt;
GSA sentence looks interesting, too. It tells us satellites #02, #04, #08, #10, #13 and #27 were used at this point.&lt;br /&gt;
&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x53\x41\x2c\x41\x2c\x33\x2c\x30\x32\x2c\x30\x34\x2c\x30\x38\x2c\x31\x30\x2c\x31\x33\x2c\x32\x37\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x36\x2e\x37\x2c\x33\x2e\x30\x2c\x36\x2e\x30\x2a\x33\x45\x0d\x0a&amp;quot;, 51) = 51&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The whole log is&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$GPGGA,154035.21,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6A&lt;br /&gt;
$GPRMC,154035.24,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154035.61,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6E&lt;br /&gt;
$GPRMC,154035.63,V,,,,,,,240407,,*19&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154038.24,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4B&lt;br /&gt;
$GPRMC,154038.29,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154038.54,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4C&lt;br /&gt;
$GPRMC,154038.56,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154042.72,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*46&lt;br /&gt;
$GPRMC,154042.74,V,,,,,,,240407,,*1F&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,33,10,46,302,33,02,33,244,34*7E&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,33,13,42,076,25,29,11,271,29,24,243,352,*49&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154043.67,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*43&lt;br /&gt;
$GPRMC,154043.69,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154046.89,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154046.93,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154047.14,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*42&lt;br /&gt;
$GPRMC,154047.19,V,,,,,,,240407,,*11&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154050.07,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154050.10,V,,,,,,,240407,,*1E&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154050.45,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*41&lt;br /&gt;
$GPRMC,154050.47,V,,,,,,,240407,,*1C&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,26,10,46,302,25,13,42,076,16*78&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,26,04,18,206,25,29,11,271,25,24,243,352,*44&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154053.35,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*45&lt;br /&gt;
$GPRMC,154053.37,V,,,,,,,240407,,*18&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154058.70,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*49&lt;br /&gt;
$GPRMC,154058.72,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154058.97,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*40&lt;br /&gt;
$GPRMC,154058.98,V,,,,,,,240407,,*16&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154059.38,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*44&lt;br /&gt;
$GPRMC,154059.40,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,13,,,,,,,,,,,669.0,300.0,600.0*3C&lt;br /&gt;
$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
$GPRMC,154104.95,A,4948.950339,N,00957.955979,E,000.0,000.0,240407,,*3E&lt;br /&gt;
$GPGSV,3,1,09,08,59,192,42,10,46,302,42,04,18,206,41,27,77,114,16*74&lt;br /&gt;
$GPGSV,3,2,09,13,42,076,18,02,33,244,18,29,11,271,40,24,243,352,*48&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,04,08,10,,,,,,,,,,11.2,5.0,10.0*39&lt;br /&gt;
$GPGGA,154106.52,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.581025,M,-0.1900190,*4A&lt;br /&gt;
$GPRMC,154111.60,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154122.94,,,,,00,06,3.0,,M,-0.581010,M,-0.1900190,*62&lt;br /&gt;
$GPRMC,154122.96,V,,,,,,,240407,,*14&lt;br /&gt;
$GPGSA,A,1,13,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
$GPGGA,154119.10,4948.936977,N,00957.930742,E,1,05,3.0,245.0,M,-0.576004,M,-0.1870190,*4D&lt;br /&gt;
$GPRMC,154119.10,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3A&lt;br /&gt;
$GPGSA,A,3,04,08,10,27,,,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154128.15,4948.936977,N,00957.930742,E,1,06,5.0,245.0,M,-0.587003,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154128.15,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3D&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,22,08,59,192,39,10,46,302,39,02,33,244,40*7B&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,38,13,42,076,11,24,243,352,,23,14,085,*48&lt;br /&gt;
$GPGSV,3,3,09,29,11,271,*4F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,11.2,5.0,10.0*3E&lt;br /&gt;
$GPGGA,154131.86,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578004,M,-0.1860190,*44&lt;br /&gt;
$GPRMC,154131.86,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154138.55,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578000,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154138.55,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*38&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154141.69,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.583002,M,-0.1840190,*42&lt;br /&gt;
$GPRMC,154141.69,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*39&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154146.16,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.595000,M,-0.1830190,*4F&lt;br /&gt;
$GPRMC,154146.16,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*36&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154151.34,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*4D&lt;br /&gt;
$GPRMC,154151.34,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*30&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,26,08,59,192,42,10,46,302,41,13,42,076,25*7A&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,42,04,18,206,37,29,11,271,37,24,243,352,*46&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154200.05,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*48&lt;br /&gt;
$GPRMC,154200.05,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:GPS]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Hammerhead/Protocol</id>
		<title>Hammerhead/Protocol</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Hammerhead/Protocol"/>
				<updated>2007-07-15T17:54:19Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Possible lock scheme that it may use */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We have set up a SCM repository for experimental code and documentation at http://projects.linuxtogo.org/projects/sphyrna.&lt;br /&gt;
&lt;br /&gt;
Christian did some stracing on TomTom device, and result is great logs at http://www.maintech.de/download/hammerhead-strace.log . 'pH5' on IRC has put up some traces at http://linuxtogo.org/~ph5/tmp/gllin (a cold start, a hot start and a somewhat longer trace). He even has a software that can init and send command to phase-1 openmoko device in http://linuxtogo.org/~ph5/tmp/hhtest.c . (Please use strace -s9999 -x to produce traces).&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/GPS_signals GPS signals at wikipedia] seems to be required reading for very basics, along with  [http://www.colorado.edu/geography/gcraft/notes/gps/gps.html this page from University of Colorado] for more in depth stuff.&lt;br /&gt;
&lt;br /&gt;
http://home.earthlink.net/~cwkelley/ has sources for open-source GPS receiver, and &lt;br /&gt;
http://home.earthlink.net/~cwkelley/documentation.htm is its documentation.&lt;br /&gt;
&lt;br /&gt;
GP2021 is &amp;quot;dumb&amp;quot; GPS receiver, similar to hammerhead. (But I think it communicates over ISA bus, not over serial). However, its data sheets are freely available. Well, hammerhead marketing tells us that their GPS chip is something special, http://www.gpsworld.com/gpsworld/article/articleDetail.jsp?id=3053 . It seems to differ from &amp;quot;dumb&amp;quot; receivers by doing code phase search in hardware, directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Possible lock scheme that it may use ==&lt;br /&gt;
&lt;br /&gt;
From reading the published brief information sheets on global locates products, not the patents.&lt;br /&gt;
The global locate chip has massively parallel correlators, and configurable integrators to integrate over a given time.&lt;br /&gt;
I would expect it to do something like - in this case.&lt;br /&gt;
*Load orbit data from file (or download from net).&lt;br /&gt;
*Look at time.&lt;br /&gt;
*Get apriori position.&lt;br /&gt;
*Compute positions of satellites. Using apriori position, compute satellite visibility and relative speeds.&lt;br /&gt;
*Init the GPS.&lt;br /&gt;
*Set the hardware to expect to receive from the  set of visible satellites (the hardware is unlikely to be designed to receive them all at once, as you'll never see more than around 16 of the nominal 32).&lt;br /&gt;
*Set the integration time at 10ms-20ms or so - around, or a bit under a data bit.&lt;br /&gt;
*Now, read back the outputs of the integrators, to see if we've got possible data (carrier lock?).&lt;br /&gt;
*If we do have data, spend a bit of time working out the exact relative phase of the PRN with regard to the carrier - each 'chip' of the PRN is around a thousand cycles of the carrier - you need to work this out exactly to get psuedoranges with a resolution of under a meter.&lt;br /&gt;
**it's possible this is done in hardware&lt;br /&gt;
*Now that we've got all the satellites locked in the hardware, simply interrogate the hardware regularly, so that we can read out the 50bps datastream from each satellite.&lt;br /&gt;
**It seems this step takes 19s or so. From the first timestamp in the file, to the first GPGSV line - satellites in view, and their actual signal strengths.&lt;br /&gt;
*Read the navigation messages from each satellite, which cycles every 6 seconds.&lt;br /&gt;
*Compute a position.&lt;br /&gt;
*Output it to NMEA&lt;br /&gt;
** It seems this takes 22 seconds.&lt;br /&gt;
&lt;br /&gt;
== Enhancements ==&lt;br /&gt;
&lt;br /&gt;
To keep to the datasheet of 1s position times, it cannot read the whole navigation message, but significantly under 50 bits of it.&lt;br /&gt;
It must:&lt;br /&gt;
*Use 'AGPS' data to initialise the hardware to a condition where it can get a rapid lock - perhaps telling it the Doppler - then compute what the navigation message from each satellite may be, based on the internal clock.&lt;br /&gt;
*Work out at what point in this navigation message the 20-30 bits that it's received come. &lt;br /&gt;
*Compute the time that was in the navigation message, though it may not have picked it up (from the internal clock) and add it to the information on where the bit edges are from the hardware.&lt;br /&gt;
**If the uncertainty in relative time - due to local clock drift and movement of the GPS device - is under 10ms, then you know immediately as you detect the satellite signal the current satellite time - you simply snap the time to the nearest bit-edge, letting you immediately compute a position, without waiting for more data.&lt;br /&gt;
***With typical crystal accuracy, this implies you need to take a position every 3 minutes or so in order to keep the clock set correctly enough for this to work.&lt;br /&gt;
**This gives you a psuedorange to the satellite to within several meters. &lt;br /&gt;
*Compute a position.&lt;br /&gt;
&lt;br /&gt;
== Analysis ==&lt;br /&gt;
&lt;br /&gt;
Looks like there were 8 satellites overhead at the time that log was made.&lt;br /&gt;
&lt;br /&gt;
The protocol appears to be oriented around 32-bit words (the single-byte markers notwithstanding.) LSB-first, as can be seen on negative numbers.&lt;br /&gt;
&lt;br /&gt;
The first stream of 0x80's to the GPS is simply to synch up the UART in the GPS to the correct baudrate.&lt;br /&gt;
&lt;br /&gt;
=== Packet format ===&lt;br /&gt;
Packet format (same format in both directions):&lt;br /&gt;
* The start of a packet is marked by FF or FE.&lt;br /&gt;
** FF in packets that do not carry data, but rather explicitly request a response.  (This isn't used very often.  More often we receive data without explicitly requesting it.)  The response will be an FE-packet with the same length and type as the FF-packet.  The GPS does not send any FF packets, only gltt does.&lt;br /&gt;
** FE in packets that carry data sections.&lt;br /&gt;
* The first word (32 bits) following the start-of-packet marker is the header.&lt;br /&gt;
** The first byte (if it's indeed little-endian, the least significant byte) gives the data length, measured as ''the number of data words minus 1.''  For FE-packets, this is the length of the data section of this packet.  For FF-packets, it's the length of the data section in the expected response.&lt;br /&gt;
** The second byte of the header is always FD.&lt;br /&gt;
** MS nibble of the third byte might be flags for the packet.&lt;br /&gt;
*** 0x4 set: The words are for increasing register numbers&lt;br /&gt;
*** 0x4 not set: The words are for/from the same register. The register is probably something like a FIFO&lt;br /&gt;
** LS nibble of the third byte is an identifying number of the channel (1-8), 0 in case this is not channel-specific&lt;br /&gt;
** The fourth byte is the packet type. It seems to be more like a register (start) number.&lt;br /&gt;
* In FE-packets only, the data section (''n'' 32-bit words) follows.&lt;br /&gt;
* Finally, FC is sent to mark the end of the packet.&lt;br /&gt;
* After the FC in an FF-packet, gltt sends a bunch of zeros.  In some cases it sends a number of zeros equal to the number of bytes in the response packet; in some cases it sends more.  I would guess that these have no effect.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 ff 04fdc00c fc&lt;br /&gt;
(possibly followed by zeros), is a request for a packet of type 0C, with length 20d ((4 + 1) * 4), and flags C0.&lt;br /&gt;
&lt;br /&gt;
 fe 04fdc00c 0025102a 45dbdd4e 36030000 4b260000 16010000 fc&lt;br /&gt;
would be an appropriate response.&lt;br /&gt;
&lt;br /&gt;
=== Packet statistics ===&lt;br /&gt;
Packet types:&lt;br /&gt;
&lt;br /&gt;
(Ugh, I do not understand this. Is it SEND or RECEIVED packets? [[User:Pavel|Pavel]] 22:26, 6 May 2007 (CEST))&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| Frequency || Type || Max length || Min length&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 16 || 73 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 86 || 08 || 19 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 8 || e2 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 23 || 133 || 101&lt;br /&gt;
|-&lt;br /&gt;
| 63 || 0a || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 24 || 71 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 52 || 0b || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 01 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 263 || 05 || 19 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 24 || 9d || 315 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 06 || 25 || 19&lt;br /&gt;
|-&lt;br /&gt;
| 16 || e0 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 20 || 15 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 10 || 577 || 59&lt;br /&gt;
|-&lt;br /&gt;
| 128 || 18 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 9e || 303 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 117 || 00 || 65 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 11 || 0c || 33 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 9f || 477 || 61&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 0e || 541 || 31&lt;br /&gt;
|-&lt;br /&gt;
| 1 || e5 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 80 || 17 || 17&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 13 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 04 || 23 || 23&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 02 || 11 || 11&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Global packets ===&lt;br /&gt;
&lt;br /&gt;
All packets in this category have the &amp;quot;channel&amp;quot; (or &amp;quot;ID&amp;quot;) field set to 0.&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 04 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 4&lt;br /&gt;
&lt;br /&gt;
In cold2.log this packet comes only once at the start.&lt;br /&gt;
Part of this packet seems to setup the timestamp clock (see packet 16).&lt;br /&gt;
&lt;br /&gt;
Usual layout&lt;br /&gt;
 92 24 11 02  7b 39 8e 23  00 00 00 00  7b 39 8e 23&lt;br /&gt;
&lt;br /&gt;
Word 2 and 4 (both are 0x238e397b = 596523387) seem to control the timestamp clock. Multipliying this value by say 0.99 makes the timestamp clock run at 0.99 its normal speed. So this value is some sort of &amp;quot;frequency&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== SEND Register/Packet 08 ====&lt;br /&gt;
&lt;br /&gt;
One 32 bit word bitmask&lt;br /&gt;
&lt;br /&gt;
* 0x4 resets the timestamp clock to 0. (putting a 0x4 will reset the clock. The bit is self-resetting to 0. This only works, if 0x2000 is set at the same time.&lt;br /&gt;
* 0x40: Unknown&lt;br /&gt;
* 0x2000 lets the timstamp clock (See 16) run. One can start and stop it using this bit.&lt;br /&gt;
* 0x4000 triggers a measurement on channels, that have been setup. This needs an edge, so you have to unset and then set this bit.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0c ====&lt;br /&gt;
&lt;br /&gt;
Flags = 0&lt;br /&gt;
&lt;br /&gt;
Is global -- not about particular sattelite, probably fixed length and rare.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 16 ====&lt;br /&gt;
&lt;br /&gt;
Flags = 8;&lt;br /&gt;
Comes only after request for it.&lt;br /&gt;
&lt;br /&gt;
The chip seems to have an internal 1ms clock. This returns the counter for this clock.&lt;br /&gt;
&lt;br /&gt;
It seems, that the clock can be widely tuned (probably using divider or so): At least I saw 1000 ticks and 2000 ticks per second.&lt;br /&gt;
&lt;br /&gt;
CMD-04 and CMd-08 seem to be needed to init and start it.&lt;br /&gt;
&lt;br /&gt;
=== Satelite / channel specific packets ===&lt;br /&gt;
&lt;br /&gt;
==== SEND Packet 00 ====&lt;br /&gt;
&lt;br /&gt;
Packet type 00 (with the exception of the very first FE-packet in the log) appears to specify a particular satellite to track.  It also seems that this specifies the &amp;quot;ID&amp;quot; field (LS nibble of the third header byte) that will be used for future packets concerning this satellite.  (Non-satellite-specific packets have ID=0.)&lt;br /&gt;
&lt;br /&gt;
Bits 3-7 of the 11th byte of the packet -- third byte of the third data word -- are the satellite PRN number.  In this log only 8 satellites appear to be tracked (2, 4, 8, 10, 13, 23, 27, 29).  If I'm reading the GPGSV messages correctly, 24 should also be visible, but it doesn't appear gltt even attempts to track it.&lt;br /&gt;
&lt;br /&gt;
As for the rest of the packet... There's a lot that gets repeated, information common to all the satellites, at least initially.  When a batch of 8 of these packets gets sent, usually only the PRN and two other words differ among the 8.  So those two words contain whatever satellite-specific info is needed, it seems.  They both appear to be little-endian integers, one around -10^8 and one around 10^8.&lt;br /&gt;
&lt;br /&gt;
(Info needed to search for sattelite... doppler frequency range and phase range is useful).&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 10 ====&lt;br /&gt;
&lt;br /&gt;
Last four bytes are the little endian timestamp, in miliseconds. (Ok, it may actually be number of frames or something on that particular channel).&lt;br /&gt;
&lt;br /&gt;
Packet length is constant (always 16 bytes.)&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 23 ====&lt;br /&gt;
&lt;br /&gt;
It carries variable-length array of  16-bit integers... 6 to 32 entries were seen.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 06, 08 ====&lt;br /&gt;
&lt;br /&gt;
short packets, 06 has varying length, and both are rare.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9d ====&lt;br /&gt;
&lt;br /&gt;
Okay, so packets 10, 23 and 9d come in groups, for each sattelite, and they seem to contain enough info to compute position.  (9d seems to come later than the other two, perhaps only after sending a packet 08?)&lt;br /&gt;
&lt;br /&gt;
Packet 9d seems to contain 2 32-bit integers (second one is  signed), then 3, 0, 0 and flags (?) -- so the packet length is constant.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 0e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 24 bytes.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9e ====&lt;br /&gt;
&lt;br /&gt;
Always appears to be 8 bytes.  Satellite-specific.  First 4 bytes are a signed 32-bit integer.&lt;br /&gt;
&lt;br /&gt;
==== RECEIVED Packet 9f ====&lt;br /&gt;
&lt;br /&gt;
Comes in variants of differing lengths: 20, 36, and 84-byte packets were seen.  Satellite-specific.&lt;br /&gt;
&lt;br /&gt;
== NMEA ==&lt;br /&gt;
&lt;br /&gt;
It is possible to translate NMEA messages into something readable using script from http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hhdecode , and using c decoder http://atrey.karlin.mff.cuni.cz/~pavel/outgoing/hh.c .&lt;br /&gt;
&lt;br /&gt;
NMEA description is available at http://www.gpsinformation.org/dale/nmea.htm .&lt;br /&gt;
&lt;br /&gt;
At this point:&lt;br /&gt;
&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256   write(GPS, &amp;quot;\xfe\x00\xfd\x40\x08\x40\x60\x00\x00\xfc&amp;quot;, 10) = 10&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x47\x41\x2c\x31\x35\x34\x31\x30\x34\x2e\x39\x35\x2c\x34\x39\x34\x38\x2e\x39\x35\x30\x33\x33\x39\x2c\x4e\x2c\x30\x30\x39\x35\x37\x2e\x39\x35\x35\x39\x37\x39\x2c\x45\x2c\x31\x2c\x30\x36\x2c\x35\x2e\x30\x2c\x32\x32\x30\x2e\x30\x2c\x4d\x2c\x2d\x30\x2e\x35\x38\x31\x30\x31\x34\x2c\x4d\x2c\x2d\x30\x2e\x31\x39\x30\x30\x31\x39\x30\x2c\x2a\x34\x30\x0d\x0a&amp;quot;, 91) = 91&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
&amp;quot;, 91) = 91&lt;br /&gt;
&lt;br /&gt;
...6 satelitte GPS fix was obtained. (And yes, there's big read few lines before that in the log). &lt;br /&gt;
&lt;br /&gt;
GSA sentence looks interesting, too. It tells us satellites #02, #04, #08, #10, #13 and #27 were used at this point.&lt;br /&gt;
&lt;br /&gt;
256 write(NMEA, &amp;quot;\x24\x47\x50\x47\x53\x41\x2c\x41\x2c\x33\x2c\x30\x32\x2c\x30\x34\x2c\x30\x38\x2c\x31\x30\x2c\x31\x33\x2c\x32\x37\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x36\x2e\x37\x2c\x33\x2e\x30\x2c\x36\x2e\x30\x2a\x33\x45\x0d\x0a&amp;quot;, 51) = 51&lt;br /&gt;
256 write(NMEA, &amp;quot;$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The whole log is&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$GPGGA,154035.21,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6A&lt;br /&gt;
$GPRMC,154035.24,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154035.61,,,,,00,00,5.0,,M,-0.586099,M,-0.1700199,*6E&lt;br /&gt;
$GPRMC,154035.63,V,,,,,,,240407,,*19&lt;br /&gt;
$GPGSA,A,1,,,,,,,,,,,,,11.2,5.0,10.0*36&lt;br /&gt;
$GPGGA,154038.24,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4B&lt;br /&gt;
$GPRMC,154038.29,V,,,,,,,240407,,*1A&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154038.54,,,,,00,04,300.0,,M,-0.586099,M,0.0000199,*4C&lt;br /&gt;
$GPRMC,154038.56,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154042.72,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*46&lt;br /&gt;
$GPRMC,154042.74,V,,,,,,,240407,,*1F&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,33,10,46,302,33,02,33,244,34*7E&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,33,13,42,076,25,29,11,271,29,24,243,352,*49&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154043.67,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*43&lt;br /&gt;
$GPRMC,154043.69,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,27,,,,,,,,669.0,300.0,600.0*36&lt;br /&gt;
$GPGGA,154046.89,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154046.93,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154047.14,,,,,00,06,300.0,,M,-0.587100,M,0.0000199,*42&lt;br /&gt;
$GPRMC,154047.19,V,,,,,,,240407,,*11&lt;br /&gt;
$GPGSA,A,1,02,04,08,10,,,,,,,,,669.0,300.0,600.0*33&lt;br /&gt;
$GPGGA,154050.07,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*47&lt;br /&gt;
$GPRMC,154050.10,V,,,,,,,240407,,*1E&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154050.45,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*41&lt;br /&gt;
$GPRMC,154050.47,V,,,,,,,240407,,*1C&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,24,08,59,192,26,10,46,302,25,13,42,076,16*78&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,26,04,18,206,25,29,11,271,25,24,243,352,*44&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154053.35,,,,,00,06,300.0,,M,-0.586100,M,0.0000199,*45&lt;br /&gt;
$GPRMC,154053.37,V,,,,,,,240407,,*18&lt;br /&gt;
$GPGSA,A,1,27,,,,,,,,,,,,669.0,300.0,600.0*39&lt;br /&gt;
$GPGGA,154058.70,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*49&lt;br /&gt;
$GPRMC,154058.72,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154058.97,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*40&lt;br /&gt;
$GPRMC,154058.98,V,,,,,,,240407,,*16&lt;br /&gt;
$GPGSA,A,1,02,,,,,,,,,,,,669.0,300.0,600.0*3E&lt;br /&gt;
$GPGGA,154059.38,,,,,00,03,300.0,,M,-0.581014,M,0.0000199,*44&lt;br /&gt;
$GPRMC,154059.40,V,,,,,,,240407,,*12&lt;br /&gt;
$GPGSA,A,1,02,13,,,,,,,,,,,669.0,300.0,600.0*3C&lt;br /&gt;
$GPGGA,154104.95,4948.950339,N,00957.955979,E,1,06,5.0,220.0,M,-0.581014,M,-0.1900190,*40&lt;br /&gt;
$GPRMC,154104.95,A,4948.950339,N,00957.955979,E,000.0,000.0,240407,,*3E&lt;br /&gt;
$GPGSV,3,1,09,08,59,192,42,10,46,302,42,04,18,206,41,27,77,114,16*74&lt;br /&gt;
$GPGSV,3,2,09,13,42,076,18,02,33,244,18,29,11,271,40,24,243,352,*48&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,04,08,10,,,,,,,,,,11.2,5.0,10.0*39&lt;br /&gt;
$GPGGA,154106.52,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.581025,M,-0.1900190,*4A&lt;br /&gt;
$GPRMC,154111.60,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154122.94,,,,,00,06,3.0,,M,-0.581010,M,-0.1900190,*62&lt;br /&gt;
$GPRMC,154122.96,V,,,,,,,240407,,*14&lt;br /&gt;
$GPGSA,A,1,13,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
$GPGGA,154119.10,4948.936977,N,00957.930742,E,1,05,3.0,245.0,M,-0.576004,M,-0.1870190,*4D&lt;br /&gt;
$GPRMC,154119.10,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3A&lt;br /&gt;
$GPGSA,A,3,04,08,10,27,,,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154128.15,4948.936977,N,00957.930742,E,1,06,5.0,245.0,M,-0.587003,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154128.15,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3D&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,22,08,59,192,39,10,46,302,39,02,33,244,40*7B&lt;br /&gt;
$GPGSV,3,2,09,04,18,206,38,13,42,076,11,24,243,352,,23,14,085,*48&lt;br /&gt;
$GPGSV,3,3,09,29,11,271,*4F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,11.2,5.0,10.0*3E&lt;br /&gt;
$GPGGA,154131.86,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578004,M,-0.1860190,*44&lt;br /&gt;
$GPRMC,154131.86,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*3F&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154138.55,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.578000,M,-0.1860190,*47&lt;br /&gt;
$GPRMC,154138.55,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*38&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154141.69,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.583002,M,-0.1840190,*42&lt;br /&gt;
$GPRMC,154141.69,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*39&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154146.16,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.595000,M,-0.1830190,*4F&lt;br /&gt;
$GPRMC,154146.16,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*36&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,27,,,,,,,,6.7,3.0,6.0*3C&lt;br /&gt;
$GPGGA,154151.34,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*4D&lt;br /&gt;
$GPRMC,154151.34,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*30&lt;br /&gt;
$GPGSV,3,1,09,27,77,114,26,08,59,192,42,10,46,302,41,13,42,076,25*7A&lt;br /&gt;
$GPGSV,3,2,09,02,33,244,42,04,18,206,37,29,11,271,37,24,243,352,*46&lt;br /&gt;
$GPGSV,3,3,09,23,14,085,*49&lt;br /&gt;
$GPGSA,A,3,02,04,08,10,13,27,,,,,,,6.7,3.0,6.0*3E&lt;br /&gt;
$GPGGA,154200.05,4948.936977,N,00957.930742,E,1,06,3.0,245.0,M,-0.587002,M,-0.1860190,*48&lt;br /&gt;
$GPRMC,154200.05,A,4948.936977,N,00957.930742,E,000.0,000.0,240407,,*35&lt;br /&gt;
$GPGSA,A,3,,,,,,,,,,,,,6.7,3.0,6.0*36&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:GPS]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Hardware:Neo1973:Alternate_Cases:General-purpose_buttons_(side-mounted)</id>
		<title>Hardware:Neo1973:Alternate Cases:General-purpose buttons (side-mounted)</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Hardware:Neo1973:Alternate_Cases:General-purpose_buttons_(side-mounted)"/>
				<updated>2007-07-15T12:16:23Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Interest */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Alternate case for the Neo1973, with side-mounted dual-state buttons.&lt;br /&gt;
&lt;br /&gt;
==Concept==&lt;br /&gt;
Two hardware buttons for simple tasks such as volume up/down, zoom in/out.&lt;br /&gt;
&lt;br /&gt;
==Sub-variants==&lt;br /&gt;
Buttons on right-hand side&amp;lt;br&amp;gt;&lt;br /&gt;
Buttons on left-hand side&lt;br /&gt;
&lt;br /&gt;
==Rendered images==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3D model==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Materials==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Processes==&lt;br /&gt;
Stereolithography&lt;br /&gt;
&lt;br /&gt;
==Components==&lt;br /&gt;
Buttons&lt;br /&gt;
&lt;br /&gt;
==Interest==&lt;br /&gt;
Leave your nickname here if you are interested in having one made. This is not an order form, but is intended to gauge interest before effort is expended designing the case.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!No  !! Nick &lt;br /&gt;
|-&lt;br /&gt;
| 1. || [[User:Shadowjack|Shadowjack]]&lt;br /&gt;
|-&lt;br /&gt;
| 2. ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Neo1973_alternate_cases]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Hardware:Neo1973:Alternate_Cases:Stylus_mount</id>
		<title>Hardware:Neo1973:Alternate Cases:Stylus mount</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Hardware:Neo1973:Alternate_Cases:Stylus_mount"/>
				<updated>2007-07-14T17:19:08Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Interest */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Alternate case for the Neo1973, with a secure method for storing the stylus when not in use.&lt;br /&gt;
&lt;br /&gt;
==Design options==&lt;br /&gt;
1. The stylus is pushed end-on into a round hole slightly larger than the stylus and retained by a spring-loaded clip at the end.&amp;lt;br&amp;gt;&lt;br /&gt;
2. The stylus is stored by pushing laterally into a C-section clip.&lt;br /&gt;
&lt;br /&gt;
==Rendered images==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3D model==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Materials==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Processes==&lt;br /&gt;
Stereolithography&lt;br /&gt;
&lt;br /&gt;
==Interest==&lt;br /&gt;
Leave your nickname here if you are interested in having one made. This is not an order form, but is intended to gauge interest before effort is expended designing the case.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!No  !! Nick&lt;br /&gt;
|-&lt;br /&gt;
|1. || [[User:Tetraden|Tetraden]]&lt;br /&gt;
|-&lt;br /&gt;
|2. || [[User:Shadowjack|Shadowjack]]&lt;br /&gt;
|-&lt;br /&gt;
|3. ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Neo1973_alternate_cases]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Hardware:Neo1973:Alternate_Cases:Removal_of_free_space</id>
		<title>Hardware:Neo1973:Alternate Cases:Removal of free space</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Hardware:Neo1973:Alternate_Cases:Removal_of_free_space"/>
				<updated>2007-07-14T17:16:38Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Interest */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Concept==&lt;br /&gt;
There is unnecessary free space within the case - this variant would remove that, possibly with some re-arrangement of components, to make the phone slightly smaller.&lt;br /&gt;
&lt;br /&gt;
==Rendered images==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3D model==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Materials==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Processes==&lt;br /&gt;
Stereolithography&lt;br /&gt;
&lt;br /&gt;
==Components==&lt;br /&gt;
&lt;br /&gt;
==Interest==&lt;br /&gt;
Leave your nickname here if you are interested in having one made. This is not an order form, but is intended to gauge interest before effort is expended designing the case.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!No  !! Nick&lt;br /&gt;
|-&lt;br /&gt;
|1. || [[User:Chooseopen|Chooseopen]]&lt;br /&gt;
|-&lt;br /&gt;
|2. ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Neo1973_alternate_cases]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Hardware:Neo1973:Alternate_Cases:General-purpose_buttons_(side-mounted)</id>
		<title>Hardware:Neo1973:Alternate Cases:General-purpose buttons (side-mounted)</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Hardware:Neo1973:Alternate_Cases:General-purpose_buttons_(side-mounted)"/>
				<updated>2007-07-14T17:15:27Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Interest */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Alternate case for the Neo1973, with side-mounted dual-state buttons.&lt;br /&gt;
&lt;br /&gt;
==Concept==&lt;br /&gt;
Two hardware buttons for simple tasks such as volume up/down, zoom in/out.&lt;br /&gt;
&lt;br /&gt;
==Sub-variants==&lt;br /&gt;
Buttons on right-hand side&amp;lt;br&amp;gt;&lt;br /&gt;
Buttons on left-hand side&lt;br /&gt;
&lt;br /&gt;
==Rendered images==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3D model==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Materials==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Processes==&lt;br /&gt;
Stereolithography&lt;br /&gt;
&lt;br /&gt;
==Components==&lt;br /&gt;
Buttons&lt;br /&gt;
&lt;br /&gt;
==Interest==&lt;br /&gt;
Leave your nickname here if you are interested in having one made. This is not an order form, but is intended to gauge interest before effort is expended designing the case.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!No  !! Nick &lt;br /&gt;
|-&lt;br /&gt;
| 1. || Shadowjack&lt;br /&gt;
|-&lt;br /&gt;
| 2. ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Neo1973_alternate_cases]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Hardware:Neo1973:Alternate_Cases:General-purpose_buttons_(side-mounted)</id>
		<title>Hardware:Neo1973:Alternate Cases:General-purpose buttons (side-mounted)</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Hardware:Neo1973:Alternate_Cases:General-purpose_buttons_(side-mounted)"/>
				<updated>2007-07-14T17:06:06Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: /* Interest */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Alternate case for the Neo1973, with side-mounted dual-state buttons.&lt;br /&gt;
&lt;br /&gt;
==Concept==&lt;br /&gt;
Two hardware buttons for simple tasks such as volume up/down, zoom in/out.&lt;br /&gt;
&lt;br /&gt;
==Sub-variants==&lt;br /&gt;
Buttons on right-hand side&amp;lt;br&amp;gt;&lt;br /&gt;
Buttons on left-hand side&lt;br /&gt;
&lt;br /&gt;
==Rendered images==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3D model==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Materials==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Processes==&lt;br /&gt;
Stereolithography&lt;br /&gt;
&lt;br /&gt;
==Components==&lt;br /&gt;
Buttons&lt;br /&gt;
&lt;br /&gt;
==Interest==&lt;br /&gt;
Leave your nickname here if you are interested in having one made. This is not an order form, but is intended to gauge interest before effort is expended designing the case.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!No  !! Nick !!&lt;br /&gt;
|-&lt;br /&gt;
|1. Shadowjack&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Neo1973_alternate_cases]]&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Talk:Hardware:Neo1973:Alternate_Cases:Extra_battery</id>
		<title>Talk:Hardware:Neo1973:Alternate Cases:Extra battery</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Talk:Hardware:Neo1973:Alternate_Cases:Extra_battery"/>
				<updated>2007-07-14T17:05:03Z</updated>
		
		<summary type="html">&lt;p&gt;Shadowjack: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Should not nick list be numbered list instead of table?&lt;/div&gt;</summary>
		<author><name>Shadowjack</name></author>	</entry>

	</feed>