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 {