cmd_phy.c 16 KB

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