avr: fix interrupt names for newer attiny chips
This only affects chips that aren't supported by TinyGo yet, so this should be a safe change. Importantly, it fixes interrupts on the ATtiny1616.
Этот коммит содержится в:
родитель
572c22f66a
коммит
b43bd9e62a
1 изменённых файлов: 42 добавлений и 5 удалений
|
@ -9,6 +9,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
@ -29,7 +30,7 @@ type AVRToolsDeviceFile struct {
|
||||||
Size string `xml:"size,attr"`
|
Size string `xml:"size,attr"`
|
||||||
} `xml:"memory-segment"`
|
} `xml:"memory-segment"`
|
||||||
} `xml:"address-spaces>address-space"`
|
} `xml:"address-spaces>address-space"`
|
||||||
Interrupts []Interrupt `xml:"interrupts>interrupt"`
|
Interrupts []*XMLInterrupt `xml:"interrupts>interrupt"`
|
||||||
} `xml:"devices>device"`
|
} `xml:"devices>device"`
|
||||||
Modules []struct {
|
Modules []struct {
|
||||||
Name string `xml:"name,attr"`
|
Name string `xml:"name,attr"`
|
||||||
|
@ -52,6 +53,13 @@ type AVRToolsDeviceFile struct {
|
||||||
} `xml:"modules>module"`
|
} `xml:"modules>module"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type XMLInterrupt struct {
|
||||||
|
Index int `xml:"index,attr"`
|
||||||
|
Name string `xml:"name,attr"`
|
||||||
|
Instance string `xml:"module-instance,attr"`
|
||||||
|
Caption string `xml:"caption,attr"`
|
||||||
|
}
|
||||||
|
|
||||||
type Device struct {
|
type Device struct {
|
||||||
metadata map[string]interface{}
|
metadata map[string]interface{}
|
||||||
interrupts []Interrupt
|
interrupts []Interrupt
|
||||||
|
@ -81,9 +89,9 @@ type MemorySegment struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Interrupt struct {
|
type Interrupt struct {
|
||||||
Index int `xml:"index,attr"`
|
Index int
|
||||||
Name string `xml:"name,attr"`
|
Name string
|
||||||
Caption string `xml:"caption,attr"`
|
Caption string
|
||||||
}
|
}
|
||||||
|
|
||||||
type Peripheral struct {
|
type Peripheral struct {
|
||||||
|
@ -247,6 +255,35 @@ func readATDF(path string) (*Device, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Process the interrupts to clean up inconsistencies between ATDF files.
|
||||||
|
var interrupts []Interrupt
|
||||||
|
hasResetInterrupt := false
|
||||||
|
for _, intr := range device.Interrupts {
|
||||||
|
name := intr.Name
|
||||||
|
if intr.Instance != "" {
|
||||||
|
// ATDF files for newer chips also have an instance name, which must
|
||||||
|
// be specified to make the interrupt name unique.
|
||||||
|
name = intr.Instance + "_" + name
|
||||||
|
}
|
||||||
|
if name == "RESET" {
|
||||||
|
hasResetInterrupt = true
|
||||||
|
}
|
||||||
|
interrupts = append(interrupts, Interrupt{
|
||||||
|
Index: intr.Index,
|
||||||
|
Name: name,
|
||||||
|
Caption: intr.Caption,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if !hasResetInterrupt {
|
||||||
|
interrupts = append(interrupts, Interrupt{
|
||||||
|
Index: 0,
|
||||||
|
Name: "RESET",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
sort.SliceStable(interrupts, func(i, j int) bool {
|
||||||
|
return interrupts[i].Index < interrupts[j].Index
|
||||||
|
})
|
||||||
|
|
||||||
return &Device{
|
return &Device{
|
||||||
metadata: map[string]interface{}{
|
metadata: map[string]interface{}{
|
||||||
"file": filepath.Base(path),
|
"file": filepath.Base(path),
|
||||||
|
@ -261,7 +298,7 @@ func readATDF(path string) (*Device, error) {
|
||||||
"ramSize": ramSize,
|
"ramSize": ramSize,
|
||||||
"numInterrupts": len(device.Interrupts),
|
"numInterrupts": len(device.Interrupts),
|
||||||
},
|
},
|
||||||
interrupts: device.Interrupts,
|
interrupts: interrupts,
|
||||||
peripherals: peripherals,
|
peripherals: peripherals,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче