Бесплатный timestamp на ESP32

Как интересно.

ESP2-S3 официально не поддерживает стандарт 802.11p. Но есть функции его включения и выключения, довольно увесистые и логика вокруг них.

Т.е. поддерживает, но Espressif молчит. Видимо, из-за сертификации.

1 лайк

Однако с выходом IEEE 802.11–2012 стандарт IEEE 802.11p был отменён, и теперь он входит в состав IEEE 802.11. elsv.ru

1 лайк

Интересное наблюдение.

ESP32 - это не просто чип. Это SoC. И , как результат, у него внутри нео^H^H^H несколько совершенно разных блоков (аналоговых, цифровых, с разным питанием и клоком, короче - жопа). Какие-то из этих блоков замапленны на память и в документации называются “peripheral registers“. Это то, к чему все привыкли.

Однако нашлось еще как минимум 9 блоков, относящиеся к радио: усилитель мощности, синтезатор частоты, блок контроля и корректировки частоты, демодулятор+AGC, потом там еще ADC используется для измерения своего собственного сигнала (ов?). Теперь я хотя бы знаю, почему нельзя пользоваться ADC2, когда работает WIFI.

Доступ к этим блокам осуществляется по нутряной шине, как будто бы I2C, но не та, что в документации. Внутренняя. Черз нее ESP32 управляет всем своим обвесом. Адреса устройств на этой нутряной шине начинаются с 0x62 а заканчиваются на 0x6d.

Например, там есть PowerAmplifier, которым можно рулить напрямую, в обход всех ограничений. Наверняка можно и спалить.

Есть блок синтезатора частот, с регистрами корректировки. Судя по коду (могу наврать) корректировка осуществляется ±101кГц (шаг 1 кгц) от центральной. Интересно, умеет ли он перестраиваться быстро? А то можно сделать FM передатчик голоса на 2.4ГГц :).

Address Что это (почти точно :slight_smile:
0x67 PHY core
0x66 RF Front End
0x6B Bias/Analog
0x62 RF PLL / Synthesizer / Clock Generator block
0x69 Calibration helper / ADC2-related, RX sense
1 лайк

Ты чо, китайца-разрабоччика выкрал и пытаешь терморектальным криптоанализатором?

2 лайка

Слава Российским дебагерам! Самым вдумчивым и беспощадным!

1 лайк

Отдел Вдумчивой Отладки Центра Самоходного Программного Обеспечения

Архитектура системного софта (драйвера + ROM) довольно интересная. Т.к. в ROM есть\будут ошибки, а исправить их в ROM нельзя, Espressif придумал такой финт:

В ROM хранится таблица функций (150+ функций), которые доступны через структуру g_phyFuns ( DRAM: 0x3fcef3d8 ). Структура эта хранится в RAM и заполняется из ROM. После этого стартует система и подменяет плохие\неправильные функции в этой таблице на исправленные.

Почти весь код драйверов WiFi и BT выглядит вот так:

  iVar2 = (**(code **)(_g_phyFuns + 0xec))((int)*param_1);
  iVar3 = (**(code **)(_g_phyFuns + 0xec))((int)param_1[1]);
  if (iVar3 < iVar2) {
    iVar2 = (**(code **)(_g_phyFuns + 0xec))((int)*param_2);
    pcVar4 = *(code **)(_g_phyFuns + 0xec);
    sVar1 = *param_1;
  }
  else {
    iVar2 = (**(code **)(_g_phyFuns + 0xec))((int)param_2[1]);
    pcVar4 = *(code **)(_g_phyFuns + 0xec);
    sVar1 = param_1[1];

и долгое время это было черным ящиком.

Сегодня ночью я расковырял эту таблицу, вот она:

g_phyFuns начинается с 0x3fcef3d8:


Поле   Адрес RAM   Значение   Указатель на какую функцию
струк
туры

000 | 0x3fcef3d8 : 0x40037fa8 rom_disable_agc
001 | 0x3fcef3dc : 0x40037fcc rom_enable_agc
002 | 0x3fcef3e0 : 0x4037a1a8 ram_disable_wifi_agc
003 | 0x3fcef3e4 : 0x4037a1f0 ram_enable_wifi_agc
004 | 0x3fcef3e8 : 0x400380b4 rom_phy_disable_cca
005 | 0x3fcef3ec : 0x400380e0 rom_phy_enable_cca
006 | 0x3fcef3f0 : 0x40055cc8 rom_pow_usr
007 | 0x3fcef3f4 : 0x400380f8 rom_set_loopback_gain
008 | 0x3fcef3f8 : 0x40038154 rom_set_cal_rxdc
009 | 0x3fcef3fc : 0x40038194 rom_loopback_mode_en
000 | 0x3fcef400 : 0x40055cdc rom_get_data_sat
011 | 0x3fcef404 : 0x400381d8 rom_write_gain_mem
012 | 0x3fcef408 : 0x40055cec rom_bt_index_to_bb
013 | 0x3fcef40c : 0x40055d08 rom_bt_bb_to_index
014 | 0x3fcef410 : 0x40055d24 rom_get_bbgain_db
015 | 0x3fcef414 : 0x40038210 rom_set_tx_dig_gain
016 | 0x3fcef418 : 0x40038254 rom_rx_gain_force
017 | 0x3fcef41c : 0x40038298 rom_set_txclk_en
018 | 0x3fcef420 : 0x400382c4 rom_set_rxclk_en
019 | 0x3fcef424 : 0x40038348 rom_spur_reg_write_one_tone
020 | 0x3fcef428 : 0x40055d70 rom_spur_cal
021 | 0x3fcef42c : 0x420b54f0 spur_coef_cfg_new
022 | 0x3fcef430 : 0x400386f8 rom_bb_wdg_test_en
023 | 0x3fcef434 : 0x40038fc8 rom_mhz2ieee
024 | 0x3fcef438 : 0x40038730 rom_bb_bss_cbw40_dig
025 | 0x3fcef43c : 0x4003900c rom_cbw2040_cfg
026 | 0x3fcef440 : 0x40039034 rom_mac_tx_chan_offset
027 | 0x3fcef444 : 0x40039074 rom_bb_bss_cbw40
028 | 0x3fcef448 : 0x40038750 rom_noise_floor_auto_set
029 | 0x3fcef44c : 0x4003879c rom_phy_get_noisefloor
030 | 0x3fcef450 : 0x400387e0 rom_check_noise_floor
031 | 0x3fcef454 : 0x40038884 rom_read_hw_noisefloor
032 | 0x3fcef458 : 0x420cc198 ram_set_noise_floor
033 | 0x3fcef45c : 0x400390fc rom_set_cca
034 | 0x3fcef460 : 0x400388e0 rom_bb_wdt_rst_enable
035 | 0x3fcef464 : 0x40038904 rom_bb_wdt_int_enable
036 | 0x3fcef468 : 0x40038928 rom_bb_wdt_timeout_clear
037 | 0x3fcef46c : 0x40038940 rom_bb_wdt_get_status
038 | 0x3fcef470 : 0x40055d4c rom_phy_byte_to_word
039 | 0x3fcef474 : 0x40038974 rom_tx_paon_set
040 | 0x3fcef478 : 0x400389f0 rom_i2cmst_reg_init
041 | 0x3fcef47c : 0x40038b00 rom_iq_corr_enable
042 | 0x3fcef480 : 0x40038b44 rom_fe_reg_init
043 | 0x3fcef484 : 0x40038c5c rom_agc_reg_init
044 | 0x3fcef488 : 0x40038cfc rom_bb_reg_init
045 | 0x3fcef48c : 0x40038d0c rom_mac_enable_bb
046 | 0x3fcef490 : 0x40038d4c rom_bb_wdg_cfg
047 | 0x3fcef494 : 0x40039168 rom_force_txon
048 | 0x3fcef498 : 0x40038d80 rom_fe_txrx_reset
049 | 0x3fcef49c : 0x40038db4 rom_set_rx_comp
050 | 0x3fcef4a0 : 0x40379ac4 ram_set_pbus_reg
051 | 0x3fcef4a4 : 0x40038f60 rom_write_chan_freq
052 | 0x3fcef4a8 : 0x400391c0 rom_phy_get_rx_freq
053 | 0x3fcef4ac : 0x40038eac rom_phy_xpd_rf
054 | 0x3fcef4b0 : 0x40038f38 rom_set_xpd_sar
055 | 0x3fcef4b4 : 0x40055bc8 rom_txbbgain_to_index
056 | 0x3fcef4b8 : 0x40036438 rom_index_to_txbbgain
057 | 0x3fcef4bc : 0x40036470 rom_pwdet_sar2_init
058 | 0x3fcef4c0 : 0x40036508 rom_en_pwdet
059 | 0x3fcef4c4 : 0x40055bf4 rom_abs_temp
060 | 0x3fcef4c8 : 0x420b4370 ram_iq_est_enable
061 | 0x3fcef4cc : 0x4003660c rom_iq_est_disable
062 | 0x3fcef4d0 : 0x40036648 rom_dc_iq_est
063 | 0x3fcef4d4 : 0x420b2c5c ram_set_chan_cal_interp
064 | 0x3fcef4d8 : 0x4037a358 ram_set_txcap_reg
065 | 0x3fcef4dc : 0x40036794 rom_linear_to_db
066 | 0x3fcef4e0 : 0x40036804 rom_wifi_11g_rate_chg
067 | 0x3fcef4e4 : 0x40036820 rom_get_target_power_offset
068 | 0x3fcef4e8 : 0x400368c4 rom_write_txrate_power_offset
069 | 0x3fcef4ec : 0x4003696c rom_get_rate_fcc_index
070 | 0x3fcef4f0 : 0x400369ec rom_get_rate_target_power
071 | 0x3fcef4f4 : 0x40055bfc rom_target_power_add_backoff
072 | 0x3fcef4f8 : 0x40036a18 rom_pkdet_vol_start
073 | 0x3fcef4fc : 0x40036aa4 rom_read_sar_dout
074 | 0x3fcef500 : 0x420b3104 ram_read_sar2_code
075 | 0x3fcef504 : 0x40036afc rom_get_sar2_vol
076 | 0x3fcef508 : 0x40036b44 rom_get_pll_vol
077 | 0x3fcef50c : 0x40036b98 rom_phy_set_bbfreq_init
078 | 0x3fcef510 : 0x40055c1c rom_get_pwctrl_correct
079 | 0x3fcef514 : 0x40036bc8 rom_tx_pwctrl_bg_init
080 | 0x3fcef518 : 0x40036bec rom_get_phy_target_power
081 | 0x3fcef51c : 0x420b2be0 ram_temp_to_power
082 | 0x3fcef520 : 0x40036c28 rom_phy_track_pll_cap
083 | 0x3fcef524 : 0x40036ce0 rom_phy_pwdet_always_en
084 | 0x3fcef528 : 0x40036d1c rom_phy_pwdet_onetime_en
085 | 0x3fcef52c : 0x40035474 rom_get_i2c_read_mask
086 | 0x3fcef530 : 0x40035494 rom_get_i2c_mst0_mask
087 | 0x3fcef534 : 0x4037a5d4 ram_get_i2c_hostid
088 | 0x3fcef538 : 0x40055bb8 rom_enter_critical_phy
089 | 0x3fcef53c : 0x40055bc0 rom_exit_critical_phy
090 | 0x3fcef540 : 0x400354fc rom_chip_i2c_readReg_org
091 | 0x3fcef544 : 0x4037a614 ram_chip_i2c_readReg
092 | 0x3fcef548 : 0x40035594 rom_i2c_paral_set_mst0
093 | 0x3fcef54c : 0x400355d8 rom_i2c_paral_set_read
094 | 0x3fcef550 : 0x40035614 rom_i2c_paral_read
095 | 0x3fcef554 : 0x40035684 rom_i2c_paral_write
096 | 0x3fcef558 : 0x400356f0 rom_i2c_paral_write_num
097 | 0x3fcef55c : 0x40035738 rom_i2c_paral_write_mask
098 | 0x3fcef560 : 0x400357f8 rom_i2c_readReg
099 | 0x3fcef564 : 0x4037a66c ram_chip_i2c_writeReg
100 | 0x3fcef568 : 0x40035880 rom_i2c_writeReg
101 | 0x3fcef56c : 0x4003589c rom_i2c_readReg_Mask
102 | 0x3fcef570 : 0x400358d8 rom_i2c_writeReg_Mask
103 | 0x3fcef574 : 0x40035964 rom_pbus_force_mode
104 | 0x3fcef578 : 0x40035a2c rom_pbus_rd_addr
105 | 0x3fcef57c : 0x40035a78 rom_pbus_rd_shift
106 | 0x3fcef580 : 0x40035acc rom_pbus_force_test
107 | 0x3fcef584 : 0x40035b28 rom_pbus_rd
108 | 0x3fcef588 : 0x40035b6c rom_pbus_debugmode
109 | 0x3fcef58c : 0x40035b80 rom_pbus_workmode
110 | 0x3fcef590 : 0x40035b94 rom_pbus_set_rxgain
111 | 0x3fcef594 : 0x40035bf8 rom_pbus_xpd_rx_off
112 | 0x3fcef598 : 0x40035c2c rom_pbus_xpd_rx_on
113 | 0x3fcef59c : 0x40035c80 rom_pbus_xpd_tx_off
114 | 0x3fcef5a0 : 0x40035cd4 rom_pbus_xpd_tx_on
115 | 0x3fcef5a4 : 0x40035d60 rom_pbus_set_dco
116 | 0x3fcef5a8 : 0x40035dc4 rom_bb_bss_cbw40_ana
117 | 0x3fcef5ac : 0x40035e3c rom_chan_to_freq
118 | 0x3fcef5b0 : 0x40035e7c rom_open_i2c_xpd
119 | 0x3fcef5b4 : 0x40035eac rom_dac_rate_set
110 | 0x3fcef5b8 : 0x40035f44 rom_tsens_read_init
111 | 0x3fcef5bc : 0x420b2b98 ram_tsens_code_read
112 | 0x3fcef5c0 : 0x40036020 rom_tsens_index_to_dac
113 | 0x3fcef5c4 : 0x4003603c rom_tsens_index_to_offset
114 | 0x3fcef5c8 : 0x4003605c rom_tsens_dac_cal
115 | 0x3fcef5cc : 0x400360d4 rom_code_to_temp
116 | 0x3fcef5d0 : 0x40036120 rom_write_pll_cap_mem
117 | 0x3fcef5d4 : 0x40036184 rom_pll_correct_dcap
118 | 0x3fcef5d8 : 0x40379684 ram_phy_en_hw_set_freq
119 | 0x3fcef5dc : 0x403796a4 ram_phy_dis_hw_set_freq
120 | 0x3fcef5e0 : 0x420cc0a4 ram_pll_vol_cal
121 | 0x3fcef5e4 : 0x420b25a8 ram_write_pll_cap
122 | 0x3fcef5e8 : 0x40036d94 rom_set_tx_gain_mem
123 | 0x3fcef5ec : 0x40036e78 rom_bt_tx_dig_gain
124 | 0x3fcef5f0 : 0x420b3a28 ram_bt_get_tx_gain
125 | 0x3fcef5f4 : 0x40036fc4 rom_get_chan_target_power
126 | 0x3fcef5f8 : 0x40055c7c rom_get_tx_gain_value
127 | 0x3fcef5fc : 0x403797cc ram_wifi_tx_dig_gain
128 | 0x3fcef600 : 0x420b3b18 ram_wifi_get_tx_gain
129 | 0x3fcef604 : 0x4037a274 ram_fe_i2c_reg_renew
130 | 0x3fcef608 : 0x40037254 rom_wifi_agc_sat_gain
131 | 0x3fcef60c : 0x403796f8 ram_i2c_master_reset
132 | 0x3fcef610 : 0x400372c0 rom_bt_filter_reg
133 | 0x3fcef614 : 0x40037310 rom_i2c_sar2_init_code
134 | 0x3fcef618 : 0x40037348 rom_phy_bbpll_cal
135 | 0x3fcef61c : 0x40037370 rom_phy_param_addr
136 | 0x3fcef620 : 0x4003737c rom_phy_reg_init
137 | 0x3fcef624 : 0x400373fc rom_set_chan_reg
138 | 0x3fcef628 : 0x40037498 rom_phy_wakeup_init
139 | 0x3fcef62c : 0x4037a414 ram_phy_i2c_init1
140 | 0x3fcef630 : 0x420b2bcc ram_tsens_temp_read
141 | 0x3fcef634 : 0x40037804 rom_bt_track_pll_cap
142 | 0x3fcef638 : 0x40037854 rom_wifi_track_pll_cap
143 | 0x3fcef63c : 0x420b3c2c ram_wifi_set_tx_gain
144 | 0x3fcef640 : 0x420afecc ram_txpwr_cal_track
145 | 0x3fcef644 : 0x40037a44 rom_tx_pwctrl_background
146 | 0x3fcef648 : 0x40379838 ram_bt_set_tx_gain
147 | 0x3fcef64c : 0x40037b08 rom_noise_check_loop
148 | 0x3fcef650 : 0x40037c34 rom_phy_close_rf
149 | 0x3fcef654 : 0x40037c70 rom_phy_xpd_tsens
150 | 0x3fcef658 : 0x40037c88 rom_phy_freq_mem_backup
151 | 0x3fcef65c : 0x40037d28 rom_phy_ant_init
152 | 0x3fcef660 : 0x420affe8 ram_bt_track_tx_power
153 | 0x3fcef664 : 0x420b0000 ram_wifi_track_tx_power
154 | 0x3fcef668 : 0x40037dec rom_phy_dig_reg_backup

Это то место, где обломался реверс у других групп. Я пока это выложу только в российском сегменте.

Функции начинающиеся с rom_ - оригинальные из ПЗУ. Зашиты на заводе в 21 году. Функции начинающиеся с ram_ - это свежие патченные версии rom_ кода, который находится в RAM.

Теперь код превращается в понятный:

                    
    (**(code **)(_g_phyFuns + 0x198))(0x66,0,4,3,2,uVar1); /* <-------- rom_i2c_writeReg_Mask() */
    if (param_1 != '\0') {
                    
      (**(code **)(_g_phyFuns + 0x1b0))(); /* <-------- rom_pbus_debugmode() */
                    
      (**(code **)(_g_phyFuns + 0x1a8))(1,1,param_2); /* <-------- rom_pbus_force_test() */
      ets_delay_us(100);
                    
      (**(code **)(_g_phyFuns + 0x1a8))(1,1,0x189); /* <-------- rom_pbus_force_test() */

Ну штош. Теперь у нас есть осмысленные вызовы.

Как 2.4 ггц сигнал смотреть?

1 лайк

Да, именно то, что все подумали. Так WiFi модуль измеряет свою выходную мощность. Измеряя температуру (!). С этого температурного сенсора можно читать температуру, настраивать его - для этого есть функции в ROM.

Мощность передачи постоянно регулируется и зависит от номера канала, от температуры и от кода страны. Есть так же глобальная переменная fcc_mode_sel , которую можно выключить и ничего регулироваться не будет, будет жарить на всю катушку. Переменная нужна для прохождения сертификации (== true) и заводского\FCC тестирования (==false)

Надо заметить, что ROM на ESP32 (все модели) весьма жырненький. Там 384кб кода. В частности там есть:

newlib

jpegdecoder

bignum library

md5/sha/aes/rsa

Т.е все это совершенно свободно можно использовать не увеличивая размер своего кода.

Хотите печатать в терминале без использования printf и Serial.printf? Не вопрос, используйте void esp_rom_printf(const char *, …) - никакие библиотеки не будут приклеены к проекту.

5 лайков

думаю написать маленькую прокси и подменить все вызовы в таблице: хочу записать порядок вызова и аргументы. Так у меня будет полный трейс инициализации WiFi. Ну, не только инициализации, конечно.

Уточнено:

| Адрес| Имя от Espressif (+ доступные логические блоки внутри, имена от Espressif)
+ -------+------------------------------------------------------
| 0x6D | ?
| 0x6C | ?
| 0x6B | Bias (CON, CPR, CGM)
| 0x6a | ?
| 0x69 | SAR (TSENS, RTC)       // ADC2, sensing
| 0x68 | ?
| 0x67 | BTOP (Fi, Fq, Bi, Bq)  // Baseband top
| 0x66 | BPLL (AD1-AD3, PLL)
| 0x65 | CKGEN
| 0x64 | RFRX (LNA,MX,VGA)
| 0x63 | ?
| 0x62 | FPLL (VCO, BIA)

1 лайк

(сообщение удалено автором)

хорошего - помаленьку.

Жадина )))