cmd_phy.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. /*
  2. * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Unlicense OR CC0-1.0
  5. */
  6. #include "freertos/FreeRTOS.h"
  7. #include "freertos/task.h"
  8. #include "esp_log.h"
  9. #include "esp_console.h"
  10. #include "argtable3/argtable3.h"
  11. #include "esp_phy_cert_test.h"
  12. #include "cmd_phy.h"
  13. #define TAG "cmd_phy"
  14. #define CERT_TASK_PRIO 2
  15. #if CONFIG_ESP_PHY_ENABLE_CERT_TEST
  16. static phy_args_t phy_args;
  17. #if SOC_WIFI_SUPPORTED
  18. static phy_wifi_tx_t phy_wifi_tx_args;
  19. static phy_wifi_rx_t phy_wifi_rx_args;
  20. static phy_wifiscwout_t phy_wifiscwout_args;
  21. #endif
  22. #if SOC_BT_SUPPORTED
  23. static phy_ble_tx_t phy_ble_tx_args;
  24. static phy_ble_rx_t phy_ble_rx_args;
  25. static phy_bt_tx_tone_t phy_bt_tx_tone_args;
  26. #endif
  27. #if CONFIG_ESP_PHY_LEGACY_COMMANDS
  28. #define arg_int0(_a, _b, _c, _d) arg_int0(NULL, NULL, _c, _d)
  29. #define arg_int1(_a, _b, _c, _d) arg_int1(NULL, NULL, _c, _d)
  30. #endif
  31. static int esp_phy_tx_contin_en_func(int argc, char **argv)
  32. {
  33. int nerrors = arg_parse(argc, argv, (void **) &phy_args);
  34. if (nerrors != 0) {
  35. arg_print_errors(stderr, phy_args.end, argv[0]);
  36. return 1;
  37. }
  38. if (phy_args.enable->count == 1) {
  39. esp_phy_tx_contin_en(phy_args.enable->ival[0]);
  40. } else {
  41. ESP_LOGW(TAG, "Please enter the enable parameter");
  42. }
  43. return 0;
  44. }
  45. static int esp_phy_cmdstop_func(int argc, char **argv)
  46. {
  47. int nerrors = arg_parse(argc, argv, (void **) &phy_args);
  48. if (nerrors != 0) {
  49. arg_print_errors(stderr, phy_args.end, argv[0]);
  50. return 1;
  51. }
  52. esp_phy_test_start_stop(0);
  53. return 0;
  54. }
  55. static int esp_phy_get_rx_result_func(int argc, char **argv)
  56. {
  57. esp_phy_rx_result_t rx_result;
  58. int nerrors = arg_parse(argc, argv, (void **) &phy_args);
  59. if (nerrors != 0) {
  60. arg_print_errors(stderr, phy_args.end, argv[0]);
  61. return 1;
  62. }
  63. esp_phy_get_rx_result(&rx_result);
  64. ESP_LOGI(TAG, "Desired: %lu, Correct: %lu, RSSI: %d, flag: %lu", rx_result.phy_rx_total_count,
  65. rx_result.phy_rx_correct_count, rx_result.phy_rx_rssi, rx_result.phy_rx_result_flag);
  66. return 0;
  67. }
  68. #if SOC_WIFI_SUPPORTED
  69. void cert_wifi_tx(void *arg)
  70. {
  71. phy_wifi_tx_s *cmd = (phy_wifi_tx_s*)arg;
  72. esp_phy_test_start_stop(3);
  73. esp_phy_wifi_tx(cmd->channel, cmd->rate, cmd->backoff, cmd->length_byte, cmd->packet_delay, cmd->packet_num);
  74. vTaskDelete(NULL);
  75. }
  76. void cert_wifi_rx(void *arg)
  77. {
  78. phy_wifi_rx_s *cmd = (phy_wifi_rx_s*)arg;
  79. esp_phy_test_start_stop(3);
  80. esp_phy_wifi_rx(cmd->channel, cmd->rate);
  81. vTaskDelete(NULL);
  82. }
  83. static int esp_phy_cbw40m_en_func(int argc, char **argv)
  84. {
  85. int nerrors = arg_parse(argc, argv, (void **) &phy_args);
  86. if (nerrors != 0) {
  87. arg_print_errors(stderr, phy_args.end, argv[0]);
  88. return 1;
  89. }
  90. if (phy_args.enable->count == 1) {
  91. esp_phy_cbw40m_en(phy_args.enable->ival[0]);
  92. } else {
  93. ESP_LOGW(TAG, "Please enter the enable parameter");
  94. }
  95. return 0;
  96. }
  97. static int esp_phy_wifi_tx_func(int argc, char **argv)
  98. {
  99. static phy_wifi_tx_s cmd;
  100. int nerrors = arg_parse(argc, argv, (void **) &phy_wifi_tx_args);
  101. if (nerrors != 0) {
  102. arg_print_errors(stderr, phy_wifi_tx_args.end, argv[0]);
  103. return 1;
  104. }
  105. if (phy_wifi_tx_args.channel->count == 1) {
  106. cmd.channel = phy_wifi_tx_args.channel->ival[0];
  107. } else {
  108. cmd.channel = 1;
  109. ESP_LOGW(TAG, "Default channel is 1");
  110. }
  111. if (phy_wifi_tx_args.rate->count == 1) {
  112. cmd.rate = phy_wifi_tx_args.rate->ival[0];
  113. } else {
  114. cmd.rate = PHY_RATE_1M;
  115. ESP_LOGW(TAG, "Default rate is PHY_RATE_1M");
  116. }
  117. if (phy_wifi_tx_args.attenuation->count == 1) {
  118. cmd.backoff = phy_wifi_tx_args.attenuation->ival[0];
  119. } else {
  120. cmd.backoff = 0;
  121. ESP_LOGW(TAG, "Default backoff is 0");
  122. }
  123. if (phy_wifi_tx_args.length_byte->count == 1) {
  124. cmd.length_byte = phy_wifi_tx_args.length_byte->ival[0];
  125. } else {
  126. cmd.length_byte = 1000;
  127. ESP_LOGW(TAG, "Default length_byte is 1000");
  128. }
  129. if (phy_wifi_tx_args.packet_delay->count == 1) {
  130. cmd.packet_delay = phy_wifi_tx_args.packet_delay->ival[0];
  131. } else {
  132. cmd.packet_delay = 1000;
  133. ESP_LOGW(TAG, "Default packet_delay is 1000");
  134. }
  135. if (phy_wifi_tx_args.packet_num->count == 1) {
  136. cmd.packet_num = phy_wifi_tx_args.packet_num->ival[0];
  137. } else {
  138. cmd.packet_num = 0;
  139. ESP_LOGW(TAG, "Default packet_num is 0");
  140. }
  141. xTaskCreate(cert_wifi_tx, "cert_wifi_tx", 1024 * 10, (void *)&cmd, CERT_TASK_PRIO, NULL);
  142. return 0;
  143. }
  144. static int esp_phy_wifi_rx_func(int argc, char **argv)
  145. {
  146. static phy_wifi_rx_s cmd;
  147. int nerrors = arg_parse(argc, argv, (void **) &phy_wifi_rx_args);
  148. if (nerrors != 0) {
  149. arg_print_errors(stderr, phy_wifi_rx_args.end, argv[0]);
  150. return 1;
  151. }
  152. if (phy_wifi_rx_args.channel->count == 1) {
  153. cmd.channel = phy_wifi_rx_args.channel->ival[0];
  154. } else {
  155. cmd.channel = 1;
  156. ESP_LOGW(TAG, "Default channel is 1");
  157. }
  158. if (phy_wifi_rx_args.rate->count == 1) {
  159. cmd.rate = phy_wifi_rx_args.rate->ival[0];
  160. } else {
  161. cmd.rate = PHY_RATE_1M;
  162. ESP_LOGW(TAG, "Default rate is PHY_RATE_1M");
  163. }
  164. xTaskCreate(cert_wifi_rx, "cert_wifi_rx", 1024 * 20, (void *)&cmd, CERT_TASK_PRIO, NULL);
  165. return 0;
  166. }
  167. static int esp_phy_wifiscwout_func(int argc, char **argv)
  168. {
  169. uint32_t enable;
  170. uint32_t channel;
  171. uint32_t attenuation;
  172. int nerrors = arg_parse(argc, argv, (void **) &phy_wifiscwout_args);
  173. if (nerrors != 0) {
  174. arg_print_errors(stderr, phy_wifiscwout_args.end, argv[0]);
  175. return 1;
  176. }
  177. if (phy_wifiscwout_args.enable->count == 1) {
  178. enable = phy_wifiscwout_args.enable->ival[0];
  179. } else {
  180. enable = 1;
  181. ESP_LOGW(TAG, "Default enable is 1");
  182. }
  183. if (phy_wifiscwout_args.channel->count == 1) {
  184. channel = phy_wifiscwout_args.channel->ival[0];
  185. } else {
  186. channel = 1;
  187. ESP_LOGW(TAG, "Default channel is 1");
  188. }
  189. if (phy_wifiscwout_args.attenuation->count == 1) {
  190. attenuation = phy_wifiscwout_args.attenuation->ival[0];
  191. } else {
  192. attenuation = 0;
  193. ESP_LOGW(TAG, "Default attenuation is 0");
  194. }
  195. esp_phy_wifi_tx_tone(enable, channel, attenuation);
  196. return 0;
  197. }
  198. #endif
  199. #if SOC_BT_SUPPORTED
  200. void cert_ble_tx(void *arg)
  201. {
  202. phy_ble_tx_s *cmd = (phy_ble_tx_s *)arg;
  203. esp_phy_test_start_stop(3);
  204. esp_phy_ble_tx(cmd->txpwr, cmd->channel, cmd->len, cmd->data_type, cmd->syncw, cmd->rate, cmd->tx_num_in);
  205. vTaskDelete(NULL);
  206. }
  207. void cert_ble_rx(void *arg)
  208. {
  209. phy_ble_rx_s *cmd = (phy_ble_rx_s *)arg;
  210. esp_phy_test_start_stop(3);
  211. esp_phy_ble_rx(cmd->channel, cmd->syncw, cmd->rate);
  212. vTaskDelete(NULL);
  213. }
  214. static int esp_phy_ble_tx_func(int argc, char **argv)
  215. {
  216. static phy_ble_tx_s cmd;
  217. int nerrors = arg_parse(argc, argv, (void **) &phy_ble_tx_args);
  218. if (nerrors != 0) {
  219. arg_print_errors(stderr, phy_ble_tx_args.end, argv[0]);
  220. return 1;
  221. }
  222. if (phy_ble_tx_args.txpwr->count == 1) {
  223. cmd.txpwr = phy_ble_tx_args.txpwr->ival[0];
  224. } else {
  225. cmd.txpwr = 8;
  226. ESP_LOGW(TAG, "Default txpwr is 8");
  227. }
  228. if (phy_ble_tx_args.channel->count == 1) {
  229. cmd.channel = phy_ble_tx_args.channel->ival[0];
  230. } else {
  231. cmd.channel = 1;
  232. ESP_LOGW(TAG, "Default channel is 1");
  233. }
  234. if (phy_ble_tx_args.len->count == 1) {
  235. cmd.len = phy_ble_tx_args.len->ival[0];
  236. } else {
  237. cmd.len = 37;
  238. ESP_LOGW(TAG, "Default len is 37");
  239. }
  240. if (phy_ble_tx_args.data_type->count == 1) {
  241. cmd.data_type = phy_ble_tx_args.data_type->ival[0];
  242. } else {
  243. cmd.data_type = PHY_BLE_TYPE_prbs9;
  244. ESP_LOGW(TAG, "Default data_type is PHY_BLE_TYPE_prbs9");
  245. }
  246. if (phy_ble_tx_args.syncw->count == 1) {
  247. cmd.syncw = phy_ble_tx_args.syncw->ival[0];
  248. } else {
  249. cmd.syncw = 0x71764129;
  250. ESP_LOGW(TAG, "Default syncw is 0x71764129");
  251. }
  252. if (phy_ble_tx_args.rate->count == 1) {
  253. cmd.rate = phy_ble_tx_args.rate->ival[0];
  254. } else {
  255. cmd.rate = PHY_BLE_RATE_1M;
  256. ESP_LOGW(TAG, "Default rate is PHY_BLE_RATE_1M");
  257. }
  258. if (phy_ble_tx_args.tx_num_in->count == 1) {
  259. cmd.tx_num_in = phy_ble_tx_args.tx_num_in->ival[0];
  260. } else {
  261. cmd.tx_num_in = 0;
  262. ESP_LOGW(TAG, "Default tx_num_in is 0");
  263. }
  264. xTaskCreate(cert_ble_tx, "cert_ble_tx", 4096, (void *)&cmd, CERT_TASK_PRIO, NULL);
  265. return 0;
  266. }
  267. static int esp_phy_ble_rx_func(int argc, char **argv)
  268. {
  269. static phy_ble_rx_s cmd;
  270. int nerrors = arg_parse(argc, argv, (void **) &phy_ble_rx_args);
  271. if (nerrors != 0) {
  272. arg_print_errors(stderr, phy_ble_rx_args.end, argv[0]);
  273. return 1;
  274. }
  275. if (phy_ble_rx_args.channel->count == 1) {
  276. cmd.channel = phy_ble_rx_args.channel->ival[0];
  277. } else {
  278. cmd.channel = 1;
  279. ESP_LOGW(TAG, "Default channel is 1");
  280. }
  281. if (phy_ble_rx_args.syncw->count == 1) {
  282. cmd.syncw = phy_ble_rx_args.syncw->ival[0];
  283. } else {
  284. cmd.syncw = 0x71764129;
  285. ESP_LOGW(TAG, "Default syncw is 0x71764129");
  286. }
  287. if (phy_ble_rx_args.rate->count == 1) {
  288. cmd.rate = phy_ble_rx_args.rate->ival[0];
  289. } else {
  290. cmd.rate = PHY_BLE_RATE_1M;
  291. ESP_LOGW(TAG, "Default rate is PHY_BLE_RATE_1M");
  292. }
  293. xTaskCreate(cert_ble_rx, "cert_ble_rx", 4096, (void *)&cmd, CERT_TASK_PRIO, NULL);
  294. return 0;
  295. }
  296. static int esp_phy_bt_tx_tone_func(int argc, char **argv)
  297. {
  298. uint32_t start;
  299. uint32_t channel;
  300. uint32_t attenuation;
  301. int nerrors = arg_parse(argc, argv, (void **) &phy_bt_tx_tone_args);
  302. if (nerrors != 0) {
  303. arg_print_errors(stderr, phy_bt_tx_tone_args.end, argv[0]);
  304. return 1;
  305. }
  306. if (phy_bt_tx_tone_args.start->count == 1) {
  307. start = phy_bt_tx_tone_args.start->ival[0];
  308. } else {
  309. start = 1;
  310. ESP_LOGW(TAG, "Default start is 1");
  311. }
  312. if (phy_bt_tx_tone_args.channel->count == 1) {
  313. channel = phy_bt_tx_tone_args.channel->ival[0];
  314. } else {
  315. channel = 1;
  316. ESP_LOGW(TAG, "Default channel is 1");
  317. }
  318. if (phy_bt_tx_tone_args.attenuation->count == 1) {
  319. attenuation = phy_bt_tx_tone_args.attenuation->ival[0];
  320. } else {
  321. attenuation = 0;
  322. ESP_LOGW(TAG, "Default backoff is 0");
  323. }
  324. esp_phy_bt_tx_tone(start, channel, attenuation);
  325. return 0;
  326. }
  327. #endif
  328. void register_phy_cmd(void)
  329. {
  330. phy_args.enable = arg_int0(NULL, NULL, "<enable>", "enable");
  331. phy_args.end = arg_end(1);
  332. const esp_console_cmd_t tx_contin_cmd = {
  333. .command = "tx_contin_en",
  334. .help = "TX Continuous mode, 1: enable, 0: disable",
  335. .hint = NULL,
  336. .func = &esp_phy_tx_contin_en_func,
  337. .argtable = &phy_args
  338. };
  339. ESP_ERROR_CHECK( esp_console_cmd_register(&tx_contin_cmd) );
  340. const esp_console_cmd_t cmdstop_cmd = {
  341. .command = "cmdstop",
  342. .help = "TX/RX test stop command",
  343. .hint = NULL,
  344. .func = &esp_phy_cmdstop_func,
  345. .argtable = NULL
  346. };
  347. ESP_ERROR_CHECK( esp_console_cmd_register(&cmdstop_cmd) );
  348. const esp_console_cmd_t get_rx_result = {
  349. .command = "get_rx_result",
  350. .help = "Get RX information",
  351. .hint = NULL,
  352. .func = &esp_phy_get_rx_result_func,
  353. .argtable = NULL
  354. };
  355. ESP_ERROR_CHECK( esp_console_cmd_register(&get_rx_result) );
  356. #if SOC_WIFI_SUPPORTED
  357. const esp_console_cmd_t cbw40m_cmd = {
  358. .command = "cbw40m_en",
  359. .help = "HT40/HT20 mode selection, 0: HT20, 1: HT40",
  360. .hint = NULL,
  361. .func = &esp_phy_cbw40m_en_func,
  362. .argtable = &phy_args
  363. };
  364. ESP_ERROR_CHECK( esp_console_cmd_register(&cbw40m_cmd) );
  365. phy_wifi_tx_args.channel = arg_int0("n", "channel" , "<channel>" , "channel setting, 1~14");
  366. phy_wifi_tx_args.rate = arg_int0("r", "rate" , "<rate>" , "rate setting");
  367. phy_wifi_tx_args.attenuation = arg_int0("p", "attenuation" , "<attenuation>" , "Transmit power attenuation");
  368. phy_wifi_tx_args.length_byte = arg_int0("l", "length_byte" , "<length_byte>" , "TX packet length configuration");
  369. phy_wifi_tx_args.packet_delay= arg_int0("d", "packet_delay", "<packet_delay>", "TX packet interval configuration");
  370. phy_wifi_tx_args.packet_num = arg_int0("c", "packet_num" , "<packet_num>" , "The number of packets to send");
  371. phy_wifi_tx_args.end = arg_end(1);
  372. const esp_console_cmd_t esp_tx_cmd = {
  373. .command = "esp_tx",
  374. .help = "WiFi TX command",
  375. .hint = NULL,
  376. .func = &esp_phy_wifi_tx_func,
  377. .argtable = &phy_wifi_tx_args
  378. };
  379. ESP_ERROR_CHECK( esp_console_cmd_register(&esp_tx_cmd) );
  380. phy_wifi_rx_args.channel = arg_int0("n", "channel", "<channel>", "channel setting, 1~14");
  381. phy_wifi_rx_args.rate = arg_int0("r", "rate" , "<rate>" , "rate setting");
  382. phy_wifi_rx_args.end = arg_end(1);
  383. const esp_console_cmd_t esp_rx_cmd = {
  384. .command = "esp_rx",
  385. .help = "WiFi RX command",
  386. .hint = NULL,
  387. .func = &esp_phy_wifi_rx_func,
  388. .argtable = &phy_wifi_rx_args
  389. };
  390. ESP_ERROR_CHECK( esp_console_cmd_register(&esp_rx_cmd) );
  391. phy_wifiscwout_args.enable = arg_int0("e", "start" , "<start>" , "enable CW");
  392. phy_wifiscwout_args.channel = arg_int0("c", "channel" , "<channel>" , "channel setting, 1~14");
  393. phy_wifiscwout_args.attenuation = arg_int0("p", "attenuation", "<attenuation>", "Transmit power attenuation");
  394. phy_wifiscwout_args.end = arg_end(1);
  395. const esp_console_cmd_t wifiscwout_cmd = {
  396. .command = "wifiscwout",
  397. .help = "Wi-Fi CW TX command",
  398. .hint = NULL,
  399. .func = &esp_phy_wifiscwout_func,
  400. .argtable = &phy_wifiscwout_args
  401. };
  402. ESP_ERROR_CHECK( esp_console_cmd_register(&wifiscwout_cmd) );
  403. #endif
  404. #if SOC_BT_SUPPORTED
  405. phy_ble_tx_args.txpwr = arg_int0("p", "txpwr" , "<txpwr>" , "Transmit power level setting");
  406. phy_ble_tx_args.channel = arg_int0("n", "channel" , "<channel>" , "TX channel setting, range is 0~39");
  407. phy_ble_tx_args.len = arg_int0("l", "len" , "<len>" , "Payload length setting, range is 0-255");
  408. phy_ble_tx_args.data_type = arg_int0("t", "data_type", "<data_type>", "Data type setting");
  409. phy_ble_tx_args.syncw = arg_int0("s", "syncw" , "<syncw>" , "Packet identification");
  410. phy_ble_tx_args.rate = arg_int0("r", "rate" , "<rate>" , "TX rate setting,0: 1M; 1: 2M;2: 125K;3: 500K");
  411. phy_ble_tx_args.tx_num_in = arg_int0("m", "tx_num_in", "<tx_num_in>", "TX mode setting");
  412. phy_ble_tx_args.end = arg_end(1);
  413. const esp_console_cmd_t esp_ble_tx_cmd = {
  414. #if CONFIG_ESP_PHY_NEW_COMMANDS
  415. .command = "esp_ble_tx",
  416. #elif CONFIG_ESP_PHY_LEGACY_COMMANDS
  417. .command = "fcc_le_tx",
  418. #endif
  419. .help = "BLE TX command",
  420. .hint = NULL,
  421. .func = &esp_phy_ble_tx_func,
  422. .argtable = &phy_ble_tx_args
  423. };
  424. ESP_ERROR_CHECK( esp_console_cmd_register(&esp_ble_tx_cmd) );
  425. phy_ble_rx_args.channel = arg_int0("n", "channel", "<channel>", "RX channel setting, range is 0~39");
  426. phy_ble_rx_args.syncw = arg_int0("s", "syncw" , "<syncw>" , "Packet identification");
  427. phy_ble_rx_args.rate = arg_int0("r", "rate" , "<rate>" , "RX rate setting,0: 1M;1: 2M;2: 125K;3: 500K");
  428. phy_ble_rx_args.end = arg_end(1);
  429. const esp_console_cmd_t esp_ble_rx_cmd = {
  430. #if CONFIG_ESP_PHY_NEW_COMMANDS
  431. .command = "esp_ble_rx",
  432. #elif CONFIG_ESP_PHY_LEGACY_COMMANDS
  433. .command = "rw_le_rx_per",
  434. #endif
  435. .help = "BLE RX command",
  436. .hint = NULL,
  437. .func = &esp_phy_ble_rx_func,
  438. .argtable = &phy_ble_rx_args
  439. };
  440. ESP_ERROR_CHECK( esp_console_cmd_register(&esp_ble_rx_cmd) );
  441. phy_bt_tx_tone_args.start = arg_int0("e", "start" , "<start>" , "enable CW, 1 means transmit, 0 means stop transmitting");
  442. phy_bt_tx_tone_args.channel = arg_int0("n", "channel", "<channel>", "Single carrier transmission channel selection");
  443. phy_bt_tx_tone_args.attenuation = arg_int0("p", "power" , "<power>" , "CW power attenuation parameter");
  444. phy_bt_tx_tone_args.end = arg_end(1);
  445. const esp_console_cmd_t bt_tx_tone_cmd = {
  446. .command = "bt_tx_tone",
  447. .help = "Single carrier TX command",
  448. .hint = NULL,
  449. .func = &esp_phy_bt_tx_tone_func,
  450. .argtable = &phy_bt_tx_tone_args
  451. };
  452. ESP_ERROR_CHECK( esp_console_cmd_register(&bt_tx_tone_cmd) );
  453. #endif
  454. }
  455. #endif