Fix gen-device-svd to handle 64-bit

Этот коммит содержится в:
Dmitriy Zakharkin 2021-10-27 08:52:27 -04:00 коммит произвёл GitHub
родитель 3fe7ab19f6
коммит e848f47ad4
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23

Просмотреть файл

@ -140,7 +140,7 @@ type PeripheralField struct {
type Bitfield struct { type Bitfield struct {
Name string Name string
Description string Description string
Value uint32 Value uint64
} }
func formatText(text string) string { func formatText(text string) string {
@ -208,7 +208,7 @@ func readSVD(path, sourceURL string) (*Device, error) {
for _, periphEl := range orderedPeripherals { for _, periphEl := range orderedPeripherals {
description := formatText(periphEl.Description) description := formatText(periphEl.Description)
baseAddress, err := strconv.ParseUint(periphEl.BaseAddress, 0, 32) baseAddress, err := strconv.ParseUint(periphEl.BaseAddress, 0, 64)
if err != nil { if err != nil {
return nil, fmt.Errorf("invalid base address: %w", err) return nil, fmt.Errorf("invalid base address: %w", err)
} }
@ -581,12 +581,12 @@ func parseBitfields(groupName, regName string, fieldEls []*SVDField, bitfieldPre
fields = append(fields, Bitfield{ fields = append(fields, Bitfield{
Name: fmt.Sprintf("%s_%s%s_%s_Pos", groupName, bitfieldPrefix, regName, fieldName), Name: fmt.Sprintf("%s_%s%s_%s_Pos", groupName, bitfieldPrefix, regName, fieldName),
Description: fmt.Sprintf("Position of %s field.", fieldName), Description: fmt.Sprintf("Position of %s field.", fieldName),
Value: lsb, Value: uint64(lsb),
}) })
fields = append(fields, Bitfield{ fields = append(fields, Bitfield{
Name: fmt.Sprintf("%s_%s%s_%s_Msk", groupName, bitfieldPrefix, regName, fieldName), Name: fmt.Sprintf("%s_%s%s_%s_Msk", groupName, bitfieldPrefix, regName, fieldName),
Description: fmt.Sprintf("Bit mask of %s field.", fieldName), Description: fmt.Sprintf("Bit mask of %s field.", fieldName),
Value: (0xffffffff >> (31 - (msb - lsb))) << lsb, Value: (0xffffffffffffffff >> (63 - (msb - lsb))) << lsb,
}) })
if lsb == msb { // single bit if lsb == msb { // single bit
fields = append(fields, Bitfield{ fields = append(fields, Bitfield{
@ -608,14 +608,14 @@ func parseBitfields(groupName, regName string, fieldEls []*SVDField, bitfieldPre
var err error var err error
if strings.HasPrefix(enumEl.Value, "0b") { if strings.HasPrefix(enumEl.Value, "0b") {
val := strings.TrimPrefix(enumEl.Value, "0b") val := strings.TrimPrefix(enumEl.Value, "0b")
enumValue, err = strconv.ParseUint(val, 2, 32) enumValue, err = strconv.ParseUint(val, 2, 64)
} else { } else {
enumValue, err = strconv.ParseUint(enumEl.Value, 0, 32) enumValue, err = strconv.ParseUint(enumEl.Value, 0, 64)
} }
if err != nil { if err != nil {
if enumBitSpecifier.MatchString(enumEl.Value) { if enumBitSpecifier.MatchString(enumEl.Value) {
// NXP SVDs use the form #xx1x, #x0xx, etc for values // NXP SVDs use the form #xx1x, #x0xx, etc for values
enumValue, err = strconv.ParseUint(strings.ReplaceAll(enumEl.Value[1:], "x", "0"), 2, 32) enumValue, err = strconv.ParseUint(strings.ReplaceAll(enumEl.Value[1:], "x", "0"), 2, 64)
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -656,7 +656,7 @@ func parseBitfields(groupName, regName string, fieldEls []*SVDField, bitfieldPre
fields = append(fields, Bitfield{ fields = append(fields, Bitfield{
Name: enumName, Name: enumName,
Description: enumDescription, Description: enumDescription,
Value: uint32(enumValue), Value: enumValue,
}) })
} }
} }