Integrate asynchronous GPS IMU fusion

This commit is contained in:
2026-07-16 23:49:43 +03:00
parent 38a96dd88f
commit 7cc3eb2a54
80 changed files with 3901 additions and 553 deletions
+169 -35
View File
@@ -2,25 +2,87 @@
Bu notlar GPS bare-metal yaziliminin VCU118 Rocket SoC portu ve interrupt debug sureci icin yazildi.
## Uygulama akisi ve dosya sinirlari
Firmware giris noktasi [gps_system.c](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.
```text
gps_system.c
-> initialize GPS, IMU and optional ESKF
-> wfi
-> timestamped IMU queue -> navigation_fusion prediction
-> GPS events -> coherent WLS -> gps_nav_solution_t
-> valid GPS -> fusion_gps_measurement_t -> navigation_fusion update
-> navigation_fusion_output_t -> corrected lat/lon publish
```
Kaynak ve public header agaci ayni modul sinirlarini izler:
```text
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.h`dir.
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.
## Generic IMU Mimarisi (TDK ve ST)
GPS/ESKF artik dogrudan bir sensor surucusune bagli degildir. Veri yolu:
```text
TDK ICM42688 -----\
-> imu_sensor -> imu_calibration -> fusion_imu_measurement -> motion detector + ESKF
ST LSM6DSOX ------/
-> 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/tdk_icm42688.c`: TDK ICM42688'e ozel SPI, register, interrupt ve
- `src/drivers/imu/tdk_icm42688.c`: TDK ICM42688'e ozel SPI, register, interrupt ve
ham-veri donusumu.
- `src/st_lsm6dsox.c`: STEVAL-MKI217V1 uzerindeki ST LSM6DSOX'e ozel SPI,
- `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_sensor.c`: ortak init/start/stop/IRQ/service/measurement arayuzu.
- `src/imu_calibration.c`: markadan bagimsiz bias, 3x3 scale/cross-axis/mounting
- `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.
- `fusion_measurement.h`, motion detector ve ESKF yalniz SI birimindeki ortak
mesaji gorur; aktif sensorun markasini bilmez.
- `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
@@ -47,6 +109,17 @@ edilerek 512 KiB sinirinda dogrulanmistir.
### Bare-metal sensor secimi
ESKF/fusion varsayilan olarak aciktir. GPS-only firmware icin ana uygulama
akisini degistirmeden kapatilabilir:
```sh
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.
Otomatik WHO_AM_I algilama varsayilandir:
```sh
@@ -61,7 +134,8 @@ 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=104 IMU_ACCEL_FS_G=2 IMU_GYRO_FS_DPS=250
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`,
@@ -70,6 +144,33 @@ 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 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
@@ -79,12 +180,14 @@ 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 canli sayac
snapshot'inda 4084 interrupt'in 4084'u sample'a donusmus; read-fail, queue
overflow, unexpected IRQ ve trap sayilari sifir kalmistir. Buna karsilik GPS +
ST + ESKF'nin ayni urun firmware kosusundaki end-to-end testi henuz tamamlanmis
sayilmamalidir. Yuksek ODR ve uzun WLS sirasinda sample kaybini daha da azaltmak
gerekirse sonraki gelistirme sensor FIFO + sensor timestamp kullanmaktir;
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
@@ -93,6 +196,30 @@ 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 level 1'de iki konum satiri art arda
yayinlanir. Ilk satir WLS GPS konumu, ikinci satir o anda mevcut IMU+ESKF
duzeltilmis konumdur:
```text
[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. DOP alanlari ayni GPS epoch'unun
geometrisidir ve iki satirda ayni tasinir. ESKF henuz kalibrasyon/origin
asamasindaysa yalniz GPS satiri yayinlanir; ESKF valid olduktan sonra her GPS
konumu geldiginde iki satir da yayinlanir. 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:
@@ -142,7 +269,7 @@ Generated DTS/RTL'e gore GPS IP adresleri:
| TRCK7 | `0x10028000` | `9` |
| TRCK8 | `0x10029000` | `10` |
Bu degerler `soc/software/bsp/include/bsp/soc.h` icinde BSP define olarak tutuluyor. GPS yazilimi `header/gps_ip_defines.h` icinde bu BSP define'larini kullaniyor.
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:
@@ -357,14 +484,14 @@ Bu bolum continuous/background acquisition ve parametrik acquisition engine dest
### Degisen Dosyalar
- `header/gps_ip_defines.h`
- `header/gps_macros.h`
- `header/gps_interrupt_handlers.h`
- `header/linked_list.h`
- `src/gps_ip.c`
- `src/gps_interrupt_handlers.c`
- `src/linked_list.c`
- `gps_test.c`
- `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
@@ -526,8 +653,9 @@ GPS_TRK_MEASUREMENT_STALE_TICKS
- 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. RTL `subframe_ready` sonrasinda COUNT durumuna girer ve `NAV_SOLVE_TIMER=N` icin N adet navigation `bit_valid` darbesi sayar. Her navigation biti 20 ms oldugu icin periyot `N * 20 ms`'dir; mevcut `gps_startup_initialization(10)` ayari 200 ms'de bir ABS_SAMPLE latch ve nav-solve interrupt'i uretir.
- Bu siralama onemlidir: RTL `nav_solve_timer` sayaci `NAV_SOLVE_EN` ve `subframe_ready` ile baslar. `NAV_SOLVE_EN` nav-bit asamasinda acik tutulur ki timer GPS bit/subframe fazina otursun; subframe 1..5 hazir olana kadar yalniz nav-solve interrupt/flag kapali kalir.
- Bundan sonra periyodik pozisyon hesaplamasi nav-solve interrupt'lari ile tetiklenir. RTL `subframe_ready` sonrasinda COUNT durumuna girer ve `NAV_SOLVE_TIMER=N` icin N adet navigation `bit_valid` darbesi sayar. 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: RTL `nav_solve_timer` sayaci `NAV_SOLVE_EN` ve ilk gecerli `subframe_ready` ile baslar. `NAV_SOLVE_EN` nav-bit asamasinda acik tutulur; subframe 1..5 hazir olana kadar yalniz nav-solve interrupt/flag kapali kalir. 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. Timer bu nedenle ilk subframe'in HOW alanindaki 17-bit Z-count degerini kullanarak `Z_COUNT * 300 mod NAV_SOLVE_TIMER` baslangic fazini hesaplar. Hesap ALIGN durumunda 26 PCLK cevriminde ard arda modulo ile yapilir; 20 ms'lik ilk navigation bitinden cok once tamamlanir. RTL ayni GPS haftasi icinde keyfi pozitif `N` degerlerini hizalayabilir; firmware ise hafta rollover'i oncesinden aktif kalan kanallarla rollover sonrasinda katilan kanallarin da ayni fazda kalmasi icin `30240000 mod N == 0` kosulunu compile time'da zorunlu tutar. Ornegin `N=40`, `N=100`, `N=125`, `N=150`, `N=200` ve `N=300` gecerlidir; kosulu 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.
- Partial coherent grup sayisi mevcut `ready channels` sayisina ulasmadiysa firmware nav-solve sequence'lerini consume etmez. Coherent snapshot tum ready kanallari kapsasa bile sequence ancak navigation solve basarili olduktan sonra, snapshot aninda kaydedilen sequence degerine kadar consume edilir. Basarisiz solve ayni epoch'u tekrar deneyebilir; daha yeni sequence yanlislikla tuketilmez.
@@ -538,6 +666,7 @@ GPS_TRK_MEASUREMENT_STALE_TICKS
- 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; yalniz ayni nav-solve epoch'undan gelen kanallari secmek ve pseudorange olcumunu olusturmak icin kullanilir. Pseudorange hesabina giden `gps_ephems.abs_sample` receiver sample'in corrected double halidir.
- `hardware/external/gps/rtl/gps_timer/tb/nav_solve_timer_tb.sv`, RTL'nin ayni hafta icindeki genel fazlama davranisini bir kanalin digerinden tam bir subframe gec basladigi `N=40`, `N=37`, `N=512` ve `N=1` durumlariyla kontrol eder. Firmware build kurali bunlardan 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:
@@ -578,6 +707,11 @@ weight = 1 / variance
- 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.160` donanim/pipeline zaman kalibrasyonunun bir parcasidir; kaynagi dogrulanmadan kaldirilmamalidir.
- Tum ready kanallarin coherent nav-solve interrupt'inin beklenmesi bilincli davranistir. Donanimin her aktif tracking kanali icin ilgili interrupt'i uretecegi kabul edilir.
- 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
@@ -688,20 +822,20 @@ Eger ACQ engine'ler tracking bolgesinden once arka arkaya yerlestiriliyorsa `BSP
#define BSP_GPS_TRCK0_IRQ 3UL
```
ACQ tarafinda normal durumda `src/gps_ip.c` icinde manuel pointer eklemek gerekmez. Startup'ta `gps_init_acq_tables()` su helper'lari kullanarak tabloyu doldurur:
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:
```c
GPS_ACQ_IP_BASE_ADDR(index)
GPS_ACQ_INTR_LINE(index)
```
ACQ engine sayisi firmware tarafinda tek noktadan `header/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.
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_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_ip.c` icindeki `gps_init_acq_tables()` explicit base/IRQ tablolarini kullanacak sekilde guncellenmeli.
- `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:
@@ -726,14 +860,14 @@ Uniform tracking channel address/IRQ stride varsa `soc.h` icinde su define'lar g
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_ip_defines.h`
- `header/gps/gps_ip_defines.h`
- `TRCK9_IP_BASE_ADDR`, `TRCK10_IP_BASE_ADDR`, ...
- `TRCK9_INTR_LINE`, `TRCK10_INTR_LINE`, ...
- `src/gps_ip.c`
- `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_interrupt_handlers.c`
- `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.
@@ -741,8 +875,8 @@ Tracking tarafinda mevcut firmware bazi yerlerde hala manuel channel entry'leri
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_ip_defines.h` icindeki `TRCKn_IP_BASE_ADDR` ve `TRCKn_INTR_LINE` define'lari explicit degerlerden gelmeli.
- `src/gps_ip.c` icindeki `trck_ips[]` ve `trck_ips_intr_lines[]` array'leri bu explicit define'lari kullanmali.
- `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: