| *** Variables *** |
| ${URI} @https://dl.antmicro.com/projects/renode |
| |
| *** Keywords *** |
| Create Machine |
| Execute Command using sysbus |
| Execute Command mach create "Ambiq Apollo4" |
| |
| Execute Command machine LoadPlatformDescription @platforms/cpus/ambiq-apollo4.repl |
| Create Terminal Tester sysbus.uart2 10 |
| |
| Load Example |
| [Arguments] ${axf_filename} |
| Execute Command sysbus LoadELF ${URI}/${axf_filename} |
| |
| Start Example |
| [Arguments] ${axf_filename} |
| Load Example ${axf_filename} |
| Start Emulation |
| |
| Load Bytes To Memory |
| [Arguments] ${address} @{bytes} |
| FOR ${byte} IN @{bytes} |
| Execute Command sysbus WriteByte ${address} ${byte} |
| ${address} = Evaluate ${address} + 1 |
| END |
| |
| *** Test Cases *** |
| Should Successfully Run hello_world_uart Example |
| Create Machine |
| Start Example hello_world_uart.axf-s_307536-899c2682fa35d4bf27992bba5a0b5845ae331ba3 |
| |
| Wait For Line On Uart Hello World! |
| Wait For Line On Uart Vendor Name: |
| |
| Should Successfully Run stimer Example |
| Create Machine |
| Start Example stimer.axf-s_252512-bd594169c2dce5d6771bb426a479fc622b1c6182 |
| |
| Wait For Line On Uart SUCCESS! pauseEmulation=true |
| |
| Execute Command emulation RunFor '00:00:02.5000' |
| # A single "SUCCESS!" line should be printed each second (approximately) so check if there are two such lines. |
| Wait For Line On Uart SUCCESS! 0 |
| Wait For Line On Uart SUCCESS! 0 |
| |
| # There shouldn't be any more SUCCESS! lines on UART. |
| Run Keyword And Expect Error *Line containing >>SUCCESS!<< event: failure* Wait For Line On Uart SUCCESS! 0 |
| |
| Should Successfully Run rtc_print Example |
| Create Machine |
| Start Example rtc_print.axf-s_259852-abb4ec53fd71107857a6b0a60994e81cda77d4d5 |
| |
| # A fixed time set in the test instead of the compilation time. |
| Wait For Line On Uart It is now 9 : 00 : 00.00 Tuesday April 26, 2022 includeUnfinishedLine=true |
| |
| # Check RTC setting and progress. |
| Execute Command pause |
| Execute Command rtc SetDateTime 2022 12 31 23 59 59 15 |
| ${res}= Execute Command rtc PrintPreciseCurrentDateTime |
| Should Contain ${res} 2022-12-31T23:59:59.1500000 |
| ${res}= Execute Command emulation RunFor '00:00:00.12'; rtc PrintPreciseCurrentDateTime |
| Should Contain ${res} 2022-12-31T23:59:59.2700000 |
| |
| # Set the alarm to every second. |
| Execute Command rtc WriteDoubleWord 0x0 0xE |
| # Alarm whenever millisecond value equals 310. |
| Execute Command rtc WriteDoubleWord 0x30 0x31 |
| # Make sure alarm is properly set. |
| ${res}= Execute Command rtc PrintNextAlarmDateTime |
| Should Contain ${res} 2022-12-31T23:59:59.3100000 |
| # Make sure the interrupt status is off. |
| ${res}= Execute Command rtc ReadDoubleWord 0x204 |
| Should Contain ${res} 0x00000000 |
| |
| # Progress the timer and stop before the event |
| ${res}= Execute Command emulation RunFor '00:00:00.03'; rtc PrintPreciseCurrentDateTime |
| Should Contain ${res} 2022-12-31T23:59:59.3000000 |
| # Check the interrupt status. |
| ${res}= Execute Command rtc ReadDoubleWord 0x204 |
| Should Contain ${res} 0x00000000 |
| |
| # Progress the timer - this time the event should trigger |
| ${res}= Execute Command emulation RunFor '00:00:00.01'; rtc PrintPreciseCurrentDateTime |
| Should Contain ${res} 2022-12-31T23:59:59.3100000 |
| # Check the interrupt status. |
| ${res}= Execute Command rtc ReadDoubleWord 0x204 |
| Should Contain ${res} 0x00000001 |
| # Make sure the next alarm is properly scheduled. |
| ${res}= Execute Command rtc PrintNextAlarmDateTime |
| Should Contain ${res} 2023-01-01T00:00:00.3100000 |
| # Clear the interrupt status and check if it's reset. |
| ${res}= Execute Command rtc WriteDoubleWord 0x208 0x1; rtc ReadDoubleWord 0x204 |
| Should Contain ${res} 0x00000000 |
| # Progress the timer to the next year. |
| ${res}= Execute Command emulation RunFor '00:00:01.00'; rtc PrintPreciseCurrentDateTime |
| Should Contain ${res} 2023-01-01T00:00:00.3100000 |
| # Check the interrupt status. |
| ${res}= Execute Command rtc ReadDoubleWord 0x204 |
| Should Contain ${res} 0x00000001 |
| |
| # Set the alarm interval to every week. |
| Execute Command rtc WriteDoubleWord 0x0 0x6 |
| # The alarm will be set to the next Sunday at 00:00:00.31 because only the alarm's milliseconds are set (Sunday is weekday=0). |
| ${res}= Execute Command rtc PrintNextAlarmDateTime |
| Should Contain ${res} 2023-01-08T00:00:00.3100000 |
| # Set the alarm's weekday to Friday. |
| Execute Command rtc WriteDoubleWord 0x34 0x50000 |
| # Trigger the alarm exactly at 12:34:56.78. |
| Execute Command rtc WriteDoubleWord 0x30 0x12345678 |
| # Check if the alarm is set properly. |
| ${res}= Execute Command rtc PrintNextAlarmDateTime |
| Should Contain ${res} 2023-01-06T12:34:56.7800000 |
| |
| # Test if the alarm is properly adjusted after setting new date. |
| Execute Command rtc SetDateTime 2022 05 06 20 48 20 15 |
| ${res}= Execute Command rtc PrintNextAlarmDateTime |
| Should Contain ${res} 2022-05-13T12:34:56.7800000 |
| |
| # Test setting the alarm to once a year on 23rd of February. |
| Execute Command rtc WriteDoubleWord 0x34 0x0223 |
| Execute Command rtc WriteDoubleWord 0x0 0x2 |
| ${res}= Execute Command rtc PrintNextAlarmDateTime |
| Should Contain ${res} 2023-02-23T12:34:56.7800000 |
| |
| # Test disabling the alarm. |
| Execute Command rtc WriteDoubleWord 0x0 0x0 |
| ${res}= Execute Command rtc PrintNextAlarmDateTime |
| Should Contain ${res} Alarm not set. |
| |
| Should Successfully Run ios_fifo_host Example |
| Create Machine |
| Execute Command machine LoadPlatformDescriptionFromString "dummySpi: Mocks.DummySPISlave @ iom1 0" |
| Create Log Tester 10 |
| Execute Command logLevel 0 iom1.dummySpi |
| Start Example ios_fifo_host.axf-s_253032-865941e8c49057c68d2d866e9c9308febe684644 |
| |
| Wait For Line On Uart IOS Test Host: Waiting for at least 10000 bytes from the slave. includeUnfinishedLine=true |
| |
| # Currently only writes to the slave peripheral are tested. |
| Wait For Log Entry iom1.dummySpi: Data received: 0xF8 |
| Wait For Log Entry iom1.dummySpi: Data received: 0x1 |
| Wait For Log Entry iom1.dummySpi: Data received: 0x80 |
| Wait For Log Entry iom1.dummySpi: Data received: 0x0 |
| |
| Should Successfully Run binary_counter Example |
| Create Machine |
| Execute Command machine LoadPlatformDescriptionFromString 'gpio: { 30 -> led30@0; 90 -> led90@0; 91 -> led91@0 }; led30: Miscellaneous.LED @ gpio 30; led90: Miscellaneous.LED @ gpio 90; led91: Miscellaneous.LED @ gpio 91' |
| Load Example binary_counter.axf-s_264304-49508d8e17aeaaa88845426e007dde2ce4416892 |
| |
| ${led30_tester}= Create LED Tester sysbus.gpio.led30 defaultTimeout=0 |
| ${led90_tester}= Create LED Tester sysbus.gpio.led90 defaultTimeout=0 |
| ${led91_tester}= Create LED Tester sysbus.gpio.led91 defaultTimeout=0 |
| |
| Execute Command emulation RunFor "1" |
| |
| Assert LED State false testerId=${led30_tester} |
| Assert LED State false testerId=${led90_tester} |
| Assert LED State false testerId=${led91_tester} |
| |
| # this simulates an IRQ from the timer |
| Execute Command nvic OnGPIO 14 true; nvic OnGPIO 14 false |
| |
| Execute Command emulation RunFor "1" |
| |
| Assert LED State true testerId=${led30_tester} |
| Assert LED State true testerId=${led90_tester} |
| Assert LED State true testerId=${led91_tester} |
| |
| Test Calling Unimplemented Bootrom Function |
| Create Machine |
| Create Log Tester 1 |
| |
| ${FUNCTION_ADDRESS} = Set Variable 0x08000098 |
| ${FUNCTION_NAME} = Set Variable Recovery |
| |
| Execute Command cpu PC ${FUNCTION_ADDRESS} |
| Start Emulation |
| Wait For Log Entry bootrom_logger: Unimplemented BOOTROM function called: ${FUNCTION_NAME} (${FUNCTION_ADDRESS}) |
| |
| Should Successfully Run adc_measure Example |
| Create Machine |
| Start Example adc_measure.axf-s_258564-3c473c4e7c59b73cdbf00b22b633e3301923ed61 |
| |
| Wait For Line On Uart ADC correction offset = 0.0 |
| Wait For Line On Uart ADC correction gain * = 0.0 treatAsRegex=true # Regex handles the output's triple space. |
| |
| # Make sure slot channels are correct |
| Wait For Line On Uart ADC SLOT0 = 0x.....1.. treatAsRegex=true |
| Wait For Line On Uart ADC SLOT1 = 0x.....2.. treatAsRegex=true |
| Wait For Line On Uart ADC SLOT2 = 0x.....4.. treatAsRegex=true |
| Wait For Line On Uart ADC SLOT3 = 0x.....6.. treatAsRegex=true |
| |
| # A single software trigger is sent by the example so a single read from each slot should be printed. |
| # These values are the example defaults set in the REPL file. |
| Wait For Line On Uart ADC#0 sample read=681, measured voltage=197.0 mV |
| Wait For Line On Uart ADC#1 sample read=1363, measured voltage=395.0 mV |
| Wait For Line On Uart ADC#2 sample read=2729, measured voltage=792.0 mV |
| Wait For Line On Uart ADC#3 sample read=4092, measured voltage=1188.0 mV |
| |
| # Change some values and manually trigger a scan. |
| Execute Command adc Channel2Data 0x00040 |
| Execute Command adc Channel4Data 0x35E00 |
| Execute Command adc ScanAllSlots |
| Wait For Line On Uart ADC#0 sample read=681, measured voltage=197.0 mV |
| Wait For Line On Uart ADC#1 sample read=0, measured voltage=0.0 mV |
| Wait For Line On Uart ADC#2 sample read=3445, measured voltage=1000.0 mV |
| Wait For Line On Uart ADC#3 sample read=4092, measured voltage=1188.0 mV |
| |
| Test Calculating CRC32 Value |
| Create Machine |
| Create Log Tester 1 |
| Execute Command logLevel -1 security |
| |
| # The data and its CRC come from SDK's 'em9304_patches.c'. |
| ${address} = Set Variable 0x0 |
| ${crc} = Set Variable 0xF9FC5EF5 |
| Load Bytes To Memory ${address} |
| ... 0x33 0x39 0x6D 0x65 0x20 0x00 0x00 0x00 |
| ... 0x01 0x0B 0x18 0x14 0x11 0x0C 0x02 0x00 |
| ... 0x75 0xDE 0xC7 0x98 0x81 0x00 0x00 0x00 |
| ... 0x01 0x00 0x00 0x00 0x01 0x00 0x00 0x00 |
| ${length} = Set Variable 0x20 |
| |
| # Check if the SDK's 'am_hal_crc32' steps work. |
| Execute Command security WriteDoubleWord 0x30 0xFFFFFFFF # Seed initial value. |
| Execute Command security WriteDoubleWord 0x10 ${address} # Set source address. |
| Execute Command security WriteDoubleWord 0x20 ${length} # Set length. |
| Execute Command security WriteDoubleWord 0x0 0x0 # Set FUNCTION field to CRC32. |
| |
| # Start the calculation by setting the ENABLE bit and wait for the result log. |
| Execute Command security WriteDoubleWord 0x0 0x1 |
| Wait For Log Entry security: CRC32 calculation result: ${crc} |
| |
| # Check if the ENABLE bit has been cleared. |
| ${control_register} = Execute Command security ReadDoubleWord 0x0 |
| Should Contain ${control_register} 0x0 |
| |
| # Check the result register's value. |
| ${result_register} = Execute Command security ReadDoubleWord 0x30 |
| Should Contain ${result_register} ${crc} |