| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408 | 
#------------------------------------------------------------------------------# $File: map,v 1.9 2021/04/26 15:56:00 christos Exp $# map:  file(1) magic for Map data## Garmin .FIT files https://pub.ks-and-ks.ne.jp/cycling/edge500_fit.shtml8	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 ./filesystems0x1FE	leshort		=0xAA55# look for valid map signature>0x13	string		=IMG\0>>0	use		garmin-map0	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 map0	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:ss0	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 Header2	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 Jenderek0	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 record0	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 Lenski0	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)
 |