diff --git a/Makefile b/Makefile index 8e4f8ba..c8c3d0d 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,9 @@ help: '' \ 'Config:' \ ' FPGA_BOARD=$(FPGA_BOARD) # vcu118 or genesys2' \ + ' UART_BAUD=460800 # FPGA firmware and host listener default' \ + ' GPS_ESKF_ENABLE=1 # gps_system: 1 ESKF, 0 GPS-only' \ + ' IMU_SENSOR=auto # gps_system: auto, tdk, st or stm' \ '' \ 'Direct entry points:' \ ' make -C soc help' \ diff --git a/README.md b/README.md index cdd6050..023aedc 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,93 @@ make -C soc/software app APP=gps_system make -C targets/fpga/vcu118 debug-load APP=gps_system ``` +## GPS Firmware Profilleri: ESKF ve GPS-only + +`gps_system` varsayilan olarak ESKF acik (`GPS_ESKF_ENABLE=1`) ve UART +`460800` baud olacak sekilde derlenir. Kok Makefile'in kart varsayilani VCU118 +oldugu icin Genesys2 komutlarinda `FPGA_BOARD=genesys2` acikca yazilmalidir. + +TDK ICM42688 + GPS + ESKF iceren birlesik Genesys2 MCS/BIN: + +```sh +make FPGA_BOARD=genesys2 APP=gps_system \ + GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-mcs +``` + +Yalniz GPS acquisition/tracking, WLS, Doppler velocity ve PPS calistiran; +IMU/ESKF baslatmayan firmware: + +```sh +make FPGA_BOARD=genesys2 APP=gps_system \ + GPS_ESKF_ENABLE=0 fpga-mcs +``` + +`GPS_ESKF_ENABLE` verilmezse deger `1`'dir. Iki komut ayni +`targets/fpga/genesys2/out/flash/genesys2_rocket.mcs` ve `.bin` yollarini +kullanir; ikinci build birincinin ciktisinin uzerine yazar. Iki profili +saklamak gerekiyorsa her build'den sonra dosyayi profil adiyla kopyalayin. + +`fpga-mcs` mevcut `.bit` dosyasini kullanip bootloader ve uygulamayi yeniden +derler. Yalniz software profili veya baud degisikligi icin sentez gerekmez. +Tracking/PPS RTL veya Chisel degistiyse once: + +```sh +make FPGA_BOARD=genesys2 APP=gps_system fpga-bitstream +make FPGA_BOARD=genesys2 APP=gps_system GPS_ESKF_ENABLE=1 \ + IMU_SENSOR=tdk fpga-mcs +``` + +Firmware ve host UART dinleyicisinin varsayilani birlikte `460800`'dur: + +```sh +make FPGA_BOARD=genesys2 fpga-uart +``` + +### Doppler, WLS ve ESKF veri yolu + +```text +tracking loop, her 20 ms: + carrier Q7 + 20 prompt I/Q + wideband power + ABS_SAMPLE/code phase + -> sabit tracking snapshot + -> synchronizer + APB-domain atomik register + interrupt + -> C/N0 ve Doppler/range-rate donusumu + -> satellite velocity/clock-drift duzeltmeli C/N0-weighted velocity WLS + -> ECEF velocity + 3x3 covariance + receiver clock drift + -> ECEF->ENU adapter + -> ayri velocity NIS gate + -> ayni capture epoch'unda 15-state ESKF update + -> daha yeni IMU history replay +``` + +RTL Doppler veya C/N0 uzerinde IIR yapmaz; ham ve 20 ms sabit snapshot'i +software'e verir. Software ayni PRN icin C/N0'yi `alpha=0.2`, Doppler'i +`alpha=0.05` ile yumusatir. L1 range-rate +`-doppler_hz * c / 1575420000` ile hesaplanir. En az dort uyduyla cozulmus +velocity WLS state'i `[vx, vy, vz, receiver_clock_drift_mps]`'dir; uydu LOS +hizi ve broadcast satellite clock drift observation'dan ayrilir. C/N0, +range-rate agirligini belirler; post-fit residual gerekirse formal +covariance'i yalniz buyutur. + +ESKF; ENU position/velocity, quaternion attitude, accel bias ve gyro bias +iceren 15 hata durumlu filtredir. Her timestamp'li IMU ornegi prediction'a +girer. Gecikmis GPS position ve Doppler velocity olcumleri kendi capture +epoch'unda uygulanir, ardindan daha yeni IMU history replay edilir. Position +ve velocity'nin ayri NIS kapilari vardir; kotu Doppler ayni epoch'taki gecerli +position update'ini iptal etmez. Durağanlik supervisor'u uygun oldugunda ZUPT +ve zero-gyro update uygular; GPS kesintisinde filtre sahte konum olcumu +uretmeden dead-reckoning yapar ve covariance buyur. + +C/N0, geometri, WLS clock sigma, integrity ve Doppler residual metrikleri PPS +software'inin `acquire/precision/robust/holdover` profilini de secer. PPS +donanimi bu metrikleri dogrudan yorumlamaz; software v2.2 mailbox ile PI +`Kp/Ki`, slew ve lock esiklerini atomik olarak gunceller. Ayrintilar: + +- `hardware/external/gps/rtl/trck_src/README.md` +- `soc/software/gps_system/README.md` +- `soc/software/fusion/README.md` +- `hardware/external/gps/rtl/pps/README.md` +- `soc/software/pps_python/README.md` + Alt girisler: ```sh diff --git a/hardware/README.md b/hardware/README.md index 575dd6f..91d0a83 100644 --- a/hardware/README.md +++ b/hardware/README.md @@ -46,3 +46,9 @@ external/gps/rtl/ pass this path as the default GPS_SYSTEM_DIR, so the Vivado flow does not depend on a user-specific /home/... checkout. ``` + +GPS tracking olcum yolunun 20 ms Doppler/C/N0 snapshot, PCLK synchronizer, +APB register/interrupt ve software velocity WLS sozlesmesi +`external/gps/rtl/trck_src/README.md` icinde belgelenir. PPS PI periferigi, +runtime coefficient/lock register map'i ve fiziksel pin sinirlari +`external/gps/rtl/pps/README.md` icindedir. diff --git a/hardware/external/gps/rtl/pps/README.md b/hardware/external/gps/rtl/pps/README.md index 4c5132b..d982f0c 100644 --- a/hardware/external/gps/rtl/pps/README.md +++ b/hardware/external/gps/rtl/pps/README.md @@ -47,6 +47,16 @@ The hardware does not add `POSTPONE_TOW`. Baremetal must commit an already epoch-aligned GPS reference, so the verified 160 ms subframe readout correction is owned exactly once by the navigation software. +Tracking C/N0 and Doppler are not inputs to the PPS RTL. The tracking wrapper +publishes those measurements through its separate 20 ms APB mailbox. Firmware +uses C/N0, geometry, WLS clock sigma, integrity and Doppler velocity residual +to select `acquire`, `precision`, `robust` or `holdover`, then writes the +corresponding PI coefficients, slew limit and lock thresholds through this +PPS mailbox. Doppler also predicts the WLS clock-bias datum between commits. +This keeps quality policy and the small navigation pre-filter in software +while the deterministic PI loop, fixed-point rate state and physical edge +generation remain in hardware. + The APB register offsets live in `pps_pkg.sv`. Multiword input fields are shadow registers and must be followed by one `COMMIT` write. A new mailbox must not be written while `STATUS.COMMIT_BUSY` is set. diff --git a/hardware/external/gps/rtl/trck_src/README.md b/hardware/external/gps/rtl/trck_src/README.md new file mode 100644 index 0000000..ee020ec --- /dev/null +++ b/hardware/external/gps/rtl/trck_src/README.md @@ -0,0 +1,107 @@ +# GPS tracking measurement yolu + +Bu dizindeki tracking loop yalniz code/carrier takibi yapmaz; her 20 ms GPS +L1 C/A navigation-bit epoch'unda software'in C/N0 ve Doppler kullanabilmesi +icin atomik bir measurement snapshot'i da uretir. + +## 20 ms snapshot + +`tracking_measurement.sv`, ilk NAV-bit kenarinda accumulator'lari arm eder ve +sonraki her bit epoch'unda su alanlari birlikte latch eder: + +```text +nav bit +ABS_SAMPLE +remaining code phase +signed carrier frequency, Q7 +20 x prompt I toplami +20 x prompt Q toplami +20 x (I_prompt^2 + Q_prompt^2) wideband power toplami +sample count +16-bit sequence +``` + +Prompt energy `lock_detector.sv` icinde pipeline'li oldugu icin bit kenarindan +sonra dort tracking clock beklenir; bu, son 1 ms enerji terimini eski epoch'a +dahil eder ve yeni epoch ile karistirmaz. Snapshot ve `measurement_valid` +sonraki bit epoch'una kadar, yaklasik 20 ms sabit kalir. + +## APB aktarimi ve interrupt + +`apb_wrappers/tracking_wrapper.sv`, valid ve payload'un her bitini +`double_ff_syn` yardimcisi ile PCLK domainine alir. Bu yardimcinin mevcut +implementasyonu `stage_1`, `stage_2` ve registered `Dout` olmak uzere uc +register kademesidir. Kaynak payload 20 ms sabit kaldigi icin FIFO veya toggle +handshake kullanilmaz. Wrapper synchronized valid kenarindan sonra iki ek PCLK +settle cycle bekler, tum alanlari APB-domain register bankina ayni anda kopyalar +ve measurement interrupt/flag uretir. + +Software sequence'i okumadan once ve payload'dan sonra tekrar okuyarak atomik +snapshot dogrulamasi yapar. Sequence degisirse okuma tekrar edilir; sequence +atlarsa kayip measurement diagnostics sayaci artar. + +Measurement register offsetleri: + +| Offset | Alan | +|---:|---| +| `0x50` | version, valid, NAV bit, lock ve sample count metadata | +| `0x54` | 16-bit sequence | +| `0x58` | signed carrier frequency Q7 | +| `0x5c` | ABS_SAMPLE | +| `0x60` | remaining code phase | +| `0x64` | signed prompt sum I | +| `0x68` | signed prompt sum Q | +| `0x6c` | wideband power low | +| `0x70` | wideband power high | + +## Software'e verilen anlam + +Carrier register'i toplam NCO frekansidir. Software IF merkezini cikarir: + +```text +doppler_hz = carrier_q7 / 128 - 4092000 +range_rate_mps = -doppler_hz * c / 1575420000 +``` + +Pozitif received-frequency Doppler azalan geometrik range anlamina geldigi +icin range-rate denkleminde eksi isareti vardir. + +C/N0, 20 prompt icin narrowband/wideband power estimator'i ile hesaplanir: + +```text +R = (sum_i^2 + sum_q^2) / WBP +C/N0_linear = 1000 * (R - 1) / (20 - R) +C/N0_dbhz = 10 * log10(C/N0_linear) +``` + +RTL IIR uygulamaz. Ham snapshot debug ve yeniden tune icin korunur. ISR state'i +ayni PRN'de C/N0 icin `alpha=0.2`, Doppler icin `alpha=0.05` software IIR +uygular; reacquisition veya PRN degisiminde eski kanal state'i kullanilmaz. + +Filtrelenmis range-rate, satellite ECEF velocity ve satellite clock drift ile +C/N0-weighted 4-state velocity WLS'ye girer: + +```text +state = [receiver_vx, receiver_vy, receiver_vz, receiver_clock_drift_mps] +observation = measured_range_rate + - satellite_LOS_rate + + c * satellite_clock_drift +H = [-u_x, -u_y, -u_z, 1] +``` + +WLS en az dort gecerli uydu ister; ECEF velocity, 3x3 covariance, receiver +clock drift ve residual RMS uretir. Fusion adapter velocity/covariance'i ENU'ya +dondurur ve ayri velocity NIS kapisi ile 15-state ESKF'ye verir. + +## Dogrulama + +```sh +make -C hardware/external/gps/rtl/trck_src/tb test +make -C soc/software/gps_system/tests run +make -C soc/software/gps_system/tests sanitize +``` + +Questa testleri 20 prompt akumulasyonu, snapshot hold, synchronizer settle, +atomik APB copy ve interrupt'i; Linux C testleri Q7 Doppler/range-rate, C/N0 +estimator, coherent read, satellite velocity/clock drift ve weighted velocity +WLS/covariance yolunu kontrol eder. diff --git a/soc/software/Makefile b/soc/software/Makefile index af0ba7b..9045706 100644 --- a/soc/software/Makefile +++ b/soc/software/Makefile @@ -11,8 +11,10 @@ APP_FLASH_OFFSET ?= 0x06000000 APP ?= hello_uart GPS_DEBUG ?= 1 GPS_DEBUG_LEVEL ?= 1 +GPS_ESKF_ENABLE ?= 1 +IMU_SENSOR ?= auto BSP_UART_CLOCK_HZ ?= 100000000 -BSP_UART_BAUDRATE ?= 115200 +BSP_UART_BAUDRATE ?= 460800 GPS_SYSTEM_UART_BAUDRATE ?= 460800 BSP_CLINT_TIMEBASE_HZ ?= 1000000 GPS_SYSTEM_CLINT_TIMEBASE_HZ ?= 500000 @@ -42,6 +44,8 @@ help: @echo " BSP_UART_CLOCK_HZ=$(BSP_UART_CLOCK_HZ)" @echo " BSP_UART_BAUDRATE=$(BSP_UART_BAUDRATE)" @echo " GPS_SYSTEM_UART_BAUDRATE=$(GPS_SYSTEM_UART_BAUDRATE)" + @echo " GPS_ESKF_ENABLE=$(GPS_ESKF_ENABLE)" + @echo " IMU_SENSOR=$(IMU_SENSOR)" @echo " BSP_CLINT_TIMEBASE_HZ=$(BSP_CLINT_TIMEBASE_HZ)" @echo " GPS_SYSTEM_CLINT_TIMEBASE_HZ=$(GPS_SYSTEM_CLINT_TIMEBASE_HZ)" @echo " GPS_SYSTEM_IMU_PUBLISH_EVERY_N_SAMPLES=$(GPS_SYSTEM_IMU_PUBLISH_EVERY_N_SAMPLES)" @@ -63,11 +67,11 @@ steval-mki217v1-test: @make -C steval_mki217v1_test TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(OUT_DIR)/steval_mki217v1_test" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(BSP_DTIM_BASE)" BSP_DTIM_SIZE="$(BSP_DTIM_SIZE)" all gps-system: - @make -C gps_system TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(OUT_DIR)/gps_system" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(GPS_SYSTEM_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(GPS_SYSTEM_CLINT_TIMEBASE_HZ)" IMU_CORRECTED_PUBLISH_EVERY_N_SAMPLES="$(GPS_SYSTEM_IMU_PUBLISH_EVERY_N_SAMPLES)" BSP_DTIM_BASE="$(BSP_DTIM_BASE)" BSP_DTIM_SIZE="$(BSP_DTIM_SIZE)" all + @make -C gps_system TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(OUT_DIR)/gps_system" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" GPS_ESKF_ENABLE="$(GPS_ESKF_ENABLE)" IMU_SENSOR="$(IMU_SENSOR)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(GPS_SYSTEM_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(GPS_SYSTEM_CLINT_TIMEBASE_HZ)" IMU_CORRECTED_PUBLISH_EVERY_N_SAMPLES="$(GPS_SYSTEM_IMU_PUBLISH_EVERY_N_SAMPLES)" BSP_DTIM_BASE="$(BSP_DTIM_BASE)" BSP_DTIM_SIZE="$(BSP_DTIM_SIZE)" all app: @test -d "$(APP)" - @make -C "$(APP)" TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(OUT_DIR)/$(APP)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(BSP_DTIM_BASE)" BSP_DTIM_SIZE="$(BSP_DTIM_SIZE)" all + @make -C "$(APP)" TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(OUT_DIR)/$(APP)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" GPS_ESKF_ENABLE="$(GPS_ESKF_ENABLE)" IMU_SENSOR="$(IMU_SENSOR)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(BSP_DTIM_BASE)" BSP_DTIM_SIZE="$(BSP_DTIM_SIZE)" all flash-image: app @mkdir -p "$(FLASH_DIR)" diff --git a/soc/software/bootloader/Makefile b/soc/software/bootloader/Makefile index 5c463fa..736caec 100644 --- a/soc/software/bootloader/Makefile +++ b/soc/software/bootloader/Makefile @@ -13,7 +13,7 @@ APP_FLASH_OFFSET ?= 0x06000000 MARCH ?= rv64imafdc_zicsr_zifencei MABI ?= lp64d BSP_UART_CLOCK_HZ ?= 100000000 -BSP_UART_BAUDRATE ?= 115200 +BSP_UART_BAUDRATE ?= 460800 BSP_DTIM_BASE ?= 0x80000000 BSP_DTIM_SIZE ?= 0x00100000 CONFIG_STAMP := $(BUILD_DIR)/build_config.txt diff --git a/soc/software/bsp/drivers/init.c b/soc/software/bsp/drivers/init.c index 9f65131..3448be5 100644 --- a/soc/software/bsp/drivers/init.c +++ b/soc/software/bsp/drivers/init.c @@ -7,7 +7,7 @@ #endif #ifndef BSP_UART_BAUDRATE -#define BSP_UART_BAUDRATE 115200UL +#define BSP_UART_BAUDRATE 460800UL #endif void bsp_init(void) diff --git a/soc/software/common/app.mk b/soc/software/common/app.mk index 0ab6e2f..c8b46a6 100644 --- a/soc/software/common/app.mk +++ b/soc/software/common/app.mk @@ -13,7 +13,7 @@ LINKER_SCRIPT ?= $(COMMON_DIR)/linker_ram.ld MARCH ?= rv64imafdc_zicsr_zifencei MABI ?= lp64d BSP_UART_CLOCK_HZ ?= 100000000 -BSP_UART_BAUDRATE ?= 115200 +BSP_UART_BAUDRATE ?= 460800 BSP_CLINT_TIMEBASE_HZ ?= 1000000 BSP_DTIM_BASE ?= 0x80000000 BSP_DTIM_SIZE ?= 0x00100000 diff --git a/soc/software/fusion/README.md b/soc/software/fusion/README.md index 019d953..a1bfc32 100644 --- a/soc/software/fusion/README.md +++ b/soc/software/fusion/README.md @@ -6,6 +6,22 @@ Bu klasör Genesys2 kartından UART ile alınan GPS WLS konumlarını ve PMOD SP ve jiroskop biası. Kartın durağan olduğu deneyde zero-velocity update (ZUPT) uygulanır ve GPS innovation değerlerine aykırı-ölçüm kapısı konur. +Bare-metal ürün firmware'i ana dizinden iki profille üretilebilir: + +```sh +# TDK + GPS + ESKF (varsayılan GPS_ESKF_ENABLE=1) +make FPGA_BOARD=genesys2 APP=gps_system \ + GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-mcs + +# GPS-only; IMU/ESKF kapalı, WLS/Doppler/PPS açık +make FPGA_BOARD=genesys2 APP=gps_system \ + GPS_ESKF_ENABLE=0 fpga-mcs +``` + +Firmware ve UART kayıt aracının varsayılan hızı `460800` baud'dur. İki profil +aynı MCS/BIN çıktı yolunu kullandığı için ikinci build ilk dosyanın üzerine +yazar. + ## Güncel durum ve devralma notu (2026-07-16) Bu bölüm yeni bir geliştirme oturumunun nereden devam edeceğini tek yerde @@ -71,6 +87,37 @@ GPS position + Doppler velocity --\ TDK veya ST IMU -> imu_sensor ----/ ``` +### Doppler ESKF'ye nasıl geliyor? + +1. Tracking RTL her 20 ms NAV-bit epoch'unda carrier NCO Q7 değerini, + `ABS_SAMPLE`, remaining code phase ve 20 prompt'un I/Q/WBP toplamlarını + birlikte latch eder. Payload 20 ms sabit kalır; APB wrapper registered + synchronizer ve settle süresinden sonra atomik register bankı ile interrupt + üretir. +2. Firmware coherent mailbox okumasında sequence'i payload öncesi/sonrası + kontrol eder. Carrier değeri için + `doppler_hz = carrier_q7/128 - 4092000`, L1 pseudorange-rate için + `range_rate = -doppler_hz*c/1575420000` kullanılır. +3. Aynı PRN'in 50 Hz snapshot'larında C/N0 `alpha=0.2`, Doppler `alpha=0.05` + software IIR ile yumuşatılır. RTL ham ölçümü korur; hardware Doppler IIR + içermez. +4. En az dört uyduyla C/N0-weighted velocity WLS + `[receiver_vx, receiver_vy, receiver_vz, receiver_clock_drift_mps]` + state'ini çözer. Her observation'dan satellite LOS velocity çıkarılır, + broadcast satellite clock drift eklenir. Inverse normal matrix ve post-fit + residual ECEF velocity covariance'ini üretir. +5. GPS adapter velocity ve 3x3 covariance'i ECEF'ten ENU'ya döndürür, + kart ölçümüne dayalı minimum `2/2/3 m/s` standard-deviation floor'larını + uygular ve position ile aynı capture timestamp'ini korur. +6. Fusion engine gecikmiş position ve velocity'yi aynı geçmiş epoch'unda + uygular. Velocity'nin ayrı 3-DOF `%99.9`, `NIS=16.266` kapısı vardır; bir + velocity reject aynı epoch'taki kabul edilmiş position update'ini bozmaz. + Sonra daha yeni IMU history current-time horizon'a kadar replay edilir. + +Bu zincirin RTL/register ayrıntısı +`hardware/external/gps/rtl/trck_src/README.md`, bare-metal WLS ve kart +doğrulaması `soc/software/gps_system/README.md` içindedir. + Python tarafındaki giriş noktaları: - `serial_capture.py`: UART akışını zaman damgalı CSV olarak toplar; @@ -149,11 +196,12 @@ konum çözülmesi tek başına PPS üretildiğini kanıtlamaz. İlk kabul edilen WLS/PPS commit'i yalnız coarse alignment yapar. Ardından faz hatası en fazla sekiz adet 125 MHz tracking-clock tick'i, yani 64 ns olan beş -ardışık PI update gerekir. Lock kazanıldıktan sonra 256 ns üzerindeki yeni bir -faz hatası lock'u düşürür. WLS receiver-clock bias/pseudorange jitter'ı veya -epoch capture belirsizliği beş ardışık ölçümde 64 ns koşulunu bozarsa konum -gelmeye devam ederken PPS pini sürekli LOW kalabilir. Bu şu an en güçlü -olasılıktır; register ölçmeden eşik değiştirilmemelidir. +ardışık PI update gerekir. RTL reset release eşiği 256 ns'dir; v2.2 production +software profile'ları tek seyrek WLS sıçraması pulse kaybettirmesin diye +release eşiğini runtime `LOOP_CONFIG` ile 1.024 us yapar. WLS receiver-clock +bias/pseudorange jitter'ı veya epoch capture belirsizliği beş ardışık ölçümde +64 ns acquire koşulunu bozarsa konum gelmeye devam ederken PPS pini LOW +kalabilir. Firmware ancak WLS başarılı, `solution_valid=true`, PPS referans satırı FDE ile dışlanmamış ve referans kanalın capture sequence'i sıfır değilse PPS mailbox'a @@ -185,7 +233,7 @@ monitor resume | Register | Beklenen/yorum | |---|---| -| `VERSION @ 0x1002a07c` | `0x00020100`; farklıysa ELF/bitstream eşleşmiyor | +| `VERSION @ 0x1002a07c` | Production v2.2 için `0x00020200`; farklıysa ELF/bitstream eşleşmesini kontrol edin | | `CONTROL @ 0x1002a000` | Enable + track açıkken alt bitler genellikle `0x3` | | `STATUS @ 0x1002a004` | `0x1`: commit/alignment yok; alt bitler `0x7`: aligned fakat lock değil; bit 11 set ve alt bitler `0xf`: locked/valid | | `ACTIVE_SEQUENCE @ 0x1002a048` | `0`: firmware hiç geçerli PPS commit'i yapmamış; artıyorsa WLS referansları PPS'ye ulaşıyor | @@ -197,7 +245,7 @@ lock acquisition/faz jitter'ıdır. `STATUS` lock gösteriyor ve `PULSE_COUNT` artıyorsa JC10 sinyali JC11 GND referansıyla osiloskop veya logic analyzer'da ölçülmelidir; pulse saniyede bir yaklaşık 100 ms HIGH'dır. -2026-07-25 canlı Genesys2 ölçümünde `VERSION=0x00020100`, +Erken 2026-07-25 v2.1 canlı Genesys2 ölçümünde `VERSION=0x00020100`, `CONTROL=0x00000003` ve snapshot `ACTIVE_SEQUENCE=11583` görüldü. `PULSE_COUNT=314`, PPS core'un resetten beri 314 `pps_out` pulse olayı oluşturduğunu kanıtladı; post-route top-level yol da sabit LOW değildir. @@ -218,6 +266,13 @@ işaret eder. Eşik ölçümsüz büyütülmemeli; önce clock-bias/TDOP kalite outlier reddi veya faz gözlemi süzme stratejisi board A/B testiyle değerlendirilmelidir. +Bu tarihsel v2.1 teşhisinden sonra v2.2 dinamik PI profilleri, Doppler +clock-drift prediction, bounded WLS clock-bias filtresi, 2 s validity +watchdog/30 s state koruma politikası ve fractional capture correction +eklenmiştir. Güncel sentetik ve kart sonuçları +`soc/software/gps_system/README.md` altındaki PPS bölümlerinde, register/RTL +davranışı `hardware/external/gps/rtl/pps/README.md` içinde tutulur. + ## Çalıştırma UART kaydı: diff --git a/soc/software/fusion/serial_capture.py b/soc/software/fusion/serial_capture.py index 47b5133..07a7dca 100644 --- a/soc/software/fusion/serial_capture.py +++ b/soc/software/fusion/serial_capture.py @@ -14,7 +14,7 @@ import serial def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser() parser.add_argument("--port", default="/dev/ttyUSB2") - parser.add_argument("--baud", type=int, default=115200) + parser.add_argument("--baud", type=int, default=460800) parser.add_argument("--duration", type=float, default=60.0) parser.add_argument("--output", type=Path, required=True) parser.add_argument( diff --git a/soc/software/gps_system/README.md b/soc/software/gps_system/README.md index d38e84b..5175f69 100644 --- a/soc/software/gps_system/README.md +++ b/soc/software/gps_system/README.md @@ -1,6 +1,8 @@ # GPS System Port Notes -Bu notlar GPS bare-metal yaziliminin VCU118 Rocket SoC portu ve interrupt debug sureci icin yazildi. +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 @@ -66,6 +68,34 @@ ve raw kuyruga koyar. GPS ISR'leri acquisition/tracking olaylarini kaydeder. 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: @@ -129,6 +159,23 @@ 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: + +```sh +# 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. + Otomatik WHO_AM_I algilama varsayilandir: ```sh @@ -446,32 +493,30 @@ Bu kosuda `mcause=5` tekrar etmedi. ## Build ve Debug Komutlari -Build: +Ana dizinden kalici flash imaji: ```sh -make -C /home/ankaoc/Desktop/rocket/rocket-chip/soc/software/gps_system \ - BUILD_DIR=/home/ankaoc/Desktop/rocket/rocket-chip/soc/out/software/gps_system \ - clean all +make FPGA_BOARD=genesys2 APP=gps_system \ + GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-mcs ``` OpenOCD: ```sh -make -C /home/ankaoc/Desktop/rocket/rocket-chip fpga-debug-openocd +make FPGA_BOARD=genesys2 fpga-debug-openocd ``` ELF'i RAM'e yukleyip calistirma: ```sh -/tools/toolchains/rvtc-medany/bin/riscv64-unknown-elf-gdb \ - -q /home/ankaoc/Desktop/rocket/rocket-chip/soc/out/software/gps_system/gps_system.elf \ - -ex "target extended-remote :3333" \ - -ex "monitor reset halt" \ - -ex "load" \ - -ex "set \$pc = _start" \ - -ex "monitor resume" \ - -ex "detach" \ - -ex "quit" +make FPGA_BOARD=genesys2 APP=gps_system \ + GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-debug-load +``` + +UART: + +```sh +make FPGA_BOARD=genesys2 fpga-uart ``` Durum okumak icin claim register'ini okumadan: @@ -749,6 +794,13 @@ 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: diff --git a/targets/asic/rocket/Makefile b/targets/asic/rocket/Makefile index d548199..e9d7461 100644 --- a/targets/asic/rocket/Makefile +++ b/targets/asic/rocket/Makefile @@ -107,7 +107,12 @@ $(BOOTLOADER_IMG): FORCE $(BOOTLOADER_SW_SRCS) $(APP_ELF): $(APP_SW_SRCS) test -d "$(APP_SW_DIR)" - $(MAKE) -C "$(APP_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(APP_BUILD_DIR)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" $(SIM_APP_MAKE_ARGS) all + $(MAKE) -C "$(APP_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(APP_BUILD_DIR)" \ + GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" \ + BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" \ + BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" \ + BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" \ + $(SIM_APP_MAKE_ARGS) all $(APP_FLASH_BIN): $(APP_ELF) mkdir -p "$(FLASH_DIR)" diff --git a/targets/fpga/genesys2/Makefile b/targets/fpga/genesys2/Makefile index 59a0e2c..c6ecdd3 100644 --- a/targets/fpga/genesys2/Makefile +++ b/targets/fpga/genesys2/Makefile @@ -24,7 +24,7 @@ GDB_HOST ?= localhost GDB_PORT ?= 3333 OPENOCD_ADAPTER_SPEED ?= 1000 UART_PORT ?= auto -UART_BAUD ?= 115200 +UART_BAUD ?= 460800 BOARD ?= genesys2 PART_NAME ?= xc7k325tffg900-2 BOARD_PART ?= digilentinc.com:genesys2:part0:1.1 @@ -69,6 +69,8 @@ FLASH_REGIONS ?= auto FLASH_FORCE ?= 0 GPS_DEBUG ?= 1 GPS_DEBUG_LEVEL ?= 1 +GPS_ESKF_ENABLE ?= 1 +IMU_SENSOR ?= auto FLASH_MCS ?= $(OUT_DIR)/flash/genesys2_rocket.mcs FLASH_BIN ?= $(OUT_DIR)/flash/genesys2_rocket.bin @@ -172,6 +174,8 @@ help: ' FLASH_FORCE=$(FLASH_FORCE) # 1 forces unchanged regions too' \ ' APP=$(APP)' \ ' APP_ELF=$(APP_ELF)' \ + ' GPS_ESKF_ENABLE=$(GPS_ESKF_ENABLE)' \ + ' IMU_SENSOR=$(IMU_SENSOR)' \ ' UART_PORT=$(UART_PORT)' \ ' ETH_RF_IFACE=$(ETH_RF_IFACE)' \ ' ETH_RF_INPUT=$(ETH_RF_INPUT)' \ @@ -209,15 +213,17 @@ fpga-config: ' CFGMEM_PART=$(CFGMEM_PART)' \ ' UART_PORT=$(UART_PORT)' \ ' UART_BAUD=$(UART_BAUD)' \ + ' GPS_ESKF_ENABLE=$(GPS_ESKF_ENABLE)' \ + ' IMU_SENSOR=$(IMU_SENSOR)' \ ' ETH_RF_IFACE=$(ETH_RF_IFACE)' \ ' ETH_RF_INPUT=$(ETH_RF_INPUT)' \ ' ETH_RF_SAMPLE_FORMAT=$(ETH_RF_SAMPLE_FORMAT)' software: - @$(MAKE_BIN) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(APP)" APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(DTIM_BASE)" BSP_DTIM_SIZE="$(DTIM_SIZE)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" bootloader flash-image + @$(MAKE_BIN) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(APP)" APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(DTIM_BASE)" BSP_DTIM_SIZE="$(DTIM_SIZE)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" GPS_ESKF_ENABLE="$(GPS_ESKF_ENABLE)" IMU_SENSOR="$(IMU_SENSOR)" bootloader flash-image $(APP_ELF): FORCE - @$(MAKE_BIN) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(APP)" APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(DTIM_BASE)" BSP_DTIM_SIZE="$(DTIM_SIZE)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" app + @$(MAKE_BIN) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(APP)" APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(DTIM_BASE)" BSP_DTIM_SIZE="$(DTIM_SIZE)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" GPS_ESKF_ENABLE="$(GPS_ESKF_ENABLE)" IMU_SENSOR="$(IMU_SENSOR)" app chisel: software @cd "$(REPO_DIR)" diff --git a/targets/fpga/genesys2/README.md b/targets/fpga/genesys2/README.md index 11bc58a..27bd7ae 100644 --- a/targets/fpga/genesys2/README.md +++ b/targets/fpga/genesys2/README.md @@ -16,7 +16,7 @@ Varsayilanlar: SoC/fabric clock : 50 MHz GPS acquisition : 80 MHz GPS tracking : 125 MHz -UART baud : 115200 +UART baud : 460800 App flash offset : 0x01800000 QSPI flash : 32 MiB S25FL256S RF input mode : pmod @@ -181,7 +181,7 @@ make -C targets/fpga/genesys2 bitstream make -C targets/fpga/genesys2 program-fpga make -C targets/fpga/genesys2 program-flash make -C targets/fpga/genesys2 program-app APP=gps_system -make -C targets/fpga/genesys2 uart-listen UART_PORT=/dev/ttyUSB1 UART_BAUD=115200 +make -C targets/fpga/genesys2 uart-listen UART_PORT=/dev/ttyUSB1 ``` Kok Makefile uzerinden: @@ -190,12 +190,25 @@ Kok Makefile uzerinden: make FPGA_BOARD=genesys2 fpga-config make FPGA_BOARD=genesys2 fpga-bitstream make FPGA_BOARD=genesys2 fpga-program + +# TDK + GPS + ESKF, UART varsayilani 460800 +make FPGA_BOARD=genesys2 APP=gps_system \ + GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-mcs + +# GPS-only; tracking, Doppler velocity WLS ve PPS aktif +make FPGA_BOARD=genesys2 APP=gps_system \ + GPS_ESKF_ENABLE=0 fpga-mcs ``` `program-app APP=gps_system` yalniz application flash bolgesini derleyip programlar. Tracking mailbox registerlari ve synchronizer RTL degisikligi bitstream gerektirir; Doppler IIR katsayisi/yazilim degisikligi ise bitstream gerektirmez, yalniz yeni `gps_system` uygulamasinin yuklenmesi yeterlidir. +`GPS_ESKF_ENABLE` verilmezse ESKF aciktir. ESKF kapali profilde IMU ve fusion +baslatilmaz; GPS acquisition/tracking, C/N0, Doppler velocity WLS, ham konum ve +PPS calismaya devam eder. Iki profil ayni `genesys2_rocket.mcs/.bin` cikti +yoluna yazdigi icin birlikte saklanacaksa build sonrasinda yeniden +adlandirilmalidir. `debug-load APP=gps_system` ELF'i GDB ile DTIM/RAM'e yukler; hizli kart testi icin uygundur fakat power-cycle/reset sonrasinda flash'taki eski uygulama geri diff --git a/targets/fpga/vcu118/Makefile b/targets/fpga/vcu118/Makefile index c73343c..0f1234d 100644 --- a/targets/fpga/vcu118/Makefile +++ b/targets/fpga/vcu118/Makefile @@ -24,7 +24,7 @@ GDB_HOST ?= localhost GDB_PORT ?= 3333 OPENOCD_ADAPTER_SPEED ?= 1000 UART_PORT ?= /dev/ttyUSB2 -UART_BAUD ?= 115200 +UART_BAUD ?= 460800 BOARD ?= vcu118 PART_NAME ?= xcvu9p-flga2104-2L-e BOARD_PART ?= xilinx.com:vcu118:part0:2.4 @@ -68,6 +68,8 @@ FLASH_REGIONS ?= auto FLASH_FORCE ?= 0 GPS_DEBUG ?= 1 GPS_DEBUG_LEVEL ?= 4 +GPS_ESKF_ENABLE ?= 1 +IMU_SENSOR ?= auto FLASH_MCS ?= $(OUT_DIR)/flash/vcu118_rocket.mcs FLASH_BIN ?= $(OUT_DIR)/flash/vcu118_rocket.bin @@ -171,6 +173,8 @@ help: ' FLASH_FORCE=$(FLASH_FORCE) # 1 forces unchanged regions too' \ ' APP=$(APP)' \ ' APP_ELF=$(APP_ELF)' \ + ' GPS_ESKF_ENABLE=$(GPS_ESKF_ENABLE)' \ + ' IMU_SENSOR=$(IMU_SENSOR)' \ ' UART_PORT=$(UART_PORT)' \ ' ETH_RF_IFACE=$(ETH_RF_IFACE)' \ ' ETH_RF_INPUT=$(ETH_RF_INPUT)' \ @@ -207,13 +211,15 @@ fpga-config: ' FLASH_INTERFACE=$(FLASH_INTERFACE)' \ ' CFGMEM_PART=$(CFGMEM_PART)' \ ' UART_PORT=$(UART_PORT)' \ - ' UART_BAUD=$(UART_BAUD)' + ' UART_BAUD=$(UART_BAUD)' \ + ' GPS_ESKF_ENABLE=$(GPS_ESKF_ENABLE)' \ + ' IMU_SENSOR=$(IMU_SENSOR)' software: - @$(MAKE_BIN) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(APP)" APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(DTIM_BASE)" BSP_DTIM_SIZE="$(DTIM_SIZE)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" bootloader flash-image + @$(MAKE_BIN) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(APP)" APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(DTIM_BASE)" BSP_DTIM_SIZE="$(DTIM_SIZE)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" GPS_ESKF_ENABLE="$(GPS_ESKF_ENABLE)" IMU_SENSOR="$(IMU_SENSOR)" bootloader flash-image $(APP_ELF): FORCE - @$(MAKE_BIN) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(APP)" APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(DTIM_BASE)" BSP_DTIM_SIZE="$(DTIM_SIZE)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" app + @$(MAKE_BIN) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(APP)" APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(DTIM_BASE)" BSP_DTIM_SIZE="$(DTIM_SIZE)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" GPS_ESKF_ENABLE="$(GPS_ESKF_ENABLE)" IMU_SENSOR="$(IMU_SENSOR)" app chisel: software @cd "$(REPO_DIR)"