/** * \brief 32-bit checksum of DMA transfer data * * This test sets up DMA to do a data block transfer, and sets up * the CRC module to do a 32 bit checksum on the data. The checksum * will then be added to another buffer, the same procedure is setup * with this new buffer which should result in a checksum = 0. * * \param test Current test case */ static void run_32bit_dma_test(const struct test_case *test) { uint32_t checksum; bool success; uint8_t data_buf_8bit[LENGTH(data_8bit) + sizeof(uint32_t)]; uint8_t data_8bit_cpy[LENGTH(data_8bit) + sizeof(uint32_t)]; setup_dma_channel(LENGTH(data_8bit), (uint8_t *)data_8bit, data_buf_8bit); crc_dma_checksum_start(CONF_TEST_DMACH, CRC_32BIT); dma_channel_trigger_block_transfer(CONF_TEST_DMACH); success = wait_for_dma_transfer(test); dma_channel_disable(CONF_TEST_DMACH); dma_disable(); checksum = crc_dma_checksum_stop(); if (!success) { return; } test_assert_true(test, checksum == CRC_CHECKSUM_32BIT, "Checksum mismatch on DMA CRC-32 test"); memcpy(data_8bit_cpy, data_8bit, LENGTH(data_8bit)); crc32_append_value(checksum, &data_8bit_cpy[LENGTH(data_8bit_cpy) - sizeof(uint32_t)]); setup_dma_channel(LENGTH(data_8bit_cpy), (uint8_t *)data_8bit_cpy, data_buf_8bit); crc_dma_checksum_start(CONF_TEST_DMACH, CRC_32BIT); dma_channel_trigger_block_transfer(CONF_TEST_DMACH); success = wait_for_dma_transfer(test); dma_channel_disable(CONF_TEST_DMACH); dma_disable(); checksum = crc_dma_checksum_stop(); if (!success) { return; } test_assert_true(test, checksum == 0, "Checksum fail check failed on DMA CRC-16 test"); }
/** * \internal * \brief Callback for DMA transfer complete * * \param status Status of a completed (or failed) DMA transfer */ static void example_crc_dma_transfer_done(enum dma_channel_status status) { uint32_t checksum; checksum = crc_dma_checksum_stop(); if (checksum == 0) { // Light the second LED to indicate that checksum is zero LED_On(LED1_GPIO); } }