cmd_phy.c 16 KB

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