mfg: Add an optional base address flag to mfg commands that can specify a base address other than 0 (#441)

diff --git a/newt/cli/mfg_cmds.go b/newt/cli/mfg_cmds.go
index 92f6ad3..4325dc8 100644
--- a/newt/cli/mfg_cmds.go
+++ b/newt/cli/mfg_cmds.go
@@ -31,6 +31,8 @@
 	"mynewt.apache.org/newt/util"
 )
 
+var baseAddress int
+
 func ResolveMfgPkg(pkgName string) (*pkg.LocalPackage, error) {
 	proj := TryGetProject()
 
@@ -114,7 +116,7 @@
 		NewtUsage(nil, err)
 	}
 
-	me, err := mfg.LoadMfgEmitter(lpkg, ver, keys)
+	me, err := mfg.LoadMfgEmitter(lpkg, ver, keys, baseAddress)
 	if err != nil {
 		NewtUsage(nil, err)
 	}
@@ -156,7 +158,7 @@
 		}
 	}
 
-	me, err := mfg.LoadMfgEmitter(lpkg, ver, nil)
+	me, err := mfg.LoadMfgEmitter(lpkg, ver, nil, baseAddress)
 	if err != nil {
 		NewtUsage(nil, err)
 	}
@@ -179,6 +181,8 @@
 		},
 	}
 
+	mfgCmd.PersistentFlags().IntVarP(&baseAddress,
+		"base-address", "b", 0, "Base address of the chip")
 	cmd.AddCommand(mfgCmd)
 
 	mfgCreateCmd := &cobra.Command{
diff --git a/newt/mfg/build.go b/newt/mfg/build.go
index e13b93c..d39fad0 100644
--- a/newt/mfg/build.go
+++ b/newt/mfg/build.go
@@ -79,6 +79,7 @@
 	Targets []MfgBuildTarget
 	Raws    []MfgBuildRaw
 	Meta    *MfgBuildMeta
+	BaseAddress int
 }
 
 // Searches the provided flash map for the named area.
@@ -105,9 +106,9 @@
 }
 
 func normalizeOffset(offset int, length int,
-	area flash.FlashArea) (int, error) {
+	area flash.FlashArea, baseAddress int) (int, error) {
 
-	areaEnd := area.Offset + area.Size
+	areaEnd := area.Offset + area.Size - baseAddress
 	if offset == OFFSET_END {
 		if length > area.Size {
 			return 0, util.FmtNewtError(
@@ -124,7 +125,7 @@
 			area.Name, offset, length, area.Size)
 	}
 
-	return area.Offset + offset, nil
+	return (area.Offset + offset - baseAddress), nil
 }
 
 func calcBsp(dm DecodedMfg,
@@ -170,13 +171,13 @@
 	return bsp, nil
 }
 
-func (raw *MfgBuildRaw) ToPart(entryIdx int) (Part, error) {
+func (raw *MfgBuildRaw) ToPart(entryIdx int, baseAddress int) (Part, error) {
 	data, err := ioutil.ReadFile(raw.Filename)
 	if err != nil {
 		return Part{}, util.ChildNewtError(err)
 	}
 
-	off, err := normalizeOffset(raw.Offset, len(data), raw.Area)
+	off, err := normalizeOffset(raw.Offset, len(data), raw.Area, baseAddress)
 	if err != nil {
 		return Part{}, err
 	}
@@ -188,13 +189,13 @@
 	}, nil
 }
 
-func (mt *MfgBuildTarget) ToPart() (Part, error) {
+func (mt *MfgBuildTarget) ToPart(baseAddress int) (Part, error) {
 	data, err := ioutil.ReadFile(mt.BinPath)
 	if err != nil {
 		return Part{}, util.ChildNewtError(err)
 	}
 
-	off, err := normalizeOffset(mt.Offset, len(data), mt.Area)
+	off, err := normalizeOffset(mt.Offset, len(data), mt.Area, baseAddress)
 	if err != nil {
 		return Part{}, err
 	}
@@ -327,7 +328,7 @@
 
 	// Create parts from the raw entries.
 	for i, raw := range mb.Raws {
-		part, err := raw.ToPart(i)
+		part, err := raw.ToPart(i, mb.BaseAddress)
 		if err != nil {
 			return nil, err
 		}
@@ -336,7 +337,7 @@
 
 	// Create parts from the target entries.
 	for _, t := range mb.Targets {
-		part, err := t.ToPart()
+		part, err := t.ToPart(mb.BaseAddress)
 		if err != nil {
 			return nil, err
 		}
@@ -596,7 +597,7 @@
 			return mfg.Mfg{}, err
 		}
 		metap = &meta
-		metaOff = mb.Meta.Area.Offset + mb.Meta.Area.Size - meta.Size()
+		metaOff = mb.Meta.Area.Offset + mb.Meta.Area.Size - meta.Size() - mb.BaseAddress
 	}
 
 	return mfg.Mfg{
diff --git a/newt/mfg/misc.go b/newt/mfg/misc.go
index 9c6e387..1ecbe62 100644
--- a/newt/mfg/misc.go
+++ b/newt/mfg/misc.go
@@ -44,7 +44,7 @@
 }
 
 func LoadMfgEmitter(basePkg *pkg.LocalPackage,
-	ver image.ImageVersion, keys []sec.PrivSignKey) (MfgEmitter, error) {
+	ver image.ImageVersion, keys []sec.PrivSignKey, baseAddress int) (MfgEmitter, error) {
 
 	dm, err := loadDecodedMfg(basePkg.BasePath())
 	if err != nil {
@@ -55,6 +55,7 @@
 	if err != nil {
 		return MfgEmitter{}, err
 	}
+	mb.BaseAddress = baseAddress
 
 	device, err := mb.calcDevice()
 	if err != nil {