349 lines
21 KiB
Plaintext
349 lines
21 KiB
Plaintext
*** Settings ***
|
|
Library nucleo_h753zi_helpers.py
|
|
|
|
*** Variables ***
|
|
${UART} sysbus.usart3
|
|
|
|
${PROJECT_URL} https://dl.antmicro.com/projects/renode
|
|
${ECHO_SERVER} ${PROJECT_URL}/zephyr-nucleo_h753zi_echo_server.elf-s_3820436-2a55e73d28b438666b588d87cc9822365ee46cf6
|
|
${ECHO_CLIENT} ${PROJECT_URL}/zephyr-nucleo_h753zi_echo_client.elf-s_3773508-692f892b406f5a4a0aedb4afe120acd26f420d21
|
|
${BLINKY} ${PROJECT_URL}/zephyr--nucleo-h753zi-blinky.elf-s_586204-d9aa33947652eb18930088c06704ad6a8cdc7fa4
|
|
${BUTTON} ${PROJECT_URL}/zephyr--nucleo_h753zi_button_sample.elf-s_582696-3d5e6775a24c75e8fff6b812d5bc850b361e3d93
|
|
${CRYPTO_GCM} ${PROJECT_URL}/stm32cubeh7--stm32h753zi-CRYP_AESGCM.elf-s_2136368-45a90683e4f954667a464fc8fa9ce57d0b74ac09
|
|
${CRYPTO_GCM_IT} ${PROJECT_URL}/stm32cubeh7--stm32h753zi-CRYP_AESGCM_IT.elf-s_2137876-ee038aa93bf68cb91af9894e0be9584eec3057e5
|
|
${CRYPTO_AES_DMA} ${PROJECT_URL}/stm32cubeh7--stm32h753zi-CRYP_AESModes_DMA.elf-s_2152168-edf19388077bb230a242d2dfc7392ea881f29051
|
|
${QSPI_RW} ${PROJECT_URL}/stm32cubeh7--stm32h753zi-QSPI_ReadWrite_IT.elf-s_2146460-5c6870c2698fe33a9ef78ce791d9e83439328cc4
|
|
${QSPI_MemMapped} ${PROJECT_URL}/stm32cubeh7--stm32h753zi-QSPI_MemoryMapped.elf-s_2152312-faec8bb984c61aabb52ae9eec1598999ea906a1c
|
|
${QSPI_XIP} ${PROJECT_URL}/stm32cubeh7--stm32h753zi-QSPI_ExecuteInPlace.elf-s_2233412-67befe44572c483b242a95ce8e714f75f4e7dc69
|
|
${PTP} ${PROJECT_URL}/nucleo_h753zi--zephyr-samples_net_ptp.elf-s_4678660-79097838e7a15377e3d9ce083917220bd0705312
|
|
${FLASH_EraseProgram} ${PROJECT_URL}/stm32cubeh7--stm32h753zi-FLASH_EraseProgram.elf-s_2098720-fdf4d20c82c0619eee844117860017b477696298
|
|
|
|
${PLATFORM} platforms/boards/nucleo_h753zi.repl
|
|
|
|
${EVAL_STUB}= SEPARATOR=
|
|
... """ ${\n}
|
|
... led1: Miscellaneous.LED @ gpioPortF 10 { invert: true } ${\n}
|
|
... led3: Miscellaneous.LED @ gpioPortA 4 { invert: true } ${\n}
|
|
... gpioPortF: ${\n}
|
|
... ${SPACE*4}10 -> led1@0 ${\n}
|
|
... ${\n}
|
|
... gpioPortA: ${\n}
|
|
... ${SPACE*4}4 -> led3@0 ${\n}
|
|
... """
|
|
|
|
# The address of the memory is mentioned in the MCU docs, when the QSPI is configured to operate in memory-mapped mode
|
|
# So it's added along with the external flash
|
|
${EXTERNAL_FLASH}= SEPARATOR=
|
|
... """
|
|
... externalQspiFlash: SPI.Macronix_MX25R @ qspi {underlyingMemory: qspiMappedFlashMemory} ${\n}
|
|
... qspiMappedFlashMemory: Memory.MappedMemory @ sysbus 0x90000000 { size: 0x10000000 } ${\n}
|
|
... """
|
|
|
|
${PTP_PLATFORM}= SEPARATOR=${\n}
|
|
... using "${PLATFORM}"
|
|
... nvic:
|
|
... ${SPACE*4}systickFrequency: 480000000 # Set frequency to match what software expects
|
|
|
|
${SMMU_PLATFORM}= SEPARATOR=${\n}
|
|
... using "${PLATFORM}"
|
|
... nvic:
|
|
... ${SPACE*4}systickFrequency: 480000000 # Set frequency to match what software expects
|
|
... smmu: MemoryControllers.ARM_SMMUv3 @ sysbus 0x53000000 # This peripheral is not a part of the real platform
|
|
... ethernet: @ {
|
|
... ${SPACE*4}sysbus 0x40028000;
|
|
... ${SPACE*4}sysbus new Bus.BusMultiRegistration { address: 0x40028C00; size: 0x200; region: "mtl" };
|
|
... ${SPACE*4}sysbus new Bus.BusMultiRegistration { address: 0x40029000; size: 0x200; region: "dma" };
|
|
... ${SPACE*4}smmu 16
|
|
... }
|
|
|
|
|
|
${FLASH_WRITE_ADDRESS} 0x08040000
|
|
${FLASH_WRITE_ERROR_HANDLER} HAL_FLASH_OperationErrorCallback
|
|
${FLASH_WRITE_ERROR_MSG} Flash Write Error Detected
|
|
|
|
*** Keywords ***
|
|
Create Setup
|
|
Execute Command emulation CreateSwitch "switch"
|
|
|
|
Create Machine ${ECHO_SERVER} server
|
|
Execute Command connector Connect sysbus.ethernet switch
|
|
Create Machine ${ECHO_CLIENT} client
|
|
Execute Command connector Connect sysbus.ethernet switch
|
|
|
|
Create Machine
|
|
[Arguments] ${elf} ${name}
|
|
|
|
Execute Command mach add "${name}"
|
|
Execute Command mach set "${name}"
|
|
Execute Command machine LoadPlatformDescription @${PLATFORM}
|
|
|
|
Execute Command sysbus LoadELF @${elf}
|
|
|
|
Create PTP Machine
|
|
[Arguments] ${elf} ${name}
|
|
Execute Command mach create "${name}"
|
|
Execute Command machine LoadPlatformDescriptionFromString """${PTP_PLATFORM}"""
|
|
Execute Command sysbus LoadELF @${elf}
|
|
|
|
Create SMMU Machine
|
|
[Arguments] ${elf} ${name}
|
|
Execute Command mach create "${name}"
|
|
Execute Command machine LoadPlatformDescriptionFromString """${SMMU_PLATFORM}"""
|
|
Execute Command include "${CURDIR}/nucleo_h753zi_helpers.py"
|
|
Execute Command setup_smmu 16
|
|
Execute Command sysbus LoadELF @${elf}
|
|
|
|
Assert PC Equals
|
|
[Arguments] ${expected}
|
|
${pc}= Execute Command sysbus.cpu PC
|
|
Should Be Equal As Integers ${pc} ${expected}
|
|
|
|
*** Test Cases ***
|
|
Should Talk Over Ethernet
|
|
Create Setup
|
|
${server}= Create Terminal Tester ${UART} machine=server defaultPauseEmulation=True
|
|
${client}= Create Terminal Tester ${UART} machine=client defaultPauseEmulation=True
|
|
|
|
Wait For Line On Uart Initializing network testerId=${server}
|
|
Wait For Line On Uart Run echo server testerId=${server}
|
|
Wait For Line On Uart Network connected testerId=${server}
|
|
Wait For Line On Uart Waiting for TCP connection testerId=${server}
|
|
|
|
Wait For Line On Uart Initializing network testerId=${client}
|
|
Wait For Line On Uart Run echo client testerId=${client}
|
|
Wait For Line On Uart Network connected testerId=${client}
|
|
|
|
Wait For Line On Uart Accepted connection testerId=${server}
|
|
|
|
Wait For Line On Uart Sent testerId=${client}
|
|
Wait For Line On Uart Received and replied testerId=${server}
|
|
Wait For Line On Uart Received and compared \\d+ bytes, all ok testerId=${client} treatAsRegex=true
|
|
|
|
Wait For Line On Uart Sent testerId=${client}
|
|
Wait For Line On Uart Received and replied testerId=${server}
|
|
Wait For Line On Uart Received and compared \\d+ bytes, all ok testerId=${client} treatAsRegex=true
|
|
|
|
Wait For Line On Uart Sent testerId=${client}
|
|
Wait For Line On Uart Received and replied testerId=${server}
|
|
Wait For Line On Uart Received and compared \\d+ bytes, all ok testerId=${client} treatAsRegex=true
|
|
|
|
Wait For Line On Uart Sent testerId=${client}
|
|
Wait For Line On Uart Received and replied testerId=${server}
|
|
Wait For Line On Uart Received and compared \\d+ bytes, all ok testerId=${client} treatAsRegex=true
|
|
|
|
Should Blink Led
|
|
Create Machine ${BLINKY} blinky
|
|
|
|
Create Terminal Tester ${UART} defaultPauseEmulation=True
|
|
Create LED Tester sysbus.gpioPortB.GreenLED defaultTimeout=1
|
|
|
|
Wait For Line On Uart *** Booting Zephyr OS includeUnfinishedLine=true
|
|
Wait For Line On Uart LED state: (ON|OFF) treatAsRegex=true
|
|
|
|
Assert LED Is Blinking testDuration=8 onDuration=1 offDuration=1 pauseEmulation=true
|
|
|
|
Should See Button Press
|
|
Create Machine ${BUTTON} button
|
|
|
|
Create Terminal Tester ${UART} defaultPauseEmulation=True
|
|
Create LED Tester sysbus.gpioPortB.GreenLED defaultTimeout=1
|
|
|
|
Wait For Line On Uart *** Booting Zephyr OS includeUnfinishedLine=true
|
|
Wait For Line On Uart Press the button
|
|
Assert LED State false
|
|
|
|
Execute Command sysbus.gpioPortC.UserButton1 Press
|
|
Wait For Line On Uart Button pressed at includeUnfinishedLine=true
|
|
Assert LED State true
|
|
Execute Command sysbus.gpioPortC.UserButton1 Release
|
|
Assert LED State false
|
|
|
|
Should Encrypt And Decrypt Data in AES GCM Mode
|
|
Create Machine ${CRYPTO_GCM} crypt-gcm
|
|
# This sample is built for STM32 Evaluation Kit, which uses the same SoC but has a bit different HW - we only care about LEDs to signal test status
|
|
Execute Command machine LoadPlatformDescriptionFromString ${EVAL_STUB}
|
|
|
|
${led3_tester}= Create LED Tester sysbus.gpioPortA.led3 defaultTimeout=1
|
|
${led1_tester}= Create LED Tester sysbus.gpioPortF.led1 defaultTimeout=1
|
|
|
|
# LED3 would be set if at any point of the test a failure occurred (e.g. on invalid MAC or ciphertext not matching the expected value)
|
|
# LED1 is set at the very end of the test, when the entire procedure is complete with no failures
|
|
Assert LED State false testerId=${led3_tester}
|
|
Assert LED State true testerId=${led1_tester}
|
|
|
|
Should Encrypt And Decrypt Data in AES GCM Mode With Interrupts
|
|
Create Machine ${CRYPTO_GCM_IT} crypt-gcm
|
|
Execute Command machine LoadPlatformDescriptionFromString ${EVAL_STUB}
|
|
|
|
${led3_tester}= Create LED Tester sysbus.gpioPortA.led3 defaultTimeout=1
|
|
${led1_tester}= Create LED Tester sysbus.gpioPortF.led1 defaultTimeout=1
|
|
|
|
# See `Should Encrypt And Decrypt Data in AES GCM Mode` for explanation
|
|
Assert LED State false testerId=${led3_tester}
|
|
Assert LED State true testerId=${led1_tester}
|
|
|
|
Should Program Flash With QSPI
|
|
Create Machine ${QSPI_RW} qspi
|
|
# This sample is built for STM32 Evaluation Kit, which uses the same SoC but has a bit different HW - we only care about LEDs to signal test status
|
|
Execute Command machine LoadPlatformDescriptionFromString ${EVAL_STUB}
|
|
Execute Command machine LoadPlatformDescriptionFromString ${EXTERNAL_FLASH}
|
|
|
|
${led3_tester}= Create LED Tester sysbus.gpioPortA.led3 defaultTimeout=1
|
|
${led1_tester}= Create LED Tester sysbus.gpioPortF.led1 defaultTimeout=1
|
|
|
|
# Wait for drivers to configure GPIO
|
|
Assert LED State false testerId=${led3_tester} pauseEmulation=true
|
|
Assert LED State false testerId=${led1_tester} pauseEmulation=true
|
|
|
|
# LED1 means that the data was uploaded to flash, and the comparison with the base was successful
|
|
# LED2 should inform about comparison success, but we lack the necessary peripherals to configure it
|
|
# the sample has been modified instead to halt on first comparison error and turn LED3 on
|
|
Assert LED State true testerId=${led1_tester} pauseEmulation=true timeout=10
|
|
Assert LED State false testerId=${led3_tester} pauseEmulation=true
|
|
|
|
# And again - LED 1 toggles each time a transfer round completes
|
|
Assert LED State false testerId=${led1_tester} pauseEmulation=true
|
|
Assert LED State false testerId=${led3_tester} pauseEmulation=true
|
|
|
|
Assert LED State true testerId=${led1_tester} pauseEmulation=true
|
|
Assert LED State false testerId=${led3_tester} pauseEmulation=true
|
|
|
|
Should Program Flash With QSPI Memory Mapped
|
|
Create Machine ${QSPI_MemMapped} qspi
|
|
# This sample is built for STM32 Evaluation Kit, which uses the same SoC but has a bit different HW - we only care about LEDs to signal test status
|
|
Execute Command machine LoadPlatformDescriptionFromString ${EVAL_STUB}
|
|
Execute Command machine LoadPlatformDescriptionFromString ${EXTERNAL_FLASH}
|
|
|
|
${led3_tester}= Create LED Tester sysbus.gpioPortA.led3 defaultTimeout=1
|
|
${led1_tester}= Create LED Tester sysbus.gpioPortF.led1 defaultTimeout=1
|
|
|
|
# Wait for drivers to configure GPIO
|
|
Assert LED State false testerId=${led3_tester} pauseEmulation=true
|
|
Assert LED State false testerId=${led1_tester} pauseEmulation=true
|
|
|
|
# LED1 means that the data was uploaded to flash, and the comparison with the base was successful
|
|
Assert LED State true testerId=${led1_tester} pauseEmulation=true timeout=10
|
|
Assert LED State false testerId=${led3_tester} pauseEmulation=true
|
|
|
|
# And again - LED 1 toggles each time a transfer round completes
|
|
Assert LED State false testerId=${led1_tester} pauseEmulation=true
|
|
Assert LED State false testerId=${led3_tester} pauseEmulation=true
|
|
|
|
Assert LED State true testerId=${led1_tester} pauseEmulation=true
|
|
Assert LED State false testerId=${led3_tester} pauseEmulation=true
|
|
|
|
# This sample normally would use MDMA to transfer data, but has been switched to interrupt mode instead
|
|
# Additionally, unsupported LEDs are disabled
|
|
# Instead of blinking LEDs periodically, it will spin forever after turning them on, on test success
|
|
Should Program Flash With QSPI and use XIP
|
|
Create Machine ${QSPI_XIP} qspi
|
|
# This sample is built for STM32 Evaluation Kit, which uses the same SoC but has a bit different HW - we only care about LEDs to signal test status
|
|
Execute Command machine LoadPlatformDescriptionFromString ${EVAL_STUB}
|
|
Execute Command machine LoadPlatformDescriptionFromString ${EXTERNAL_FLASH}
|
|
|
|
${led3_tester}= Create LED Tester sysbus.gpioPortA.led3 defaultTimeout=1
|
|
${led1_tester}= Create LED Tester sysbus.gpioPortF.led1 defaultTimeout=1
|
|
|
|
# Wait for drivers to configure GPIO
|
|
Assert LED State false testerId=${led3_tester} timeout=20 pauseEmulation=true
|
|
Assert LED State false testerId=${led1_tester} pauseEmulation=true
|
|
|
|
# If the LEDs turned on, it means that the code relocated to QSPI memory is being executed
|
|
Assert LED State true testerId=${led1_tester} timeout=10 pauseEmulation=true
|
|
Assert LED State true testerId=${led3_tester} pauseEmulation=true
|
|
|
|
# Get out of GPIO init functions, which are located in regular memory
|
|
# and step into infinite spin-loop in the QSPI memory
|
|
Execute Command emulation RunFor "00:00:00.01"
|
|
# QSPI memory starts at: 0x90000000
|
|
Assert PC Equals 0x90000010
|
|
|
|
Should Read Correct Time From the PTP Clock
|
|
Create PTP Machine ${PTP} ptp
|
|
Create Terminal Tester ${UART} defaultPauseEmulation=True
|
|
# Use AdvanceImmediately to make the RunFor take less real time
|
|
Execute Command emulation SetGlobalAdvanceImmediately true
|
|
|
|
Wait For Line On Uart ptp_port: ptp_port_init: Port 1 initialized
|
|
Wait For Prompt On Uart uart:~$
|
|
Write Line To Uart ptp_clock set PTP_CLOCK 25
|
|
Write Line To Uart ptp_clock get PTP_CLOCK
|
|
Wait For Line On Uart 25.00
|
|
Execute Command emulation RunFor "7.48s"
|
|
Write Line To Uart ptp_clock get PTP_CLOCK
|
|
Wait For Line On Uart 32.48
|
|
|
|
Should Transmit PTP Frames
|
|
Create PTP Machine ${PTP} ptp
|
|
Create Terminal Tester ${UART} defaultPauseEmulation=True
|
|
Create Network Interface Tester sysbus.ethernet
|
|
|
|
Wait For Line On Uart ptp_port: ptp_port_init: Port 1 initialized
|
|
|
|
Start Emulation
|
|
|
|
FOR ${i} IN RANGE 0 3
|
|
# Wait for a PTP Sync message over UDP from 192.0.2.1:319 to 224.0.1.129:319
|
|
Wait For Outgoing Packet With Bytes At Index 0800__________________11____C0000201E0000181013F013F________0012 12 5 10
|
|
# Wait for a PTP Follow_Up message over UDP from 192.0.2.1:320 to 224.0.1.129:320 - which should be the next transmitted packet
|
|
${follow_up}= Wait For Outgoing Packet With Bytes At Index 0800__________________11____C0000201E000018101400140________0812 12 1 1
|
|
|
|
${packet_seconds}= Extract Int From Bytes ${follow_up.Bytes} 76 count=6
|
|
${packet_nanoseconds}= Extract Int From Bytes ${follow_up.Bytes} 82 count=4
|
|
${packet_milliseconds}= Evaluate (${packet_seconds} * 10**9 + ${packet_nanoseconds}) / 10**6
|
|
|
|
# Emulation time and the packet timestamp should be within 100ms of one another (100ms is to account for board initialization)
|
|
Should Be True abs(${packet_milliseconds} - ${follow_up.Timestamp}) < 100
|
|
END
|
|
|
|
Should Transmit PTP Frames With SMMUv3 In Bypass Mode
|
|
Create SMMU Machine ${PTP} smmu
|
|
Create Terminal Tester ${UART} defaultPauseEmulation=True
|
|
Execute Command showAnalyzer ${UART}
|
|
Execute Command logLevel -1 smmu
|
|
Create Network Interface Tester sysbus.ethernet
|
|
|
|
Wait For Line On Uart ptp_port: ptp_port_init: Port 1 initialized
|
|
Start Emulation
|
|
|
|
# Wait for a PTP Sync message over UDP from 192.0.2.1:319 to 224.0.1.129:319
|
|
Wait For Outgoing Packet With Bytes At Index 0800__________________11____C0000201E0000181013F013F________0012 12 5 10
|
|
# Wait for a PTP Follow_Up message over UDP from 192.0.2.1:320 to 224.0.1.129:320 - which should be the next transmitted packet
|
|
Wait For Outgoing Packet With Bytes At Index 0800__________________11____C0000201E000018101400140________0812 12 1 1
|
|
|
|
Should Encrypt And Decrypt Using DMA
|
|
Create Machine ${CRYPTO_AES_DMA} crypt
|
|
Execute Command machine LoadPlatformDescriptionFromString ${EVAL_STUB}
|
|
|
|
${led3_tester}= Create LED Tester sysbus.gpioPortA.led3 defaultTimeout=1
|
|
${led1_tester}= Create LED Tester sysbus.gpioPortF.led1 defaultTimeout=1
|
|
|
|
# LED3 would be set if at any point of the test a failure occurred
|
|
# LED1 is set at the very end of the test, when the entire procedure is complete with no failures
|
|
Assert LED State false testerId=${led3_tester}
|
|
Assert LED State true testerId=${led1_tester}
|
|
|
|
Should Erase And Program Flash Memory
|
|
Create Machine ${FLASH_EraseProgram} flash
|
|
Execute Command machine LoadPlatformDescriptionFromString ${EVAL_STUB}
|
|
|
|
${led3_tester}= Create LED Tester sysbus.gpioPortA.led3 defaultTimeout=1
|
|
${led1_tester}= Create LED Tester sysbus.gpioPortF.led1 defaultTimeout=1
|
|
|
|
# LED3 would be set if at any point of the test a failure occurred
|
|
# LED1 is set at the very end of the test, when the entire procedure is complete with no failures
|
|
Assert LED State false testerId=${led3_tester}
|
|
Assert LED State true testerId=${led1_tester}
|
|
|
|
Should Manually Trigger Flash Error
|
|
Create Machine ${FLASH_EraseProgram} flash
|
|
Create Log Tester 5
|
|
|
|
# Set up hook to notify about error during write
|
|
Execute Command cpu AddHook `sysbus GetSymbolAddress "${FLASH_WRITE_ERROR_HANDLER}" cpu` "self.ErrorLog('${FLASH_WRITE_ERROR_MSG}')"
|
|
|
|
# Set up hook to trigger error on flash write
|
|
Execute Command sysbus AddWatchpointHook ${FLASH_WRITE_ADDRESS} DoubleWord Write "cpu.GetMachine()['sysbus.flashController'].TriggerOperationError(1)"
|
|
|
|
Wait For Log Entry ${FLASH_WRITE_ERROR_MSG}
|