VCU118 Rocket SoC Flash Boot Akışı

Workspace: /home/ankaoc/Desktop/rocket/rocket-chip - Kart: Xilinx VCU118, xcvu9p-flga2104-2L-e - Tarih: 1 Temmuz 2026

Son durum: Rocket SoC VCU118 üzerinde çalışıyor. Bootloader BootROM'dan başlıyor, kart üzerindeki QSPI flash'ı SPI üzerinden okuyor, APP_FLASH_OFFSET adresindeki uygulama imajını DTIM'e kopyalıyor, CRC kontrolünden sonra uygulamaya atlıyor. Hello UART uygulaması kart üzerinde doğrulandı.

Ne Yapıldı?

Klasör Yapısı

Donanım tarafı tek hardware/ ağacında toplanır. soc/ artık yazılım ve flash imaj üretimi içindir; target dizinleri ise akış giriş noktalarını ve scriptleri tutar.

hardware/
  upstream/rocket-chip/
    src/
    bootrom/
    scala
    resources
  soc/
    Makefile
    scala/fpga/VCU118Peripherals.scala
  generated/
    vcu118-soc/
    vcu118-soc-verilog/
    asic-rocket-soc/
    asic-rocket-soc-verilog/
    asic-rocket-soc-sim-verilog/
  fpga/vcu118/
    rtl/
      Makefile
      axi4_ram_64.sv
      axi4_slave_tieoff_64.sv
      rocket_bscan_dmi_tunnel.sv
    constraints/
      vcu118_rocket.xdc
  sim/
    fpga/vcu118/Makefile
    asic/rocket/
      wave.do
      tb/
  external/gps/rtl/
    filelist.f

soc/
  Makefile
  software/
    Makefile
    bsp/
    bootloader/
    common/
    hello_uart/
    tools/make_flash_image.py
  out/
    software/
    flash/

targets/fpga/vcu118/
  Makefile
  docs/
    vcu118_rocket_flash_boot_guide.html
  flow/vivado/
    Makefile
    scripts/
      build.tcl
      program_flash.tcl
      program_fpga.tcl
      write_flash.tcl
      write_flash_regions.tcl
  tools/
    gen_vcu118_wrapper.py
  out/
    bitstream/
    build/
    flash/
    logs/
    reports/
Dizin İçerik
hardware/soc Ortak Scala/Chisel SoC generator kaynakları ve FIRRTL/RTL üretim Makefile'ı.
hardware/fpga/vcu118/rtl FPGA shell yardımcı RTL kaynakları.
hardware/fpga/vcu118/constraints VCU118 XDC constraint dosyaları.
soc/software Bare-metal BSP, bootloader, linker scriptleri ve uygulama kaynakları.
soc/software/tools ELF dosyasını bootloader flash imajına çeviren ortak yardımcı araçlar.
targets/fpga/vcu118/tools VCU118 top wrapper generator.
targets/fpga/vcu118/flow/vivado/scripts Vivado non-project build, flash image ve programlama Tcl scriptleri.
targets/fpga/vcu118/out Bitstream, generated wrapper, MCS/BIN, Vivado logları ve raporlar.

Makefile Ağacı

Her katmanın kendi Makefile'ı var. soc/Makefile ortak SoC/software hedeflerini, targets/fpga/vcu118/Makefile FPGA hedeflerini, targets/asic/rocket/Makefile ASIC sim/shell hedeflerini yönetir.

Makefile Tipik hedefler
soc/Makefile software, chisel, fpga-rtl, asic-rtl, clean
hardware/soc/Makefile firrtl, rtl, fpga-rtl, asic-rtl, clean
soc/software/Makefile all, app, bootloader, hello, flash-image, clean
hardware/fpga/vcu118/rtl/Makefile shell, generated, clean
targets/fpga/vcu118/flow/vivado/Makefile bitstream, program, flash-app, flash-bitstream, flash-combined
hardware/sim/fpga/vcu118/Makefile smoke, clean. Full Verilator harness henüz eklenmedi.

Kavramlar: Scala, Chisel, Rocket, Mill, FIRRTL ve firtool

Kavram Bu projedeki anlamı
Scala JVM üzerinde çalışan programlama dili. Rocket Chip ve Chisel tabanlı SoC generator kodu Scala ile yazılıyor. Burada Scala kodu doğrudan RTL değildir; RTL üreten generator kodudur.
Chisel Scala içine gömülü hardware construction language. Register, wire, module, bus bağlantısı gibi donanım yapıları Scala kodu ile tarif edilir. Chisel çıktısı önce FIRRTL ara temsiline gider.
Rocket Chip Chisel ile yazılmış parametrik RISC-V SoC generator. Rocket core, TileLink bus yapısı, BootROM, debug, interrupt ve memory/peripheral bağlantı altyapısını sağlar.
Mill Scala/JVM build tool. Bu repoda Rocket Chip Scala kodunu derleyip çalıştırılabilir assembly jar üretmek için kullanılıyor.
FIRRTL Chisel'den çıkan ara devre temsili. FPGA/ASIC backend'e gitmeden önce donanım bu IR ile ifade edilir.
firtool CIRCT tabanlı FIRRTL compiler. Bu akışta VCU118RocketSystem.fir dosyasını synthesizable SystemVerilog dosyalarına çevirir.

Kısaca zincir şöyledir:

Scala/Chisel Rocket config
  -> mill ile assembly jar
  -> Rocket generator çalışır
  -> VCU118RocketSystem.fir
  -> firtool
  -> split SystemVerilog RTL
  -> VCU118 wrapper + shell RTL + XDC
  -> Vivado synth/place/route
  -> vcu118_rocket.bit

RTL Nasıl Generate Ediliyor?

RTL üretimi make -C targets/fpga/vcu118 rtl hedefiyle başlıyor. Ana adımlar:

  1. make -C soc/software/hello_uart ile hello ELF build edilir.
  2. make -C soc/software/bootloader ile flash bootloader build edilir ve BootROM imajı üretilir.
  3. mill -i 'rocketchip[6.7.0].assembly' Rocket Chip Scala/Chisel kodunu assembly jar haline getirir.
  4. java -jar out/rocketchip/6.7.0/assembly.dest/out.jar komutu Rocket generator'ı çalıştırır.
  5. Generator top olarak freechips.rocketchip.fpga.VCU118RocketSystem, config olarak freechips.rocketchip.fpga.VCU118RocketConfig kullanır.
  6. Çıktı olarak hardware/generated/vcu118-soc/VCU118RocketSystem.fir oluşur.
  7. firtool bu FIRRTL dosyasını hardware/generated/vcu118-soc-verilog/ altında SystemVerilog dosyalarına böler.
  8. filelist.f oluşturulur ve generated assert satırları FPGA sentezini sadeleştirmek için temizlenir.
  9. gen_vcu118_wrapper.py generated top portlarını okuyup targets/fpga/vcu118/out/build/generated/vcu118_rocket_top.sv wrapper'ını üretir.

Bu zinciri çalıştıran ana komutlar:

make -C targets/fpga/vcu118 soc        # Chisel/FIRRTL/SystemVerilog üretir
make -C targets/fpga/vcu118 bitstream  # soc + Vivado non-project FPGA build

Bizim Rocket Config Neyi Oluşturuyor?

VCU118'e özel SoC tanımı hardware/soc/scala/fpga/VCU118Peripherals.scala içinde. Ana sınıflar:

Sınıf / Config Rolü
VCU118RocketSystem Rocket subsystem üzerine BootROM, UART, SPI, GPS APB blokları ve top-level IO bridge bağlantılarını ekleyen SoC top generator.
VCU118RocketSystemModuleImp Generated top-level portları oluşturur: uart_rxd, uart_txd, spi_sck, spi_csn, spi_dq_i/o/oe, gps_rf_clk, gps_rf_data.
VCU118RocketConfig SoC konfigürasyon zinciri. BootROM, debug SBA, harici memory portlarının kapatılması, hard double FPU, 1 MiB DTIM, UART, SPI, GPS APB blokları ve tek küçük Rocket core burada seçilir.
WithVCU118OneMiBDTIM Harici AXI RAM yerine Rocket D-cache scratchpad/DTIM kullanır. Varsayılan adres 0x80000000, boyut 1 MiB.
WithVCU118FlashBootROM BootROM içeriğini soc/out/software/bootloader/bootloader.img dosyasından alır.
WithVCU118UART UART peripheral'ı 0x10013000 adresine ekler. Clock 100 MHz, baud 115200.
WithVCU118SPI SPI flash controller'ı 0x10014000 adresine ekler.
WithVCU118GPS 1 acquisition ve 9 tracking APB wrapper'ını 0x10020000 tabanından başlayarak 4 KiB pencereler halinde ekler.

VCU118RocketConfig özeti:

new WithVCU118FlashBootROM ++
new WithDebugSBA ++
new WithoutTLMonitors ++
new WithNoMemPort ++
new WithNoMMIOPort ++
new WithNoSlavePort ++
new WithNMemoryChannels(0) ++
new WithNBanks(0) ++
new WithVCU118OneMiBDTIM ++
new WithVCU118UART(0x10013000L, 100000000, 115200) ++
new WithVCU118SPI(0x10014000L) ++
new WithVCU118GPS(0x10020000L, 9) ++
new WithNExtTopInterrupts(0) ++
new WithNSmallCores(1) ++
new WithIncoherentBusTopology ++
new BaseConfig

Peripheral'leri Nasıl Ekledik?

UART

TLFpgaUART, Rocket'ın peripheral bus'ına bağlı bir TLRegisterNode olarak yazıldı. Register map:

Offset Register Görev
0x00txdataBir byte yaz, UART TX başlasın.
0x04rxdataAlınan byte oku.
0x08txreadyTX yeni byte kabul edebilir mi?
0x0crxvalidRX byte hazır mı?
0x10clockfreqUART clock frekansı.
0x14baudrateUART baud değeri.

UART pinleri doğrudan TileLink içinde kalmıyor; BundleBridgeSource/Sink ile top-level IO'ya çıkarılıyor. Wrapper bu portları VCU118 RS232 UART pinlerine bağlıyor.

SPI Flash Controller

TLFpgaSPI da peripheral bus üzerinde TLRegisterNode. Register map:

Offset Register Görev
0x00ctrlbusy, csn, quad kontrol/status bitleri.
0x04txTransfer başlatır.
0x08rxSon alınan shift register değeri.
0x0creadyController hazır mı?

SPI controller serial ve quad mod için sck, csn, dq_i, dq_o, dq_oe sinyalleri üretir. Bu sinyaller top-level porta çıkarılır ve wrapper içinde STARTUPE3 ile FPGA config flash pinlerine bağlanır.

GPS APB IP'leri ve AFE Yardımcı Bloğu

GPS entegrasyonu /home/ankaoc/Desktop/anka-rocket/gps_system altındaki SystemVerilog wrapper'ları kullanır. SoC içinde bir adet acq_wrapper, dokuz adet tracking_wrapper ve APB peripheral olmayan bir afe_top instance edilir.

APBGpsBlock TileLink peripheral bus'tan TLToAPB ile APB'ye geçer. Acquisition ve tracking blokları APB register penceresi olarak görünür; afe_top sadece yardımcı logic olduğu için address map'e girmez.

GPS APB baz adresi 0x10020000. Her IP'ye 0x1000 byte pencere ayrılır. Tracking adres formülü: 0x10020000 + (tracking_index + 1) * 0x1000.

Blok GPS base'e göre offset Absolute base Adres aralığı Interrupt
gps-acq0x000000x100200000x10020000..0x10020fffPLIC source 1
gps-tracking00x010000x100210000x10021000..0x10021fffPLIC source 2
gps-tracking10x020000x100220000x10022000..0x10022fffPLIC source 3
gps-tracking20x030000x100230000x10023000..0x10023fffPLIC source 4
gps-tracking30x040000x100240000x10024000..0x10024fffPLIC source 5
gps-tracking40x050000x100250000x10025000..0x10025fffPLIC source 6
gps-tracking50x060000x100260000x10026000..0x10026fffPLIC source 7
gps-tracking60x070000x100270000x10027000..0x10027fffPLIC source 8
gps-tracking70x080000x100280000x10028000..0x10028fffPLIC source 9
gps-tracking80x090000x100290000x10029000..0x10029fffPLIC source 10

Scala/Chisel ile SoC'ye Nasıl Ekleniyor?

FpgaGPSParams base address, tracking sayısı ve pencere boyunu taşır. WithVCU118GPS(0x10020000L, 9) config fragment'i bu parametreyi aktif eder. VCU118RocketSystem içinde p(VCU118GPSKey) okunur, APBGpsBlock yaratılır ve PBUS üzerinden APB'ye bağlanır.

val pbus = locateTLBusWrapper(PBUS)
val domain = pbus.generateSynchronousDomain("FPGAGPS")
val dev = domain { LazyModule(new APBGpsBlock(params, pbus.beatBytes)) }

domain {
  dev.node := TLToAPB() := pbus.coupleTo("gps") {
    TLFragmenter(pbus, Some("FPGAGPS")) := _
  }
  ibus.fromSync := dev.intnode
}

APB wrapper'ların lokal adres genişliği pencere boyundan gelir. Varsayılan 4 KiB pencere için PADDR 12 bittir; üst adres bitleri boşa taşınmaz.

Clock, RF IO ve AFE Bağlantısı

FPGA wrapper 100 MHz fabric clock, 100 MHz acquisition clock ve 125 MHz tracking clock üretir. RF clock üretilmez; gps_rf_clk dış IO olarak gelir ve 16.368 MHz olarak constrain edilir. RF sample datası da gps_rf_data[3:0] dış IO'dur.

afe_top.start_i acquisition wrapper'ın afe_start çıkışından, sample_counter_clear_i ise sample_counter_clear çıkışından sürülür. afe_top.sample_align_o acquisition ve bütün tracking wrapper'lara, afe_top.sample_counter_o ise bütün tracking wrapper'lara bağlanır.

ASIC sim top'unda RF clock yine PLL modelinden çıkmaz; testbench gps_rf_clk girişini 16.368 MHz dış kaynak gibi sürer.

BootROM ve Bootloader

BootROM imajı soc/out/software/bootloader/bootloader.img. Bootloader şunları yapar:

  1. UART üzerinden durum mesajı basar.
  2. SPI flash reset ve JEDEC ID okuma komutlarını gönderir.
  3. APP_FLASH_OFFSET adresinden 64 byte header okur.
  4. Header'daki load address, entry, size ve CRC alanlarını doğrular.
  5. Payload'u flash'tan DTIM'e kopyalar.
  6. CRC doğruysa entry adresine jump eder.

FPGA İçin Eklenen Wrapper ve Shell Modülleri

Generated Rocket RTL doğrudan VCU118 kartına uygun değildir. Bu yüzden gen_vcu118_wrapper.py bir shell top üretir:

STARTUPE3 bağlantısının amacı: VCU118 üzerindeki config QSPI flash pinleri normal user IO gibi dışarı çıkmaz. UltraScale+ cihazda user design bu flash'a STARTUPE3 üzerinden erişir. Bizim wrapper'da bağlantı şu mantıkla yapılıyor:

assign spi_dq_i = cfg_flash_dq_i;

STARTUPE3 u_cfg_flash_startup (
  .DI(cfg_flash_dq_i),
  .DO(spi_dq_o),
  .DTS(~spi_dq_oe),
  .FCSBO(spi_csn),
  .FCSBTS(1'b0),
  .USRCCLKO(spi_sck),
  .USRCCLKTS(1'b0),
  ...
);

Vivado FPGA Flow Scriptleri Nasıl Çalışıyor?

Vivado tarafı non-project mode. Ana script targets/fpga/vcu118/flow/vivado/scripts/build.tcl:

  1. Part: xcvu9p-flga2104-2L-e.
  2. Board part: xilinx.com:vcu118:part0:2.4.
  3. hardware/generated/vcu118-soc-verilog/filelist.f içindeki Rocket SystemVerilog dosyalarını okur.
  4. hardware/upstream/rocket-chip/src/main/resources/vsrc/plusarg_reader.v ve GPS APB/native RTL kaynaklarını okur.
  5. hardware/fpga/vcu118/rtl/*.sv içindeki FPGA shell yardımcı RTL dosyalarını okur.
  6. targets/fpga/vcu118/out/build/generated/vcu118_rocket_top.sv wrapper'ını okur.
  7. hardware/fpga/vcu118/constraints/vcu118_rocket.xdc constraint dosyasını okur.
  8. synth_design, opt_design, place_design, phys_opt_design, route_design çalıştırır.
  9. Timing, utilization, DRC ve power raporları üretir.
  10. targets/fpga/vcu118/out/bitstream/vcu118_rocket.bit dosyasını yazar.

Kaynaklar

Önemli Dosyalar

Dosya Görev
hardware/soc/scala/fpga/VCU118Peripherals.scala VCU118 Rocket config, UART, SPI flash controller, GPS APB blokları, AFE bağlantısı ve BootROM ayarları.
/home/ankaoc/Desktop/anka-rocket/gps_system/ Acquisition, tracking, common AFE helper ve APB wrapper SystemVerilog kaynakları.
targets/fpga/vcu118/tools/gen_vcu118_wrapper.py Generated Rocket top modülünü VCU118 wrapper'a bağlar; SPI flash için STARTUPE3 ekler.
targets/fpga/vcu118/flow/vivado/scripts/build.tcl Vivado non-project sentez, place, route ve bitstream üretim akışı.
targets/fpga/vcu118/Makefile Tek giriş noktası; software, RTL, bitstream, flash image ve programlama hedeflerini yönetir.
soc/software/tools/make_flash_image.py ELF dosyasını bootloader'ın okuyacağı header + payload flash imajına çevirir.
targets/fpga/vcu118/flow/vivado/scripts/write_flash_regions.tcl Bitstream ve app için ayrı MCS üretir; aradaki boşluğu MCS'e koymaz.
targets/fpga/vcu118/flow/vivado/scripts/program_flash.tcl Vivado hw_server üzerinden seçilen MCS region dosyalarını flash'a yazar.
soc/software/bootloader/ BootROM'a gömülen SPI flash bootloader kaynakları.
soc/software/hello_uart/ DTIM'e yüklenip çalışan bare-metal hello UART uygulaması.

Flash Bellek Yerleşimi

Bölge Varsayılan Offset İçerik Nasıl Değiştirilir?
Bitstream 0x00000000 FPGA konfigürasyon bitstream'i. BITSTREAM_OFFSET=0x...
Application / ELF image 0x06000000 Bootloader header + ELF payload. APP_FLASH_OFFSET=0x...

Son doğrulanan app image bilgisi:

flash_offset:         0x06000000
payload_flash_offset: 0x06000040
load_addr:            0x80000000
entry:                0x80000000
payload size:         425 bytes
crc32:                0xf5aa3b60

Normal Geliştirme Akışı

1. SoC ve bitstream üret

cd /home/ankaoc/Desktop/rocket/rocket-chip
make -C targets/fpga/vcu118 bitstream

Bu hedef software'i de build eder, Rocket Verilog üretir, wrapper oluşturur ve Vivado non-project flow ile targets/fpga/vcu118/out/bitstream/vcu118_rocket.bit dosyasını üretir.

2. Bitstream'i flash'a bir kere yaz

make -C targets/fpga/vcu118 program-flash-bitstream

Bu işlem uzun sürer. Sadece bitstream region MCS'i üretir ve BITSTREAM_OFFSET adresine yazar. App offset'e kadar olan boşluğu programlamaz.

3. ELF / uygulama değiştikçe sadece app region yaz

make -C targets/fpga/vcu118 program-flash

Bu hızlı yoldur. APP_ELF dosyasından flash image üretir, APP_FLASH_OFFSET adresine küçük app MCS'i yazar. Bitstream'e dokunmaz.

4. FPGA'yı JTAG üzerinden SRAM'e programlayıp hızlı test et

make -C targets/fpga/vcu118 program-fpga

Bu komut flash'taki bitstream'i kullanmaz; direkt .bit dosyasını FPGA SRAM'e yükler. Bootloader yine kart üzerindeki SPI flash'tan uygulamayı okur. Geliştirme sırasında en hızlı test yöntemi budur.

5. Power-cycle sonrası flash'tan kalkış

Bitstream region bir kere doğru yazıldıktan sonra kart power-cycle veya program/reset sonrası flash'taki bitstream'den konfigüre olabilir. Ardından BootROM bootloader çalışır ve app region'daki imajı okur.

Komut Referansı

Komut Açıklama
make -C targets/fpga/vcu118 software Bootloader, hello app ve app flash image üretir.
make -C targets/fpga/vcu118 soc Rocket Verilog ve VCU118 wrapper üretir.
make -C targets/fpga/vcu118 bitstream Vivado non-project flow ile bitstream üretir.
make -C targets/fpga/vcu118 flash-regions Seçilen region'lar için ayrı MCS üretir. Varsayılan auto/all davranışı için FLASH_REGIONS kullanılır.
make -C targets/fpga/vcu118 program-flash-bitstream Sadece bitstream region'ını flash'a yazar.
make -C targets/fpga/vcu118 program-flash Sadece ELF/app image region'ını flash'a yazar. Günlük uygulama geliştirme için ana komut budur.
make -C targets/fpga/vcu118 program-flash-elf program-flash ile aynı alias.
make -C targets/fpga/vcu118 program-flash-all Bitstream ve app'i iki ayrı region MCS ile yazar; aradaki gap'i yazmaz.
make -C targets/fpga/vcu118 program-flash-combined Eski tek MCS yolu. Bitstream + app tek MCS/BIN içinde üretilir ve programlanır.
make -C targets/fpga/vcu118 program-fpga Bitstream'i JTAG ile FPGA SRAM'e yükler.
make -C targets/fpga/vcu118 prune Büyük geçici çıktıları siler; mevcut bitstream, app image ve küçük region MCS dosyalarını korur.
make -C targets/asic/rocket sim Questa/ModelSim batch sanity sim çalıştırır. Varsayılan app hello_uart.
make -C targets/asic/rocket sim GUI=1 Questa/ModelSim graphical simulator açar; -voptargs="+acc" ile sinyal erişimini açar, onfinish stop ayarlar, hardware/sim/asic/rocket/wave.do dosyasını yükler ve run 0ns yaparak GUI'yi debug için hazır bırakır.

Ayarlanabilir Değişkenler

Değişken Varsayılan Açıklama
BITSTREAM_OFFSET 0x00000000 Bitstream flash başlangıç adresi.
APP_FLASH_OFFSET 0x06000000 Bootloader'ın app header beklediği flash adresi.
APP_ELF soc/out/software/hello_uart/hello_uart.elf Flash'a konacak bare-metal ELF.
BIT_FILE targets/fpga/vcu118/out/bitstream/vcu118_rocket.bit FPGA bitstream dosyası.
FLASH_VERIFY 0 Vivado flash verify aç/kapat. Uzun sürdüğü için kapalı.
CFGMEM_PART mt25qu01g-spi-x1_x2_x4 VCU118 üzerindeki MT25QU01G flash için Vivado programlama parçası.
FLASH_REGIONS auto app, bitstream, all veya virgüllü liste.

Örnek: farklı app offset ile yazmak

APP_FLASH_OFFSET=0x06400000 make -C targets/fpga/vcu118 program-flash

Bootloader build edilirken de aynı APP_FLASH_OFFSET değeri kullanılır. Flow bunu software build'e geçirir; offset değiştiğinde bootloader içeriği de yeniden oluşur. Bootloader BootROM'a gömülü olduğu için offset değişikliği tam SoC/bitstream rebuild gerektirebilir.

Örnek: farklı ELF yazmak

APP_ELF=/path/to/my_app.elf make -C targets/fpga/vcu118 program-flash

Örnek: Questa GUI sim açmak

make -C targets/asic/rocket sim GUI=1

Bu komut compile/DPI hazırlığını yapar, asic_rocket_tb testbench'ini -voptargs="+acc" ile GUI'de yükler, onfinish stop kurar, hardware/sim/asic/rocket/wave.do dosyasını çalıştırır ve otomatik olarak sadece run 0ns çalıştırır. Devam etmek için Questa transcript'te elle run -all veya istediğin süre kadar run 1 us yazabilirsin.

Test Sonucu

1 Temmuz 2026 tarihinde yapılan kart testinde şu adımlar çalıştırıldı:

make -C targets/fpga/vcu118 program-flash
make -C targets/fpga/vcu118 program-fpga

UART cihazı: /dev/ttyUSB2, baud: 115200.

Alınan UART çıktısı:

VCU118 Rocket flash bootloader
Header offset: 0x06000000
Flash JEDEC ID: 0x0020bb21
Load: flash 0x06000040 -> mem 0x80000000, size 0x000001a9
CRC ok, jumping 0x80000000

Rocket Chip VCU118 hello UART
DTIM: 0x80000000..0x800fffff (1 MiB)
UART clock Hz: 0x047868c0
UART baud: 0x0001c200

Doğrulama: Bootloader flash JEDEC ID'yi doğru okudu, app header'ını 0x06000000 adresinden buldu, payload'u 0x80000000 DTIM adresine kopyaladı, CRC kontrolü geçti ve hello UART uygulaması çalıştı.

Notlar ve Riskler