| *** Variables *** |
| ${UART} sysbus.uart |
| ${STDOUT} sysbus.stdout |
| ${URI} @https://dl.antmicro.com/projects/renode |
| |
| *** Keywords *** |
| Create Machine |
| [Arguments] ${elf} |
| |
| Execute Command mach create |
| Execute Command machine LoadPlatformDescription @platforms/boards/A2_CV32E40P.repl |
| |
| Execute Command sysbus LoadELF ${URI}/${elf} |
| |
| Create Test File |
| [Arguments] ${file} |
| ${string} = Set Variable ${EMPTY} |
| FOR ${index} IN RANGE 128 |
| ${string}= Catenate ${string} 00 ${index} |
| END |
| |
| ${bytes}= Convert To Bytes ${string} int |
| Create Binary File ${file} ${bytes} |
| |
| *** Test Cases *** |
| Should Print Hello to UART |
| Create Machine arnold-pulp-hello-s_354412-d0f4d2860104d3bb1d4524c4ee76ef476bbe1d1e |
| Create Terminal Tester ${UART} |
| |
| Start Emulation |
| |
| Wait For Line On Uart Hello ! |
| |
| Should Set GPIO Output to High |
| Create Machine arnold-pulp-gpio-s_380728-f9f273e2063a3ea7d4f9607cce4d7f12ea10bf63 |
| Execute Command machine LoadPlatformDescriptionFromString "gpio: { 5 -> led@0 }; led: Miscellaneous.LED @ gpio 5" |
| |
| Create LED Tester sysbus.gpio.led |
| |
| Start Emulation |
| |
| Assert LED State true 1 |
| |
| Should Print to UART Using a Timer |
| Create Machine arnold-pulp-timer-s_365004-fc268eecd231afb88a571748c864b6c3ab0bcb5d |
| Create Terminal Tester ${UART} |
| |
| Set Test Variable ${SLEEP_TIME} 163 |
| Set Test Variable ${SLEEP_TOLERANCE} 10 |
| Set Test Variable ${REPEATS} 20 |
| |
| Start Emulation |
| |
| ${l}= Create List |
| ${MAX_SLEEP_TIME}= Evaluate ${SLEEP_TIME} + ${SLEEP_TOLERANCE} |
| |
| FOR ${i} IN RANGE 0 ${REPEATS} |
| ${r} Wait For Line On Uart Entered user handler |
| Append To List ${l} ${r.timestamp} |
| END |
| |
| FOR ${i} IN RANGE 1 ${REPEATS} |
| ${i1}= Get From List ${l} ${i - 1} |
| ${i2}= Get From List ${l} ${i} |
| ${d}= Evaluate ${i2} - ${i1} |
| Should Be True ${d} >= ${SLEEP_TIME} Too short sleep detected between entries ${i} and ${i + 1}: expected ${SLEEP_TIME}, got ${d} |
| Should Be True ${d} <= ${MAX_SLEEP_TIME} Too long sleep detected between entires ${i} and ${i + 1}: expected ${SLEEP_TIME}, got ${d} |
| END |
| |
| Should Echo Characters on UART |
| Create Machine arnold-pulp-echo-s_387788-cf79547cd654f7ebad125546dd2c98e58b47731e |
| Create Terminal Tester ${UART} |
| |
| Start Emulation |
| |
| Wait For Line On Uart Entered test |
| |
| Write Char On Uart t |
| Wait For Prompt On Uart t |
| Write Char On Uart e |
| Wait For Prompt On Uart e |
| Write Char On Uart s |
| Wait For Prompt On Uart s |
| Write Char On Uart t |
| Wait For Prompt On Uart t |
| |
| Should Fail When I2S Not Configured |
| Create Machine arnold-pulp-i2s_capture-s_566452-62d9e3e48551334dac1ab17af371728e66586c7a |
| Create Log Tester 1 |
| |
| Start Emulation |
| |
| Wait For Log Entry Starting reception without an input file! Aborting |
| |
| Should Output I2S Samples From File |
| Create Machine arnold-pulp-i2s_capture-s_566452-62d9e3e48551334dac1ab17af371728e66586c7a |
| |
| ${input_file}= Allocate Temporary File |
| Create Test File ${input_file} |
| Execute Command sysbus.i2s InputFile '${input_file}' |
| Create Terminal Tester ${STDOUT} |
| |
| Start Emulation |
| |
| Wait For Line On Uart Value of sample 0 = 0 |
| Wait For Line On Uart Value of sample 127 = 127 |
| |
| Should Run I2C test |
| Create Machine arnold-pulp-i2c-s_389340-a622fbd1302bc8a0a52b70f8713bc028f341c902 |
| Execute Command machine LoadPlatformDescriptionFromString "i2c_echo: Mocks.EchoI2CDevice @ i2c0 0x55" |
| |
| # There is a problem with the rt_i2c_write() function in the simulation. |
| # It configures the DMA transfer with the first set of commands (CFG, START, WRITE address, RPT, WRITE), but fails to continue with the next one. |
| # The i2c_step1() callback is being called as a result of the interrupt, but it doesn't start the transfer of the actual data. |
| # It looks like the state of the X8 register is wrong - it should contain a base address of the controller, but instead it is 0. |
| # As a result the write that should be directed to I2C's register ends up in the memory. |
| # |
| # The code belows patches the value of the register by setting it to the TxBufferBaseAddress register of the i2c0 device |
| # in the i2c_step1() function (https://github.com/pulp-platform/pulp-rt/blob/master/kernel/riscv/udma-v3.S#L305). |
| # |
| # WARNING: the addresses below are binary-specific and should be adapted after rebuilding the demo |
| |
| Execute Command sysbus.cpu AddHook 0x1c008208 "self.SetRegisterUnsafeUlong(12, 0x1a102190)" |
| Execute Command sysbus.cpu AddHook 0x1c00822c "self.SetRegisterUnsafeUlong(12, 0x1a102190)" |
| |
| Create Terminal Tester ${UART} |
| |
| Start Emulation |
| |
| Wait For Line On Uart Entering test |
| Wait For Line On Uart reading... |
| Wait For Line On Uart 0x0: 0x0 |
| Wait For Line On Uart 0x1: 0x0 |
| Wait For Line On Uart 0x2: 0x0 |
| Wait For Line On Uart 0x3: 0x0 |
| Wait For Line On Uart writing... |
| Wait For Line On Uart readng again... |
| Wait For Line On Uart 0x0: 0x0 |
| Wait For Line On Uart 0x1: 0x1 |
| Wait For Line On Uart 0x2: 0x2 |
| Wait For Line On Uart 0x3: 0x3 |
| Wait For Line On Uart the end |
| |
| SPI Should Send Bytes |
| Create Machine arnold--pulp-rt-examples--spim-send.elf-s_414648-d0100af113d67254d957e26c9ea62c014a753a0c |
| Execute Command machine LoadPlatformDescriptionFromString "dummySlave: Mocks.DummySPISlave @ spi" |
| Create Log Tester 0.1 |
| Execute Command logLevel 0 spi.dummySlave |
| |
| Start Emulation |
| |
| Wait For Log Entry Data received: 0x0 |
| Wait For Log Entry Data received: 0x1 |
| Wait For Log Entry Data received: 0x2 |
| Wait For Log Entry Data received: 0x3 |
| Wait For Log Entry Data received: 0x4 |
| Wait For Log Entry Data received: 0x5 |
| Wait For Log Entry Data received: 0x6 |
| Wait For Log Entry Data received: 0x7 |
| Wait For Log Entry Data received: 0x8 |
| Wait For Log Entry Data received: 0x9 |
| Wait For Log Entry Data received: 0xA |
| Wait For Log Entry Data received: 0xB |
| Wait For Log Entry Data received: 0xC |
| Wait For Log Entry Data received: 0xD |
| Wait For Log Entry Data received: 0xE |
| Wait For Log Entry Data received: 0xF |
| |
| SPI Should Send Bytes Async |
| Create Machine arnold--spim-async.elf-s_417852-3cf040621fd22ac14bd67be8decfe3a84f7d8d78 |
| Execute Command machine LoadPlatformDescriptionFromString "dummySlave: Mocks.DummySPISlave @ spi" |
| Create Terminal Tester sysbus.uart |
| Create Log Tester 0.1 |
| Execute Command logLevel 0 spi.dummySlave |
| |
| Start Emulation |
| |
| Wait For Line On Uart Executing callback! |
| Wait For Log Entry Data received: 0x0 |
| Wait For Log Entry Data received: 0x1F |
| Wait For Line On Uart Executing callback! |
| Wait For Log Entry Data received: 0x0 |
| Wait For Log Entry Data received: 0x1F |
| Wait For Line On Uart Executing callback! |
| Wait For Log Entry Data received: 0x0 |
| Wait For Log Entry Data received: 0x1F |
| |
| SPI Should Receive Bytes |
| Create Machine arnold--pulp-rt-examples--spim-receive.elf-s_414528-ba2983aef41f1493d1f6b13c58ea0d7b843bf57a |
| Execute Command machine LoadPlatformDescriptionFromString "dummySlave: Mocks.DummySPISlave @ spi" |
| Execute Command logLevel 0 spi.dummySlave |
| |
| ${res}= Execute Command sysbus ReadDoubleWord 0x1C00A7F8 |
| Should Contain ${res} 0x00000000 |
| ${res}= Execute Command sysbus ReadDoubleWord 0x1C00A7FC |
| Should Contain ${res} 0x00000000 |
| ${res}= Execute Command sysbus ReadDoubleWord 0x1C00A800 |
| Should Contain ${res} 0x00000000 |
| ${res}= Execute Command sysbus ReadDoubleWord 0x1C00A804 |
| Should Contain ${res} 0x00000000 |
| |
| FOR ${i} IN RANGE 0 16 |
| Execute Command sysbus.spi.dummySlave EnqueueValue ${i} |
| END |
| |
| Start Emulation |
| |
| Wait For Log Entry Data received: 0x0 (idx: 15) |
| ${res}= Execute Command sysbus ReadDoubleWord 0x1C00A7F8 |
| Should Contain ${res} 0x03020100 |
| ${res}= Execute Command sysbus ReadDoubleWord 0x1C00A7FC |
| Should Contain ${res} 0x07060504 |
| ${res}= Execute Command sysbus ReadDoubleWord 0x1C00A800 |
| Should Contain ${res} 0x0B0A0908 |
| ${res}= Execute Command sysbus ReadDoubleWord 0x1C00A804 |
| Should Contain ${res} 0x0F0E0D0C |
| |
| Should Read Frames From Camera |
| Create Machine arnold-pulp-camera-s_391968-f3ac0d1bcaf06ba5811c3e5c333aeac8286c5bdc |
| Execute Command machine LoadPlatformDescriptionFromString "himax: Sensors.HiMaxHM01B0 @ camera_controller" |
| |
| Execute Command sysbus.camera_controller.himax AddFrame ${URI}/images/person_image_0.jpg-s_3853-7f2125e28423fa117a1079d84785b17c9b70f62d |
| |
| Create Terminal Tester ${UART} |
| Start Emulation |
| |
| Wait For Line On Uart Entering main controller |
| Wait For Line On Uart Frame 1 captured! |
| Wait For Line On Uart 0xff 0xd8 0xff 0xe0 0x0 0x10 0x4a 0x46 |
| Wait For Line On Uart Frame 2 captured! |
| Wait For Line On Uart 0xff 0xd8 0xff 0xe0 0x0 0x10 0x4a 0x46 |
| Wait For Line On Uart Frame 3 captured! |
| Wait For Line On Uart 0xff 0xd8 0xff 0xe0 0x0 0x10 0x4a 0x46 |
| Wait For Line On Uart Frame 4 captured! |
| Wait For Line On Uart 0xff 0xd8 0xff 0xe0 0x0 0x10 0x4a 0x46 |
| Wait For Line On Uart Frame 5 captured! |
| Wait For Line On Uart 0xff 0xd8 0xff 0xe0 0x0 0x10 0x4a 0x46 |
| Wait For Line On Uart Frame 6 captured! |
| Wait For Line On Uart 0xff 0xd8 0xff 0xe0 0x0 0x10 0x4a 0x46 |
| Wait For Line On Uart Frame 7 captured! |
| Wait For Line On Uart 0xff 0xd8 0xff 0xe0 0x0 0x10 0x4a 0x46 |
| Wait For Line On Uart Frame 8 captured! |
| Wait For Line On Uart 0xff 0xd8 0xff 0xe0 0x0 0x10 0x4a 0x46 |
| Wait For Line On Uart Frame 9 captured! |
| Wait For Line On Uart 0xff 0xd8 0xff 0xe0 0x0 0x10 0x4a 0x46 |
| Wait For Line On Uart Frame 10 captured! |
| Wait For Line On Uart 0xff 0xd8 0xff 0xe0 0x0 0x10 0x4a 0x46 |
| Wait For Line On Uart Test success |