76 lines
3.5 KiB
Plaintext
76 lines
3.5 KiB
Plaintext
*** Variables ***
|
|
${PROGRAM_COUNTER} 0x80000000
|
|
${PIT_ADDRESS} 0xf0400000
|
|
${CH0_CTRL_OFFSET} 0x20
|
|
${CH0_RELOAD_OFFSET} 0x24
|
|
${INTERRUPT_ENABLE_OFFSET} 0x14
|
|
${CH_ENABLE_OFFSET} 0x1C
|
|
${INTERRUPT_STATE_OFFSET} 0x18
|
|
${CHANNEL_STEP} 0x10
|
|
*** Keywords ***
|
|
Create Machine
|
|
Execute Command include @platforms/cpus/egis_et171.repl
|
|
Execute Command cpu0 PC ${PROGRAM_COUNTER}
|
|
Create Log Tester 0
|
|
|
|
Channel ${number:(0|1|2|3)} ${interrupt_enable:(Should|Should Not)} Fire And Clear Interrupt In Single 32-bit Mode
|
|
Create Machine
|
|
Execute Command logLevel -1
|
|
|
|
${ctrl_offset}= Evaluate ${CH0_CTRL_OFFSET} + (${number} * ${CHANNEL_STEP})
|
|
${reload_offset}= Evaluate ${CH0_RELOAD_OFFSET} + (${number} * ${CHANNEL_STEP})
|
|
${channel_bit}= Evaluate 1 << (${number} * 4)
|
|
${interrupt_bit}= Evaluate ${channel_bit} if "${interrupt_enable}" == "Should" else 0
|
|
${frequency}= Execute Command syscon APBClockFrequency
|
|
${delay}= Evaluate int(${frequency} / 10) #delay of 0.1 second
|
|
|
|
${PROG}= Catenate SEPARATOR=\n
|
|
... li a0, ${PIT_ADDRESS}
|
|
... li t0, 1 # 32-bit timer mode
|
|
... sw t0, ${ctrl_offset}(a0)
|
|
... li t0, ${delay}
|
|
... sw t0, ${reload_offset}(a0)
|
|
... li t0, ${interrupt_bit}
|
|
... sw t0, ${INTERRUPT_ENABLE_OFFSET}(a0)
|
|
... li t0, ${channel_bit}
|
|
... sw t0, ${CH_ENABLE_OFFSET}(a0)
|
|
... loop:
|
|
... j loop
|
|
|
|
Execute Command cpu0 AssembleBlock ${PROGRAM_COUNTER} """${PROG}"""
|
|
|
|
Execute Command emulation RunFor "0.1001"
|
|
|
|
Wait For Log Entry pit0: Channel ${number} timer 0 fired
|
|
IF $interrupt_enable == "Should"
|
|
Wait For Log Entry pit0: Setting IRQ to True
|
|
Wait For Log Entry plic: Setting GPIO number #22 to value True
|
|
Wait For Log Entry plic: Setting state to True for source #22
|
|
|
|
# Write 1 to interrupt state to clear the interrupt
|
|
${PROG}= Catenate SEPARATOR=\n
|
|
... li t0, ${interrupt_bit}
|
|
... sw t0, ${INTERRUPT_STATE_OFFSET}(a0)
|
|
... loop:
|
|
... j loop
|
|
|
|
Execute Command cpu0 AssembleBlock `cpu0 PC` """${PROG}"""
|
|
Execute Command emulation RunFor "0.001"
|
|
Wait For Log Entry pit0: Setting IRQ to False
|
|
ELSE
|
|
Should Not Be In Log pit0: Setting IRQ to True
|
|
Should Not Be In Log plic: Setting GPIO number #22 to value True
|
|
Should Not Be In Log plic: Setting state to True for source #22
|
|
END
|
|
|
|
Reset Emulation
|
|
|
|
*** Test Cases ***
|
|
PIT Should Fire Interrupts Correctly In 32-bit Mode
|
|
[Template] Channel ${number:(0|1|2|3)} ${interupt_enable:(Should|Should Not)} Fire And Clear Interrupt In Single 32-bit Mode
|
|
FOR ${channel} IN 0 1 2 3
|
|
FOR ${interrupt_enable} IN Should Should Not
|
|
${channel} ${interrupt_enable}
|
|
END
|
|
END
|