logo elektroda
logo elektroda
X

Custom UART programmer over Wi-Fi for BK7231 and other platforms - first version

p.kaczmarek2 309 10
ADVERTISEMENT
Treść została przetłumaczona polish » english Zobacz oryginalną wersję tematu
📢 Listen (AI):
  • CB2S module wired to Arduino Wemos D1 WiFi development board .
    We have practically always used a simple USB to UART converter based on the popular CH340 chip to program IoT devices. Recently, however, I realised that you could just as well program wirelessly using a second Wi-Fi module and a UartTCP driver with an additional script that either resets the module or sets the boot state, depending on the platform. This is a potentially attractive and simple solution, as it does not require implementing the programmer from scratch, simply redirecting the UART traffic. Here I will present the first version of this mechanism.

    The old programming method .
    Up to now, we have connected the chip to be programmed to the computer via the USB port on the UART, and then our flasher communicates with it via this port. Depending on the type of MCU being programmed, we also had to short-circuit the boot pin to ground or power, for example, or reset the chip. It looked more or less like this:
    Connection diagram for programming an IoT module using a USB to TTL adapter .
    (although this 5 V could be taken from the 5 V pin from the USB to TTL converter).

    New programming method .
    The new idea is to replace the USB to UART converter with a second Wi-Fi module with already pre-loaded our firmware , compiled with the UART driver enabled on TCP. It should be noted here that this method requires soldering wires to the device to be programmed anyway. It does, however, have other advantages:
    - you do not need a USB to UART converter
    - you can program the hardware without connecting it to a PC/laptop, so there is no risk of short-circuiting - you can power the programmed hardware from the mains
    - potentially boot mode control and resetting are easier - not every USB to UART converter has extra RTS/DTR lines, and the Wi-Fi module has many IOs we can use
    This is what an example connection looks like - the CB3S on the board from the Arduino Wemos is the programmer, and the CB2S hanging on the wires is the chip being programmed. Of course, you can do it the other way round - use an additional small CB2S soldered to the device to program it with. You just need to connect properly:
    - RX to TX (usually RX1, TX1)
    - TX to RX (usually RX1, TX1)
    - common ground
    - common supply 3.3 V
    - any GPIO configured as "Relay" in OBK from programmer to CEN pin of the chip being programmed (to reset)
    CB2S module wired to Arduino Wemos D1 WiFi development board .
    Wemos D1 board with signal wires attached, placed on a wooden surface .

    Implementation details .
    Pass this paragraph if you are only interested in results!
    We already have in OpenBeken the TCP to UART bridge driver - when started, it opens a port on TCP port 8888, and everything that goes into that port is passed to UART port 1 of the Wi-Fi module. The same works in the other direction too. This was already used in our redesign of the Zigbee gateway .. This could potentially carry the programmer's data over the network.
    The OBK also, of course, has programmable GPIO operations, so we can have control over resetting and CEN of the chip.
    The only thing left is to plug in the flasher, the source code can be found here:
    https://github.com/openshwprojects/BK7231GUIFlashTool
    First of all, the flasher must take the IP address and port of the device-programmer instead of the COM port. This is not a problem, however, you need to somehow run the controller on this programmer. The Tasmota command interface will be used for this. An example command is sent as a GET request like this:
    
    http://192.168.0.212/cm?cmnd=add_dimmer%20-10
    
    .
    In a similar way, a command can be sent that starts the TCP driver on the UART and sets the baud. In my C# it looks like this:
    Code: C#
    Log in, to see the code
    .
    The driver is stopped and restarted, this is so that the baud can be changed. 8192 is the buffer size.
    The second problem is the CEN operation - resetting the BK7231, because you can only start programming the BK7231 right after the reset. The window of opportunity is very short.
    I also perform this by command:
    
    
        void toggleCEN()
        {
            SendCommand(TARGET_IP, "setChannel 0 0");
            SendCommand(TARGET_IP, "setChannel 0 1");
        }
    
    .
    This assumes that there is a pin on channel 0 in OBK with the Relay role, and this pin is connected to the CEN of the device being programmed.
    Catching the flashing mode (aka "getting bus") takes a bit then anyway, so I may have to improve this mechanism, but at least it works.
    Screenshot showing C# code and UART log with “Getting bus success!” message in green .
    The rest of the changes are down to swapping the serial port for a TCP socket.
    The stability issue remains - the Wi-Fi isn't as reliable as the cable though, and I've seen that sometimes one of the flash commands doesn't execute correctly - I've added a retry transmission mechanism for this reason.
    Screenshot of C# code with flash erase log, including one erase sector failure. .

    This is what the whole process looks like for flash operations, here reading:
    Console screenshot showing flash memory read from BK7231N device over Wi-Fi .

    ADVERTISEMENT


    Verify operation .
    Smallest test command - draws the data, writes it to the target, then reads it and compares it to the one at the beginning:
    
    WiFiProgram.exe bk7231n -d 192.168.0.139:8888 -u -t -s 0x11000 -l 0x2000
    
    .
    In the screenshot is the result from the same but with offset 0, i.e. bootloader editing on BK7231N. This is not possible on the BK7231T - this will lose the ability to program via the UART and SPI will have to be used.
    Terminal screenshot showing memory flashing process over UART TCP .
    Same test for offset 0x11000 (application start):
    Screenshot of terminal showing flash process of BK7231N via Wi-Fi TCP to UART .

    Supported commands .
    The new flasher has basic commands to operate on the flash. These include reading memory, writing, verification (comparison with a given file) and a memory test based on writing and reading a random sequence of bytes. A short readme follows:
    
    usage: wifiprogram bk7231n [-h] [-d DEVICE] [-s STARTADDR] [-l LENGTH] [-b BAUDRATE]
                       [-u] [-r] [-w] [-p]
                       filename
    
    OBK WiFi Downloader.
    
    positional arguments:
      filename              specify file_crc.bin
    
    optional arguments:
      -h, --help            show this help message and exit
      -d DEVICE, --device DEVICE
                            Target device, default 192.168.0.1:8888
      -s STARTADDR, --startaddr STARTADDR
                            burn flash address, defaults to 0x11000
      -l LENGTH, --length LENGTH
                            length to read, defaults to 0x1000
      -b BAUDRATE, --baudrate BAUDRATE
                            burn uart baudrate, defaults to 921600
      -u, --unprotect       unprotect flash first, used by BK7231N
      -r, --read            read flash
      -w, --write           write flash
      -t, --test            test flash (generate pattern, write, read, verify)
      -v, --verify           verify flash
      
         
         
            Flash BK7123N (-w, --write, start address 0x0)
            wifiprogram bk7231n -d 192.168.0.139:8888 -w -s 0 -u OpenBK7231N_QIO_1.18.193.bin
            Read BK7231N (-r, read):
            wifiprogram bk7231n -d 192.168.0.139:8888 -r -s 0 -l 0x200000 firmwarebackup.bin
            Short test (-t, --test, start address 0x0, len 0x2000):
            wifiprogram bk7231n -d 192.168.0.139:8888 -u -t -s 0 -l 0x2000
            Long test (1MB random data):
            wifiprogram bk7231n -d 192.168.0.139:8888 -u -t -s 0 -l 0x100000
    
    .
    Repository:
    https://github.com/openshwprojects/WiFiFlasher


    The "getting bus" operation takes quite a long time, I don't know how to get the timings correct. The flasher on the UART has no such problem with this. This is an issue to be solved.

    Further plans .
    This option will be integrated into the main flasher:
    https://github.com/openshwprojects/BK7231GUIFlashTool
    Ultimately, I will test this with plaforms other than BK7231.

    Summary .
    Being able to use a second Wi-Fi module as a programmer has its pros and cons. The pros include better automation of the process (not every USB to UART converter has extra lines to control possible RESET/CEN/BOOT pins), flashing a device connected to the network (many IoT devices have non-isolated converters, so you can't just program them with the main power connected) and convenience (no need to pull a USB cable). Of the downsides at the moment, I can see a potential problem with the get bus operation, but this only applies to Beken, and trouble with less precise timing in general - this is to be determined.
    It's worth bearing in mind that the whole thing could be greatly improved by implementing the flasher on the target Wi-Fi chip, as at the moment it's simply in the role of TCP bridge to UART, but that may be some day.
    @divadiow @insmod let us know if it works for you.

    PS: Newer versions may be available here: https://github.com/openshwprojects/WiFiFlasher

    Cool? Ranking DIY
    Helpful post? Buy me a coffee.
    About Author
    p.kaczmarek2
    Moderator Smart Home
    Offline 
    p.kaczmarek2 wrote 13055 posts with rating 10822, helped 601 times. Been with us since 2014 year.
  • ADVERTISEMENT
  • #2 21720443
    divadiow
    Level 36  
    thanks for the explainer. I didn't *quite* understand the process from the posts on in the other where this idea was born. I actually didn't know what the UartTCP driver was for (!)

    I'm a fan of soldering though so not sure if I will really use this, but it's nice to know it's possible.

    I'll setup a test now
  • ADVERTISEMENT
  • #3 21720469
    p.kaczmarek2
    Moderator Smart Home
    UartTCP driver opens a serial port on WiFi module (for example, UART 1 on Beken), and a TCP socket. Then, you can connect to this TCP socket, even with Putty - in "raw" mode. And whatever you will send via putty, will get send out of UART. And in the same way, everything that UART receives, gets sent to Putty.
    Helpful post? Buy me a coffee.
  • #4 21720484
    divadiow
    Level 36  
    cool

    P7 as Relay:0. Host device running version uart_95b02ee83a21 on the left. 2 CB3S modules. micro-USB for power only - ie no onboard USB-TTL in use.

    Two electronic development boards connected with jumper wires on a wooden surface

    Code: Text
    Log in, to see the code

    Windows console showing firmware flashing process on BK7231N chip

    Code: Text
    Log in, to see the code

    CMD window during firmware flashing to a device over WiFi

    Spoiler:
    wifiprogram bk7231n -d 192.168.137.92:8888 -w -s 0 -u OpenBK7231N_QIO_1.18.194.bin
    Chip type: BK7231N!Will flash via 192.168.137.92 at 8888...
    Sending 'backlog stopDriver UartTCP; startDriver UartTCP 115200 8192'...Getting bus... (now, please reboot device)
    Send reboot command.
    Sending 'backlog setChannel 0 0; addRepeatingEvent 0.01 1 setChannel 0 1'...Result: {}
    Consumed 040E0501E0FC0100
    Getting bus success!
    Going to set baud rate setting (115200)!
    Sending 'backlog stopDriver UartTCP; startDriver UartTCP 115200 8192'...Baudrate set ok!
    Will try to read device flash MID (for unprotect N):
    Flash MID loaded: 1560EB
    Will now search for Flash def in out database...
    Flash def found! For: 1560EB
    Flash information: mid: 1560EB, icName: TH25Q16HB, manufacturer: TH, szMem: 200000, szSR: 2, cwUnp: 0, cwEnp: 7, cwMsk: 407C, sb: 2, lb: 5, cwdRd: 05-35-FF-FF, cwdWr: 01-FF-FF-FF
    Flash size is 2MB
    Entering SetProtectState(True)...
    sr: 0
    sr: 400
    final sr: 400
    msk: 407c
    cw: 0, sb: 2, lb: 5
    bfd: 0
    SetProtectState(True) success!
    Going to do erase, start 0, sec count 298!
    Erasing sector 0... ok! Erasing sector 4096... ok! Erasing sector 8192... ok! Erasing sector 12288... ok! Erasing sector 16384... ok! Erasing sector 20480... ok! Erasing sector 24576... ok! Erasing sector 28672... ok! Erasing sector 32768... ok! Erasing sector 36864... ok! Erasing sector 40960... ok! Erasing sector 45056... ok! Erasing sector 49152... ok! Erasing sector 53248... ok! Erasing sector 57344... ok! Erasing sector 61440... ok! Erasing sector 65536... ok! Erasing sector 69632... ok! Erasing sector 73728... ok! Erasing sector 77824... ok! Erasing sector 81920... ok! Erasing sector 86016... ok! Erasing sector 90112... ok! Erasing sector 94208... ok! Erasing sector 98304... ok! Erasing sector 102400... ok! Erasing sector 106496... ok! Erasing sector 110592... ok! Erasing sector 114688... ok! Erasing sector 118784... ok! Erasing sector 122880... ok! Erasing sector 126976... ok! Erasing sector 131072... ok! Erasing sector 135168... ok! Erasing sector 139264... ok! Erasing sector 143360... ok! Erasing sector 147456... ok! Erasing sector 151552... ok! Erasing sector 155648... ok! Erasing sector 159744... ok! Erasing sector 163840... ok! Erasing sector 167936... ok! Erasing sector 172032... ok! Erasing sector 176128... ok! Erasing sector 180224... ok! Erasing sector 184320... ok! Erasing sector 188416... ok! Erasing sector 192512... ok! Erasing sector 196608... ok! Erasing sector 200704... ok! Erasing sector 204800... ok! Erasing sector 208896... ok! Erasing sector 212992... ok! Erasing sector 217088... ok! Erasing sector 221184... ok! Erasing sector 225280... ok! Erasing sector 229376... ok! Erasing sector 233472... ok! Erasing sector 237568... ok! Erasing sector 241664... ok! Erasing sector 245760... ok! Erasing sector 249856... ok! Erasing sector 253952... ok! Erasing sector 258048... ok! Erasing sector 262144... ok! Erasing sector 266240... ok! Erasing sector 270336... ok! Erasing sector 274432... ok! Erasing sector 278528... ok! Erasing sector 282624... ok! Erasing sector 286720... ok! Erasing sector 290816... ok! Erasing sector 294912... ok! Erasing sector 299008... ok! Erasing sector 303104... ok! Erasing sector 307200... ok! Erasing sector 311296... ok! Erasing sector 315392... ok! Erasing sector 319488... ok! Erasing sector 323584... ok! Erasing sector 327680... ok! Erasing sector 331776... ok! Erasing sector 335872... ok! Erasing sector 339968... ok! Erasing sector 344064... ok! Erasing sector 348160... ok! Erasing sector 352256... ok! Erasing sector 356352... ok! Erasing sector 360448... ok! Erasing sector 364544... ok! Erasing sector 368640... ok! Erasing sector 372736... ok! Erasing sector 376832... ok! Erasing sector 380928... ok! Erasing sector 385024... ok! Erasing sector 389120... ok! Erasing sector 393216... ok! Erasing sector 397312... ok! Erasing sector 401408... ok! Erasing sector 405504... ok! Erasing sector 409600... ok! Erasing sector 413696... ok! Erasing sector 417792... ok! Erasing sector 421888... ok! Erasing sector 425984... ok! Erasing sector 430080... ok! Erasing sector 434176... ok! Erasing sector 438272... ok! Erasing sector 442368... ok! Erasing sector 446464... ok! Erasing sector 450560... ok! Erasing sector 454656... ok! Erasing sector 458752... ok! Erasing sector 462848... ok! Erasing sector 466944... ok! Erasing sector 471040... ok! Erasing sector 475136... ok! Erasing sector 479232... ok! Erasing sector 483328... ok! Erasing sector 487424... ok! Erasing sector 491520... ok! Erasing sector 495616... ok! Erasing sector 499712... ok! Erasing sector 503808... ok! Erasing sector 507904... ok! Erasing sector 512000... ok! Erasing sector 516096... ok! Erasing sector 520192... ok! Erasing sector 524288... ok! Erasing sector 528384... ok! Erasing sector 532480... ok! Erasing sector 536576... ok! Erasing sector 540672... ok! Erasing sector 544768... ok! Erasing sector 548864... ok! Erasing sector 552960... ok! Erasing sector 557056... ok! Erasing sector 561152... ok! Erasing sector 565248... ok! Erasing sector 569344... ok! Erasing sector 573440... ok! Erasing sector 577536... ok! Erasing sector 581632... ok! Erasing sector 585728... ok! Erasing sector 589824... ok! Erasing sector 593920... ok! Erasing sector 598016... ok! Erasing sector 602112... ok! Erasing sector 606208... ok! Erasing sector 610304... ok! Erasing sector 614400... ok! Erasing sector 618496... ok! Erasing sector 622592... ok! Erasing sector 626688... ok! Erasing sector 630784... ok! Erasing sector 634880... ok! Erasing sector 638976... ok! Erasing sector 643072... ok! Erasing sector 647168... ok! Erasing sector 651264... ok! Erasing sector 655360... ok! Erasing sector 659456... ok! Erasing sector 663552... ok! Erasing sector 667648... ok! Erasing sector 671744... ok! Erasing sector 675840... ok! Erasing sector 679936... ok! Erasing sector 684032... ok! Erasing sector 688128... ok! Erasing sector 692224... ok! Erasing sector 696320... ok! Erasing sector 700416... ok! Erasing sector 704512... ok! Erasing sector 708608... ok! Erasing sector 712704... ok! Erasing sector 716800... ok! Erasing sector 720896... ok! Erasing sector 724992... ok! Erasing sector 729088... ok! Erasing sector 733184... ok! Erasing sector 737280... ok! Erasing sector 741376... ok! Erasing sector 745472... ok! Erasing sector 749568... ok! Erasing sector 753664... ok! Erasing sector 757760... ok! Erasing sector 761856... ok! Erasing sector 765952... ok! Erasing sector 770048... ok! Erasing sector 774144... ok! Erasing sector 778240... ok! Erasing sector 782336... ok! Erasing sector 786432... ok! Erasing sector 790528... ok! Erasing sector 794624... ok! Erasing sector 798720... ok! Erasing sector 802816... ok! Erasing sector 806912... ok! Erasing sector 811008... ok! Erasing sector 815104... ok! Erasing sector 819200... ok! Erasing sector 823296... ok! Erasing sector 827392... ok! Erasing sector 831488... ok! Erasing sector 835584... ok! Erasing sector 839680... ok! Erasing sector 843776... ok! Erasing sector 847872... ok! Erasing sector 851968... ok! Erasing sector 856064... ok! Erasing sector 860160... ok! Erasing sector 864256... ok! Erasing sector 868352... ok! Erasing sector 872448... ok! Erasing sector 876544... ok! Erasing sector 880640... ok! Erasing sector 884736... ok! Erasing sector 888832... ok! Erasing sector 892928... ok! Erasing sector 897024... ok! Erasing sector 901120... ok! Erasing sector 905216... ok! Erasing sector 909312... ok! Erasing sector 913408... ok! Erasing sector 917504... ok! Erasing sector 921600... ok! Erasing sector 925696... ok! Erasing sector 929792... ok! Erasing sector 933888... ok! Erasing sector 937984... ok! Erasing sector 942080... ok! Erasing sector 946176... ok! Erasing sector 950272... ok! Erasing sector 954368... ok! Erasing sector 958464... ok! Erasing sector 962560... ok! Erasing sector 966656... ok! Erasing sector 970752... ok! Erasing sector 974848... ok! Erasing sector 978944... ok! Erasing sector 983040... ok! Erasing sector 987136... ok! Erasing sector 991232... ok! Erasing sector 995328... ok! Erasing sector 999424... ok! Erasing sector 1003520... ok! Erasing sector 1007616... ok! Erasing sector 1011712... ok! Erasing sector 1015808... ok! Erasing sector 1019904... ok! Erasing sector 1024000... ok! Erasing sector 1028096... ok! Erasing sector 1032192... ok! Erasing sector 1036288... ok! Erasing sector 1040384... ok! Erasing sector 1044480... ok! Erasing sector 1048576... ok! Erasing sector 1052672... ok! Erasing sector 1056768... ok! Erasing sector 1060864... ok! Erasing sector 1064960... ok! Erasing sector 1069056... ok! Erasing sector 1073152... ok! Erasing sector 1077248... ok! Erasing sector 1081344... ok! Erasing sector 1085440... ok! Erasing sector 1089536... ok! Erasing sector 1093632... ok! Erasing sector 1097728... ok! Erasing sector 1101824... ok! Erasing sector 1105920... ok! Erasing sector 1110016... ok! Erasing sector 1114112... ok! Erasing sector 1118208... ok! Erasing sector 1122304... ok! Erasing sector 1126400... ok! Erasing sector 1130496... ok! Erasing sector 1134592... ok! Erasing sector 1138688... ok! Erasing sector 1142784... ok! Erasing sector 1146880... ok! Erasing sector 1150976... ok! Erasing sector 1155072... ok! Erasing sector 1159168... ok! Erasing sector 1163264... ok! Erasing sector 1167360... ok! Erasing sector 1171456... ok! Erasing sector 1175552... ok! Erasing sector 1179648... ok! Erasing sector 1183744... ok! Erasing sector 1187840... ok! Erasing sector 1191936... ok! Erasing sector 1196032... ok! Erasing sector 1200128... ok! Erasing sector 1204224... ok! Erasing sector 1208320... ok! Erasing sector 1212416... ok! Erasing sector 1216512... ok!
    All selected sectors erased!
    Writing sector 0x00... ok! Writing sector 0x1000... ok! Writing sector 0x2000... ok! Writing sector 0x3000... ok! Writing sector 0x4000... ok! Writing sector 0x5000... ok! Writing sector 0x6000... ok! Writing sector 0x7000... ok! Writing sector 0x8000... ok! Writing sector 0x9000... ok! Writing sector 0xA000... ok! Writing sector 0xB000... ok! Writing sector 0xC000... ok! Writing sector 0xD000... ok! Writing sector 0xE000... ok! Writing sector 0xF000... ok! Writing sector 0x10000... ok! Writing sector 0x11000... ok! Writing sector 0x12000... ok! Writing sector 0x13000... ok! Writing sector 0x14000... ok! Writing sector 0x15000... ok! Writing sector 0x16000... ok! Writing sector 0x17000... ok! Writing sector 0x18000... ok! Writing sector 0x19000... ok! Writing sector 0x1A000... ok! Writing sector 0x1B000... ok! Writing sector 0x1C000... ok! Writing sector 0x1D000... ok! Writing sector 0x1E000... ok! Writing sector 0x1F000... ok! Writing sector 0x20000... ok! Writing sector 0x21000... ok! Writing sector 0x22000... ok! Writing sector 0x23000... ok! Writing sector 0x24000... ok! Writing sector 0x25000... ok! Writing sector 0x26000... ok! Writing sector 0x27000... ok! Writing sector 0x28000... ok! Writing sector 0x29000... ok! Writing sector 0x2A000... ok! Writing sector 0x2B000... ok! Writing sector 0x2C000... ok! Writing sector 0x2D000... ok! Writing sector 0x2E000... ok! Writing sector 0x2F000... ok! Writing sector 0x30000... ok! Writing sector 0x31000... ok! Writing sector 0x32000... ok! Writing sector 0x33000... ok! Writing sector 0x34000... ok! Writing sector 0x35000... ok! Writing sector 0x36000... ok! Writing sector 0x37000... ok! Writing sector 0x38000... ok! Writing sector 0x39000... ok! Writing sector 0x3A000... ok! Writing sector 0x3B000... ok! Writing sector 0x3C000... ok! Writing sector 0x3D000... ok! Writing sector 0x3E000... ok! Writing sector 0x3F000... ok! Writing sector 0x40000... ok! Writing sector 0x41000... ok! Writing sector 0x42000... ok! Writing sector 0x43000... ok! Writing sector 0x44000... ok! Writing sector 0x45000... ok! Writing sector 0x46000... ok! Writing sector 0x47000... ok! Writing sector 0x48000... ok! Writing sector 0x49000... ok! Writing sector 0x4A000... ok! Writing sector 0x4B000... ok! Writing sector 0x4C000... ok! Writing sector 0x4D000... ok! Writing sector 0x4E000... ok! Writing sector 0x4F000... ok! Writing sector 0x50000... ok! Writing sector 0x51000... ok! Writing sector 0x52000... ok! Writing sector 0x53000... ok! Writing sector 0x54000... ok! Writing sector 0x55000... ok! Writing sector 0x56000... ok! Writing sector 0x57000... ok! Writing sector 0x58000... ok! Writing sector 0x59000... ok! Writing sector 0x5A000... ok! Writing sector 0x5B000... ok! Writing sector 0x5C000... ok! Writing sector 0x5D000... ok! Writing sector 0x5E000... ok! Writing sector 0x5F000... ok! Writing sector 0x60000... ok! Writing sector 0x61000... ok! Writing sector 0x62000... ok! Writing sector 0x63000... ok! Writing sector 0x64000... ok! Writing sector 0x65000... ok! Writing sector 0x66000... Attempt 0 writing sector 417792 failed!
    Retrying!
    Writing sector 0x66000... ok! Writing sector 0x67000... ok! Writing sector 0x68000... ok! Writing sector 0x69000... ok! Writing sector 0x6A000... ok! Writing sector 0x6B000... ok! Writing sector 0x6C000... ok! Writing sector 0x6D000... ok! Writing sector 0x6E000... ok! Writing sector 0x6F000... ok! Writing sector 0x70000... ok! Writing sector 0x71000... ok! Writing sector 0x72000... ok! Writing sector 0x73000... ok! Writing sector 0x74000... ok! Writing sector 0x75000... ok! Writing sector 0x76000... ok! Writing sector 0x77000... ok! Writing sector 0x78000... ok! Writing sector 0x79000... ok! Writing sector 0x7A000... ok! Writing sector 0x7B000... ok! Writing sector 0x7C000... ok! Writing sector 0x7D000... ok! Writing sector 0x7E000... ok! Writing sector 0x7F000... ok! Writing sector 0x80000... ok! Writing sector 0x81000... ok! Writing sector 0x82000... ok! Writing sector 0x83000... ok! Writing sector 0x84000... ok! Writing sector 0x85000... ok! Writing sector 0x86000... ok! Writing sector 0x87000... ok! Writing sector 0x88000... ok! Writing sector 0x89000... ok! Writing sector 0x8A000... ok! Writing sector 0x8B000... ok! Writing sector 0x8C000... ok! Writing sector 0x8D000... ok! Writing sector 0x8E000... ok! Writing sector 0x8F000... ok! Writing sector 0x90000... ok! Writing sector 0x91000... ok! Writing sector 0x92000... ok! Writing sector 0x93000... ok! Writing sector 0x94000... ok! Writing sector 0x95000... ok! Writing sector 0x96000... ok! Writing sector 0x97000... ok! Writing sector 0x98000... ok! Writing sector 0x99000... ok! Writing sector 0x9A000... ok! Writing sector 0x9B000... ok! Writing sector 0x9C000... ok! Writing sector 0x9D000... ok! Writing sector 0x9E000... ok! Writing sector 0x9F000... ok! Writing sector 0xA0000... ok! Writing sector 0xA1000... ok! Writing sector 0xA2000... ok! Writing sector 0xA3000... ok! Writing sector 0xA4000... ok! Writing sector 0xA5000... ok! Writing sector 0xA6000... ok! Writing sector 0xA7000... ok! Writing sector 0xA8000... ok! Writing sector 0xA9000... ok! Writing sector 0xAA000... ok! Writing sector 0xAB000... ok! Writing sector 0xAC000... ok! Writing sector 0xAD000... ok! Writing sector 0xAE000... ok! Writing sector 0xAF000... ok! Writing sector 0xB0000... ok! Writing sector 0xB1000... ok! Writing sector 0xB2000... ok! Writing sector 0xB3000... ok! Writing sector 0xB4000... ok! Writing sector 0xB5000... ok! Writing sector 0xB6000... ok! Writing sector 0xB7000... ok! Writing sector 0xB8000... ok! Writing sector 0xB9000... ok! Writing sector 0xBA000... ok! Writing sector 0xBB000... ok! Writing sector 0xBC000... ok! Writing sector 0xBD000... ok! Writing sector 0xBE000... ok! Writing sector 0xBF000... ok! Writing sector 0xC0000... ok! Writing sector 0xC1000... ok! Writing sector 0xC2000... ok! Writing sector 0xC3000... ok! Writing sector 0xC4000... ok! Writing sector 0xC5000... ok! Writing sector 0xC6000... ok! Writing sector 0xC7000... ok! Writing sector 0xC8000... ok! Writing sector 0xC9000... ok! Writing sector 0xCA000... ok! Writing sector 0xCB000... ok! Writing sector 0xCC000... ok! Writing sector 0xCD000... ok! Writing sector 0xCE000... ok! Writing sector 0xCF000... ok! Writing sector 0xD0000... ok! Writing sector 0xD1000... ok! Writing sector 0xD2000... ok! Writing sector 0xD3000... ok! Writing sector 0xD4000... ok! Writing sector 0xD5000... ok! Writing sector 0xD6000... ok! Writing sector 0xD7000... ok! Writing sector 0xD8000... ok! Writing sector 0xD9000... ok! Writing sector 0xDA000... ok! Writing sector 0xDB000... ok! Writing sector 0xDC000... ok! Writing sector 0xDD000... ok! Writing sector 0xDE000... ok! Writing sector 0xDF000... ok! Writing sector 0xE0000... ok! Writing sector 0xE1000... ok! Writing sector 0xE2000... ok! Writing sector 0xE3000... ok! Writing sector 0xE4000... ok! Writing sector 0xE5000... ok! Writing sector 0xE6000... ok! Writing sector 0xE7000... ok! Writing sector 0xE8000... ok! Writing sector 0xE9000... ok! Writing sector 0xEA000... ok! Writing sector 0xEB000... ok! Writing sector 0xEC000... ok! Writing sector 0xED000... ok! Writing sector 0xEE000... ok! Writing sector 0xEF000... ok! Writing sector 0xF0000... ok! Writing sector 0xF1000... ok! Writing sector 0xF2000... ok! Writing sector 0xF3000... ok! Writing sector 0xF4000... ok! Writing sector 0xF5000... ok! Writing sector 0xF6000... ok! Writing sector 0xF7000... ok! Writing sector 0xF8000... ok! Writing sector 0xF9000... ok! Writing sector 0xFA000... ok! Writing sector 0xFB000... ok! Writing sector 0xFC000... ok! Writing sector 0xFD000... ok! Writing sector 0xFE000... ok! Writing sector 0xFF000... ok! Writing sector 0x100000... ok! Writing sector 0x101000... ok! Writing sector 0x102000... ok! Writing sector 0x103000... ok! Writing sector 0x104000... ok! Writing sector 0x105000... ok! Writing sector 0x106000... ok! Writing sector 0x107000... ok! Writing sector 0x108000... ok! Writing sector 0x109000... ok! Writing sector 0x10A000... ok! Writing sector 0x10B000... ok! Writing sector 0x10C000... ok! Writing sector 0x10D000... ok! Writing sector 0x10E000... ok! Writing sector 0x10F000... ok! Writing sector 0x110000... ok! Writing sector 0x111000... ok! Writing sector 0x112000... ok! Writing sector 0x113000... ok! Writing sector 0x114000... ok! Writing sector 0x115000... ok! Writing sector 0x116000... ok! Writing sector 0x117000... ok! Writing sector 0x118000... ok! Writing sector 0x119000... ok! Writing sector 0x11A000... ok! Writing sector 0x11B000... ok! Writing sector 0x11C000... ok! Writing sector 0x11D000... ok! Writing sector 0x11E000... ok! Writing sector 0x11F000... ok! Writing sector 0x120000... ok! Writing sector 0x121000... ok! Writing sector 0x122000... ok! Writing sector 0x123000... ok! Writing sector 0x124000... ok! Writing sector 0x125000... ok! Writing sector 0x126000... ok! Writing sector 0x127000... ok! Writing sector 0x128000... ok! Writing sector 0x129000... ok! Starting CRC check for 298 sectors, starting at offset 0x00
    CRC matches 0xFF2DF427!

    Sending 'backlog stopDriver UartTCP; startDriver UartTCP 115200 8192'...Toggling CEN to start firmware...
    Sending 'setChannel 0 0'...Sending 'setChannel 0 1'...Done.


    client BK7231N boots to AP

    Added after 3 [minutes]:

    now with a booting client with bootloader in tact I will try again to see how long it takes CEN to catch

    Added after 1 [minutes]:


    Windows console showing communication logs with BK7231N device via UART
  • #5 21720513
    p.kaczmarek2
    Moderator Smart Home
    Hehe, I didn't think it will actually work that good. Maybe it can be useable. Have you tried higher baud rates?

    Once I port this approach to Easy Flasher, we should be able to flash all Easy-supported platforms this way.

    I can also see that retry mechanism was useful:
    
    Writing sector 0x66000... Attempt 0 writing sector 417792 failed!
    Retrying!
    Writing sector 0x66000... ok! Writing sector 0x67000... ok!
    

    I am curious to see if it would also work on BK7231T? My short UART-only testing shown that T may behave differently and might deny the repeated attempts.
    Helpful post? Buy me a coffee.
  • ADVERTISEMENT
  • #6 21720541
    divadiow
    Level 36  
    interesting
    Code: Text
    Log in, to see the code
    Windows console showing firmware flashing with some write sector errors

    not sure final cen is working - I can see LEDs flashing on ESP adaptor and I think it's boot looping, but I had to hit RST button for this to start. Anyway, no boot on that attempt, which is first at 921600

    Added after 11 [minutes]:

    Code: Text
    Log in, to see the code


    attempting now

    Added after 3 [minutes]:

    Command prompt window showing errors during Wi-Fi device firmware flashing
  • #7 21720566
    p.kaczmarek2
    Moderator Smart Home
    I can see a problem.
    This:
    
    11000 
    

    Is a decimal number, not hexadecimal. You need to put it like:
    
    0x11000 
    

    You're lucky that I added this protection. You'd overwrite bootloader at 11000 decimal, which is 0x2AF8 hex.
    Helpful post? Buy me a coffee.
  • #8 21720574
    divadiow
    Level 36  
    lol ok. can always SPI fix.

    Code: Text
    Log in, to see the code
    Windows console with bootloader overwrite errors and flash communication messages.
  • #9 21720589
    p.kaczmarek2
    Moderator Smart Home
    Oh I see, I didn't test it with T, and the offset is unncessary divided by sector size. I pushed a fix, I will also fix online build if it's still broken.
    https://github.com/openshwprojects/WiFiFlasher
    My testing on N didn't catch it because 0 divided by 4096 is still 0.
    Helpful post? Buy me a coffee.
  • ADVERTISEMENT
  • #11 21720644
    p.kaczmarek2
    Moderator Smart Home
    I don't remember T platform much, but as far as I know, the unprotect step (switch -u) is not supported there. That's how Easy Flasher does it as well.
    Helpful post? Buy me a coffee.
📢 Listen (AI):

Topic summary

The discussion presents a novel approach to programming IoT devices like the BK7231 series wirelessly via Wi-Fi using a custom UART programmer. Traditionally, programming involved a USB-to-UART converter (e.g., CH340) connected physically to the device, with manual boot mode or reset pin manipulation. The new method employs a second Wi-Fi module running a UartTCP driver that bridges UART traffic over a TCP socket, enabling wireless flashing without hardware changes. Users tested this with BK7231N and BK7231T modules, using commands such as "wifiprogram" to write firmware images over the network. Challenges included correct address offset formatting (hexadecimal vs decimal), bootloader protection, and retry mechanisms for flash writes. Higher baud rates (up to 9,216,000) were experimented with, though stability issues like boot looping on the ESP adapter were noted. The approach is planned to be integrated into Easy Flasher to support multiple platforms. The project source is hosted on GitHub under openshwprojects/WiFiFlasher.
Summary generated by the language model.
ADVERTISEMENT