123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413 |
- #------------------------------------------------------------------------------
- # $File: map,v 1.10 2023/02/03 20:41:57 christos Exp $
- # map: file(1) magic for Map data
- #
- # Garmin .FIT files https://pub.ks-and-ks.ne.jp/cycling/edge500_fit.shtml
- 8 string .FIT FIT Map data
- >15 byte 0
- >>35 belong x \b, unit id %d
- >>39 lelong x \b, serial %u
- # https://pub.ks-and-ks.ne.jp/cycling/edge500_fit.shtml
- # 20 years after unix epoch
- # TZ=GMT date -d '1989-12-31 0:00' +%s
- >>43 leldate+631065600 x \b, %s
- >>47 leshort x \b, manufacturer %d
- >>47 leshort 1 \b (garmin)
- >>49 leshort x \b, product %d
- >>53 byte x \b, type %d
- >>53 byte 1 \b (Device)
- >>53 byte 2 \b (Settings)
- >>53 byte 3 \b (Sports/Cycling)
- >>53 byte 4 \b (Activity)
- >>53 byte 8 \b (Elevations)
- >>53 byte 10 \b (Totals)
- # Summary: Garmin map
- # From: Joerg Jenderek
- # URL: https://en.wikipedia.org/wiki/Garmin_.img
- # Reference: https://wiki.openstreetmap.org/wiki/OSM_Map_On_Garmin/IMG_File_Format
- # sourceforge.net/projects/garmin-img/files/IMG%20File%20Format/1.0/imgformat-1.0.pdf
- # GRR: similar to MBR boot sector handled by ./filesystems
- 0x1FE leshort =0xAA55
- # look for valid map signature
- >0x13 string =IMG\0
- >>0 use garmin-map
- 0 name garmin-map
- >0 ubyte x Garmin
- !:mime application/x-garmin-map
- # If non-zero, every byte of the entire .img file is to be XORed with this value
- >0 ubyte !0 \b, %#x XORed
- # goto block before FAT
- >(0x40.b*512) ubyte x
- # 1st fat name "DLLINFO TXT" only found for vpm
- >>&512 string =DLLINFO\ TXT map (Voice Processing)
- # there exist 2 other Garmin VPM formats; see ./audio
- !:ext vpm
- # Deutsch__Yannick_D4481-00_0210.vpm
- #>>>512 search/0x0116da60/s RIFF \b; with
- # determine type voice type by ./riff
- #>>>>&0 indirect x \b
- >>&512 string !DLLINFO\ TXT map
- !:ext img
- # 9 zeros
- >1 ubelong !0 \b, zeroes %#x
- # Map's version major
- >8 ubyte x v%u
- # Map's version minor
- >9 ubyte x \b.%.2u
- # Map description[20], 0x20 padded
- >0x49 string x %.20s
- # Map name, continued (0x20 padded, \0 terminated)
- >0x65 string >\ \b%.31s
- # Update year (+1900 for val >= 0x63, +2000 for val <= 0x62)
- >0xB ubyte x \b, updated
- >>0xB ubyte >0x62
- >>>0xB ubyte-100 x 20%.2u
- >>0xB ubyte <0x63
- >>>0xB ubyte x 20%.2u
- # Update month (0-11)
- >0xA ubyte x \b-%.2u
- # All zeroes
- >0xc uleshort !0 \b, zeroes %#x
- # Mapsource flag, 1 - file created by Mapsource, 0 - Garmin map visible in Basecamp and Homeport
- #>0xE ubyte !0 \b, Mapsource flag %#x
- >0xE ubyte 1 \b, Mapsource
- # Checksum, sum of all bytes modulo 256 should be 0
- #>0xF ubyte x \b, Checksum %#x
- # Signature: DSKIMG 0x00 or DSDIMG 0x00 for demo map
- >0x10 string !DSKIMG \b, signature "%.7s"
- >0x39 use garmin-date
- # Map file identifier like GARMIN\0
- >0x41 string !GARMIN \b, id "%.7s"
- # Block size exponent, E1; appears to always be 0x09; minimum block size 512 bytes
- >0x61 ubyte !0x09 \b, E1=%u
- # Block size exponent, E2 ; file blocksize=2**(E1+E2)
- >>0x62 ubyte x \b, E2=%u
- >0x61 ubyte =0x09 \b, blocksize
- >>0x62 ubyte 0 512
- >>0x62 ubyte 1 1024
- >>0x62 ubyte 2 2048
- >>0x62 ubyte 3 4096
- >>0x62 ubyte 4 8192
- >>0x62 ubyte 5 16384
- >>0x62 default x
- >>>0x62 ubyte x E2=%u
- # MBR signature
- >0x1FE leshort !0xAA55 \b, invalid MBR
- # 512 zeros
- >0x200 uquad !0 \b, zeroes %#llx
- # First sub-file offset (absolute); sometimes NO/UNKNOWN sub file!
- >0x40C ulelong >0 \b, at %#x
- # sub-file Header length
- #>>(0x40C.l) uleshort x \b, header len %#x
- >>(0x40C.l) uleshort x %u bytes
- # sub-file Type[10] like "GARMIN RGN" "GARMIN TRE", "GARMIN TYP", etc.
- >>(0x40C.l+2) ubyte >0x1F
- >>>(0x40C.l+2) ubyte <0xFF
- >>>>(0x40C.l+2) string x "%.10s"
- # 0x00 for most maps, 0x80 for locked maps (City Nav, City Select, etc.)
- >>>>(0x40C.l+13) ubyte >0 \b, locked %#x
- # Block sequence numbers like 0000 0100 0200 ... FFFF
- # >0x420 ubequad >0 \b, seq. %#16.16llx
- # >>0x428 ubequad >0 \b%16.16llx
- # >>>0x430 ubequad >0 \b%16.16llx
- # >>>>0x438 ubequad >0 \b%16.16llx
- # >>>>>0x440 ubequad >0 \b%16.16llx
- # >>>>>>0x448 ubequad >0 \b%16.16llx
- # >>>>>>>0x450 ubequad >0 \b%16.16llx
- # >>>>>>>>0x458 ubequad >0 \b%16.16llx
- # >>>>>>>>>0x460 ubequad >0 \b%16.16llx
- # >>>>>>>>>>0x468 ubequad >0 \b%16.16llx
- # >>>>>>>>>>>0x470 ubequad >0 \b%16.16llx
- # >>>>>>>>>>>>0x478 ubequad >0 \b%16.16llx
- # >>>>>>>>>>>>>0x480 ubequad >0 \b%16.16llx
- # >>>>>>>>>>>>>>0x488 ubequad >0 \b%16.16llx
- # >>>>>>>>>>>>>>>0x490 ubequad >0 \b%16.16llx
- # >>>>>>>>>>>>>>>>0x498 ubequad >0 \b%16.16llx
- # >>>>>>>>>>>>>>>>>0x4A0 ubequad >0 \b%16.16llx
- # >>>>>>>>>>>>>>>>>>0x4A8 ubequad >0 \b%16.16llx
- # look for end of FAT
- #>>0x420 search/512/s \xff\xff FAT END
- # Physical block number of FAT header
- #>0x40 ubyte x \b, FAT at phy. block %u
- >0x40 ubyte x
- >>(0x40.b*512) ubyte x
- # 1st FAT block
- >>>&511 use garmin-fat
- # 2nd FAT block
- >>>&1023 use garmin-fat
- # 3th FAT block
- >>>&1535 use garmin-fat
- # 4th FAT block
- >>>&2047 use garmin-fat
- # ... xth FAT block
- #
- # 314 zeros but not in vpm and also gmaptz.img
- >0x84 uquad !0 \b, at 0x84 %#llx
- # display FileAllocationTable block entry in garmin map
- 0 name garmin-fat
- >0 ubyte x \b;
- # sub file part; 0x0003 seems to be garbage
- >0x10 uleshort !0 next %#4.4x
- >0x10 uleshort =0
- # fat flag 0~dummy block 1~true sub file
- >>0 ubyte !1 flag %u
- >>0 ubyte =1
- # sub-file name like MAKEGMAP 12345678
- >>>0x1 string x %.8s
- # sub-file typ like RGN TRE MDR LBL
- >>>0x9 string x \b.%.3s
- # size of sub file
- >>>0xC ulelong x \b, %u bytes
- # 32-bit block sequence numbers
- #>>>0x20 ubequad x \b, seq. %#16.16llx
- # display date stored inside Garmin maps like yyyy-mm-dd h:mm:ss
- 0 name garmin-date
- # year like 2018
- >0 uleshort x \b, created %u
- # month (0-11)
- >2 ubyte x \b-%.2u
- # day (1-31)
- >3 ubyte x \b-%.2u
- # hour (0-23)
- >4 ubyte x %u
- # minute (0-59)
- >5 ubyte x \b:%.2u
- # second (0-59)
- >6 ubyte x \b:%.2u
- # Summary: Garmin Map subfiles
- # From: Joerg Jenderek
- # URL: https://wiki.openstreetmap.org/wiki/OSM_Map_On_Garmin/IMG_File_Format
- # Garmin Common Header
- 2 string GARMIN\
- # skip ASCII text by checking for low header length
- >0 uleshort <0x1000 Garmin map,
- # URL: https://wiki.openstreetmap.org/wiki/OSM_Map_On_Garmin/GMP_Subfile_Format
- >>9 string GMP subtile
- !:mime application/x-garmin-gpm
- !:ext gmp
- # copyright message
- >>>(0.s) string x %s
- >>>0x0E use garmin-date
- # URL: https://wiki.openstreetmap.org/wiki/OSM_Map_On_Garmin/MDR_Subfile_Format
- # This contains the searchable address table used for finding routing destinations
- >>9 string MDR address table
- !:mime application/x-garmin-mdr
- !:ext mdr
- # URL: https://wiki.openstreetmap.org/wiki/OSM_Map_On_Garmin/NOD_Subfile_Format
- # http://svn.parabola.me.uk/display/trunk/doc/nod.txt
- # This contains the routing information
- >>9 string NOD routing
- !:mime application/x-garmin-nod
- !:ext nod
- >>>0x0E use garmin-date
- #>>>0x15 ulelong x \b, at %#x
- #>>>0x19 ulelong x %#x bytes NOD1
- #>>>0x25 ulelong x \b, at %#x
- #>>>0x29 ulelong x %#x bytes NOD2
- #>>>0x31 ulelong x \b, at %#x
- #>>>0x35 ulelong x %#x bytes NOD3
- # URL: http://www.pinns.co.uk/osm/net.html
- # routable highways (length, direction, allowed speed,house address information)
- >>9 string NET highways
- !:mime application/x-garmin-net
- !:ext net
- #>>>0x15 ulelong x \b, at %#x
- #>>>0x19 ulelong x %#x bytes NET1
- #>>>0x22 ulelong >0
- #>>>>0x1E ulelong x \b, at %#x
- #>>>>0x22 ulelong x %#x bytes NET2
- #>>>0x2B ulelong >0
- #>>>>0x27 ulelong x \b, at %#x
- #>>>>0x2B ulelong x %#x bytes NET3
- # URL: https://wiki.openstreetmap.org/wiki/OSM_Map_On_Garmin/LBL_Subfile_Format
- >>9 string LBL labels
- !:mime application/x-garmin-lbl
- !:ext lbl
- >>>(0.s) string x %s
- # Label coding type 6h 9h and ah
- >>>0x1E ubyte x \b, coding type %#x
- #>>>0x15 ulelong x \b, at %#x
- #>>>0x19 ulelong x %#x bytes LBL1
- #>>>0x1F ulelong x \b, at %#x
- #>>>0x23 ulelong x %#x bytes LBL2
- #>>>0x2D ulelong x \b, at %#x
- #>>>0x31 ulelong x %#x bytes LBL3
- # URL: https://wiki.openstreetmap.org/wiki/OSM_Map_On_Garmin/SRT_Subfile_Format
- # A lookup table of the chars in the map's codepage, and their collating sequence
- >>9 string SRT sort table
- !:mime application/x-garmin-srt
- !:ext srt
- >>>0x0E use garmin-date
- # URL: https://wiki.openstreetmap.org/wiki/OSM_Map_On_Garmin/TRE_Subfile_Format
- >>9 string TRE tree
- !:mime application/x-garmin-tre
- !:ext tre
- # title like City Nav Europe NTU 2019.2 Basemap
- # or OSM Street map
- >>>(0.s) string x %s
- # 2nd title like Copyright 1995-2018 by GARMIN Corporation.
- # or http://www.openstreetmap.org/
- >>>>&1 string x %s
- >>>0x0E use garmin-date
- #>>>0x21 ulelong x \b, at %#x
- #>>>0x25 ulelong x %#x bytes TRE1
- #>>>0x29 ulelong x \b, at %#x
- #>>>0x2D ulelong x %#x bytes TRE2
- #>>>0x31 ulelong x \b, at %#x
- #>>>0x35 ulelong x %#x bytes TRE3
- # Copyright record size
- #>>>0x39 uleshort x \b, copyright record size %u
- # Map ID
- >>>0x74 ulelong x \b, ID %#x
- # URL: https://www.gpspower.net/garmin-tutorials/353310-basecamp-installing-free-desktop-map.html
- # For road traffic information service (RDS/TMS/TMC). Commonly seen in City Navigator maps
- >>9 string TRF traffic,
- !:mime application/x-garmin-trf
- !:ext trf
- # city/region like Preitenegg
- >>>(0.s+1) string x 1st %s
- # highway part like L606/L148
- >>>>&1 string x %s
- # URL: https://wiki.openstreetmap.org/wiki/OSM_Map_On_Garmin/Format
- # Reference: http://www.pinns.co.uk/osm/typformat.html
- # customize the appearance of objects. For GPS and MapSource/Qlandkarte better looking maps
- >>9 string TYP types
- !:mime application/x-garmin-typ
- !:ext typ
- >>>0x0E use garmin-date
- # character set 1252 65001~UTF8
- >>>0x15 uleshort x \b, code page %u
- # POIs
- #>>>0x17 ulelong x \b, at %#x
- #>>>0x1B ulelong x %#x bytes TYP1
- # extra pois
- #>>>0x5B ulelong x \b, at %#x
- #>>>0x5F ulelong x %#x bytes TYP8
- # URL: https://wiki.openstreetmap.org/wiki/OSM_Map_On_Garmin/RGN_Subfile_Format
- # http://www.pinns.co.uk/osm/RGN.html
- # region data used by the Garmin software
- >>9 string RGN region
- !:mime application/x-garmin-rgn
- !:ext rgn
- # POIs,Indexed POIs,Polylines or Polygons or first map level
- #>>>0x15 ulelong x \b, at %#x
- #>>>0x19 ulelong x %#x bytes RGN1
- # polygons with extended types
- #>>>0x21 ulelong >0
- #>>>>0x1D ulelong x \b, at %#x
- #>>>>0x21 ulelong x %#x bytes RGN2
- # polylines with extended types
- #>>>0x3D ulelong >0
- #>>>>0x39 ulelong x \b, at %#x
- #>>>>0x3D ulelong x %#x bytes RGN3
- # extended POIs
- #>>>0x59 ulelong >0
- #>>>>0x55 ulelong x \b, at %#x
- #>>>>0x59 ulelong x %#x bytes RGN3
- #>>9 default x unknown map type
- # Header length; GMP:31h 35h 3Dh,MDR:11Eh 238h 2C4h 310h,NOD:3Fh 7Fh,NET:64h,
- # LBL:2A9h,SRT:1Dh 25h 27h,TRE:CFh 135h,TRF:5Ah,TYP:5Bh 6Eh 7Ch AEh,RGN:7Dh
- >>0 uleshort x \b, header length %#x
- # URL: https://www.memotech.franken.de/FileFormats/
- # Reference: https://www.memotech.franken.de/FileFormats/Garmin_RGN_Format.pdf
- # From: Joerg Jenderek
- 0 string KpGr Garmin update
- # format version like: 0064h~1.0
- >0x4 uleshort !0x0064
- >>4 uleshort/100 x \b, version %u
- >>4 uleshort%100 x \b.%u
- # 1st Garmin entry
- >6 use garmin-entry
- # 2nd Garmin entry
- >(0x6.l+10) ubyte x
- >>&0 use garmin-entry
- # 3rd entry
- >(0x6.l+10) ubyte x
- >>&(&0.l+4) ubyte x
- >>>&0 use garmin-entry
- # look again at version to use default clause
- >0x4 uleshort x
- # test for region content by looking for
- # Garmin *.srf by ./images with normal builder name "SQA" or longer "hales"
- # 1 space after equal sign
- >>0x3a search/5/s GARMIN\ BITMAP \b=
- !:mime image/x-garmin-exe
- !:ext exe
- >>>&0 indirect x
- # if not bitmap *.srf then region; 1 space after equal sign
- >>0x3a default x \b=
- !:mime application/x-garmin-rgn
- !:ext rgn
- # recursiv embedded
- >>>0x3a search/5/s KpGrd
- >>>>&0 indirect x
- # look for ZIP or JAR archive by ./archive and ./zip
- >>>0x3a search/5/s PK\003\004
- >>>>&0 indirect x
- # TODO: other garmin RGN record content like foo
- #>>0x3a search/5/s bar BAR
- # display information of Garmin RGN record
- 0 name garmin-entry
- # record length: 2 for Data, for Application often 1Bh sometimes 1Dh, "big" for Region
- #>0 ulelong x \b, length %#x
- # data record (ID='D') with version content like 0064h~1.0
- >4 ubyte =0x44
- >>5 uleshort !0x0064 \b; Data
- >>>5 uleshort/100 x \b, version %u
- >>>5 uleshort%100 x \b.%u
- # Application Record (ID='A')
- >4 ubyte =0x41 \b; App
- # version content like 00c8h~2.0
- >>5 uleshort !0x00C8
- >>>5 uleshort/100 x \b, version %u
- >>>5 uleshort%100 x \b.%u
- # builder name like: SQA sqa build hales
- >>7 string x \b, build by %s
- # build date like: Oct 25 1999, Oct 1 2008, Feb 23 2009, Dec 15 2009
- >>>&1 string x %s
- # build time like: 11:26:12, 11:45:54, 14:16:13, 18:23:01
- >>>>&1 string x %s
- # region record (ID='R')
- >4 ubyte =0x52 \b; Region
- # region ID:14~fw_all.bin: 78~ZIP, RGN or SRF bitmap; 148~ZIP or JAR; 249~display firmware; 251~WiFi or GCD firmware; 255~ZIP
- >>5 uleshort x ID=%u
- # delay in ms: like 0, 500
- >>7 ulelong !0 \b, %u ms
- # region size (is record length - 10)
- #>>11 ulelong x \b, length %#x
- # region content like:
- # "KpGr"~recursiv embedded,"GARMIN BITMAP"~Garmin Bitmap *.srf, "PK"~ZIP archive
- #>>15 string x \b, content "%s"
- >>15 ubequad x \b, content %#llx...
- # This does NOT WORK!
- #>>15 indirect x \b; contains
- >4 default x \b; other
- # garmin Record ID Identifies the record content like: D A R
- >>4 ubyte x ID '%c'
- # TOM TOM GPS watches ttbin files:
- # https://github.com/ryanbinns/ttwatch/tree/master/ttbin
- # From: Daniel Lenski
- 0 byte 0x20
- >1 leshort 0x0007
- >>0x76 byte 0x20
- >>>0x77 leshort 0x0075 TomTom activity file, v7
- >>>>8 leldate x (%s,
- >>>>3 byte x device firmware %d.
- >>>>4 byte x \b%d.
- >>>>5 byte x \b%d,
- >>>>6 leshort x product ID %04d)
- # Garmin firmware:
- # https://www.memotech.franken.de/FileFormats/Garmin_GCD_Format.pdf
- # https://www.gpsrchive.com/GPSMAP/GPSMAP%2066sr/Firmware.html
- 0 string GARMIN
- >6 uleshort 100 GARMIN firmware (version 1.0)
|