Files
retroSoC/rtl/tiny/integration/soc_topology.json
T
maksyuki 8f5630fb41 feat(tiny): implement R2-P9 DVP capture and recovery
Connect DVP to Tiny DMA2/request 11, IRQ15 and the camera pad/reset lifecycle.
Harden shared capture CDC, frame statistics, per-row size validation and HAL
cleanup while preserving the Mini DMA3 binding and existing register ABI.

Add deterministic capture/recovery firmware, source-bound evidence tooling,
focused RTL/host tests and compact netlist acceptance. Preserve SAFE24,
128 KiB main SRAM, private Crypto storage and the locked dependencies.

Retained validation: focused RTL, host/policy checks, Mini firmware, and
ICS55/IHP130 RECOVERY, QVGA, synthesis and boot/DVP netlist checks pass.
Full-system VGA remains historical; long full Icarus and broad regressions
remain deferred. Global publication/format gaps and negative observational
STA are retained, not reported as passing qualification.

Specification: docs/ip/tiny-soc.md, TINY-R2-P9.
Evidence: docs/ip/tiny-soc-verification.md.
2026-10-17 15:32:59 +08:00

751 lines
13 KiB
JSON

{
"schema_version": 1,
"cpu": {
"module": "hazard3_cpu_2port",
"local_ports": 2,
"data_outstanding": 1
},
"main_sram": {
"groups": 4,
"group_bytes": 32768,
"macros_per_group": 8,
"macro_bytes": 4096,
"base": "0x30000000",
"macro_instance": "u_soc.u_sram.gen_group[{group}].u_group.gen_bank[{bank}].u_ram.u_mem",
"external_attachment": "per-target-P5"
},
"fabric": {
"owners": [
"cpu_slow",
"central_dma",
"sdio"
],
"active_owners": [
0,
1,
2
],
"cpu_combined_outstanding": 1,
"dma_direction_outstanding": 1,
"sdio_direction_outstanding": 1,
"target_combined_outstanding": 1,
"sram_targets": [
0,
1,
2,
3
],
"xpi_target": 4,
"apb_target_base": 5,
"decode_error_target": 26,
"protocol_error_target": 27,
"target_count": 28
},
"gpio_pins": 32,
"irq_vector_width": 32,
"external_irq_count": 30,
"dma_channels": 8,
"apb_targets": [
{
"name": "gpio",
"regions": [
"APB4_GPIO",
"APB4_GPIO_ADMIN"
]
},
{
"name": "uart0",
"regions": [
"APB4_UART0"
]
},
{
"name": "timer0",
"regions": [
"APB4_TIM0"
]
},
{
"name": "timer1",
"regions": [
"APB4_TIM1"
]
},
{
"name": "i2c0",
"regions": [
"APB4_I2C0"
]
},
{
"name": "xpi",
"regions": [
"APB4_XPI"
]
},
{
"name": "dma",
"regions": [
"APB4_DMA"
]
},
{
"name": "sysctrl",
"regions": [
"APB4_SYSCTRL"
]
},
{
"name": "clint",
"regions": [
"APB4_CLINT"
]
},
{
"name": "sram",
"regions": [
"APB4_SRAM"
]
},
{
"name": "archinfo",
"regions": [
"APB4_ARCHINFO"
]
},
{
"name": "pwm",
"regions": [
"APB4_PWM"
]
},
{
"name": "rtc",
"regions": [
"APB4_RTC"
]
},
{
"name": "wdg",
"regions": [
"APB4_WDG"
]
},
{
"name": "rng",
"regions": [
"APB4_RNG"
]
},
{
"name": "crc",
"regions": [
"APB4_CRC"
]
},
{
"name": "ws2812",
"regions": [
"APB4_WS2812"
]
},
{
"name": "crypto",
"regions": [
"APB4_CRYPTO"
]
},
{
"name": "i2s",
"regions": [
"APB4_I2S"
]
},
{
"name": "sdio",
"regions": [
"APB4_SDIO0"
]
},
{
"name": "dvp",
"regions": [
"APB4_DVP"
]
}
],
"interrupts": [
{
"name": "clint_software",
"core_bit": 0,
"signal": "u_clint_if.software_irq_o[0]"
},
{
"name": "clint_timer",
"core_bit": 1,
"signal": "u_clint_if.timer_irq_o[0]"
},
{
"name": "uart0",
"core_bit": 2,
"signal": "u_uart0_if.irq_o"
},
{
"name": "timer0",
"core_bit": 3,
"signal": "s_timer0_irq"
},
{
"name": "timer1",
"core_bit": 4,
"signal": "s_timer1_irq"
},
{
"name": "i2c0",
"core_bit": 7,
"signal": "u_i2c0_if.irq_o"
},
{
"name": "i2s",
"core_bit": 8,
"signal": "u_i2s_if.irq_o"
},
{
"name": "xpi",
"core_bit": 9,
"signal": "s_xpi_irq"
},
{
"name": "sdio",
"core_bit": 10,
"signal": "u_sdio_if.irq_o"
},
{
"name": "dvp",
"core_bit": 15,
"signal": "s_dvp_irq"
},
{
"name": "pwm",
"core_bit": 11,
"signal": "u_pwm_if.irq_o"
},
{
"name": "rtc",
"core_bit": 13,
"signal": "u_rtc_if.irq_o"
},
{
"name": "watchdog_early_warning",
"core_bit": 14,
"signal": "u_wdg_if.irq_o"
},
{
"name": "rng",
"core_bit": 16,
"signal": "s_rng_irq"
},
{
"name": "ws2812",
"core_bit": 17,
"signal": "u_ws2812_if.irq_o"
},
{
"name": "gpio",
"core_bit": 18,
"signal": "u_gpio_if.irq_o"
},
{
"name": "dma",
"core_bit": 20,
"signal": "s_dma_irq"
},
{
"name": "crypto",
"core_bit": 23,
"signal": "s_crypto_irq"
},
{
"name": "rcu",
"core_bit": 31,
"signal": "s_rcu_irq"
}
],
"gpio_alt_functions": [
{
"pin": 0,
"alt0": {
"inputs": [],
"do": "u_sdio_if.sck_o",
"oe": "1'b1"
},
"alt1": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 1,
"alt0": {
"inputs": [
"u_sdio_if.cmd_di_i"
],
"do": "u_sdio_if.cmd_do_o",
"oe": "u_sdio_if.cmd_oe_o"
},
"alt1": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 2,
"alt0": {
"inputs": [
"u_sdio_if.dat_di_i[0]"
],
"do": "u_sdio_if.dat_do_o[0]",
"oe": "u_sdio_if.dat_oe_o[0]"
},
"alt1": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 3,
"alt0": {
"inputs": [
"u_sdio_if.dat_di_i[1]"
],
"do": "u_sdio_if.dat_do_o[1]",
"oe": "u_sdio_if.dat_oe_o[1]"
},
"alt1": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 4,
"alt0": {
"inputs": [
"u_sdio_if.dat_di_i[2]"
],
"do": "u_sdio_if.dat_do_o[2]",
"oe": "u_sdio_if.dat_oe_o[2]"
},
"alt1": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 5,
"alt0": {
"inputs": [
"u_sdio_if.dat_di_i[3]"
],
"do": "u_sdio_if.dat_do_o[3]",
"oe": "u_sdio_if.dat_oe_o[3]"
},
"alt1": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 6,
"alt0": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
},
"alt1": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 7,
"alt0": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
},
"alt1": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 8,
"alt0": {
"inputs": [],
"do": "u_uart0_if.tx_o",
"oe": "1'b1"
},
"alt1": {
"inputs": [],
"do": "u_pwm_if.pwm_o[0]",
"oe": "u_pwm_if.oe_o[0]"
}
},
{
"pin": 9,
"alt0": {
"inputs": [
"u_uart0_if.rx_i"
],
"do": "1'b0",
"oe": "1'b0"
},
"alt1": {
"inputs": [],
"do": "u_pwm_if.pwm_o[1]",
"oe": "u_pwm_if.oe_o[1]"
}
},
{
"pin": 10,
"alt0": {
"inputs": [
"u_i2c0_if.scl_i"
],
"do": "u_i2c0_if.scl_o",
"oe": "u_i2c0_if.scl_oe_o"
},
"alt1": {
"inputs": [],
"do": "u_pwm_if.pwm_o[2]",
"oe": "u_pwm_if.oe_o[2]"
}
},
{
"pin": 11,
"alt0": {
"inputs": [
"u_i2c0_if.sda_i"
],
"do": "u_i2c0_if.sda_o",
"oe": "u_i2c0_if.sda_oe_o"
},
"alt1": {
"inputs": [],
"do": "u_pwm_if.pwm_o[3]",
"oe": "u_pwm_if.oe_o[3]"
}
},
{
"pin": 12,
"alt0": {
"inputs": [],
"do": "u_i2s_if.sclk_o",
"oe": "1'b1"
},
"alt1": {
"inputs": [
"u_dvp_if.dat_i[0]"
],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 13,
"alt0": {
"inputs": [],
"do": "u_i2s_if.lrck_o",
"oe": "1'b1"
},
"alt1": {
"inputs": [
"u_dvp_if.dat_i[1]"
],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 14,
"alt0": {
"inputs": [],
"do": "u_i2s_if.dacdat_o",
"oe": "1'b1"
},
"alt1": {
"inputs": [
"u_dvp_if.dat_i[2]"
],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 15,
"alt0": {
"inputs": [
"u_i2s_if.adcdat_i"
],
"do": "1'b0",
"oe": "1'b0"
},
"alt1": {
"inputs": [
"u_dvp_if.dat_i[3]"
],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 16,
"alt0": {
"inputs": [],
"do": "u_i2s_if.mclk_o",
"oe": "1'b1"
},
"alt1": {
"inputs": [
"u_dvp_if.dat_i[4]"
],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 17,
"alt0": {
"inputs": [
"s_audio_pad_clk"
],
"do": "1'b0",
"oe": "1'b0"
},
"alt1": {
"inputs": [
"u_dvp_if.dat_i[5]"
],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 18,
"alt0": {
"inputs": [],
"do": "u_pwm_if.pwm_o[0]",
"oe": "u_pwm_if.oe_o[0]"
},
"alt1": {
"inputs": [
"u_dvp_if.dat_i[6]"
],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 19,
"alt0": {
"inputs": [],
"do": "u_pwm_if.pwm_o[1]",
"oe": "u_pwm_if.oe_o[1]"
},
"alt1": {
"inputs": [
"u_dvp_if.dat_i[7]"
],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 20,
"alt0": {
"inputs": [],
"do": "u_pwm_if.pwm_o[2]",
"oe": "u_pwm_if.oe_o[2]"
},
"alt1": {
"inputs": [
"u_dvp_if.pclk_i"
],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 21,
"alt0": {
"inputs": [],
"do": "u_pwm_if.pwm_o[3]",
"oe": "u_pwm_if.oe_o[3]"
},
"alt1": {
"inputs": [
"u_dvp_if.href_i"
],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 22,
"alt0": {
"inputs": [
"u_pwm_if.fault_i"
],
"do": "1'b0",
"oe": "1'b0"
},
"alt1": {
"inputs": [
"u_dvp_if.vsync_i"
],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 23,
"alt0": {
"inputs": [
"u_pwm_if.sync_i"
],
"do": "1'b0",
"oe": "1'b0"
},
"alt1": {
"inputs": [],
"do": "s_clkout",
"oe": "s_clkout_enable"
}
},
{
"pin": 24,
"alt0": {
"inputs": [
"u_pwm_if.capture_i[0]"
],
"do": "1'b0",
"oe": "1'b0"
},
"alt1": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 25,
"alt0": {
"inputs": [
"u_pwm_if.capture_i[1]"
],
"do": "1'b0",
"oe": "1'b0"
},
"alt1": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 26,
"alt0": {
"inputs": [],
"do": "u_ws2812_if.dat_o",
"oe": "1'b1"
},
"alt1": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 27,
"alt0": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
},
"alt1": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 28,
"alt0": {
"inputs": [],
"do": "s_clkout",
"oe": "s_clkout_enable"
},
"alt1": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 29,
"alt0": {
"inputs": [],
"do": "xpi.nss_o[1]",
"oe": "1'b1"
},
"alt1": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 30,
"alt0": {
"inputs": [],
"do": "xpi.nss_o[2]",
"oe": "1'b1"
},
"alt1": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
}
},
{
"pin": 31,
"alt0": {
"inputs": [],
"do": "xpi.nss_o[3]",
"oe": "1'b1"
},
"alt1": {
"inputs": [],
"do": "1'b0",
"oe": "1'b0"
}
}
],
"dma_request_mask": "0x39ff",
"private_crypto": {
"banks": 6,
"bank_bytes": 4096,
"macro_instance": "u_soc.u_crypto.u_storage.gen_bank[{bank}].gen_macro.u_sram.u_mem",
"clock_domain": "peripheral",
"logical_domain": "PCLK"
}
}