test_rmt_common.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include "sdkconfig.h"
  9. #include "freertos/FreeRTOS.h"
  10. #include "freertos/task.h"
  11. #include "unity.h"
  12. #include "driver/rmt_tx.h"
  13. #include "driver/rmt_rx.h"
  14. #include "soc/soc_caps.h"
  15. TEST_CASE("rmt_channel_install_uninstall", "[rmt]")
  16. {
  17. rmt_tx_channel_config_t tx_channel_cfg = {
  18. .mem_block_symbols = SOC_RMT_MEM_WORDS_PER_CHANNEL,
  19. .gpio_num = 0,
  20. .clk_src = RMT_CLK_SRC_DEFAULT,
  21. .resolution_hz = 1000000,
  22. .trans_queue_depth = 1,
  23. };
  24. rmt_channel_handle_t tx_channels[SOC_RMT_TX_CANDIDATES_PER_GROUP] = {};
  25. rmt_rx_channel_config_t rx_channel_cfg = {
  26. .mem_block_symbols = SOC_RMT_MEM_WORDS_PER_CHANNEL,
  27. .gpio_num = 2,
  28. .clk_src = RMT_CLK_SRC_DEFAULT,
  29. .resolution_hz = 1000000,
  30. };
  31. rmt_channel_handle_t rx_channels[SOC_RMT_RX_CANDIDATES_PER_GROUP] = {};
  32. printf("install tx/rx channels, each channel takes one memory block\r\n");
  33. for (int i = 0; i < SOC_RMT_TX_CANDIDATES_PER_GROUP; i++) {
  34. TEST_ESP_OK(rmt_new_tx_channel(&tx_channel_cfg, &tx_channels[i]));
  35. }
  36. // alloc more when tx channels are exhausted should report error
  37. TEST_ESP_ERR(ESP_ERR_NOT_FOUND, rmt_new_tx_channel(&tx_channel_cfg, &tx_channels[0]));
  38. for (int i = 0; i < SOC_RMT_TX_CANDIDATES_PER_GROUP; i++) {
  39. TEST_ESP_OK(rmt_del_channel(tx_channels[i]));
  40. }
  41. for (int i = 0; i < SOC_RMT_RX_CANDIDATES_PER_GROUP; i++) {
  42. TEST_ESP_OK(rmt_new_rx_channel(&rx_channel_cfg, &rx_channels[i]));
  43. }
  44. // alloc more when rx channels are exhausted should report error
  45. TEST_ESP_ERR(ESP_ERR_NOT_FOUND, rmt_new_rx_channel(&rx_channel_cfg, &rx_channels[0]));
  46. for (int i = 0; i < SOC_RMT_RX_CANDIDATES_PER_GROUP; i++) {
  47. TEST_ESP_OK(rmt_del_channel(rx_channels[i]));
  48. }
  49. printf("install tx/rx channels, each channel takes two memory blocks\r\n");
  50. tx_channel_cfg.mem_block_symbols = 2 * SOC_RMT_MEM_WORDS_PER_CHANNEL;
  51. rx_channel_cfg.mem_block_symbols = 2 * SOC_RMT_MEM_WORDS_PER_CHANNEL;
  52. for (int i = 0; i < SOC_RMT_TX_CANDIDATES_PER_GROUP / 2; i++) {
  53. TEST_ESP_OK(rmt_new_tx_channel(&tx_channel_cfg, &tx_channels[i]));
  54. }
  55. TEST_ESP_ERR(ESP_ERR_NOT_FOUND, rmt_new_tx_channel(&tx_channel_cfg, &tx_channels[0]));
  56. for (int i = 0; i < SOC_RMT_TX_CANDIDATES_PER_GROUP / 2; i++) {
  57. TEST_ESP_OK(rmt_del_channel(tx_channels[i]));
  58. }
  59. for (int i = 0; i < SOC_RMT_RX_CANDIDATES_PER_GROUP / 2; i++) {
  60. TEST_ESP_OK(rmt_new_rx_channel(&rx_channel_cfg, &rx_channels[i]));
  61. }
  62. TEST_ESP_ERR(ESP_ERR_NOT_FOUND, rmt_new_rx_channel(&rx_channel_cfg, &rx_channels[0]));
  63. for (int i = 0; i < SOC_RMT_RX_CANDIDATES_PER_GROUP / 2; i++) {
  64. TEST_ESP_OK(rmt_del_channel(rx_channels[i]));
  65. }
  66. printf("install tx+rx channels, memory blocks exhaustive\r\n");
  67. tx_channel_cfg.mem_block_symbols = SOC_RMT_MEM_WORDS_PER_CHANNEL;
  68. TEST_ESP_OK(rmt_new_tx_channel(&tx_channel_cfg, &tx_channels[0]));
  69. tx_channel_cfg.mem_block_symbols = SOC_RMT_MEM_WORDS_PER_CHANNEL * (SOC_RMT_CHANNELS_PER_GROUP - 2);
  70. TEST_ESP_OK(rmt_new_tx_channel(&tx_channel_cfg, &tx_channels[1]));
  71. rx_channel_cfg.mem_block_symbols = SOC_RMT_MEM_WORDS_PER_CHANNEL;
  72. TEST_ESP_OK(rmt_new_rx_channel(&rx_channel_cfg, &rx_channels[0]));
  73. TEST_ESP_ERR(ESP_ERR_NOT_FOUND, rmt_new_rx_channel(&rx_channel_cfg, &rx_channels[1]));
  74. TEST_ESP_OK(rmt_del_channel(tx_channels[0]));
  75. TEST_ESP_OK(rmt_del_channel(tx_channels[1]));
  76. TEST_ESP_OK(rmt_del_channel(rx_channels[0]));
  77. #if SOC_RMT_SUPPORT_DMA
  78. printf("install DMA channel + normal channel\r\n");
  79. tx_channel_cfg.mem_block_symbols = 4096; // DMA is aimed for transfer large amount of buffers
  80. tx_channel_cfg.flags.with_dma = true;
  81. TEST_ESP_OK(rmt_new_tx_channel(&tx_channel_cfg, &tx_channels[0]));
  82. rx_channel_cfg.flags.with_dma = true;
  83. TEST_ESP_OK(rmt_new_rx_channel(&rx_channel_cfg, &rx_channels[0]));
  84. tx_channel_cfg.mem_block_symbols = SOC_RMT_MEM_WORDS_PER_CHANNEL;
  85. tx_channel_cfg.flags.with_dma = false;
  86. rx_channel_cfg.mem_block_symbols = SOC_RMT_MEM_WORDS_PER_CHANNEL;
  87. rx_channel_cfg.flags.with_dma = false;
  88. TEST_ESP_OK(rmt_new_tx_channel(&tx_channel_cfg, &tx_channels[1]));
  89. TEST_ESP_OK(rmt_new_rx_channel(&rx_channel_cfg, &rx_channels[1]));
  90. for (int i = 0; i < 2; i++) {
  91. TEST_ESP_OK(rmt_del_channel(tx_channels[i]));
  92. TEST_ESP_OK(rmt_del_channel(rx_channels[i]));
  93. }
  94. #endif // SOC_RMT_SUPPORT_DMA
  95. }