Exemple #1
0
/**
 * \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");
}
Exemple #2
0
/**
 * \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);
	}
}