Files
2026-08-04 15:52:36 +03:00

93 KiB
Raw Permalink Blame History

GPS System Port Notes

Bu notlar GPS bare-metal yaziliminin VCU118/Genesys2 Rocket SoC portunu, tracking Doppler/C/N0 yolunu, ESKF entegrasyonunu ve interrupt debug surecini belgeler.

Uygulama akisi ve dosya sinirlari

Firmware giris noktasi gps_system.c'dir. main() surucu veya ESKF matematigi icermez; fakat sistemlerin nasil baglandigini acikca gosterir. ESKF enable/disable, GPS WLS sonucu, timestamp'li IMU girdisi, GPS'in fusion olcumune donusumu ve ham/duzeltilmis lat-lon bu dosyada gorunur. Main'in GPS/IMU/fusion arasinda tasidigi mesajlar ve yasam-dongusu bayraklari header/gps_system.h icindeki gps_system_state_t tipindedir; uygulama veri tipleri giris noktasi C dosyasinda tekrar tanimlanmaz.

gps_system.c
    -> initialize GPS, IMU and optional ESKF
    -> wfi
    -> timestamped IMU queue -> navigation_fusion prediction
    -> 20 ms tracking mailbox -> C/N0 + Doppler/range-rate
    -> GPS events -> coherent position/velocity WLS -> gps_nav_solution_t
    -> valid GPS position + Doppler velocity -> fusion_gps_measurement_t
    -> same-epoch navigation_fusion position/velocity update
    -> navigation_fusion_output_t -> corrected lat/lon publish

Doppler WLS'nin ECEF velocity, covariance, speed ve residual sonucu fusion_gps_measurement_t icine aktarilir. GPS adapter velocity ile covariance'i ECEF'ten ENU'ya dondurur; position ve velocity ayni capture epoch'unda ESKF'ye uygulanir, sonra daha yeni IMU history replay edilir. Position ve velocity'nin ayri NIS kapilari/sayaclari vardir; bir velocity outlier'i ayni epoch'taki gecerli position update'ini geri almaz.

Kaynak ve public header agaci ayni modul sinirlarini izler:

header/ + src/
  gps/          acquisition, tracking, nav epoch, WLS ve GPS interrupt state
  imu/          sensor secimi, kalibrasyon ve ortak imu_sample_t yonetimi
  drivers/imu/  yalniz cihaza ozel SPI/register/INT1 kodu
  fusion/       ESKF, motion/ZUPT, NIS ve delayed-measurement replay
  adapters/     GPS->fusion ve sensor-profile->fusion donusumleri

UART konum/status formatlamasi adapters/gps_system_uart icindedir; bu sayede gps_system.c telemetry format string'leriyle sismez. Buna karsilik GPS WLS sonucunun fusion olcumune cevrilip ESKF'ye teslim edilmesi bilincli olarak main() icinde gorunur kalir.

GPS kaynaklari IMU veya ESKF header'i include etmez; IMU suruculeri de GPS/fusion header'i include etmez. Ortak trap/PLIC dispatcher harici bir IRQ numarasi ile callback kabul eder. BSP_PMOD_IRQ -> imu_sensor_irq_handler baglantisini GPS icinde hard-code etmek yerine main, GPS init'inden sonra ve IMU start'indan once kaydeder. GPS ve IMU girdileri yalniz gps_system.c uzerinden navigation_fusion API'sine verilir; tip donusumleri adapters/ sinirinda kalir.

ESKF'nin public girisi fusion/navigation_fusion.h, sensor yonetiminin public girisi imu/imu_sensor.h, GPS alicisinin public girisi gps/gps_receiver.hdir. Yeni sensor eklemek icin yeni bir drivers/imu backend'i ve sensor profil adapter'i eklenir; GPS veya ESKF cekirdegi degistirilmez.

ISR icinde WLS veya ESKF calismaz. IMU ISR'i ornegi olcum aninda timestamp'ler ve raw kuyruga koyar. GPS ISR'leri acquisition/tracking olaylarini kaydeder. wfi sonrasi foreground bu kuyruklari tuketir. WLS sirasinda yeni IMU interrupt'lari gelebilecegi icin IMU kuyrugu WLS'den hem once hem sonra drain edilir; GPS update'i WLS bitis zamaninda degil capture epoch'unda uygulanir.

ESKF entegrasyonunda yapilanlar

  • TDK ICM42688 ve ST LSM6DSOX suruculeri sensor-markasindan bagimsiz imu_sensor/imu_sample_t sinirinin arkasina alindi. Her IMU ornegi olcum aninda monotonik CLINT timestamp'i alir; ISR icinde ESKF matematigi calismaz.
  • Filtre ENU position/velocity, quaternion attitude, accel bias ve gyro bias iceren 15 hata durumlu ESKF'dir. Prediction her ham IMU orneginde midpoint mechanization ile calisir; telemetry bolucusu prediction oranini dusurmez.
  • GPS WLS position ve Doppler velocity ayni capture timestamp'iyle tek fusion_navigation_measurement_t icinde tasinir. Gecikmis GPS olcumu history icindeki kendi epoch'una uygulanir; sonraki IMU ornekleri current time'a kadar tekrar oynatilir.
  • Position ve velocity update'lerinin ayri 3-DOF NIS kapilari ve accept/reject sayaclari vardir. Velocity bozuksa ayni epoch'taki gecerli position update'i geri alinmaz.
  • Doppler WLS ECEF velocity covariance'i ENU'ya dondurulur. Kart verisinde zayif geometrinin formal covariance'i asiri iyimser yapmamasi icin horizontal 2.0 m/s, vertical 3.0 m/s minimum standard deviation floor'u uygulanir; daha buyuk formal belirsizlik korunur.
  • Durağanlik supervisor'u IMU/GNSS hareket kanitlarini histerezisle birlestirir ve yalniz guvenli durumda ZUPT/zero-gyro update uygular. GPS kesintisinde sahte position olcumu uretilmez; dead-reckoning devam eder ve covariance buyur.
  • Kotu ilk fix sonraki tutarli fix'leri surekli NIS reject'e kilitlerse, timeout ve coklu-fix sureklilik kosuluyla yalniz position state/covariance yeniden ankrajlanir. Velocity, attitude ve IMU bias state'leri korunur.

Generic IMU Mimarisi (TDK ve ST)

GPS/ESKF artik dogrudan bir sensor surucusune bagli degildir. Veri yolu:

TDK ICM42688 -----\
                   -> imu_sensor -> imu_calibration -> imu_sample_t
ST LSM6DSOX ------/                                      |
                                                         v
GPS receiver -> WLS -> gps_nav_solution_t -> GPS adapter -> navigation_fusion
                                                          |
                                                          v
                                           motion/ZUPT + ESKF -> fused LLH
  • src/drivers/imu/tdk_icm42688.c: TDK ICM42688'e ozel SPI, register, interrupt ve ham-veri donusumu.
  • src/drivers/imu/st_lsm6dsox.c: STEVAL-MKI217V1 uzerindeki ST LSM6DSOX'e ozel SPI, register, INT1 data-ready interrupt ve ham-veri donusumu.
  • src/imu/imu_sensor.c: ortak init/start/stop/IRQ/service/measurement arayuzu.
  • src/imu/imu_calibration.c: markadan bagimsiz bias, 3x3 scale/cross-axis/mounting donusumu ve opsiyonel sicaklik katsayisi.
  • header/imu/imu_sample.h: driver ve IMU yonetimi ile fusion arasindaki sensor-markasindan bagimsiz SI mesaj sozlesmesi.
  • src/adapters/imu_fusion_profile.c: aktif sensorun karakteristigini ESKF process-noise/kalibrasyon esiklerine cevirir.

Firmware isletim sistemi kullanmaz. Yeni IMU katmani malloc cagirmadan sensor kuyruklarini ve butun durumunu statik ayirir. Newlib ve formatli UART destegi nedeniyle linker'da heap alani yine bulunur; yeni sensor kodu buna guvenmez. Karttaki 1 MiB DTIM test icin genis tutulmustur; firmware tasarim butcesi ilerideki 512 KiB DTIM hedefidir. auto build iki sensor surucusunu da icerir; kesin sensor secimi kullanilmayan surucuyu linkten cikarir.

2026-07-13 tarihli -Os bare-metal link boyutlari:

Secim text data bss Toplam DTIM image
tdk 67,256 2,496 205,160 274,912 bayt
st 66,936 2,496 199,280 268,712 bayt
auto 68,888 2,496 207,560 278,944 bayt

En buyuk auto image 512 KiB DTIM'in yaklasik yuzde 53.2'sini kullanir; stack ve ilerideki buffer'lar icin 245,344 bayt (yaklasik 239.6 KiB) adres alani kalir. Linker bunun 16 KiB'ini varsayilan stack icin ayirir. 1 MiB test konfigurasyonunda gorulen ek bosluk yeni statik buffer eklemek icin gerekce sayilmamalidir. Host unit-test executable'i bu rakamlara dahil degildir. auto konfigurasyonu ayrica BSP_DTIM_SIZE=0x00080000 ile gercekten link edilerek 512 KiB sinirinda dogrulanmistir.

Bare-metal sensor secimi

ESKF/fusion varsayilan olarak aciktir. GPS-only firmware icin ana uygulama akisini degistirmeden kapatilabilir:

make -C soc/software/gps_system GPS_ESKF_ENABLE=0

Bu durumda GPS acquisition/tracking/WLS ve ham lat-lon yayini calismaya devam eder; IMU stream'i ve navigation_fusion baslatilmaz. UART startup satirinda eskf_enabled ve gercek init sonucu olan eskf_ready ayri alanlardir.

Ana proje dizininden Genesys2 MCS uretmek icin:

# TDK + ESKF; GPS_ESKF_ENABLE verilmezse de varsayilan 1'dir.
make FPGA_BOARD=genesys2 APP=gps_system \
  GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-mcs

# GPS-only: tracking, C/N0, Doppler velocity WLS ve PPS calisir.
make FPGA_BOARD=genesys2 APP=gps_system \
  GPS_ESKF_ENABLE=0 fpga-mcs

Her iki profil bootloader ve uygulamayi varsayilan 460800 baud ile derler. Iki komut ayni MCS/BIN yoluna yazdigi icin iki imaj birlikte saklanacaksa build'ler arasinda profil adiyla kopyalanmalidir. Bu secenekler software derleme parametresidir; mevcut bitstream ile fpga-mcs yeterlidir.

PPS Doppler datum-drift predictor production'da varsayilan olarak aciktir. Kontrollu A/B icin build-time secenekleri:

# Production: predictor sürekli acik, otomatik A/B yok.
make -C soc/software/gps_system \
  GPS_PPS_DOPPLER_PREDICTOR_ENABLE=1 \
  GPS_PPS_DOPPLER_PREDICTOR_AB_UPDATES=0

# Tani: her 200 navigation update'inda (~40 s) kapali/acik degistir.
make -C soc/software/gps_system \
  GPS_PPS_DOPPLER_PREDICTOR_AB_UPDATES=200

GPS_PPS_DOPPLER_PREDICTOR_ENABLE=0 yalniz kontrollu fallback testi icindir. GPS_PPS_DOPPLER_PREDICTOR_AB_UPDATES sifirdan buyukse A/B secimi enable degerini bilerek ezer; production image'da mutlaka 0 kalmalidir.

Otomatik WHO_AM_I algilama varsayilandir:

make -C soc/software/gps_system IMU_SENSOR=auto

Otomatik secimde eslesen cihaz bulunana kadar yalniz read-only WHO_AM_I probe yapilir. TDK ve ST build'leri acikca su sekilde secilebilir:

make -C soc/software/gps_system IMU_SENSOR=tdk \
  IMU_ODR_HZ=500 IMU_ACCEL_FS_G=4 IMU_GYRO_FS_DPS=250

make -C soc/software/gps_system IMU_SENSOR=st \
  IMU_ODR_HZ=50 GPS_NAV_SOLVE_TIMER_TICKS=10 \
  IMU_ACCEL_FS_G=2 IMU_GYRO_FS_DPS=250

IMU_SENSOR=stm, st seciminin alias'idir. IMU_ODR_HZ=0, IMU_ACCEL_FS_G=0 ve IMU_GYRO_FS_DPS=0 aktif surucunun guvenli varsayilanini secer. Bu ozellikle auto icin onemlidir; TDK ve ST'nin ortak bir ODR degeri yoktur. Desteklenen ODR'ler TDK icin 25/50/100/200/500/1000 Hz, ST icin 52/104/208 Hz'dir.

IMU_ODR_HZ fiziksel data-ready hizini secer; ST icin 50 istegi gercek 52 Hz ayarina eslenir. Her IMU ornegi kendi monotonik CLINT timestamp'i ile ESKF tahminine girer. 19/20 ms gibi sabit bir dt varsayilmaz ve CPU yuku icin ham ornek atlanmaz. Ileride ESKF orani dusurulecekse PX4'teki gibi delta-angle ve delta-velocity biriktiren, coning/sculling bilgisini koruyan bir downsampler kullanilmalidir.

GPS orani bundan bagimsizdir. GPS_NAV_SOLVE_TIMER_TICKS=5/10/50 sirasiyla 100/200/1000 ms nav-solve periyodu verir. WLS sonucu gec gelse bile olcum kendi capture timestamp'inde fixed-lag replay ile uygulanir; yalniz solution_valid=true olan GPS cozumu fusion'a girer. GPS yokken IMU ESKF'nin process-model tahminini surdurur, fakat filtre kendine sahte konum olcumu vermez. Global origin yoksa LLH cikisi valid degildir; origin daha once kurulduysa sonuc yardimsiz dead-reckoning'dir ve kovaryansi zamanla buyur.

NIS kapisi tek bir aykiri GPS'in ESKF'yi suruklemesini engeller. Ancak acilista ilk GPS fix'i kotu olup sonraki tutarli fix'ler bu ilk noktadan onlarca metre uzakta kalirsa, yalniz hard NIS rejection kullanmak filtreyi yanlis baslangica kilitler. Fusion engine bu nedenle ardisik reddedilen position fix'lerinin zamansal surekliligini izler. Son başarılı fusion'dan sonra yedi saniye timeout dolmuşsa ve en az uc fix birbirinin devamı ise ve platform IMU/GNSS hareket vetolariyla duragan kabul ediliyorsa yalniz ESKF konumu ve konum kovaryansi son olcume yeniden ankrajlanir; attitude, hiz ve IMU bias state'leri korunur, gecersiz hale gelen position cross-covariance'lari sifirlanir. Tek aykiri fix bu yolu tetiklemez. Bu davranis 100/200/1000 ms GPS oranlarinda gps_reacquisition_test.c ile dogrulanir ve level-2 fusion status satirinda recoveries= sayaci ile gozlenir.

TDK ve ST veri-hazir interrupt'i ile calisir ve ana dongu wfi kullanabilir. Genesys2 son pin planinda ortak aktif sensor interrupt girişi JB1/V29 uzerinden wrapper'daki 3FF synchronizer'a, oradan PLIC device 11'e gider. ST surucusu LSM6DSOX accel data-ready olayini INT1'e yonlendirir; ISR local CLINT timestamp'ini basta alir, latched kaynagi temizler, ayni sample'in gyro ve sicaklik alanlarini okuyup statik SPSC kuyruğa koyar. imu_sensor_service() interrupt backend'lerde no-op'tur.

Standalone LSM6DSOX SPI okuma, stationary log ve INT1 -> JB1 -> 3FF -> PLIC 11 -> C ISR fiziksel yolu kartta dogrulanmistir. 2026-07-16 GPS + ST + ESKF end-to-end stationary kosusunda 6531 interrupt/sample, 467 ESKF aktarimi ve 322 kabul edilen GPS update'i goruldu; read-fail, queue overflow, missed sample ve GPS NIS reject sayilari sifir kaldi. Ayni logun yerlesmis son bolumunde 100 ham GPS fix'inin yatay RMS sacilimi 13.62 m, son 20 fused durumun yatay RMS sacilimi 0.39 m oldu. Bu degerler survey referansina gore mutlak dogruluk degil, sabit anten etrafindaki repeatability olcumudur. Yuksek ODR gerekirse sonraki gelistirme sensor FIFO + sensor timestamp veya daha yuksek CPU butcesidir; ortak IMU arayuzu ve ESKF bunun icin degismeyecektir.

Sensor ODR'si ile GPS nav-solve periyodu birbirinden bagimsizdir. Her IMU ve GPS olcumu ayni local monotonic CPU tick domaininde kendi olcum zamaniyla tasinir; ESKF olaylari timestamp sirasinda isler. TDK ve ST ISR timestamp'i data-ready kenarini yakindan temsil eder. Daha kesin ve WLS/interrupt latency'sinden bagimsiz yuksek-ODR zamanlama gerekirse sensor FIFO timestamp'i kullanilmalidir.

Level-1 konum UART protokolu

Her gecerli GPS navigation epoch'unda ham WLS GPS konumu yayinlanir. ESKF duzeltilmis konumu ise GPS epoch'undan bagimsiz olarak IMU ornek sayaci uzerinden yayinlanir:

[LOCATION] source=gps lat=... lon=... height=... gdop=... pdop=... hdop=... vdop=... tdop=... tracked=... used=...
[LOCATION] source=imu_corrected lat=... lon=... height=... gdop=... pdop=... hdop=... vdop=... tdop=... tracked=... used=...

tracked, donanimda calisan tracking kanal sayisini; used, ilgili WLS cozumunde kullanilan uydu sayisini belirtir. ESKF henuz kalibrasyon/origin asamasindaysa yalniz GPS satiri yayinlanir. Origin kurulduktan sonra GPS reddedilse veya gecici olarak kesilse de corrected konum IMU ile ilerlemeye devam eder.

Varsayilan corrected UART periyodu bes IMU ornegidir. 50 Hz sensor hedefinde bu yaklasik 100 ms/10 Hz demektir. Bu bolucu yalniz UART logunu seyreltir; sensor okuma ve ESKF prediction her IMU orneginde calismaya devam eder:

# Varsayilan: 20 ms x 5 ~= 100 ms
make -C soc/software/gps_system IMU_CORRECTED_PUBLISH_EVERY_N_SAMPLES=5

# 20 ms x 2 ~= 40 ms
make -C soc/software/gps_system IMU_CORRECTED_PUBLISH_EVERY_N_SAMPLES=2

# Parent software hedefi uzerinden ayni ayar
make -C soc/software gps-system GPS_SYSTEM_IMU_PUBLISH_EVERY_N_SAMPLES=5

Deger en az 1 olmalidir. Secilen bolucu startup satirinda publish_every= alaniyla gorulur. Eski [NAV] position ve periyodik [FUSION] lat/lon ayrintilari daha yuksek debug seviyesindedir; level 1 parser'inin ayni konumu birden fazla kez gormesi engellenir.

Desktop location_plotter, source=gps serisini mavi ve source=imu_corrected serisini kirmizi cizer. Iki kaynak arasinda zigzag yol cizmez; corrected veri varsa CEP/RMS analizi yalniz corrected seriyle yapilir. Linux sentetik replay loglarindaki source=trajectory gerçek izi yeşil çizer.

Kalibrasyon ve sicaklik politikasi

Uc farkli duzeltme birbirinden ayridir:

  1. Sensorun fabrika trim'i ve datasheet sensitivity degerleri sensor surucusunde kullanilir.
  2. Kalici, karta ozel bias/scale/eksen/sicaklik katsayilari ortak imu_calibration_t icinde uygulanabilir. TDK ve ST ayarlari calibration_by_backend[] icinde ayri profillerdir; auto secimi bir sensorun kalibrasyonunu digerine uygulayamaz. Varsayilan deger identity + sifir bias'tir; yani varsayilanda olcumu degistirmez.
  3. Fusion engine acilista kart sessizken iki saniyelik ornek toplar. Anlik gyro bias'ini, ilk roll/pitch hizalamasini ve gravity yonundeki accel kalintisini tahmin eder. ESKF bundan sonra residual accel/gyro bias state'lerini izler.

Sicaklik GPS/IMU fusionunun calismasi icin zorunlu degildir. Kisa sureli ve dar sicaklik araligindaki ilk testte sicaklik yalniz olculur ve mesajda tasinir; ESKF denklemlerini etkilemez. Uzun sure, dis ortam veya sensorun isinmasiyla bias degisimi gorulurse sicaklik katsayilari offline loglardan cikarilip temperature_compensation_enabled=true ile etkinlestirilir. Katsayi olmadan otomatik sicaklik duzeltmesi yapmak yanlis bias uretme riski tasir.

Portable kalibrasyon matematigi Linux'ta heap kullanmadan su testle dogrulanir:

make -C soc/software/gps_system/tests clean run

Bu test identity davranisini, bias + 3x3 donusumu, opsiyonel sicaklik duzeltmesini ve singular matris reddini kontrol eder. Test executable'i host icindir ve bare-metal firmware'e linklenmez.

Donanim Adresleri ve IRQ Map

Generated DTS/RTL'e gore GPS IP adresleri:

IP Base address PLIC source
ACQ 0x10020000 1
TRCK0 0x10021000 2
TRCK1 0x10022000 3
TRCK2 0x10023000 4
TRCK3 0x10024000 5
TRCK4 0x10025000 6
TRCK5 0x10026000 7
TRCK6 0x10027000 8
TRCK7 0x10028000 9
TRCK8 0x10029000 10

Bu degerler soc/software/bsp/include/bsp/soc.h icinde BSP define olarak tutuluyor. GPS yazilimi header/gps/gps_ip_defines.h icinde bu BSP define'larini kullaniyor.

PLIC base:

BSP_PLIC_BASE = 0x0c000000
priority      = base + 4 * source_id
pending       = base + 0x1000
enable hart0  = base + 0x2000
threshold     = base + 0x200000
claim/complete= base + 0x200004

claim/complete icin +4 dogru. Generated TLPLIC 64-bit beat kullaniyor, claim/complete register'i threshold ile ayni beat'in upper 32-bit tarafinda.

Yapilan Software Degisiklikleri

  • GPS base adresleri ve IRQ line'lari eski SoC sabitlerinden BSP define'larina tasindi.
  • Tracking IP sayisi 9'a cikarildi.
  • trck6_ip, trck7_ip, trck8_ip ve bunlarin interrupt map'i eklendi.
  • PLIC init eklendi:
    • mtvec = gps_irq_handler
    • PLIC threshold 0
    • source 1..10 priority 1
    • source 1..10 enable
    • mie.MEIE ve mstatus.MIE enable
  • gps_irq_handler() PLIC claim ID'ye gore dispatch ediyor:
    • 1 -> ACQ ISR
    • 2..10 -> tracking index irq_id - 2
    • sonra PLIC complete yaziyor
  • gps_irq_handler machine interrupt handler attribute ile derleniyor. ELF'te handler mret ile donuyor.
  • gps_irq_handler ayrica 4-byte aligned ediliyor. mtvec base adresi 4-byte aligned olmak zorunda; RVC acik oldugu icin fonksiyon 2-byte aligned yerlesirse trap iki byte erken baslayabilir.
  • _start basinda debug-load'dan kalan interrupt state'i temizleniyor:
    • mie = 0
    • mstatus.MIE = 0
  • FPGA gdb_load_and_run.gdb script'i de _starta resume etmeden once eski debug oturumundan kalan mie, mstatus.MIE, CLINT mtimecmp ve stack pointer state'ini temizler. Bu, pending timer interrupt'in _start stack init'inden once handler'a girip stack ustu store fault uretmesini engeller.
  • ACQ ISR pending clear bug'i duzeltildi:
    • Daha once ACQ sadece "acquired" dalinda pending clear ediyordu.
    • ACQ sonucu "not acquired" ise pending clear edilmiyordu.
    • Simdi ACQ pending set ise her iki durumda da clear ediliyor.
  • acq_start_loop use-after-free bug'i duzeltildi:
    • ACQ ISR assign_tracking() sirasinda current acquisition node'unu listeden silebiliyor.
    • Loop WFI'dan sonra iterator->next okursa freed node dereference ediliyordu.
    • Simdi next pointer'i WFI'dan once aliniyor.

PLIC Davranisi

Rocket-chip TLPLIC bu konfigde LevelGateway kullaniyor. Edge/level secen bir software mode register'i yok.

Generated/Scala davranisi:

io.plic.valid := io.interrupt && !inFlight
when (c || g.valid) { p := !c }

Sonuc:

  • PLIC input'u PLIC clock'unda high gorurse pending setlenir.
  • Pending bitleri software'den set edilebilir degil, read-only status gibi davranir.
  • Software priority, enable, threshold yazar; claim okur; complete yazar.

Onemli debug notu: PLIC claim register okumasi side-effect'lidir. GDB ile 0x0c200004 okumak pending'i claim eder. Eger sonra complete yazilmazsa Rocket LevelGateway inFlight kalabilir ve ayni source'tan sonraki interruptlar bloklanir. Debug yaparken durum okumak icin claim register'ini okumayin.

Eger GDB ile claim yanlislikla okunduysa toparlama:

set *(unsigned int*)0x10020000 = (*(unsigned int*)0x10020000 | 0x2)
set *(unsigned int*)0x0c200004 = 1

Ilk satir ACQ pending clear bitini yazar. Ikinci satir PLIC source 1 complete yazar.

GDB Ile Dogrulanan Durum

Clean load sonrasi acq_intr_handler_0 breakpoint'i ile gorulen durum:

mcause = 0x800000000000000b   // machine external interrupt
mepc   = 0x80000e98           // WFI sonrasi
PLIC enable = 0x7fe           // source 1..10 enable
ACQ ctrl = 0x0c               // intr enable + internal pending
acq_interrupt_flag = 1

Dispatch sonrasi, PLIC complete oncesi:

PLIC pending = 0
ACQ ctrl = 0x04               // internal pending clear, interrupt enable duruyor
acq_interrupt_flag = 1

PLIC complete sonrasi:

PLIC pending = 0
ACQ ctrl = 0x04

Bu, ACQ interrupt hattinin PLIC tarafindan goruldugunu, handler'in calistigini, IP pending clear edildigini ve PLIC complete sirasinin dogru oldugunu gosteriyor.

Mevcut Son Durum

Interrupt path artik calisiyor. Son GDB kosusunda program tekrar acq_start_loop icinde goruldu:

pc = 0x80000e98
ACQ ctrl = 0x04
ACQ status = 0x2
PRN = 18
PLIC pending = 0
acq_interrupt_flag = 1
trck_interrupt_flag = 0

Bu durumda stuck sebebi interrupt degil. ACQ status bit0 GPS_ACQ_STATUS_POS set olmadigi icin assign_tracking() calismiyor ve tracking'e gecilmiyor. Yani sonraki debug konusu ACQ sonuc/status semantics'i veya RF/input tarafidir.

RF data verildikten sonra gorulen unexpected trap mcause = 5 icin ek debug:

mcause = 5                 // load access fault
mepc   = acq_start_loop + lw a1,0(s0)
mtval  = 0x2

Bu, acquisition linked-list iterator'unun gecersiz/freed node'a donustugunu gosterdi. Sebep acq_start_loop icinde WFI'dan sonra current node'un next alaninin okunmasiydi; ayni node ACQ ISR icinde silinebiliyor. Fix: next pointer'i ACQ start/WFI oncesinde saklandi.

Ayni debug sirasinda ikinci bir trap sebebi bulundu:

gps_irq_handler = 0x...13c6
mtvec readback  = 0x...13c4

mtvec base 4-byte aligned oldugu icin handler 2-byte aligned adrese yerlesince trap iki byte erken basliyordu. Fix: GPS_IRQ_HANDLER_ATTR icine aligned(4) eklendi. Son dogrulamada:

mtvec = 0x800013c8
pc    = acq_start_loop
mcause= 0x800000000000000b
mtval = 0
trck_interrupt_flag = 1

Bu kosuda mcause=5 tekrar etmedi.

Build ve Debug Komutlari

Ana dizinden kalici flash imaji:

make FPGA_BOARD=genesys2 APP=gps_system \
  GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-mcs

OpenOCD:

make FPGA_BOARD=genesys2 fpga-debug-openocd

ELF'i RAM'e yukleyip calistirma:

make FPGA_BOARD=genesys2 APP=gps_system \
  GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-debug-load

UART:

make FPGA_BOARD=genesys2 fpga-uart

Durum okumak icin claim register'ini okumadan:

target remote :3333
monitor halt
p/x $pc
p/x $mtvec
p/x $mie
p/x $mstatus
p/x $mcause
p/x $mepc
p/x *(unsigned int*)0x0c001000
p/x *(unsigned int*)0x0c002000
p/x *(unsigned int*)0x0c200000
x/16wx 0x10020000
x/20wx 0x10021000

Tekrar: 0x0c200004 claim/complete register'idir. Debug read yapmayin; okuma pending'i claim eder.

Continuous Acquisition ve Parametric ACQ Update

Bu bolum continuous/background acquisition ve parametrik acquisition engine destegi icin yapilan son firmware degisikliklerini ozetler.

Analiz Edilen Noktalar

  • Mevcut firmware acquisition'i acq_start_loop() icinde calistiriyor ve 4 veya daha fazla tracking uydusu varsa yeni acquisition baslatmiyordu.
  • calculate_position() sadece tracking sayisi 4'un altina dustugunde acquisition'i tekrar tetikliyordu.
  • ACQ ISR daha once acquisition sonucunu ISR icinde isliyor, linked-list degistiriyor, tracking handoff yapiyor ve debug basiyordu.
  • TRCK ISR de linked-list/node islemleri, subframe parse ve cok fazla debug isini ISR icinde yapabiliyordu.
  • Navigation tarafinda tracking measurement verisinin taze olup olmadigi tick/epoch ile net kontrol edilmiyordu.
  • XLSX register dokumanlari incelendi:
    • GPS_ACQ_APB_regmap.xlsx
    • GPS_TRCK_APB_regmap.xlsx
  • ACQ ve TRCK register offset'leri firmware struct'lari ile karsilastirildi.

Degisen Dosyalar

  • header/gps/gps_ip_defines.h
  • header/gps/gps_macros.h
  • header/gps/gps_interrupt_handlers.h
  • header/gps/linked_list.h
  • src/gps/gps_ip.c
  • src/gps/gps_interrupt_handlers.c
  • src/gps/linked_list.c
  • gps_system.c (onceki gps_test.c giris noktasi)

Parametric Acquisition Engine Destegi

  • Acquisition engine sayisi tek noktadan ayarlanabilir hale getirildi:
ACQ_ENGINE_COUNT
  • Varsayilan olarak ACQ_ENGINE_COUNT, BSP tarafindaki BSP_GPS_ACQ_COUNT degerinden gelir.
  • BSP bu define'i vermiyorsa firmware default olarak 1 ACQ engine kullanir.
  • ACQ base address ve interrupt line artik index uzerinden hesaplanir:
GPS_ACQ_IP_BASE_ADDR(index)
GPS_ACQ_INTR_LINE(index)
  • ACQ IP pointer ve IRQ tablolarina gecildi:
acq_ips[GPS_ACQ_IP_COUNT]
acq_ips_intr_lines[GPS_ACQ_IP_COUNT]
  • Mevcut donanim haritasinda sadece bir ACQ engine var:
    • ACQ base: 0x10020000
    • TRCK0 base: 0x10021000
  • Bu nedenle birden fazla ACQ engine acilirsa ACQ register window'larinin tracking register window'lari ile cakismamasi icin compile-time guard eklendi.
  • Multi-ACQ icin donanim/BSP tarafinda non-overlapping ACQ base/stride/IRQ bilgisi verilmesi gerekir.

Continuous Background Acquisition

  • acq_start_loop() artik eski blocking acquisition dongusunu calistirmiyor.
  • Main loop su sekilde calisir:
wfi();
gps_background_task();
calculate_position();
  • Acquisition scheduling RISC-V timer/systick tarafindan tetiklenir.
  • Tracking real-time oncelikli kalir; acquisition sadece background task icinde yeni is atar.
  • Yeni scheduler:
    • bos ACQ engine arar,
    • aktif tracking uydularini tekrar acquire etmeye calismaz,
    • herhangi bir tracking IP tarafindan busy/allocated gorulen PRN'leri ACQ listesinden temizler,
    • ACQUIRING, ACQUIRED, TRACKING durumlarindaki PRN'leri skip eder,
    • kayip veya stale PRN'leri tekrar listeye alabilir,
    • acquisition retry icin tick tabanli delay uygular.
  • Gercek tracking loss sonrasi ilk hot reacquisition denemesi hemen yapilir. Deneme sinyal henuz geri gelmedigi icin basarisizsa ayni PRN icin sabit 30 s beklenmez; GPS_ACQ_HOT_RETRY_DELAY_TICKS=2 s sonra tekrar uygun olur. Round-robin cursor ve GPS_ACQ_MAX_HOT_STREAK bir absent PRN'in engine'i tek basina kullanmasini ve cold discovery'yi sonsuza kadar ac birakmasini engeller. Bu delay ephemeris TTL'i degildir; fresh ephemeris ve HOW/sample anchor butun hot denemeler boyunca RAM'de korunur.

Acquisition Engine Algoritmasi

Bu firmware'de "hot" ve "cold" ayirimi acquisition RTL correlatorunun Doppler veya code-phase arama penceresini degistirmez. Ayrim, hangi PRN'in tek ACQ engine'ine once verilecegini ve tracking basladiginda cache'deki navigation state'inin nasil geri yuklenecegini belirleyen software scheduler politikasidir. Scheduler her 100 ms background gecisinde once donanim BUSY ve software channel ownership bilgisini uzlastirir; yalniz bos tracking kanali varsa yeni arama baslatir. Genesys2 tasariminda bir ACQ engine ve dokuz tracking kanali vardir.

PRN state gecisleri su sekildedir:

power-on: DISABLED -> COLD -> ACQUIRING
acquisition success: ACQUIRING -> ACQUIRED -> TRACKING
acquisition failure: ACQUIRING -> COLD
measurement deadline: TRACKING -> STALE -> TRACKING (lock devam ediyorsa)
real unlock/stop: TRACKING|STALE -> HOT -> ACQUIRING
expired hot window: HOT -> COLD

Arama iki farkli constellation-knowledge fazinda calisir:

  1. Cold start veya incomplete/stale almanak: visibility filtresi tamamen kapatilir. Gecerli position ve birkac full ephemeris olsa bile 32 hardware PRN'i eski round-robin sirayla aranmaya devam eder. Partial almanak bir uyduyu "gorunmez" ilan etmek icin kullanilmaz.
  2. Complete/fresh almanak: her PRN icin fresh full ephemeris varsa precise orbit kullanilir; yoksa reduced-precision almanak orbiti kullanilir. 5 derece elevation mask'inin ustundeki adaylar elevation'a gore siralanir. Almanakta unavailable (health=111111) veya mask altinda olan PRN'ler normal cold queue'dan cikarilir.

Bu iki faz icindeki arama onceligi su kurallari kullanir:

  1. Yakinda gercekten track edilmis HOT PRN'ler sky modelinden bagimsiz olarak once aranir. Onceki lock, bu uydu icin gozlemsel gorunurluk kanitidir. Ilk deneme hemen, sonraki basarisiz denemeler ayni PRN icin 2 s araliklidir.
  2. Incomplete almanak fazinda tum COLD PRN'ler round-robin aranir. Complete fazda yalniz predicted-visible COLD PRN'ler elevation onceligiyle aranir.
  3. Complete modelde mask altindaki PRN'ler position/time veya orbit modelinin hatali/stale olmasina karsi yalniz 60 s'de bir round-robin safety probe alir.
  4. Ardisik en fazla dort hot denemeden sonra bir eligible cold/discovery denemesine yer verilir. Boylece coklu tunnel/drop durumunda reacquisition yuksek oncelikli kalirken yeni uydu kesfi starvation'a ugramaz.

LNAV almanak collector, subframe 5 SV ID 1..24 ile subframe 4 SV ID 25..32 orbit sayfalarini, iki page-25 health grubunu ve subframe 5 page 25 toa/WNa referansini RAM'de biriktirir. Broadcast SV ID, zero-based acquisition RTL index'ine SV_ID - 1 olarak cevrilir. Bir almanak seti su kosullarda complete kabul edilir:

  • toa/WNa, SF5 PRN 1..24 health ve SF4 PRN 25..32 health kayitlari vardir,
  • her available PRN icin ayni toa degerine ait orbit sayfasi vardir,
  • orbit sayfasi olmayan PRN page-25 health'te acikca 111111 unavailable'dir,
  • RAM reception age ve GPS week/toa age limitleri asilmamistir.

Tek bir satellite'in tum almanak dongusunu yaymasi 25 adet 30 saniyelik frame, yani yaklasik 12.5 dakika surer. Birden fazla tracking kanali ayni sayfalari redundant olarak hizlandirmadan tekrarlar. Complete olmadan sky-guided mod acilmaz; complete set daha sonra stale olur veya yeni toa seti partial kalirsa firmware otomatik olarak 32-PRN round-robin'e geri doner. Tracking kanallari dolunca background arama durur; nav-bit decode ve almanak toplama devam eder.

Onceki five-satellite plateau'nun sebebi safety probe'un yalniz normal visible queue tamamen bosken calismasiydi. Bir predicted-visible absent PRN her retry delay sonunda yeniden eligible oldugu icin queue hic bosalmiyor ve unknown PRN probe'u 15 dakika sonra bile acilmiyordu. Yeni politika partial almanak boyunca visibility suppression'i hic acmadigi icin bu starvation kosulu yoktur. Linux hardware simulation testinde bes tracked uydu, bir partial modelin mask-altinda isaretledigi PRN'leri yine normal round-robin ile arayarak 25 simulation tick icinde dokuz tracked uyduya cikar.

Satellite State Model

Her PRN icin state tutulur:

GPS_ACQ_PRN_DISABLED
GPS_ACQ_PRN_COLD
GPS_ACQ_PRN_HOT
GPS_ACQ_PRN_ACQUIRING
GPS_ACQ_PRN_ACQUIRED
GPS_ACQ_PRN_TRACKING
GPS_ACQ_PRN_STALE

Bu state modeli acquisition scheduler, tracking handoff ve stale measurement temizligi icin kullanilir.

PRN register degeri bu donanimda 0..31 hardware index olarak kullanilir. Bu nedenle firmware PRN_NUMBER alanina 0..31 yazar; 0 invalid kabul edilmez.

ISR Safety Degisiklikleri

  • ACQ ve TRCK ISR'lari sade hale getirildi.
  • ISR icinde artik agir is yapilmiyor.
  • ISR akisi:
    • status/control register snapshot al,
    • gerekli data register'larini oku,
    • interrupt clear yap,
    • fixed-size event queue'ya event push et,
    • cik.
  • Linked-list mutation, acquisition-to-tracking handoff, subframe parse ve debug print gibi agir isler deferred/main context'e tasindi.
  • Fixed-size event queue eklendi:
GPS_EVENT_QUEUE_SIZE
  • Queue overflow sayaci eklendi ve overflow debug seviyesinde raporlanir.
  • ACQ event'i queue doluysa shadow result ile korunur; tracking event overflow'u sayilir.
  • PLIC dispatch artik ACQ interrupt source'larini acq_ips_intr_lines[] tablosundan arar.
  • Tracking status register'inda INTR_PEND set kalir fakat PLIC event'i software'e ulasmazsa, gps_background_task() icindeki hafif poll fallback ayni ISR snapshot yolunu cagirir. Bu fallback sadece register snapshot/clear ve fixed queue push yapar; subframe parse ve navigation islemleri yine deferred context'te kalir.

Systick / Timer Degisiklikleri

  • Machine timer interrupt path eklendi.
  • gps_systick_ticks global tick counter olarak kullanilir.
  • Systick acquisition scheduler'i periyodik olarak uyandirir.
  • Timer interrupt sadece tick arttirir, scheduler pending flag set eder ve bir sonraki compare degerini programlar.
  • Mevcut ayar GPS_SYSTICK_HZ=10u'dir. CLINT timebase board build'inden gelir: Genesys2'de 50 MHz SoC clock /100 bolucu nedeniyle 500000 Hz, VCU118'de 100 MHz SoC clock nedeniyle 1000000 Hz kullanilir. Her iki kartta machine timer interval'i gercek zamanda 100 ms'dir.
  • Systick sadece bos acquisition engine'e yeni is atamak ve background maintenance yapmak icin kullanilir.
  • Acquisition completion/stop systick timeout ile yapilmaz; ACQ engine normalde sadece ACQ-end interrupt ile tamamlanir.
  • GPS_ACQ_STUCK_WARN_TICKS diagnostic-only stuck-busy warning icindir. ACQ'yi stop/restart etmez; sadece software-owned ACQ engine beklenenden uzun busy kalirsa rf_clk, sample_align_i veya acq_end yolunu kontrol etmek icin log basar.
  • Ortak AFE yalniz gps_startup_initialization() sirasinda bir kez baslatilir. Per-PRN acq_start() AFE fazina dokunmadan sadece pending clear, PRN ve ACQ start pulse islemlerini yapar.
  • Software engine'i idle gorurken ACQ donanimi busy ise scheduler yeni PRN/start yazmaz; donanim idle olana kadar yeni aramayi erteler.
  • ACQ sonucu bir tracking kanalina verildiginde tracking_allocated software rezervasyonu donanim BUSY biti gec gorundu diye geri alinmaz. Rezervasyon normal tracking drop/stop interrupt'i ile serbest birakilir.

Tracking Freshness ve Stale Data Koruma

  • Tracking linked-list node'una phase-aware freshness alani eklendi:
gps_measurement_freshness_t gps_measurement_freshness
gps_nav_solve_sequence
gps_last_nav_solve_pps_counter
  • Freshness state machine event cadence'ini acikca ayirir:
    • GPS_MEASUREMENT_PHASE_LNAV: cold-acquisition subframe'leri 6 saniyede bir geldiginden periyodik measurement deadline uygulanmaz. Kanal liveness'i tracking BUSY/LOCK, stop/unlock interrupt'i ve stopped-channel reconciliation ile belirlenir.
    • GPS_MEASUREMENT_PHASE_NAV_SOLVE_ARMED: firmware nav-solve interrupt'ini actigi anda 3 saniyelik deadline baslar.
    • GPS_MEASUREMENT_PHASE_NAV_SOLVE_ACTIVE: gelen her nav-solve olcumu deadline'i yeniler. Bu asamada gelen LNAV olayi deadline'i yenileyemez.
  • Periyodik stale timeout:
GPS_TRK_MEASUREMENT_STALE_TICKS
  • Navigation input'u kullanilmadan once phase-valid, lock ve—yalniz nav-solve armed/active phase'lerinde—measurement deadline kontrol edilir.
  • Tracking channel lock kaybederse:
    • measurement invalid/stale yapilir,
    • PRN GPS_SAT_LOST durumuna alinir,
    • tracking slot bosaltilir,
    • PRN tekrar acquisition listesine eklenebilir.
  • Position calculation artik stale veya unlock olmus measurement kullanmaz.
  • Her PRN icin commit edilmis ephemeris gps_ephemeris_cache_t.entry[32] dizisinde CPU RAM/BSS icinde tutulur. Tracking slot'u silinse bile cache silinmez; ayni PRN reacquire edildiginde ephemeris yeni kanala kopyalanir.
  • Cache yalniz matching IODC/IODE ile commit edilmis, ephemeris_valid=true setleri kabul eder. Ayni broadcast issue tekrar alinirsa iki saatlik TTL yenilenmez; yeni IOD/toe issue'su TTL'yi yeniden baslatir. Expired entry restore sirasinda invalid edilir ve kanal yeniden SF1/SF2/SF3 toplar.
  • Gecerli cache ile reacquisition tam ephemeris turunu veya siradaki 6 saniyelik subframe/HOW sinirini beklemez. Cache'deki week-qualified HOW/sample anchor'i ilk coherent 20 ms hardware measurement'ina tasinir ve NAV_SOLVE_PHASE yazilarak timer dogrudan COUNT durumuna alinir. Boylece tracking lock sonrasi ek gecikme ilk coherent measurement ve en fazla bir nav-solve periyodudur (varsayilan N=10 icin yaklasik 20..220 ms). RAM power-cycle boyunca kalici degildir. Power-cycle sonrasi asagidaki flash-assistance yolu en az bir parity-valid live subframe ile zamani yeniden dogrular; RF phase flash'tan restore edilmez.
  • Subframe 1'den gelen 6-bit svhlth alani 000000 degilse kanal tracking/nav-bit guncellemesine devam eder fakat navigation snapshot'a alinmaz. Boylece broadcast unhealthy olarak isaretlenen SV konum hesabinda kullanilmaz.
  • Navigation hesaplamasi icin interrupt disable suresi kisaltildi; sadece snapshot/promote bolumleri korunuyor.

Power-cycle Flash Assistance ve Yazma Politikasi

Genesys2 32 MiB QSPI flash'in son 512 KiB'i GPS assistance icin ayrilmistir. Bitstream 0x00000000, uygulama 0x01800000 adresinden baslar; build scriptleri artik bu iki image'in assistance rezervasyonuna tasmasini hata olarak reddeder.

0x00000000 ... bitstream
0x01800000 ... bootloader application image
0x01f80000 ... journal bank 0 (ilk 64 KiB kullanilir)
0x01fc0000 ... journal bank 1 (ilk 64 KiB kullanilir)
0x02000000     flash sonu

Iki logical bank ayri 256 KiB erase boundary'sindedir. Bu nedenle kartin S25FL256S'i 64 KiB veya 256 KiB uniform-sector modunda olsa da 0xDC erase bitstream/application bolgesine dokunmaz. Her record version, sequence, payload boyu, header CRC, payload CRC ve en son yazilan commit word tasir. Yeni bank ancak eski committed record dururken erase edilir; power loss header, herhangi bir payload page'i veya commit yazisi sirasinda olursa reboot eski CRC-valid record'a geri doner. Corrupt en yeni bank da diger banktaki onceki sequence'e fallback eder.

Flash snapshot su navigation assistance verilerini saklar:

  • her PRN icin matching SF1/SF2/SF3'ten atomik commit edilmis full ephemeris, IODC/IODE, toe/toc, URA ve broadcast SV health,
  • SF5 PRN 1..24 ve SF4 PRN 25..32 almanak orbitleri, toa/WNa referansi ve iki 6-bit health grubu,
  • SF4 page 18'in tam Klobuchar alpha/beta modeli, GPS-UTC A0/A1, tot/WNt, current/future leap second (dtLS/dtLSF) ve WNlsf/DN alanlari,
  • son integrity-valid WLS ECEF/lat/lon/height konumu ve full GPS week/TOW.

Su state bilerek flash'a yazilmaz: raw/corrected RF sample anchor'i, NAV_SOLVE_PHASE, PPS loop/filter state'i, tracking NCO/loop state'i ve WLS receiver clock bias'i. Bunlar power-cycle sonrasi yeni fabric/RF/oscillator phase'ine ait olmadigi icin restore edilmeleri pseudorange scatter uretirdi. Konum WLS seed'inde yalniz ECEF kullanilir; clock bias dorduncu unknown olarak sifirdan yeniden cozulur.

Yazma periodic degil, content-change event driven'dir:

  1. Ephemeris RAM'de her nav interrupt'inda izlenmeye devam eder. Yalniz coherent setin IODC/IODE/toe/toc issue'su degisirse flash dirty olur. Ayni issue'nun tekrari reception confirmation'dir; iki saatlik TTL'yi veya flash deadline'i yenilemez.
  2. Almanak page'i her reception'da RAM age'ini yeniler; fakat WNa/toa, orbit veya health icerigi degismediyse flash dirty olmaz. Yeni epoch'in degisen sayfalari geldikce quiet deadline ileri gider, boylece her 6 saniyelik page icin degil ilgili set toplandiktan sonra tek snapshot yazilir.
  3. Iono/UTC/leap snapshot'i page-18 icerigi gercekten degistiginde yazilir.
  4. Ilk valid konum veya persisted konumdan en az 1 km hareket yeni assistance event'idir. Sabit anten icin zaman tabanli periyodik position write yoktur.
  5. Ilgili degisikliklerin tek record'da toplanmasi icin son degisiklikten sonra 60 s quiet-time uygulanir; surekli degisimde 15 dakika maximum delay vardir. Payload CRC son committed snapshot ile ayniysa program/erase yapilmaz.

Power-on'da flash yalniz bir kez okunur ve data provisional kalir. Ilk parity-valid LNAV subframe'in HOW'u live TOW'u verir; SF1 varsa 10-bit week saved full week etrafinda cozulur. Hic saved record yoksa current 2019 rollover era base'i (2048) kullanilir. Sonra:

  • ephemeris her PRN icin live time ile toe arasinda en fazla iki saatse RAM'e import edilir; reboot bu entry'ye yeni iki saat vermez, gercek kalan TTL korunur,
  • ilgili satellite'in ilk live SF1/SF2/SF3'u cache IOD'si ile uyusmuyorsa yalniz o PRN hemen invalid edilir; ilk page SF4/SF5 ise time-age validation ile kullanilir ve sonraki issue-bearing page yine mismatch kontrolu yapar,
  • almanak WNa/toa age'i yedi gunden eskiyse, iono/UTC snapshot'i yedi gunden eskiyse reddedilir; son konum coarse seed olarak en fazla 30 gun tutulur,
  • fresh complete almanak + restored konum WLS/coarse seed olarak kullanilir, fakat sky scheduler'i PRN suppression moduna sokmaz; bunun icin live position gerekir. Partial/stale almanakta davranis yine tum 32 PRN round-robin'dir.

Combined full-device MCS programlama islemi programmer erase politikasi nedeniyle runtime journal'i silebilir; bu yeni firmware'in normal QSPI runtime yazma adreslerinin bitstream/app ile cakistigi anlamina gelmez. Kalici assistance korunacaksa yalniz app-region programlama hedefi kullanilmalidir.

Linux testleri fake NOR flash'ta 1->0 page semantics, iki-bank rotation, deduplication, her page/commit asamasinda torn write, CRC corruption fallback, power-cycle restore, per-PRN IOD mismatch, mixed stale/fresh satellite ve uzun idle surede sifir write / identical almanakta dedup / changed almanakta tek debounced commit durumlarini kapsar. test_gps_receiver_hardware_sim ayrica 30 s tum-satellite tunnel, 2 s kisa fade, 6/7 satellite icin 15 s blockage ve stale cache decode yollarini calistirir.

Nav Bits + Nav Solve Akisi

  • Tracking kanali ilk basladiginda nav-bits mode kullanilir:
    • NAV_BITS_INTR_EN=1
    • NAV_BITS_FLAG_EN=1
    • NAV_SOLVE_EN=1
    • NAV_SOLVE_INTR_EN=0
    • NAV_SOLVE_FLAG_EN=0
  • Firmware nav bit interrupt'lari ile subframe verisini surekli toplar.
  • Bir tracking kanali ancak IODC/IODE degerleri eslesen subframe 1, 2 ve 3 seti atomik olarak commit edildikten sonra navigation-ready olur. Subframe 4 ve 5 ilk fix'i bloke etmez; page 18 iyonosfer/UTC ve almanak verisi arka planda toplanmaya devam eder.
  • En az 4 satellite icin tutarli ephemeris commit edilince nav-bit snapshot'i yalniz ephemeris uygunlugunu ve kullanilacak kanallari belirler; bu snapshot'tan pozisyon hesaplanmaz.
  • Tutarlı ephemerisi hazir olan ve HOW/sample anchor'indan hardware phase seed'i tamamlanmis tracking kanallarinda nav-solve akisi etkinlestirilir:
    • nav bits interrupt/flag acik kalir,
    • NAV_SOLVE_INTR_EN=1,
    • NAV_SOLVE_FLAG_EN=1.

NAV_SOLVE_PHASE Neden Gereklidir?

Fresh ephemeris yalniz satellite orbit ve clock bilgisinin tekrar decode edilmesini gereksiz yapar; tek basina per-channel nav-solve timer'ini yeniden baslatip diger kanallarla hizalayamaz. Tracking unlock oldugunda trck_busy=0 RTL timer'ini IDLE durumuna ve sayacini sifira dondurur. Bu durumda software'in yalniz NAV_SOLVE_INTR_EN bitini acmasi yeterli degildir: timer COUNT durumunda olmadigi icin interrupt uretilmez ve eski yol yeni bir subframe_ready darbesini 0..6 saniye bekler.

Her reacquired kanali bagimsiz olarak counter zero'dan baslatmak da dogru degildir. Kanallar farkli 20 ms navigation-bit kenarlarinda lock olur; bu nedenle lokal sayaclari ayni degerden baslatmak wrap/interrupt darbelerini farkli fiziksel epoch'lara koyar. Coalescent snapshot ayni receiver zamanina ait olcumler ister; farkli epoch'lari yalniz software interrupt zamanina bakarak birlestirmek pseudorange ve position scatter hatasi yaratir.

HOW-anchor phase seed yolu bu nedenle hem cold ephemeris decode sonrasinda hem cached reacquisition sonrasinda su sirayi izler:

  1. Cold yolda parity-valid live HOW TOW, corrected/raw RF sample ve CPU systick anchor'i commit edilir. Cached yolda ayni bilgiler yeni tracking kanalina restore edilir.
  2. Background software kopyasi yerine channel'in en yeni atomik 20 ms hardware measurement mailbox'i okunur; PRN, valid ve lock alanlari dogrulanir.
  3. Anchor, bu measurement'in GPS zamanina tasinir ve global bit numarasi ile seed hesaplanir:
global_bit = round(measurement_tow_seconds / 0.020)
phase      = global_bit mod GPS_NAV_SOLVE_TIMER_TICKS
  1. Nav-solve flag/interrupt kapaliyken phase NAV_SOLVE_PHASE register'ina yazilir. RTL bu yazma darbesiyle IDLE durumundan dogrudan COUNT durumuna gecer. Yazma sirasinda mailbox sequence ilerlemisse interrupt acilmaz; yeni mailbox ile sonraki background turunda yeniden seed edilir.
  2. Stable seed sonrasinda nav-solve flag ve interrupt acilir ve tracking node gps_nav_phase_seeded=true olur. Her channel'in lokal counter'i artik ayni global GPS bit numarasinin modulo-N fazini tasidigi icin sonraki wrap darbeleri ayni coalescent epoch'ta olusur.

Bu register ephemeris cache'in yerine gecmez ve TOW uretmez; cache'deki zaman anchor'ini RTL'nin periodic measurement fazina uygular. Epoch assembler yine 25 ms RF-sample penceresini, TOW cluster'ini, 64-bit PPS capture counter'ini ve frozen expected channel maskesini kontrol eder. Dolayisiyla phase seed tek basina hatali kanallari zorla ayni solution'a sokmaz.

Cold start'ta fresh flash assistance da yoksa RAM cache ve valid HOW/sample anchor olmadigi icin phase tahmin edilmez. Orijinal parity-valid LNAV/HOW yolu kullanilir, SF1/SF2/SF3 ephemerisi decode edilir ve ayni live HOW/sample anchor'i ile NAV_SOLVE_PHASE seed edilir. Fresh flash ephemerisi varsa ilk live subframe zaman/issue kontrolunden sonra orbit restore edilir, fakat power-cycle oncesi HOW/sample anchor yine kullanilmaz. RF sample counter'in resetlenmesi veya RF clock'un durmasi halinde CPU systick ile RF elapsed-time kontrolu uyusmaz; ephemeris cache korunur fakat unsafe phase seed reddedilir ve en fazla bir yeni HOW beklenerek guvenli hizalama yapilir. GPS_NAV_SOLVE_TIMER_TICKS, hem 300-bit subframe'i hem 30240000-bit GPS haftasini tam bolecek sekilde compile-time'da kontrol edildigi icin week rollover da ortak fazi bozmaz.

  • Ilk pozisyon dahil butun pozisyon hesaplari, kanallardan senkron nav-solve tick ve ABS_SAMPLE geldikten sonra olusturulan coherent nav-solve snapshot'i ile yapilir.
  • Nav-bit ve nav-solve handler'lari canli ephemeris deposunu ortak kullansa da her kabul edilen nav-solve event'i corrected ABS_SAMPLE, TOW ve o anda commit edilmis ephemerisin tam kopyasini aktif epoch snapshot'ina birlikte yazar. WLS daha sonra canli node listesinden ephemeris okumaz; araya giren nav-bit interrupt'i eski olcumle yeni ephemerisi karistiramaz.
  • Coherent snapshot olusturulurken 32-bit raw ABS_SAMPLE degerleri en yeni sample etrafinda modulo fark ile unwrap edilir. Sayac wrap sinirinin iki tarafindaki uydular ayni pseudorange hesabinda kullanilabilir.
  • Nav bits akisi ilk tutarli subframe 1..3 seti commit edildikten sonra kapatilmaz. Boylece yeni subframe 1..3 verisi ephemerisi, subframe 4 page 18 verisi iyonosfer/UTC parametrelerini guncel tutar.
  • Nav-solve interrupt'lari acilmadan once TOW, parity kontrolunden gecen nav-bit HOW alanindan kurulur. Her yeni HOW'un GPS zaman farki receiver sample-counter farkiyla karsilastirilir; tek bir sureksiz HOW saglikli anchor'i degistiremez. Iki ardışık aday kendi aralarinda tutarliysa kanal reset gerektirmeden yeni zaman cizgisine gecerek toparlanir. Subframe 1 gelmeden onceki gecici hafta, ilk gecerli WN ile atomik olarak guncellenir.
  • Subframe 1..3 ham kelimeleri once staging alaninda biriktirilir. IODC'nin alt 8 biti ile iki IODE alani eslesen tam set olusmadan canli ephemeris degistirilmez; yayin guncellemesi sirasinda eski/yeni ephemeris alanlari karismaz.
  • Subframe 1 toc alani parity bitleri disarida birakilarak 16 bit okunur ve 2^4 ile olceklenir.
  • Subframe 4 page 18 henuz alinmadiysa iyonosfer duzeltmesi uygulanmaz. Page 18 hazir oldugunda her navigation solve tek bir ionoutc kopyasi kullanir.
  • Klobuchar gecikmesi WLS'nin receiver ECEF, azimut ve elevasyon hesabindan uretilir. Ilk unseeded iteration iyonosfersizdir; yaklasik receiver konumu olustuktan sonraki iteration'larda gecikme gozlenen pseudorange'dan cikarilir.
  • Bundan sonra periyodik pozisyon hesaplamasi nav-solve interrupt'lari ile tetiklenir. Current internal-timer RTL'de cold ve cached yollarin ikisi de NAV_SOLVE_PHASE write pulse'u sonrasinda ortak global-bit fazina hizalanir; yalniz NAV_SOLVE_INTR_EN acmak timer'lari hizalamaz. NAV_SOLVE_TIMER=N icin N adet navigation bit_valid darbesi sayilir. Her navigation biti 20 ms oldugu icin periyot N * 20 ms'dir; firmware GPS_NAV_SOLVE_TIMER_TICKS build ayarini gps_startup_initialization() fonksiyonuna verir.
  • Bu siralama onemlidir: NAV_SOLVE_EN nav-bit asamasinda acik tutulabilir, fakat tutarli subframe 1..3 ephemerisi ve hardware phase seed tamamlanmadan kanal navigation-ready sayilmaz. Stable seed sonrasinda nav-solve interrupt/flag acilir. Timer COUNT durumuna girdikten sonra sonraki subframe darbeleri sayaci sifirlamaz veya yeniden fazlamaz.
  • Tracking kanallari farkli zamanlarda lock olabilir ve ilk gecerli subframe'lerini 6 saniyenin farkli katlarinda gorebilir. Bu nedenle hepsini counter zero'dan baslatmak farkli fiziksel epoch'larda interrupt uretir. Firmware her kanali live/cached HOW anchor'i ile en yeni 20 ms measurement mailbox'ina tasir ve round(TOW / 0.020) mod NAV_SOLVE_TIMER fazini yazar. Firmware hem subframe/HOW hem week rollover boyunca ortak fazi korumak icin 300 mod N == 0 ve 30240000 mod N == 0 kosullarini compile-time'da zorunlu tutar. Ornegin N=10, N=25, N=50, N=75, N=100, N=150 ve N=300 gecerlidir; kosullari saglamayan build acik bir #error ile durur.
  • Initial position sonrasinda subframe'lerini tamamlayan yeni tracking kanallarinda da nav bits acik tutularak nav-solve otomatik etkinlestirilir.
  • Coherence kontrolu sadece software systick ile yapilmaz; periodic snapshot icin tracking node'da saklanan nav-solve interrupt sonrasi raw ABS_SAMPLE kullanilir. GPS_NAV_ABS_SAMPLE_SYNC_WINDOW_MS=25 oldugu icin 4 satellite measurement'i 25 ms'den fazla ayriksa navigation solve calistirilmaz. Bu pencere interrupt skew'den cok uydu path delay farkini kapsamak icindir: 20 ms yaklasik 6000 km, 25 ms yaklasik 7500 km pseudorange farkina denk gelir. 25 ms, dusuk-elevation uydu geometrisi ve tracking jitter icin pay birakir ama 50 ms kadar gevsek degildir.
  • Interrupt'lar epoch'a GPS TOW ile degil, butun kanallarda ortak olan 64-bit PPS capture counter ile atanir. Ilk olcum sabit expected maskeyi ve 30 ms bounded holdoff'u baslatir. 25 ms pencereye giren kanallar ayni fiziksel epoch'a katilir; yarim nav periyodundan uzaktaki eski/yeni capture'lar stale veya yeni epoch olarak siniflanir. Boylece bozuk bir gelecek HOW degeri epoch assembler'i kilitleyemez.
  • Yalniz frozen expected maskenin tamami geldiginde snapshot sabit boyutlu iki buffer arasinda immutable olarak foreground'a devredilir. 30 ms holdoff dolan eksik epoch ve daha yeni counter geldigi anda yarim kalan eski epoch butunuyle discard edilir. Hardware mailbox birden fazla pulse'u kacirdiysa sequence/counter farki tutarli olan en yeni gercek olcum kabul edilir; elde olmayan ara olcumler sentetik olarak uretilmez. Sequence ile 64-bit capture counter uyusmazsa event yalniz rebase icin kullanilir ve epoch'a girmez.
  • Immutable snapshot icindeki butun adaylar heap kullanmayan selector ile ikili TOW ve modulo-32-bit ABS_SAMPLE coherence kontrolunden gecirilir. En buyuk coherent kume frozen aday sayisindan bir eksik bile olsa tum epoch reddedilir; WLS icin alt kumeye dusulmez. Tamamlanan snapshot WLS sonucu basarili veya basarisiz olsa da yalniz bir kez denenir.
  • Navigation snapshot ayni SVID/PRN'i ikinci kez kabul etmez. Ayni uydu iki tracking IP uzerinden frozen ready maskeye girerse aday sayisi maskeyle uyusmayacagi icin tum epoch reddedilir; ayni uydu iki kez WLS'e giremez.
  • UART debug satirindaki coherent_nav= degeri, o anda ayni nav-solve penceresinde kullanilabilir kanal sayisini gosterir. 600 ms pozisyon gelmiyorsa busy channels, ready channels ve coherent_nav birlikte kontrol edilmelidir.
  • Tracking ISR event queue dolarsa, her tracking IP icin son event shadow buffer'a alinir. Shadow overwrite sayaci WARN olarak loglanir; bu log gorulurse CPU nav hesaplamasi veya UART debug cikisi tracking interrupt isleme hizini geciktiriyor olabilir.
  • Bir tracking kanali shadow buffer'a dustukten sonra shadow main context tarafindan tuketilene kadar ayni kanalin yeni event'leri tekrar ana queue'ya alinmaz; en yeni shadow snapshot'i korunur. Boylece daha yeni queue event'inin daha eski shadow event'inden once islenmesi ve raw sample zamaninin geriye gitmesi engellenir.
  • Tracking nav-solve interrupt'lari ayni GPS epoch'unda birbirine cok yakin gelebilir. External interrupt handler bu yuzden PLIC'te bekleyen farkli GPS source ID'lerini tek ISR girisinde bounded olarak drain eder. Ayni source ID tekrar claim edilirse handler durur; bu durum level interrupt clear'in henuz donanima yansimadigini gosterir ve PLIC repeated source while draining WARN sayaci ile raporlanir.
  • Normal nav-bit interrupt'larinda mevcut tracking node tekrar insert edilmeye calisilmaz. Bu nedenle requested node already exists UART spam'i normal akista gorulmemelidir; per-subframe nav bits logu TRACE seviyesine alinmistir.
  • Nav solve mode'da NAV_SOLVE_TIMER, subframe fazindan sonra kac adet 20 ms navigation biti sayilacagini; dolayisiyla ABS_SAMPLE latch ve interrupt epoch'unu belirler. Her islenen event'te TOW NAV_SOLVE_TIMER * 20 ms artirilir ve GPS hafta sinirinda normalize edilir. Raw ABS_SAMPLE TOW artisini belirlemez; epoch coherence ve fractional code-boundary correction icin kullanilir. Position pseudorange'in receiver-time terimi ortak RF sample counter ile ayni anda yakalanan REM_CODE_PHASE_REG'den gelir. PPS wrapper'in 64-bit 125 MHz capture counter'i ise epoch assembly, GPS-time mailbox, PPS discipline ve holdover icin kullanilir; position WLS range datum'una girmez.
  • hardware/external/gps/rtl/gps_timer/tb/nav_solve_timer_tb.sv, hem cold/HOW alignment'i hem cached NAV_SOLVE_PHASE seed yolunu kontrol eder. Cold testleri bir kanalin digerinden tam bir subframe gec basladigi N=40, N=37, N=512 ve N=1 durumlarini; cached testleri farkli reacquisition zamanlarinda verilen global-bit phase'lerin ayni wrap epoch'una geldigini kapsar. Firmware build kurali 300-bit subframe'i veya GPS haftasindaki 30240000 navigation biti tam bolmeyen degerleri sistem konfigurasyonu olarak reddeder.
  • Tracking wrapper'daki REM_CODE_PHASE_REG donanimda IEEE-754 double degildir. RTL'de code NCO phase accumulator 46 bittir; software'e expose edilen kisim rem_code_ph[45:20] yani 26-bit integer residue'dur ve APB PRDATA[25:0] alanina zero-extend edilerek verilir. Bu yuzden firmware bu register'i uint32_t okur; uint64_t veya double* olarak MMIO okumak iki 32-bit APB read uretir ve register map ile uyumlu degildir.
  • Navigation icin kullanilan corrected receiver sample formulu:
corrected_abs_sample = (double)ABS_SAMPLE - ((double)REM_CODE_PHASE_REG / CODE_FREQ_BASIS);

REM_CODE_PHASE_REG pozitif crossing residue olarak yakalandigi icin isaret eksi kullanilir: code boundary, raw ABS_SAMPLE sample kenarindan REM_CODE_PHASE_REG / CODE_FREQ_BASIS sample kadar once gerceklesmistir. Raw ABS_SAMPLE yine gps_last_nav_solve_abs_sample icinde saklanir ve wrap/coherence delta hesaplari icin kullanilir; corrected double sadece pseudorange/navigation hesabina girer.

  • Least-squares A matrisi satirlari geometric range ile normalize edilir. Pseudorange ile normalize etmek DOP ve pozisyon hesaplamasini bozabilir.
  • WLS weight artik yalniz elevation'a bagli degildir. Subframe 1'den parse edilen URA/SVA index nominal metre degerine cevrilir; tracking mailbox'tan hesaplanan C/N0 da code-tracking kalite terimine donusturulur:
cn0_sigma_m = clamp(3.0 * 10^((45 - cn0_dbhz) / 20), 0.5, 30.0)
variance = ura_sigma_m^2
         + (3.0 m / sin(max(elevation, 10 deg)))^2
         + cn0_sigma_m^2
weight   = 1 / variance

Ilk receiver konumu henuz yoksa elevation terimi kullanilmaz; gecerli C/N0 varsa URA + C/N0 weight yine uygulanir. Azimut/elevation olustuktan sonra uc terim birlikte kullanilir. Relative weight'ler her iteration en buyuk weight 1.0 olacak sekilde normalize edilir. URA index 15 accuracy prediction saglamadigi veya svhlth alani sifir olmadigi icin uygun olmayan satellite navigation-ready snapshot'a alinmaz.

Formuldeki iki 3.0 m katsayisi GPS yayini veya ICD tarafindan verilen degerler degildir; receiver'a ozel, kart olcumleri arttikca kalibre edilmesi gereken baslangic modelleridir. Elevation terimi zenith'te 3 m, 30 derecede 6 m, 10 derece ve altinda yaklasik 17.3 m sigma uretir. C/N0 terimi 45 dB-Hz'de 3 m sigma uretir ve 0.5..30 m araliginda sinirlanir. Multipath/elevation ile C/N0 ayni belirsizligi temsil ediyorsa ileride cift sayimi onlemek icin kart verisiyle birlikte tune edilmelidir.

20 ms C/N0, Doppler ve velocity WLS

Her tracking kanali navigation bit epoch'unda 20 adet 1 ms prompt orneginden sum_i, sum_q ve wideband power (WBP) snapshot'i verir. Software narrowband/wideband power estimator'ini kullanir:

R = (sum_i^2 + sum_q^2) / WBP
C/N0_linear = 1000 * (R - 1) / (20 - R)
C/N0_dbhz = 10 * log10(C/N0_linear)

Gecersiz oranlar reddedilir; sonuc 10..60 dB-Hz araliginda sinirlanir. Bir-bit estimator jitter'i ayni PRN'in ard arda olcumlerinde software IIR'i ile alpha=0.2 kullanilarak yumusatilir.

RTL snapshot, synchronizer, APB register ve measurement-interrupt ayrintilari hardware/external/gps/rtl/trck_src/README.md icinde belgelenir. Ozetle payload tracking domaininde yaklasik 20 ms sabit tutulur; valid ve tum alanlar PCLK'e registered synchronizer ile alinir, iki ek settle cycle'dan sonra atomik APB bankina kopyalanir. Software sequence-before/payload/sequence-after okumasiyla coherence'i tekrar dogrular.

Carrier register'i signed Q7 toplam NCO frekansidir. Doppler ve range-rate donusumu:

doppler_hz = carrier_q7 / 128 - 4092000
range_rate_mps = -doppler_hz * c / 1575420000

Ham 20 ms carrier snapshot'inda kartta gorulen birkac hertz jitter, L1'de metre/saniye seviyesinde range-rate gurultusune ve zayif geometride daha buyuk receiver velocity hatasina donusur. Software ISR her PRN icin ham degeri degistirmeden korur ve iki ayri state gunceller:

PPS:  doppler_slow = 0.05 * raw + 0.95 * previous
ESKF: doppler_fast = alpha * raw + (1-alpha) * previous
      alpha = 0.05 stationary, 0.20 moving, 0.40 high acceleration

PPS yolu 50 Hz cadence'de yaklasik 0.39 s zaman sabitine sahiptir. ESKF yolu fusion motion state ve gravity-compensated linear acceleration ile bant genisligini acar. Alpha buyudugunde EWMA noise kazanci kadar WLS range-rate sigma da buyutulur; bu, FDE ve ESKF covariance'in filtre bant genisliginden habersiz kalmasini engeller. Reacquisition/PRN degisiminde eski kanal state'i kullanilmaz.

IIR donanimda da uygulanabilirdi; bunun icin kanal basina state, coefficient-multiply, rounding/saturation ve reacquisition reset kurali gerekir. Mevcut sistemde gerekli degildir: RTL'nin gorevi ham, atomik ve 20 ms sabit olcumu sunmaktir; C/N0/WLS zaten software'dedir, ham ve filtreli yollar bitstream almadan ayrilabilir. Board testinde CPU/interrupt yolu measurement kaybetmedigi icin RTL filtresinin karsilayacagi bir bant genisligi veya latency problemi de gorulmemistir. Ileride tamamen RTL icinde bir tuketici eklenirse ham register yaninda ayri bir filtered register mantikli olabilir.

Velocity WLS her uydu icin satellite velocity ve clock drift'i hesaba katar:

observation = measured_range_rate
            - satellite_LOS_rate
            + c * satellite_clock_drift
H = [-u_x, -u_y, -u_z, 1]
state = [receiver_vx, receiver_vy, receiver_vz, receiver_clock_drift_mps]
sigma_rate = clamp(30 * 10^(-C/N0_dbhz / 20), 0.05, 5.0)
weight = 1 / sigma_rate^2

Her 200 ms navigation epoch'unda iki velocity tuketicisi vardir:

adaptive range-rate -> robust velocity WLS -> fusion adapter -> ESKF
slow range-rate     -> robust velocity WLS -> PPS bias-drift predictor

Tam ham 20 ms snapshot yolu kart A/B'sinde fazla gurultulu bulundugu icin ESKF'ye yayinlanmaz. Adaptif yol sakin durumda PPS kadar dusuk gurultulu, harekette ise sabit alpha=0.05 yolundan daha dusuk gecikmelidir. PPS'in ana olcumu position WLS clock_bias_m sonucudur. Filtreli velocity yalniz bu referans-datum bias'inin 200 ms epoch'lar arasindaki turevini ongormek ve PPS kalite profilini siniflandirmak icin kullanilir. Doppler WLS'nin dorduncu receiver_clock_drift_mps state'i PPS'e dogrudan verilmez.

Position WLS ile Doppler WLS iki ayri fiziksel observation kullanir: code-phase pseudorange konum/ofseti, carrier Doppler ise hiz/frekans hatasini olcer. Klasik mutlak-pseudorange modelinde ayni receiver zaman hatasi delta_t_r(t) icin:

code WLS:     [x, y, z, b_r],       b_r    = c * delta_t_r       [m]
Doppler WLS:  [vx, vy, vz, bdot_r], bdot_r = c * d(delta_t_r)/dt [m/s]

Doppler WLS'nin dorduncu bilinmeyeni receiver clock/frequency drift'idir. Receiver oscillator 0.1 ppm hizliysa bdot_r yaklasik 29.98 m/s olur. Bu etki butun uydu Doppler'larina ortak girer; cozulmezse bir kismi vx/vy/vz receiver hareketi sanilir.

Bu projedeki position WLS gozlemi, tum kanallarca paylasilan RF sample counter ile ayni code boundary'de yakalanan code-NCO residue'u birlestirir:

S_i   = unwrap32(ABS_SAMPLE_i) - REM_CODE_PHASE_i / 1.023e6
P_i/c = (S_i - S_ref)/16.367981e6 - (T_tx_i - T_tx_ref)

ABS_SAMPLE tek basina kullanilsaydi 16.367981 MHz'in 61.095 ns periyodu 18.31 m range quantum'u olustururdu. REM_CODE_PHASE code-NCO crossing residue'u ayni latch'te sagladigi icin integer sample altina inilir; gercek dogruluk register quantization'undan cok DLL thermal noise, multipath ve uydu geometrisiyle sinirlidir. Free-running sample counter'in reset degeri ve ortak phase bu kanal farkinda yok olur; sabit startup/flight-time offset'i kullanilmaz. RF sample-frequency scale hatasi ortak bias degildir ve WLS'nin dorduncu state'i bunu tamamen silemez; fakat etkisi outage suresiyle degil, ayni epoch'taki kanallar arasi millisecond-scale receive-time farkiyla buyur. Dolayisiyla solution.clock_bias_m, saf c*delta_t_r yerine yaklasik -reference_range + c*reference_satellite_clock_correction olan referans-uyduya bagli bir datumdur. Doppler solution.clock_drift_mps ile bunun arasinda dogrudan turev kisiti kurulmaz.

Fit'ler matematiksel olarak ayridir ve solution_valid/velocity_valid bagimsizdir. Bununla birlikte velocity WLS LOS birim vektorlerini hesaplamak icin position WLS'nin guncel receiver ECEF konumunu kullanir; uydu ECEF konumlari, hizlari ve satellite clock drift'leri broadcast ephemeristen gelir. Position kabul edilip velocity reddedilebilir; velocity NIS reject ayni epoch'taki position update'ini geri almaz.

En az dort uydu gerekir. Dort uyduda velocity residual serbestlik derecesi yoktur; bes uydu ve dusuk PDOP'ta bile zayif geometri velocity gurultusunu buyutebilir. Alti veya daha fazla kullanilabilir uyduda full-fit maksimum normalized residual 3.5 sigma'yi asarsa butun tek-kanal leave-one-out adaylari cozulur; en dusuk weighted post-fit residual enerjili aday secilir. Boylece ESKF'nin aggregate 3D velocity NIS kapisina gelmeden once bozuk kanal ayrilabilir. Dort/bes uyduda redundancy yetersiz oldugu icin velocity FDE uygulanmaz.

WLS, inverse(H'WH) matrisinden ECEF velocity covariance uretir. N>4 ise weighted post-fit reduced chi-square yalniz covariance'i buyutebilir; tek bir sessiz epoch formal belirsizligi kucultemez. Sonuc velocity_valid, ECEF velocity/covariance, speed_mps, velocity_residual_rms_mps, velocity_fde_applied ve velocity_excluded_row_mask alanlarinda yayinlanir.

Fusion adapter covariance'i R_ecef_to_enu * P * R^T ile ENU'ya dondurur. 2026-07-25 sabit kart verisinde zayif geometriyle gorulen p95=6.020 m/s speed hatasi nedeniyle default alt sinirlar yatay eksenlerde 2.0 m/s, dikey eksende 3.0 m/s'dir. Bu konservatif tabanlar zayif geometri ve kartta kalan Doppler hata kuyruklarini sinirlar; formal covariance daha buyukse aynen korunur. Velocity innovation 3-DOF %99.9 NIS=16.266 kapisindan gecer. Kabul/red sayilari ve son velocity NIS'i [FUSION] UART status satirinda velocity=accepted/rejected ve vel_nis olarak yayinlanir.

  • Konum cozumu URA/elevation/CN0 agirlikli WLS kullanir; raporlanan DOP degerleri ise bu normalize relative weight'lerden uretilmez. GDOP/PDOP/TDOP agirliksiz geometri matrisinden, HDOP/VDOP de ayni covariance ECEF'ten lokal ENU eksenlerine donduruldukten sonra hesaplanir. Boylece loglanan degerler klasik geometrik DOP anlamini korur.
  • Troposfer correction her satellite icin bagimsiz hesaplanir ve dort satellite ile de aktiftir. Ilk konumsuz iteration sabit baslangic correction'i kullanir; receiver konumu olustuktan sonra elevation ve metre cinsinden receiver height modele verilir. Model kilometre bekledigi icin height donusumu yapilir ve dusuk elevation'da gecerli olabilen 5 m uzeri delay degerleri artik keyfi olarak sifirlanmaz.
  • Troposfer modelindeki mevcut 1013 hPa basinc, 293 K sicaklik ve %50 bagil nem degerleri gecici fallback sabitleridir. Ileride gercek barometre/basinc, sicaklik ve nem sensorleri sisteme baglanacak; model her navigation cozumunde son gecerli sensor snapshot'indan beslenecektir. Sensor arayuzu modele basinci hPa, sicakligi K ve bagil nemi % olarak vermeli; birim donusumleri sensor surucusu ile navigation modeli arasinda tek bir yerde yapilmalidir. Sensor verisi henuz hazir degilse veya kullanilamiyorsa mevcut sabit atmosfer degerleriyle correction devam edecektir.
  • Least-squares veya DOP inverse matrisi singular/invalid olursa firmware artik print_mat(NULL) veya NULL matrix uzerinden load fault uretmez. Bu epoch sessizce skip edilir; ayrinti sadece DEBUG_TRACE seviyesinde gorulur ve onceki gecerli position bozularak 20 km ziplamaya zorlanmaz.

Navigation Veri Yolu Notlari

  • Azimut ve elevasyon hesaplari aktif olarak elevation/URA/CN0 weight ve Klobuchar correction icin kullanilir. az ve el heap matrisleri de doldurulur fakat mevcut solver bu matrisleri daha sonra okumaz. Satellite bazli metric arayuzu eklendiginde bu degerler matris yerine kalici metric kaydina tasinabilir.
  • rho0/range_t eski range ve range-rate yolundan kalmistir. computeRange() icinde rho alanlarini dolduran eski blok kapali oldugu icin mevcut position-only akista rho0 allocate edilir fakat sonuc uretmez.
  • satpos() analitik satellite ECEF velocity ve clock drift hesaplar; computeRange() bunlari velocities ve clockDrift matrislerine yazar. Position WLS bu alanlari kullanmaz; Doppler velocity WLS kullanir.
  • computeRange() icinde aktif parametreler psTVLTime, sat_no, eph, clockCorr, clockDrift, satellitePositions ve velocities'dir. rho, ionoutc, xyz ve tempPos eski genis API'den kalmistir. Ionosphere correction receiver azimut/elevasyonu hazir oldugunda WLS icinde uygulanir.
  • Ephemeris alanlarinin mevcut isimleri ile ICD anlamlari su sekildedir: omgdot gercekte Omega0, omg0 gercekte argument of perigee omega, omgkdot gercekte OmegaDot degeridir. satpos() bunlari dogru matematiksel yerde kullanir; konu su an hesap hatasi degil, ileride yapilacak kontrollu isim duzeltmesidir.
  • POSTPONE_TOW=0.180 mevcut RTL'nin dokuzuncu takip eden navigation bitinde yaptigi teslimi duzeltir. satpos() ve PPS receive-time anchor bu degeri tam bir kez ve ayni firmware surumunde kullanir.
  • Ilk nav-solve interrupt'i geldiginde o anda allocated, hardware busy, lock'lu, ephemeris-valid, measurement-fresh ve phase-seeded kanallar epoch'un sabit bekleme maskesine alinir. Unlock interrupt'i gelen kanal artik tracked olmadigi icin bekleme maskesinden cikarilir; epoch ortasinda navigation-ready olan yeni kanal ise aktif maskeyi buyutmez ve sonraki epoch'tan itibaren beklenir. Kalan beklenen kanallarin tamami gelirse snapshot son interrupt'ta hemen yayinlanir. 30 ms holdoff dolarsa veya daha yeni fiziksel epoch baslarsa eksik eski epoch WLS calistirilmadan discard edilir; eski ve yeni olcumler birlestirilmez.
  • Interrupt bekleme maskesi tamamlandiktan sonra frozen kanallarin tumu ortak TOW/ABS_SAMPLE kumesinde degilse epoch reddedilir. Selector'in buldugu daha kucuk alt kume yalniz diagnostic bilgidir ve WLS girdisi olamaz.
  • Dort uydu 3D konum + receiver clock bias icin minimum ve yeterlidir. Bu durumda dof=N-4=0 oldugu icin WLS konumu publish edilir fakat residual chi-square integrity bayragi false kalir. Bes veya daha fazla uyduda publish icin mevcut chi-square gecis kosulu uygulanir. Boylece solution_valid ile integrity_available/pass ayni kavram olarak kullanilmaz.
  • Broadcast SV health filtresi uygulanir. Sonraki integrity adimi ephemeris age/fit interval ve post-fit residual metriklerini eklemektir. En az bes satellite olmadan tek hatali olcumu residual ile guvenilir sekilde ayirmak mumkun degildir.

Debug Mesajlari

  • Yeni kategorili log macro yapisi eklendi:
GPS_LOG(level, category, ...)
  • Kategoriler:
    • ACQ
    • TRK
    • ISR
    • NAV
    • SCHED
    • MEM
    • HWREG
    • FUSION
    • LOCATION
  • Debug seviyeleri kumulatiftir; secilen seviye kendisini ve daha dusuk seviyeleri gosterir:
GPS_DEBUG_LEVEL Eklenen cikti
1 Temel telemetri: ham GPS/WLS [LOCATION] source=gps satirinda DOP ile birlikte velocity_valid, speed ve velocity_rms; gecerliyse ESKF [LOCATION] source=imu_corrected; sifir tabanli donanim kanal numaralarini tasiyan [TRK] tracked satellites=... prn_indices=[...] (0 = GPS PRN G01). Baslangicta fusion/IMU konfigurasyonu ve periyodik [FUSION] NIS/kabul-red durumu da gorulur.
2 Gelecekteki ek status ayrintilari icin ayrilmistir. Su an level 2'ye ozel mesaj yoktur; pratikte level 1 ile ayni ciktiyi verir.
3 Level 1'e ek olarak acquisition/tracking/navigation durum gecisleri, warning/error mesajlari ve integrity bilgileri.
4 Level 3'e ek olarak performans, scheduler, nav-bit/parser, uydu/olcum ve dusuk seviye TRACE tanilari. UART yuku en yuksek seviyedir.

Makefile varsayilanlari GPS_DEBUG=1 ve GPS_DEBUG_LEVEL=4'tur. Bu nedenle dogrudan parametresiz make, debug loglarini derler ve dort seviyenin tamamini acar. Yalniz temel GPS/ESKF konumu ve tracked-satellite telemetrisi icin:

make GPS_DEBUG=1 GPS_DEBUG_LEVEL=1 GPS_ESKF_ENABLE=1

Butun UART debug mesajlarini derleme disinda birakmak icin GPS_DEBUG=0 kullanilir. Komut satirinda veya ust build'de verilen degerler ?= ile tanimlanan Makefile varsayilanlarini ezer.

  • Core ACQ/TRCK/ISR path'inde yuksek frekansli uncategorized debug print'ler azaltildi.

Memory Safety

  • ISR path'inde dynamic allocation yok.
  • Event queue static/fixed-size.
  • ACQ engine index, tracking channel index ve PRN icin defensive bounds check'ler eklendi.
  • Linked-list allocation path'lerinde malloc failure kontrolu eklendi.
  • Dynamic allocation halen linked-list ve navigation/math tarafinda mevcut, fakat ISR icinden cagrilmiyor.

Register Map Dogrulama

XLSX register dokumanlarina gore dogrulananlar:

  • ACQ offset'leri firmware ile uyumlu:
    • control 0x00
    • PRN 0x04
    • peak 0x08
    • code phase 0x0c
    • absolute sample 0x10
    • status 0x14
    • doppler 0x18
  • ACQ status bitleri:
    • acquired bit
    • busy bit
  • TRCK offset'leri firmware ile uyumlu:
    • control 0x00
    • PRN 0x04
    • code phase 0x08
    • absolute sample 0x0c
    • status 0x10
    • doppler 0x14
    • nav data 0x18..0x3c
    • timeout 0x40
    • nav timer 0x44
    • nav solve phase seed 0x48 (NAV_SOLVE_PHASE; write pulse timer'i global 20 ms bit fazinda COUNT durumuna alir)
    • remaining code phase 0x4c
    • measurement meta 0x50
    • measurement sequence 0x54
    • measurement carrier Q7 0x58
    • measurement absolute sample 0x5c
    • measurement remaining code phase 0x60
    • measurement prompt sum-I 0x64
    • measurement prompt sum-Q 0x68
    • measurement WBP low/high 0x6c/0x70
  • TRCK measurement control/status bitleri:
    • control bit 13: measurement interrupt enable
    • control bit 14: measurement flag enable
    • status bit 7: measurement flag
  • Measurement meta [31:24]=version(1), [12:8]=sample count, bit 2 lock, bit 1 navigation bit ve bit 0 valid alanlarini tasir.
  • Wrapper payload'i atomik register eder. Software yine de coherent read icin sequence register'ini payload'dan once ve sonra okuyup iki degerin esit oldugunu kontrol eder.
  • Interrupt clear davranisi write-one toggle/clear seklinde ele alindi.
  • TRCK XLSX icinde NAV_SOLVE flag aciklamasi ambiguous/copy-paste gibi gorunuyor; RTL davranisina gore nav timer solve flag olarak yorumlandi.

Donanima Yeni ACQ/TRCK IP Eklenirse Software'de Nereler Degisir

Donanimda ACQ veya TRCK instance sayisi, base address'i, stride'i veya interrupt source'u degisirse once software BSP map'i guncellenmeli. Bu proje icin ana software giris noktasi:

soc/software/bsp/include/bsp/soc.h

Bu dosya generated ise kalici degisiklik icin generator veya hardware config tarafindaki source-of-truth da guncellenmeli; aksi halde BSP tekrar generate edilince manuel degisiklikler kaybolur.

Mevcut BSP GPS map'i:

#define BSP_GPS_ACQ_BASE          0x10020000UL
#define BSP_GPS_TRCK0_BASE        0x10021000UL
#define BSP_GPS_TRCK_STRIDE       0x00001000UL
#define BSP_GPS_TRCK_COUNT        9UL
#define BSP_GPS_ACQ_IRQ           1UL
#define BSP_GPS_TRCK0_IRQ         2UL
#define BSP_GPS_TRCK_IRQ_STRIDE   1UL

ACQ IP Eklemek

Uniform ACQ address/IRQ stride varsa soc.h icinde su define'lar verilmelidir:

#define BSP_GPS_ACQ_BASE          0x10020000UL
#define BSP_GPS_ACQ_COUNT         2UL
#define BSP_GPS_ACQ_STRIDE        0x00001000UL
#define BSP_GPS_ACQ_IRQ           1UL
#define BSP_GPS_ACQ_IRQ_STRIDE    1UL

Eger ACQ engine'ler tracking bolgesinden once arka arkaya yerlestiriliyorsa BSP_GPS_TRCK0_BASE de yeni ACQ penceresinden sonra baslamalidir. Ornek iki ACQ engine icin:

#define BSP_GPS_ACQ_BASE          0x10020000UL
#define BSP_GPS_ACQ_COUNT         2UL
#define BSP_GPS_ACQ_STRIDE        0x00001000UL
#define BSP_GPS_TRCK0_BASE        0x10022000UL
#define BSP_GPS_ACQ_IRQ           1UL
#define BSP_GPS_TRCK0_IRQ         3UL

ACQ tarafinda normal durumda src/gps/gps_ip.c icinde manuel pointer eklemek gerekmez. Startup'ta gps_init_acq_tables() su helper'lari kullanarak tabloyu doldurur:

GPS_ACQ_IP_BASE_ADDR(index)
GPS_ACQ_INTR_LINE(index)

ACQ engine sayisi firmware tarafinda tek noktadan header/gps/gps_ip_defines.h icindeki ACQ_ENGINE_COUNT ile kontrol edilir. Varsayilan olarak BSP_GPS_ACQ_COUNT kullanilir. Donanim/BSP dogru count veriyorsa ekstra override gerekmez.

Eger ACQ address veya IRQ offset'leri uniform degilse, mevcut base + index * stride modeli yeterli degildir. Bu durumda:

  • soc.h icinde her ACQ icin explicit base/IRQ define'i eklenmeli, ornek BSP_GPS_ACQ0_BASE, BSP_GPS_ACQ1_BASE.
  • header/gps/gps_ip_defines.h icindeki GPS_ACQ_IP_BASE_ADDR(index) ve GPS_ACQ_INTR_LINE(index) helper'lari explicit tablo veya switch ile guncellenmeli.
  • src/gps/gps_ip.c icindeki gps_init_acq_tables() explicit base/IRQ tablolarini kullanacak sekilde guncellenmeli.

ACQ register layout'u degisirse sadece count/base degistirmek yetmez. Su alanlar da XLSX/RTL'e gore kontrol edilmelidir:

  • gps_acq_t struct layout'u,
  • GPS_ACQ_* control bitleri,
  • GPS_ACQ_STATUS_POS,
  • GPS_ACQ_BUSY_POS,
  • interrupt clear/pending semantics.
  • PRN encoding'i. Mevcut donanim 0..31 PRN index bekliyor.

TRCK IP Eklemek

Uniform tracking channel address/IRQ stride varsa soc.h icinde su define'lar guncellenmelidir:

#define BSP_GPS_TRCK0_BASE        0x10022000UL
#define BSP_GPS_TRCK_STRIDE       0x00001000UL
#define BSP_GPS_TRCK_COUNT        10UL
#define BSP_GPS_TRCK0_IRQ         3UL
#define BSP_GPS_TRCK_IRQ_STRIDE   1UL

Tracking tarafinda mevcut firmware bazi yerlerde hala manuel channel entry'leri kullaniyor. BSP_GPS_TRCK_COUNT arttirilinca su dosyalarda yeni kanal icin entry eklenmelidir:

  • header/gps/gps_ip_defines.h
    • TRCK9_IP_BASE_ADDR, TRCK10_IP_BASE_ADDR, ...
    • TRCK9_INTR_LINE, TRCK10_INTR_LINE, ...
  • src/gps/gps_ip.c
    • trck9_ip, trck10_ip, ...
    • trck_ips[] array'ine yeni pointer'lar,
    • trck_ips_intr_lines[] array'ine yeni IRQ line'lar.
  • src/gps/gps_interrupt_handlers.c
    • dosya sonundaki DEFINE_TRCK_INTR_HANDLER(9), DEFINE_TRCK_INTR_HANDLER(10), ... wrapper'lari.

GPS_TRCK_IP_COUNT, BSP_GPS_TRCK_COUNT uzerinden gelir ve loop/array boyutlari bu count'u kullanir. Ancak yukaridaki manuel array initializer'lar ve handler wrapper'lari yeni count ile uyumlu olmak zorundadir.

Eger TRCK address veya IRQ offset'leri uniform degilse, mevcut BSP_GPS_TRCK0_BASE + index * BSP_GPS_TRCK_STRIDE ve BSP_GPS_TRCK0_IRQ + index * BSP_GPS_TRCK_IRQ_STRIDE modeli yeterli degildir. Bu durumda:

  • BSP'ye her tracking channel icin explicit base/IRQ define'i eklenmeli.
  • header/gps/gps_ip_defines.h icindeki TRCKn_IP_BASE_ADDR ve TRCKn_INTR_LINE define'lari explicit degerlerden gelmeli.
  • src/gps/gps_ip.c icindeki trck_ips[] ve trck_ips_intr_lines[] array'leri bu explicit define'lari kullanmali.

TRCK register layout'u degisirse su alanlar XLSX/RTL'e gore tekrar kontrol edilmelidir:

  • gps_trck_t struct layout'u,
  • GPS_TRCK_* control bitleri,
  • GPS_TRCK_* status bitleri,
  • nav data register araligi,
  • timeout/nav timer offset'leri,
  • interrupt clear/pending semantics.

Degisiklik Sonrasi Kontrol Listesi

  • ACQ register window'lari TRCK register window'lari ile cakismiyor mu?
  • PLIC source ID'leri donanim interrupt map'i ile birebir ayni mi?
  • BSP_GPS_ACQ_IRQ, BSP_GPS_TRCK0_IRQ ve stride degerleri PLIC tarafinda beklenen source ID'lere gidiyor mu?
  • ACQ_ENGINE_COUNT ve GPS_TRCK_IP_COUNT yeni donanim sayilari ile uyumlu mu?
  • GPS_EVENT_QUEUE_SIZE, toplam ACQ + TRCK interrupt yogunlugu icin yeterli mi?
  • Build sonrasi make clean all basarili mi?
  • Board uzerinde ACQ completion, TRCK nav bits, unlock ve nav solve interrupt'lari tek tek dogrulandi mi?

Build Validation

Degisikliklerden sonra build alindi:

make clean all

Build basarili oldu ve ELF uretildi:

build/gps_system.elf

Kalan warning'ler:

  • mevcut volatile qualifier warning'leri,
  • nav/math dosyalarinda unused variable/parameter warning'leri,
  • linker tarafinda RWX LOAD segment warning'i,
  • eski ASCII/comment formatting warning'i.

20 ms tracking measurement degisiklikleri icin host/Linux ve RTL regression komutlari:

make -C soc/software/gps_system/tests run
make -C soc/software/gps_system/tests sanitize
make -C hardware/external/gps/rtl/trck_src/tb test

run ve sanitize, C/N0 estimator'i, Q7 ham/filtreli Doppler-range-rate donusumu, coherent mailbox read'i, weighted velocity WLS/covariance, tek-kanal robust FDE ve satellite velocity/clock drift hesaplarini kapsar. Fusion regression'i ayrica ECEF->ENU velocity/covariance rotasyonunu, velocity NIS kabul/redini ve ayni epoch position+velocity delayed replay esdegerligini kapsar. RTL Questa/vlog-vsim testi prompt akumulasyonu, 20 ms hold, synchronizer settle, atomik APB capture ve interrupt yolunu kapsar.

2026-07-25 Genesys2 C/N0 ve Doppler Board Dogrulamasi

Kart ve GPS anteni sabitken canli tracking mailbox olcumlerinde:

  • M=20, valid=1 ve lock=1 goruldu.
  • C/N0 kanala gore yaklasik 38..46 dB-Hz araligindaydi; lock durumundaki canli L1 C/A sinyali icin makul ve PRN'ler arasinda ayirt ediciydi.
  • Doppler kanala gore yaklasik -3.9 kHz..+3.0 kHz araligindaydi. Uydu hareketi nedeniyle farkli PRN'lerde hem pozitif hem negatif deger gorulmesi beklenen fiziksel davranistir.
  • Ham kanal Doppler jitter'i yaklasik 6..13 Hz RMS, yani L1'de 1.2..2.5 m/s range-rate jitter'iydi. alpha=0.05 software IIR sonrasi kanal standard deviation'i yaklasik 1.1..2.2 Hz oldu; 3x..6x iyilesme olculdu.
  • Ayni epoch'un offline karsilastirmasinda C/N0-weighted velocity WLS 2.364 m/s, equal-weight cozum 4.120 m/s speed verdi. Bu tek epoch kalite agirliginin dogru yonde fayda ettigini gosterir; genis veri seti kalibrasyonunun yerine gecmez.
  • IIR yuklu firmware'de 5 uydu ve PDOP=13..17 ile 213 velocity sonucunun mean/median/p95/max speed degerleri sirasiyla 2.495/2.158/6.020/11.344 m/s oldu. Sabit alici icin sifir degildir; dusuk uydu sayisi, kotu geometri ve code/ephemeris hatalari halen baskindir.
  • Satellite LOS rate cikarilip satellite clock drift eklendiginde kanallar ortak yaklasik 129.9..130.8 m/s receiver clock-drift teriminde toplandi. Bu, Doppler isaretinin ve velocity observation modelinin fonksiyonel olarak tutarli oldugunu dogruladi.
  • Kesintisiz kosuda event_overflow=0, plic_drain_limit=0, plic_repeat=0, measurement_missed=0 ve measurement_invalid=0 kaldi. Debugger ile tekrar tekrar halt edilen onceki olcumlerde gorulen missed sayilari donanim mailbox/CDC kaybi olarak yorumlanmamalidir.

C/N0 ve Doppler verisi fiziksel olarak makul, IIR velocity gurultusunu azaltiyor ve C/N0 weighting ornek epoch'ta sonucu iyilestiriyor. Buna ragmen position WLS'deki pseudorange/code-phase hata ve zayif geometriyi tek basina duzeltmiyor. Doppler velocity artik ESKF state update'ine baglidir; formal covariance, kart verisine dayali floor ve ayri NIS gate ile asiri guven sinirlanir. Yukaridaki board istatistikleri ESKF entegrasyonundan onceki velocity dogrulamasidir; entegrasyon sonrasi vel_nis ve velocity=accepted/rejected saha sonucu bir sonraki bolumdedir.

2026-07-26 Genesys2 PPS ve Doppler/ESKF A/B

Kart sabitken once tam ham 20 ms snapshot -> robust WLS -> ESKF yolu olculdu. Son 120 PPS penceresinde ham WLS speed RMS 9.17 m/s, p95 16.71 m/s ve raw-FDE 86/120 oldu. Yavas alpha=0.05 PPS yolu ayni pencerede 0.92 m/s RMS, 1.63 m/s p95 ve 0/120 FDE verdi. ESKF+ZUPT fused hizi dusuk tutsa da bu sonuc tam ham yolun hareketli platform icin guvenli oldugunu dogrulamadi.

Bu nedenle ESKF icin yukarida tarif edilen ayri adaptif yol uygulandi. Ayni kartta 240 epoch'luk yerlesmis pencerede alpha=0.05, speed RMS 0.48 m/s, p95 0.83 m/s, FDE 0/240 olculdu. Son 180 saniyede ESKF velocity kabul/red farki 892/0, velocity NIS median/p95/max 0.028/0.111/0.180, fused speed RMS 0.0052 m/s oldu. IMU overflow sayaci bu pencerede 15 olarak sabit kaldi; olcum telemetrisi yeni kayip uretmedi.

PPS predictor, yeniden boot etmeden 40 saniyelik kapali/acik segmentlerle A/B yapildi (GPS_PPS_DOPPLER_PREDICTOR_AB_UPDATES=200, yalniz tanisal build). Her segmentin ilk bes saniyesi atildiginda predictor acik segmentlerde software clock-bias innovation RMS 12.52 m, kapali segmentlerde 46.48 m oldu. Hardware phase p95 acikken 51.02 ns, kapaliyken 58.21 ns idi. Tek acik segmentte gorulen bir -216.48 ns one-epoch phase transient'i lock kaybi olusturmadi; bu nedenle physical-pin jitter sonucu olarak yorumlanmaz. Production default predictor acik, A/B toggling kapali (0) kalir.

Son olarak adaptive-pps-final-20260726 production image'i PREDICTOR_ENABLE=1, PREDICTOR_AB_UPDATES=0 ile RAM'den karta yuklendi. Acquisition/coarse baslangici dislandiktan sonraki 120 lock status orneginde:

  • predictor tum orneklerde 1, ESKF alpha sabit kartta tum orneklerde 0.05,
  • adaptive velocity-WLS speed RMS/p95 0.52/0.92 m/s, FDE 0/120,
  • ESKF velocity kabul/red farki 448/0, velocity NIS p95/max 0.139/0.341, fused speed RMS 0.0061 m/s,
  • PPS software clock innovation RMS 12.36 m,
  • internal hardware phase RMS ve p95-absolute 28.50/58.36 ns, lock kaybi 0/120,
  • IMU overflow sayaci 13..13, tracking measurement missed sayaci 0..0 kaldi.

Bu hw_phase, APB status'taki son commit residual'idir; fiziksel PPS pin jitter'i degildir. Dolayisiyla 15-20 ns pin hedefinin saglandigi bu logdan iddia edilmez; scope veya time-interval counter ile ayri olculmelidir.

2026-07-08 ACQ Debug Notu

make fpga_debug_load APP=gps_system GDB=/usr/bin/gdb-multiarch sonrasi GDB ile dogrulanan durum:

  • Scheduler acq_start() fonksiyonuna giriyor; yani acquisition start yazisi yapiliyor.
  • ACQ0 register snapshot:
    • PRN_NUMBER=0
    • STATUS_REG=0x2
    • ACQ_BUSY=1
    • PLIC pending bit yok
    • ACQ internal pending bit yok
  • Bu durum firmware'in acquisition'i baslattigini, fakat ACQ RTL'in henuz acquisition-end interrupt uretmedigini gosterir.

RTL'de acq_top.sv akisi:

  • ACQ_START geldikten sonra ACQ S_WR_DATA state'ine gecer ve busy=1 olur.
  • S_WR_DATA cikisi afe_clk domainindeki sample_align_i ve RF buffer write tamamlanmasina baglidir.
  • rf_clk board uzerinde yoksa veya sample_align_i uretilmiyorsa wr_mem_end gelmez.
  • Bu durumda ACQ busy high kalir ve acq_end uretilmedigi icin ACQ interrupt gelmez.

Bu timer/scheduler yavasligi degildir. Firmware start ediyor; tamamlanma icin RF/AFE clock ve sample-align path'i board uzerinde dogrulanmalidir.

Kalan Riskler ve Board-Level Test Ihtiyaci

  • Mevcut donanim/BSP tek ACQ engine expose ediyor. Birden fazla ACQ engine icin hardware/BSP register map'i guncellenmeli.
  • ACQ normal completion tamamen acq_end interrupt'ina baglidir. RF clock veya sample-align yoksa ACQ busy stuck kalir; firmware bunu warning olarak raporlar ama ACQ'yi timeout ile tamamlanmis saymaz.
  • Event queue dolarsa tracking event kaybi olabilir; overflow sayiliyor ve loglaniyor.
  • ACQ interrupt queue doluysa shadow result korunuyor, fakat cok sik ACQ completion durumunda board uzerinde stres test gerekli.
  • Navigation freshness kontrolu eklendi, fakat tum kanallar icin tam epoch-aligned double-buffer modeli eklenmedi.
  • CLINT timer cadence, PLIC interrupt siralamasi ve ACQ/TRCK back-to-back interrupt davranisi board uzerinde dogrulanmali.

PPS Entegrasyonu

  • PPS APB periferigi 0x1002a000 adresindedir ve PLIC interrupt kullanmaz.
  • Her tracking wrapper, yalniz nav_solve_timer_reached olayinda PPS capture darbesi uretir. Bu olay ABS_SAMPLE ve REM_CODE_PHASE latch'iyle aynidir; subframe-ready PPS timestamp'i olusturmaz. Darbe ve PPS raw counter ayni 125 MHz domain'de latch edilir; stable counter APB'ye tasindiktan bir PCLK sonra sequence publish edilir. Boylece 8 ns darbe 50 MHz PCLK tarafinda kacmaz ve firmware sequence/data/sequence kontrolu mixed payload kabul etmez.
  • PPS reset'i RF/MMCM-ready reset'inden ayridir. RF kablosu veya sample clock kayboldugunda acquisition/tracking DSP resetlenebilir, fakat 125 MHz raw PPS counter, disciplined accumulator ve holdover rate SoC resetine kadar yurur.
  • leastSquaresSTD() ayni basarili epoch'un [x, y, z, b] sonucunu verir. Ilk cozumde en erken corrected-ABS kanali zaman datum'u secilir; ayni SVID coherent snapshot'ta kaldigi surece referans korunur. Receive-time ankraji:
T_rx = TOW_ref + POSTPONE_TOW - b/c
  • POSTPONE_TOW=0.180 s, mevcut tracking RTL'nin parity kontrolunu dokuzuncu takip eden bitte tamamlamasinin gecikmesidir ve yazilim tarafinda tam bir kez uygulanir. PPS RTL bu degeri tekrar eklemez. Tracking RTL sekizinci bitte validate edecek sekilde degistirilirse bu sabit ayni release'de 160 ms'ye geri alinmalidir.
  • Bu GPS zamani, ayni kalici referans kanalinin 125 MHz capture counter'i ile atomik APB mailbox uzerinden eslenir. Ilk cozum coarse-align, sonraki cozumler Q2.46 dusuk bant genislikli PI rate discipline yapar. WLS/APB calisma suresi faz hatasi olarak kullanilmaz.
  • Tracking capture olayi integer RF sample kenarinda olustugu halde WLS, ABS_SAMPLE - REM_CODE_PHASE/1.023e6 alt-sample zamanini kullanir. Yazilim mailbox EPOCH_COUNTER degerinden ayni fractional sample gecikmesini round(fraction * 125e6/16.367981e6) ile cikarir. Bu fractional duzeltme yalniz PPS epoch/mailbox ankrajini ayni code boundary'ye getirir; position WLS zaten dogrudan fractional RF observation'i kullandigi icin 125 MHz capture quantization'i XYZ hesabina girmez.
  • HOW/sample sureklilik kontrolu kartin fiziksel 16.367981 MHz RF frekansini kullanir. Periyodik nav-solve TOW'u receiver propagation/range-rate degisiminden uretilmez; sample farki yalniz olay numarasini dogrular ve TOW bilinen 200 ms transmit-time grid'ine snap edilir.
  • Donanimdaki kontrol filtresi PI loop'un kendisidir; ayri bir phase-IIR veya D terimi yoktur. Yazilim TDOP/GDOP, formal clock-bias sigma, kullanilan uydu sayisi, C/N0, chi-square/FDE ve Doppler velocity residual'ina gore acquire, precision, robust ve holdover profillerini histerezisle secer. Profil gecisinde Kp, Ki, max-slew ve v2.2 lock esikleri bir sonraki mailbox commit'inde birlikte yakalanir; normal geciste integrator korunur. Lock almak icin bes ardisik residual 64 ns icinde olmalidir; uretim release esigi tek seyrek WLS/capture sicrama pulse kaybettirmesin diye 1.024 us tutulur. Watchdog, quality holdover ve 20 ppm slew clamp buyuk arizalari ayri olarak sinirlar.
  • Yazilim filtresi PI'nin yerine gecmez. Yalnizca 5 Hz WLS clock-bias olcumunde filtreli-Doppler velocity'den turetilen referans-datum drift prediction, bounded innovation ve aykiri olcum reddi yapar. Position WLS clock_bias_m ana PPS olcumu olarak kalir; Doppler yalnız prediction'dir. Ilk yerlesmede commit'ler coarse ve PPS invalid tutulur. Periyodik background watchdog iki saniye yeni referans gelmezse cikis validligini holdover ile kapatir; fakat ayni referans geri gelirse Doppler prediction ve donanim PI state'i 30 saniyeye kadar korunur. Referans SVID degisimi veya 30 saniyeyi asan bosluk coarse re-anchor yapar. PPS v2.2 holdover aktifken normal PI commit'ini uygulamadigi icin recovery'de butun shadow word'ler once yazilir, holdover commit toggle'inin hemen oncesinde birakilir ve ilk taze olcum PI'ya girer. Fiziksel PPS held rate ile kesintisiz yurur; STATUS.VALID PI apply'dan yalniz bounded synchronizer/commit-pipeline gecikmesi kadar once gorunebilir.
  • PPS v2.2 LOOP_CONFIG register'i 0x88 adresindedir. Eski v2.1 bitstream algilanirsa yazilim bu register'a dokunmaz; dinamik Q2.46 Kp/Ki/max-slew yazimi mevcut register'larla calismaya devam eder.
  • 125 MHz fiziksel kenar grid'i 8 ns'dir. Generated VCU118 ve Genesys2 top'lari gps_pps output'unu expose eder. VCU118 icin PPS PMOD1/J53.8 (R29), Genesys2 icin PMOD JC10 (AK28) pinine atanmistir. Board testinde clock-tree/I/O/output-buffer gecikmesi olculup kalibre edilmelidir.

PPS Sentetik Dogrulama (2026-07-25)

Python modeli ve Linux C testi ayni Q32/Q46 PI, kalite histerezisi, Doppler prediction, holdover ve lock politikasini kullanir. Ayrica donanim phase-IIR kullanilmaz. Test matrisi temiz/320 ns WLS noise, 650 ns zayif geometri, baslangicta 1.1 us noise sonra temiz sinyal, aralikli 900 ns noise burstleri, uydu kaybi ve geri gelmesi, 15 saniyelik state-korumali ve 30 saniye ustu coarse WLS kesintisi, Doppler kaybi, multipath basamagi, profil sicramalari, +18 ppm slew siniri ve +25 ppm sinir disi osilatoru kapsar.

Monte Carlo sonucunda hedeflenen senaryolarin tamami lock/recovery sagladi. Normal kart-noise senaryosunda 50/50 kosu lock oldu ve 125 MHz edge quantization dahil bir saniyelik jitter p95 13.62 ns bulundu. Baslangicta yuksek noise sonra temiz sinyal senaryosunda 30/30, noise-burst senaryosunda 30/30, iki uydu-kaybi araligi bulunan senaryoda 30/30 recovery goruldu. +18 ppm 30/30 yerlesirken +25 ppm, 20 ppm clamp disinda oldugu icin 0/10 lock uretti; yani saturation yanlis-valid olusturmadi. Bunlar sentetik loop/jitter sonuclaridir; mutlak UTC/GPS faz dogrulugu icin karttaki sabit capture/I/O offset'i ve gercek multipath halen osiloskop/time-interval olcumu gerektirir.

PPS Kart Dogrulamasi (2026-07-25, Genesys2)

  • Kartta okunan RTL surumu 0x00020200; dinamik LOOP_CONFIG=0x08800800 mailbox'i ve diagnostic snapshot calisti.
  • Eski 16.368 MHz zaman donusumu 6 saniyede yaklasik 6.97 us hata uretiyordu. Fiziksel 16.367981 MHz donusumu ve 200 ms transmit-grid snap sonrasinda 6 saniyelik mikro-saniye sawtooth kayboldu.
  • Fractional capture duzeltmesi kartta epoch'a gore 0..64 ns uygulandi (son deger 8 ns grid'ine yuvarlanir). Duzeltmeden onceki uzun lock penceresinde internal commit residual'i yaklasik 20.9 ns median mutlak ve 62.8 ns p95 idi. Duzeltmeden sonraki precision penceresinde median mutlak residual yaklasik 17 ns, RMS 26 ns ve p95 yaklasik 55 ns oldu.
  • Ilk kart yaziliminda iki saniyeyi asan normal coherent-WLS scheduling bosluklari filtreyi coarse resetliyordu; bu PPS'in periyodik olarak 4--5 update invalid kalmasina yol acti. Esigi validlik watchdog'undan ayirdiktan sonra seq=10551 -> 10561 araliginda pulse=2174 -> 2186 ile yaklasik 12 saniyelik gercek kart boslugu goruldu. Buna ragmen mode=tracking, locked=1, status 0x80f ve PI integrator kesintisiz kaldi; coarse commit veya faz basamagi olusmadi.
  • Her WLS commit'inin loglandigi pps-fullrate tanisinda seq=16090..17631 arasinda 1514 commit izlendi. Ilk lock'tan sonra coarse veya unlock olmadi. seq>=16250 icin 1355 locked residual'in median mutlak degeri 17.29 ns, RMS'i 34.17 ns, p95'i 52.76 ns, p99'u 67.24 ns oldu. Bu sayilar fiziksel PPS pin jitter'i degil, 5 Hz WLS commit residual'idir.
  • Ayni tanida quality'nin robust'a dustugu tek bir commit'te 750.93 ns residual goruldu ve bir sonraki 200 ms commit'te normale dondu. Robust 1.024 us release esigi gereksiz pulse kaybini onledi. Daha once precision 512 ns release ile gorulen tek kisa unlock nedeniyle uretim precision esigi de 1.024 us yapildi; acquisition kosulu bes ardisik <=64 ns olarak kaldi. Son pps-final kart okumasinda LOOP_CONFIG=0x05800800, CONTROL=0x3, valid/locked status 0x80f goruldu ve kontrollu holdover denemesinden sonra ilk normal commit ile control/valid geri geldi.
  • Bu hw_phase, 5 Hz WLS reference commit residual'idir ve dogrudan fiziksel 1PPS kenar jitter'i degildir. Ayni pencerede proportional rate terimi yaklasik 9.6 ppb RMS idi; sentetik 125 MHz edge modeli kart-noise senaryosunda bir saniyelik jitter p95 13.62 ns veriyor. 15--20 ns fiziksel hedef makuldur fakat pin uzerinde scope/TIC ile GPS-disiplinli harici referansa karsi olculmeden saglandi diye raporlanmamalidir.