Unit tests for Direct Memory Access controller driver.
Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
#include <stdint.h>
#include <stdbool.h>
#include <board.h>
#include <sysclk.h>
#include <dma.h>
#include <pmic.h>
#include <tc.h>
#include <sleepmgr.h>
#include <string.h>
#include <unit_test/suite.h>
#include <stdio_serial.h>
#include <conf_test.h>
#include <conf_board.h>
Functions | |
int | main (void) |
Callback functions | |
static void | dma_transfer_is_complete (enum dma_channel_status status) |
DMA transfer complete callback. More... | |
static void | timer_overflow_callback (void) |
Timer overflow callback. More... | |
DMA module test functions | |
static void | run_dma_memory_copy_burst_length_test (const struct test_case *test) |
Test the different burst lengths by copying on all channels. More... | |
static void | run_dma_direction_test (const struct test_case *test) |
Test different directions on all channels. More... | |
static void | run_dma_config_interface_test (const struct test_case *test) |
Set DMA configuration, and read it back. More... | |
static void | run_dma_triggered_with_callback (const struct test_case *test) |
Test read from fixed location, trigger from timer and callback. More... | |
static void | run_dma_error_handling_test (const struct test_case *test) |
Test the error handling of the module. More... | |
static void | run_dma_double_buffering_test (const struct test_case *test) |
Test double buffering mode. More... | |
Variables | |
Variables | |
uint8_t | memory_block_src [MEMORY_BLOCK_SIZE] |
Memory block to read from. More... | |
uint8_t | memory_block_dest [MEMORY_BLOCK_SIZE] |
Memory block to write to. More... | |
uint8_t | dest_block_tc [DEST_BLOCK_TC_SIZE] |
Memory block to write to, used by run_dma_triggered_with_callback. More... | |
uint8_t | expected_result_tc [DEST_BLOCK_TC_SIZE] |
Expected result from trigger/interrupt copy. More... | |
volatile bool | dma_has_completed = false |
Whether DMA has finished copying, used by run_dma_triggered_with_callback. More... | |
volatile uint8_t | timer_overflow_counter = 0 |
Counter incremented by timer overflow. More... | |
Helper functions | |
#define | set_buffer(buffer, value) memset(buffer, value, sizeof(buffer)) |
Set all bytes in buffer to value. More... | |
static void | block_fill (uint8_t *block, uint16_t size) |
Fill a block with a certain pattern. More... | |
static bool | block_compare (const uint8_t *block_1, const uint8_t *block_2, uint16_t block_size) |
Compare two 8-bit data blocks of given size. More... | |
static bool | block_compare_reverse (const uint8_t *block_1, const uint8_t *block_2, uint16_t block_size) |
Compare two 8-bit data blocks of given size in reverse. More... | |
static void | dma_transfer_block (dma_channel_num_t channel_num) |
Trigger and wait for a successful transfer. More... | |
Set all bytes in buffer to value.
Referenced by run_dma_direction_test(), run_dma_double_buffering_test(), run_dma_memory_copy_burst_length_test(), and run_dma_triggered_with_callback().
|
static |
Compare two 8-bit data blocks of given size.
block_1 | Pointer to first block. |
block_2 | Pointer to second block. |
block_size | Size of blocks to compare. |
Referenced by run_dma_direction_test(), run_dma_memory_copy_burst_length_test(), and run_dma_triggered_with_callback().
|
static |
Compare two 8-bit data blocks of given size in reverse.
block_1 | Pointer to first block. |
block_2 | Pointer to second block. |
block_size | Size of blocks to compare. |
Referenced by run_dma_direction_test().
|
static |
Fill a block with a certain pattern.
block_1 | Pointer to block. |
block_size | Size of block to fill. |
Referenced by run_dma_direction_test(), run_dma_double_buffering_test(), and run_dma_memory_copy_burst_length_test().
|
static |
Trigger and wait for a successful transfer.
channel_num | Channel number |
References DMA_CH_TRANSFER_COMPLETED, dma_channel_trigger_block_transfer(), and dma_get_channel_status().
Referenced by run_dma_direction_test(), and run_dma_memory_copy_burst_length_test().
|
static |
DMA transfer complete callback.
status | Status of transfer |
References DMA_CH_TRANSFER_COMPLETED, dma_has_completed, and tc_disable().
Referenced by run_dma_triggered_with_callback().
int main | ( | void | ) |
References usart_rs232_options::baudrate, board_init(), cpu_irq_enable, DEFINE_TEST_ARRAY, DEFINE_TEST_CASE, DEFINE_TEST_SUITE, pmic_enable_level(), pmic_init(), PMIC_LVL_LOW, run_dma_config_interface_test(), run_dma_direction_test(), run_dma_double_buffering_test(), run_dma_error_handling_test(), run_dma_memory_copy_burst_length_test(), run_dma_triggered_with_callback(), sleepmgr_init(), stdio_serial_init(), sysclk_init(), test_suite_run(), and usart_serial_options.
|
static |
Set DMA configuration, and read it back.
test | Current test case |
References dma_channel_config::addrctrl, dma_channel_config::ctrla, dma_channel_config::destaddr16, dma_channel_read_config(), dma_channel_reset(), dma_channel_set_burst_length(), dma_channel_set_dest_dir_mode(), dma_channel_set_dest_reload_mode(), dma_channel_set_destination_address(), dma_channel_set_interrupt_level(), dma_channel_set_repeats(), dma_channel_set_single_shot(), dma_channel_set_source_address(), dma_channel_set_src_dir_mode(), dma_channel_set_src_reload_mode(), dma_channel_set_transfer_count(), dma_channel_set_trigger_source(), dma_channel_unset_single_shot(), dma_channel_write_burst_length(), dma_channel_write_config(), dma_channel_write_destination(), dma_channel_write_repeats(), dma_channel_write_source(), dma_channel_write_transfer_count(), dma_disable(), dma_enable(), DMA_NUMBER_OF_CHANNELS, HUGEMEM_NULL, hugemem_write32(), PMIC_LVL_HIGH, dma_channel_config::repcnt, dma_channel_config::srcaddr16, test_assert_true, dma_channel_config::trfcnt, and dma_channel_config::trigsrc.
Referenced by main().
|
static |
Test different directions on all channels.
test | Current test |
References block_compare(), block_compare_reverse(), block_fill(), dma_channel_disable(), dma_channel_enable(), dma_channel_reset(), dma_channel_set_burst_length(), dma_channel_set_dest_dir_mode(), dma_channel_set_dest_reload_mode(), dma_channel_set_destination_address(), dma_channel_set_source_address(), dma_channel_set_src_dir_mode(), dma_channel_set_src_reload_mode(), dma_channel_set_transfer_count(), dma_channel_write_config(), dma_disable(), dma_enable(), DMA_NUMBER_OF_CHANNELS, dma_transfer_block(), memory_block_dest, memory_block_src, set_buffer, success, and test_assert_true.
Referenced by main().
|
static |
Test double buffering mode.
test | Current test case |
References block_fill(), DMA_CH_TRANSFER_COMPLETED, dma_channel_disable(), dma_channel_enable(), dma_channel_is_enabled(), dma_channel_set_burst_length(), dma_channel_set_dest_dir_mode(), dma_channel_set_dest_reload_mode(), dma_channel_set_destination_address(), dma_channel_set_repeats(), dma_channel_set_source_address(), dma_channel_set_src_dir_mode(), dma_channel_set_src_reload_mode(), dma_channel_set_transfer_count(), dma_channel_trigger_block_transfer(), dma_channel_write_config(), dma_enable(), dma_get_channel_status(), dma_set_double_buffer_mode(), memory_block_dest, memory_block_src, set_buffer, success, and test_assert_true.
Referenced by main().
|
static |
Test the error handling of the module.
test | Current test |
References DMA_CH_TRANSFER_ERROR, dma_channel_disable(), dma_channel_enable(), dma_channel_is_busy(), dma_channel_reset(), dma_channel_trigger_block_transfer(), dma_channel_write_burst_length(), dma_channel_write_destination(), dma_channel_write_source(), dma_channel_write_transfer_count(), dma_disable(), dma_enable(), dma_get_channel_status(), memory_block_dest, memory_block_src, and test_assert_true.
Referenced by main().
|
static |
Test the different burst lengths by copying on all channels.
test | Current test |
References block_compare(), block_fill(), dma_channel_disable(), dma_channel_enable(), dma_channel_reset(), dma_channel_set_burst_length(), dma_channel_set_dest_dir_mode(), dma_channel_set_dest_reload_mode(), dma_channel_set_destination_address(), dma_channel_set_source_address(), dma_channel_set_src_dir_mode(), dma_channel_set_src_reload_mode(), dma_channel_set_transfer_count(), dma_channel_write_config(), dma_disable(), dma_enable(), DMA_NUMBER_OF_CHANNELS, dma_transfer_block(), memory_block_dest, memory_block_src, set_buffer, success, and test_assert_true.
Referenced by main().
|
static |
Test read from fixed location, trigger from timer and callback.
test | Current test |
References block_compare(), dest_block_tc, dma_channel_enable(), dma_channel_reset(), dma_channel_set_burst_length(), dma_channel_set_dest_dir_mode(), dma_channel_set_dest_reload_mode(), dma_channel_set_destination_address(), dma_channel_set_interrupt_level(), dma_channel_set_single_shot(), dma_channel_set_source_address(), dma_channel_set_src_dir_mode(), dma_channel_set_src_reload_mode(), dma_channel_set_transfer_count(), dma_channel_set_trigger_source(), dma_channel_write_config(), dma_disable(), dma_enable(), dma_has_completed, dma_set_callback(), dma_transfer_is_complete(), expected_result_tc, PMIC_LVL_LOW, set_buffer, success, tc_enable(), tc_set_direction(), tc_set_overflow_interrupt_callback(), tc_set_overflow_interrupt_level(), tc_set_resolution(), TC_UP, tc_write_period(), test_assert_true, timer_overflow_callback(), and timer_overflow_counter.
Referenced by main().
|
static |
Timer overflow callback.
References timer_overflow_counter.
Referenced by run_dma_triggered_with_callback().
uint8_t dest_block_tc[DEST_BLOCK_TC_SIZE] |
Memory block to write to, used by run_dma_triggered_with_callback.
Referenced by run_dma_triggered_with_callback().
Whether DMA has finished copying, used by run_dma_triggered_with_callback.
Referenced by dma_transfer_is_complete(), and run_dma_triggered_with_callback().
uint8_t expected_result_tc[DEST_BLOCK_TC_SIZE] |
Expected result from trigger/interrupt copy.
Referenced by run_dma_triggered_with_callback().
uint8_t memory_block_dest[MEMORY_BLOCK_SIZE] |
Memory block to write to.
Referenced by run_dma_direction_test(), run_dma_double_buffering_test(), run_dma_error_handling_test(), and run_dma_memory_copy_burst_length_test().
uint8_t memory_block_src[MEMORY_BLOCK_SIZE] |
Memory block to read from.
Referenced by run_dma_direction_test(), run_dma_double_buffering_test(), run_dma_error_handling_test(), and run_dma_memory_copy_burst_length_test().
volatile uint8_t timer_overflow_counter = 0 |
Counter incremented by timer overflow.
Referenced by run_dma_triggered_with_callback(), and timer_overflow_callback().