rust-embedded / svdtools

Python package to handle vendor-supplied, often buggy SVD files.
Apache License 2.0
63 stars 28 forks source link

conversion error: unsure if I'm just missing something #100

Closed hanetzer closed 2 years ago

hanetzer commented 2 years ago

Ello. I'm using the rust svdtools program to build an svd for a chip without one. I started by converting the rp2040.svd to rp2040.yaml as a reference, and began writing the yaml for my chip, to convert to svd later for use with gdb and such. Some of the data is dummied out (for instance, its not a traditional mcu, but is a cortex-a7 proc). Attempting to convert with what I currently have (below) results in the following error: [2022-04-11T13:49:24Z ERROR svdtools::cli] peripherals[0]: invalid type: map, expected a sequence at line 20 column 9 Line 20 column 9 translates to the : before BOOT_ADDR; this seems correct, as the rp2040.yaml file has the same kind of setup:

Am I missing something or is this a legit bug?

---
vendor: Raspberry Pi
name: RP2040
version: "0.1"
description: ""
licenseText: "\n    Copyright (c) 2020 Raspberry Pi (Trading) Ltd. \\n\n    \\n\n    SPDX-License-Identifier: BSD-3-Clause\n  "
cpu:
  name: CM0PLUS
  revision: r0p1
  endian: little
  mpuPresent: true
  fpuPresent: false
  vtorPresent: true
  nvicPrioBits: 2
  vendorSystickConfig: false
  deviceNumInterrupts: 26
addressUnitBits: 8
width: 32
peripherals:
  - name: XIP_CTRL
---
vendor: Hisilicon
name: Hi3521A
version:  "0.0"
description: ""
licenseText: ""
cpu:
  name: other
  revision: r0p1
  endian: little
  mpuPresent: true
  fpuPresent: true
  vtorPresent: true
  nvicPrioBits: 0
  vendorSystickConfig: false
  deviceNumInterrupts: 64
addressUnitBits: 8
width: 32
peripherals:
  - name: BOOT_ADDR
    version: "1"
    description: ""
    baseAddress: 0x0
    size: 32
    addressBlock:
      offset: 0
      size: 0x4000000
      usage: buffer
  - name: BOOT_ROM
    version: "1"
    description: ""
    baseAddress: 0x04000000
    size: 32
    addressBlock:
      offset: 0
      size: 0x1000
      usage: buffer
  - name: SRAM
    version: "1"
    description: ""
    baseAddress: 0x04010000
    size: 32
    addressBlock:
      offset: 0
      size: 0x4000
      usage: buffer
  - name: FMC_CTRL
    version: "1"
    description: ""
    baseAddress: 0x10000000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: OHCI
    version: "1"
    description: ""
    baseAddress: 0x10030000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: EHCI
    version: "1"
    description: ""
    baseAddress: 0x10040000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: DMAC
    version: "1"
    description: ""
    baseAddress: 0x10060000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: CIPHER
    version: "1"
    description: ""
    baseAddress: 0x10070000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: SCD
    version: "1"
    description: ""
    baseAddress: 0x10080000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: GSF
    version: "1"
    description: ""
    baseAddress: 0x100a0000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: SATA
    version: "1"
    description: ""
    baseAddress: 0x11010000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: TIMER01
    version: "1"
    description: ""
    baseAddress: 0x12000000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: TIMER23
    version: "1"
    description: ""
    baseAddress: 0x12010000
    size: 32
  - name: TIMER45
    version: "1"
    description: ""
    baseAddress: 0x12020000
    size: 32
  - name: TIMER67
    version: "1"
    description: ""
    baseAddress: 0x12030000
    size: 32
  - name: CRG
    version: "1"
    description: ""
    baseAddress: 0x12040000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
    registers:
      - register:
        name: CRG_PLL0
        description: APLL configuration register 0
        addressOffset: 0x0000
        resetValue: 0x12000000
        fields:
          - name: postdiv2
            description: Level-2 output divider of the APLL
            bitRange: "[30:28]"
            access: read-write
          - name: postdiv1
            description: Level-1 output divider of the APLL
            bitRange: "[26:24]"
            access: read-write
          - name: frac
            description: Decimal divider of the APLL
            bitRange: "[23:0]"
            access: read-write
        name: CRG_PLL1
        description: APLL configuration register 0
        addressOffset: 0x0004
        resetValue: 0x02003064
        fields:
          - name: bypass
            description: APLL clock frequency-division bypass control
            bitRange: "[26:26]"
            access: read-write
          - name: dacpd
            description: APLL test signal control
            bitRange: "[25:25]"
            access: read-write
          - name: dsmpd
            description: APLL decimal frequency-division control
            bitRange: "[24:24]"
            access: read-write
          - name: pd
            description: PLL power-down control
            bitRange: "[23:23]"
            access: read-write
          - name: foutvcopd
            description: Power-down control for the APLL VCO output
            bitRange: "[22:22]"
            access: read-write
          - name: postdivpd
            description: Power-down control for the APLL POSTDIV output
            bitRange: "[21:21]"
            access: read-write
          - name: fout4phasepd
            description: Power-down control for the APLL FOUT output
            bitRange: "[20:20]"
            access: read-write
          - name: refdiv
            description: Divider of the APLL reference clock
            bitRange: "[17:12]"
            access: read-write
          - name: fbdiv
            description: Integral multiplier of the APLL
            bitRange: "[11:0]"
            access: read-write
  - name: SYSCTL
    version: "1"
    description: ""
    baseAddress: 0x12050000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: WDG
    version: "1"
    description: ""
    baseAddress: 0x12070000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: UART0
    version: "1"
    description: ""
    baseAddress: 0x12080000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: UART1
    version: "1"
    description: ""
    baseAddress: 0x12090000
    size: 32
  - name: UART2
    version: "1"
    description: ""
    baseAddress: 0x120a0000
    size: 32
  - name: RTC
    version: "1"
    description: ""
    baseAddress: 0x120b0000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: I2C
    version: "1"
    description: ""
    baseAddress: 0x120c0000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: SSP
    version: "1"
    description: ""
    baseAddress: 0x120d0000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: PMC
    version: "1"
    description: ""
    baseAddress: 0x120e0000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: PINMUX
    version: "1"
    description: ""
    baseAddress: 0x120f0000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: PINCTRL
    version: "1"
    description: ""
    baseAddress: 0x120f0800
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: DDRT0
    version: "1"
    description: ""
    baseAddress: 0x12100000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: DDRC
    version: "1"
    description: ""
    baseAddress: 0x12110000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: PERICTL
    version: "1"
    description: ""
    baseAddress: 0x12120000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: IR
    version: "1"
    description: ""
    baseAddress: 0x12140000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: GPIO00
    version: "1"
    description: ""
    baseAddress: 0x12150000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: GPIO01
    version: "1"
    description: ""
    baseAddress: 0x12160000
    size: 32
  - name: GPIO02
    version: "1"
    description: ""
    baseAddress: 0x12170000
    size: 32
  - name: GPIO03
    version: "1"
    description: ""
    baseAddress: 0x12180000
    size: 32
  - name: GPIO04
    version: "1"
    description: ""
    baseAddress: 0x12190000
    size: 32
  - name: GPIO05
    version: "1"
    description: ""
    baseAddress: 0x121a0000
    size: 32
  - name: GPIO06
    version: "1"
    description: ""
    baseAddress: 0x121b0000
    size: 32
  - name: GPIO07
    version: "1"
    description: ""
    baseAddress: 0x121c0000
    size: 32
  - name: GPIO08
    version: "1"
    description: ""
    baseAddress: 0x121d0000
    size: 32
  - name: GPIO09
    version: "1"
    description: ""
    baseAddress: 0x121e0000
    size: 32
  - name: GPIO10
    version: "1"
    description: ""
    baseAddress: 0x121f0000
    size: 32
  - name: GPIO11
    version: "1"
    description: ""
    baseAddress: 0x12200000
  - name: GPIO12
    version: "1"
    description: ""
    baseAddress: 0x12210000
  - name: GPIO13
    version: "1"
    description: ""
    baseAddress: 0x12220000
  - name: HDMI
    version: "1"
    description: ""
    baseAddress: 0x13010000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: VDP
    version: "1"
    description: ""
    baseAddress: 0x13020000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: AVC0
    version: "1"
    description: ""
    baseAddress: 0x13040000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: TDE
    version: "1"
    description: ""
    baseAddress: 0x13050000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: IVE
    version: "1"
    description: ""
    baseAddress: 0x13060000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: JPGD
    version: "1"
    description: ""
    baseAddress: 0x13070000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: VGS
    version: "1"
    description: ""
    baseAddress: 0x13080000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: VICAP
    version: "1"
    description: ""
    baseAddress: 0x130c0000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: AVC1
    version: "1"
    description: ""
    baseAddress: 0x13100000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: VPSS
    version: "1"
    description: ""
    baseAddress: 0x13110000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: VOIE
    version: "1"
    description: ""
    baseAddress: 0x13120000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: JPGE
    version: "1"
    description: ""
    baseAddress: 0x13130000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: AIAO
    version: "1"
    description: ""
    baseAddress: 0x13140000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: MDU
    version: "1"
    description: ""
    baseAddress: 0x13150000
    size: 32
    addressBlock:
      offset: 0
      size: 0x10000
      usage: registers
  - name: SFC_MEM
    version: "1"
    description: ""
    baseAddress: 0x14000000
    size: 32
    addressBlock:
      offset: 0
      size: 0x1000000
      usage: buffer
  - name: DRAM
    version: "1"
    description: ""
    baseAddress: 0x80000000
    size: 32
    addressBlock:
      offset: 0
      size: 0x80000000
      usage: buffer
burrbull commented 2 years ago

Did I understand right? You've used svdtools convert to convert SVD to YAML, but backward conversion doesn't work?

hanetzer commented 2 years ago

Backwards conversion of the rp2040.yaml to rp2040.svd works, but my hand written hi3521a.yaml will not convert.

burrbull commented 2 years ago

address_block is an array of AddressBlocks: https://docs.rs/svd-rs/0.13.1/svd_rs/peripheral/struct.PeripheralInfo.html#structfield.address_block

hanetzer commented 2 years ago

ah derp. got tunnel vision because of the line/column and didn't notice the actual error.

hanetzer commented 2 years ago

Actually, I found a conversion issue. When converting a yaml to svd, the resultant svd file does not contain the schema information some svd tools (in my case, SVD-Loader-Ghidra) require for operation. Converted SVD:

<device schemaVersion="" xmlns:xs="" xs:noNamespaceSchemaLocation="">

'real' SVD:

<device schemaVersion="1.1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="CMSIS-SVD.xsd">
burrbull commented 2 years ago

~#102~ https://github.com/rust-embedded/svd/pull/197

burrbull commented 2 years ago

reinstall with cargo install svdtools --force

hanetzer commented 2 years ago

Yep, that fixed that. Thanks for the info.