This is something that has been bugging me for a while. This whole altitude issue with Sirf based GPS receivers. The issue is related to the way GPS works but it gets worst with Sirf chips because earlier versions of its firmware (before 2.30) do not provide a correction value, called "geoid separation". Or the height of Mean Sea Level above the WGS84 ellipsoid.
We don't live in a perfect abstract ellipsoid, but in a rough and real geoid. The correction value would compensate the difference in height from the ellipsoid model to the mean sea level. For a visual explanation, check this diagram from the Victoria government website in Australia.
I have two CF cards that I use with the Toshiba e755. The Holux Ultra GM-270 I bought before knowing about DGPS (Differential GPS), WAAS (Wide Area Augmentation System) and EGNOS (European Geostationary Navigation Overlay Service System), the GlobalSat BC-307 after. (The non-Ultra version of the GM-270 supports WAAS.)
After posting about GPSDash and its new Geodic Separation menu option I decided to investigate this matter a bit further. Here is what I found out. First I looked at the NMEA log file from both receivers based on information from this thread.
Basically the correction value should be present after the first M in the GPGGA sentence (for more on NMEA sentences check this post). This is the output example from the Holux 270:
$GPGGA,000021.531,3657.5968,N,12201.1615,W,1,07,1.3,-21.8,And this is the output from the GlobalSat BC 307
$GPGGA,212231.340,3656.3602,N,12150.1878,W,1,05,1.6,130.3,Notice that the Holux doesn't provide any value after the M. That because the firmware version in the Holux GM-270 is pre 2.30 while the BC 307 which has a newer firmware does provide a correction value. A negative one: -26.5. So from that I now know that I need to set the geoid separation in GPSDash with "apply negative". This way, the -26.5 meters will be added to the current value (130.3 in the example above), resulting in an altitude value of 156.5 meters.
To make sure that these values are correct, one would need an accurate altimeter to verify it. Or read the values provided at sea level. But even applying the geoid separation value I still get at sea level about 20 meters above what it should be.
If you are wondering about how to check the version of a Sirf firmware download & run GpsTweak. Select Sirf protocol under settings, plus the COM port and Command | Poll version. (You can also use this utility to turn on/off WAAS/EGNOS mode). For the BC 307 I got 2.3.2 GSW2-2.05.024 from GpsTweak. GSW2 means standard SiRFStar II software and 2.3.2 its version number. And the 2.0.5.024 is the manufacturer's internal version control number. The Holux had a pre-2.3 firmware.
I didn't find a way someone could upgrade the firmware on the Sirf chipset. It seems that you would need a Flash programmer according to this answer (which also explains how to interpret the version numbers obtained above). Some vendors provide this service.