Forcing TX power on the MM8108-EKH05

Hello,

I’m currently developping a system using the MM8108-EKH05 on the TX side and the MM8108-EKH19 on the RX side.
I’m having a hard time setting the transmission power to the maximum available (26dbm).

I am currently stuck at exactly 14 dBm (25 mW).

Here is my configuration:

  • Country Code: Set to "US" in config.hjson.

  • BCF: Set to bcf_mf15457.mbin and successfully flashed via OpenOCD/Python script.

  • Channel: 28 / 916 MHz.

  • Power Supply: USB-C 5V 3A.

  • Measurement: Mini-Circuit Power Sensor (50 - 6000 MHz).

I’v tried using mmwlan_override_max_tx_power(26); too but i’m getting the same result.

here is my void app_init(void) for more context

void app_init(void)
{
    printf("\n\n--- RPI -> STM32 -> HALOW ---\n\n");

    SPI_Slave_Init();

    HAL_SPI_Receive_IT(&hspi1, spi_rx_buffer, SPI_PAYLOAD_SIZE);

    // low QoS config
    struct mmwlan_qos_queue_params fpv_qos = {
        .aci = 3,         // ACI 3 = Voice (TOS 0xC0 - LwIP)
        .aifs = 2,        // inter-trame waiting time
        .cw_min = 1,      
        .cw_max = 1,  
        .txop_max_us = 0 
    };

    mmwlan_set_default_qos_queue_params(&fpv_qos, 1);
    mmwlan_set_power_save_mode(MMWLAN_PS_DISABLED);

    app_wlan_init();

    mmwlan_override_max_tx_power(26);

    mmipal_set_link_status_callback(link_status_callback);

    printf("connection to the OpenWrt AP...\n");

    app_wlan_start();

    mmwlan_ate_override_rate_control(MMWLAN_MCS_1, MMWLAN_BW_8MHZ, MMWLAN_GI_NONE);
    printf("8 MHz / MCS 1 setted.\n");


    while (!is_network_ready) {
        mmosal_task_sleep(10);
    }

    struct udp_pcb *pcb = init_udp_pcb();
    if (pcb != NULL) {
    	pcb->tos = 0xC0;
        udp_broadcast_tx_start(pcb);
    }

    (void)get_mode;
    (void)udp_broadcast_rx_start;
}

Thank you for your help,
Nathan.T

Hi Nathan,

mmwlan_override_max_tx_power will only limit the TX power, it will never increase it past the default value in the regulatory database:

The US Max Tx EIRP (dBm) for all channels is 36, so setting 26 will actually be reducing the TX power. Can you try removing the override and measuring the power?

As an aside, mmwlan_override_max_tx_power should be called between app_wlan_init and app_wlan_start, rather than after app_wlan_start (see note in docs above)

Cheers

Thanks for the response.

The function is indeed called between init and start in my code :). However, even with the override removed completely, the TX power remains physically capped at 14 dBm on the power meter.

Is it possible that, since I purchased the eval kit in the EU, the maximum power is hardcoded/locked in the hardware for regulatory reasons, even though I configured the country code to US? Or should I be using a different BCF file than bcf_mf15457.mbin?

Thanks again for your help.

Weird, I must have gotten my wired crossed when reading the code :sweat_smile:

Assuming you updated the country code in the mmconfig (which should be the case if you are associating to a US based AP) there shouldn’t be any EU restrictions as far as I know.

Can you confirm how/where you are measuring the power? That should help with diagnosing on our side

Thanks for the clarification!
​Regarding the measurement, I performed a conducted measurement: I connected the EKH05 directly via its SMA connector to a PWR-6LGHS USB Power Sensor (50 MHz - 6 GHz, -45 to +10 dBm) using a 20 dB attenuator to not fry the equipment. The reading consistently sits at exactly 14 dBm.
​To confirm this wasn’t a measurement artifact, I also did some Line-of-Sight (LOS) tests outdoors (in a mostly openfield terrain). I completely lost the connection at ~250m, which seems logical with 14 dBm.
​To address the mmconfig: yes, I did set “wlan.country_code”: “US” in my config.hjson and flashed it to the Config Store using the program-configstore.py tool.

​Is there any other parameter that could clamp the PA hardware internally?

I’m checking with my colleagues on the power side as it’s not my area of expertise.

One other sanity check for your setup etc, have you measured the power output from the EKH19? What did that read?

Hi,
Thanks for suggesting that sanity check.
Running a ping flood, the EKH19 is emitting between 20-22 dBm. Which is coherent with what iw dev wlan0 info is returning (txpower 20.00 dBm), altough when trying to set it with iw dev wlan0 set txpower fixed 2600 it doesn’t get changed.

However, my EKH05 remains strictly capped at 14 dBm.

If you provide the serial number of the EKH05 board, we can check the production database for the test results of your unit.

Not that it should make a difference here, but can you confirm the version of mm-iot-sdk you are using?

Also any other details to help investigate would be useful. EG trace of power measurement, dump of mmconfig etc

Here are the details:

  • MM8108-EKH05 V2 - Serial: 0-02BBGV, HW Version 2.1.

  • SDK version: release 2.10.4

Screenshot of the power measurement:

config.hsjon dump

{
     /* You can specify a list of key/value strings in this section to write to config store */
     /*this is equivalent to the write-string command */
    "strings" : {
        //"wlan.operating_mode": "AP",
        "wlan.operating_mode": "STA",
        /* The Wi-Fi SSID \*/
        "wlan.ssid": "MM8108_EKH19",
        //"wlan.ssid": "",
        /* The Wi-Fi password, not required if wlan.security is open */
        //"wlan.password": "EKH19_PW",
        //"wlan.password": "",
        /* The Wi-Fi security to use, valid values are sae, owe and open */
       //"wlan.security": "sae",
        "wlan.security": "open",
        /* The 2 letter country code to ensure the correct regulatory domain is used */
        "wlan.country_code": "US",

        "wlan.channel": "28",

       /* If true use DHCP, else the static IP configuration will be used */
        "ip.dhcp_enabled": "false"
        /* These settings are ignored if DHCP is used, but mandatory if using static IP */
        "ip.address": "192.168.12.50",
        "ip.netmask": "255.255.255.0",
        "ip.gateway": "192.168.12.10",
        //"ip.gateway": "255.255.255.255",

        /* These settings are for IPv6, ip6.ip_addr is only required if ip6.autoconfig is */

        "ip6.autoconfig": "true",
        // "ip6.ip_addr": "FE80::2",
        /* The following settings are required only for the udp_broadcast app */
        /* Only used in "tx" mode. If set to zero packets will be sent forever. */
        "udp_broadcast.packet_count": "10",
        /* Only used in "tx" mode */

        "udp_broadcast.packet_interval_ms": "1",
        "udp_broadcast.port": "1337",
        /* The udp broadcast mode, valid values are "tx" or "rx" */
        "udp_broadcast.mode": "tx",
        /* Used in "rx" mode to specify the device’s index into the received data array
          (see the documentation in udp_broadcast.c) */
        "udp_broadcast.id": "0"  
    },
    "hex_strings" : {     
    },
    "files" : {
        "bcf_file": "$MMIOT_ROOT/morsefirmware/mm8108/bcfs/bcf_mf15457.mbin" 
    }
}