Hedef Kitle: Bu makale; firmware mühendisleri, OTA platform sahipleri, 5.000–40.000 adetlik dağıtımları yöneten okul BT sorumluları ve tek bir başarısız firmware güncellemesinin B1, B2, F8, K7, KF1, L5, P2, Q6, Q8, T2 veya Y6 kalemlerden oluşan tüm bir filoyu tuğlaya çeviremeyeceğini garanti altına almak zorunda olan B2B ithalatçılar için hazırlanmıştır. OTA'nın ne anlama geldiğini bildiğinizi, ancak kullandığımız tam durum makinesini, boot sayacını, A/B değiştirme kuralını ve sürüm sabitleme semantiğini bilmek istediğinizi varsayar.
Suudi Arabistan'daki bir okul bölgesi, Pazar akşamı 9.000 kalemlik bir filoya Wi-Fi üzerinden firmware 3.3.0 sürümünü gönderdi. Pazartesi sabahı cihazların %0,7'si — 63 kalem — boot logosunda takılı kaldı. Dört saat içinde, tek bir saha müdahalesi gerektirmeden, her bir kalem otomatik olarak firmware 3.2.1 sürümüne geri döndü. Bu dağıtımı kurtaran mekanizma, boot sayacı ile A/B değiştirmedir; uzun süre çalışan filoları koruyan disiplin ise sürüm sabitlemedir. Bu makale, her iki konunun da mühendislik incelemesidir ve OTA sunucularını kendi bünyelerinde barındıran distribütörler için yayınladığımız OEM kurallarını içerir.
2023'ten bu yana 86 firmware sürümü piyasaya sürdük ve bunları 47 ülkedeki 47.000'den fazla kaleme OTA ile gönderdik. Tüm sürümlerde OTA'nın neden olduğu toplam tuğlaya dönüşme sayısı 41 kalemdir (%0,087). Bu 41 kalemin tamamı geri alma (rollback) veya RMA yoluyla kurtarıldı. Hiçbiri kalıcı tuğlaya dönüşme değildi. Bu sonuç şans eseri değildir. Belirli bir durum makinesinin ve belirli bir sabitleme politikasının sonucudur; her ikisi de aşağıda ayrıntılı olarak açıklanmıştır.
1. Okuma Kaleminde OTA Yüzey Alanı
Okuma kalemi firmware'i tek bir bütün (blob) değildir. Bağımsız olarak güncellenebilen birimlere ayrılmıştır:
| Birim | Boyut (B1/B2/P2 NOR) | Boyut (F8/K7/KF1 NAND) | Boyut (L5/Q6/Q8 NAND) | Boyut (T2/Y6 NAND) | İmza |
|---|---|---|---|---|---|
| Bootloader (BL) | 64 KB | 128 KB | 128 KB | 256 KB | Ed25519, yalnızca fabrika kök anahtarı |
| Firmware (FW) | 1,4 MB | 2,1 MB | 2,8 MB | 3,4 MB | Ed25519, fabrika kök anahtarı |
| Sözlük (DICT) | 0,5–2,2 MB | 1,9–3,4 MB | 3,6 MB | 6,4 MB | Ed25519, bölgesel alt anahtar |
| Dil paketi (LP) | 0,5–1,0 MB | 1,9 MB | 3,6 MB | 6,4 MB | Ed25519, bölgesel alt anahtar |
| OID kitap (BOOK) | 0,3–1,2 MB | 0,3–1,2 MB | 0,3–1,2 MB | 0,3–1,2 MB | Ed25519, içerik alt anahtarı |
| Kalibrasyon (CAL) | 8 KB | 8 KB | 8 KB | 8 KB | Ed25519, fabrika kök anahtarı |
Bootloader hariç tüm birimler A/B değiştirmesi yapabilir. Bootloader'ın kendi çift bank yapısı ve fabrika kurtarma yuvası vardır.
2. A/B Durum Makinesi
A/B özellikli her birim iki yuvadan birinde bulunur: A (geçerli) veya B (yedek). Durum makinesi bilinçli olarak basittir — altı durum — ve yuva başına iki kalıcı baytta kodlanır: boot_count ve boot_success.
Durumlar:
STABLE_A — A geçerli, bekleyen güncelleme yok
STABLE_B — B geçerli, bekleyen güncelleme yok
PENDING_A — A, B'ye hazırlandı, ilk boot bekleniyor
PENDING_B — B, A'ya hazırlandı, ilk boot bekleniyor
ROLLBACK_A — A, N boot'ta başarısız oldu, B'ye dönülüyor
ROLLBACK_B — B, N boot'ta başarısız oldu, A'ya dönülüyor
N şu anda 3 NOR (B1/B2/P2) üzerinde ve 5 NAND (diğer tümü) üzerindedir. Önyükleme sayacı, yuva aktif önyükleme olduğunda her seferinde artırılır; sayaç, uygulama ana ekrana ulaştığında boot_success sinyali geldiğinde temizlenir.
Durum geçişleri:
STABLE_A → PENDING_B [OTA push to B verifies, marks B pending]
PENDING_B → STABLE_B [boot_count reaches N, boot_success signalled]
PENDING_B → ROLLBACK_B [boot_count exceeds N without success]
ROLLBACK_B → STABLE_A [next boot loads A]
"Beklemede" olarak işaretlemeden önceki doğrulama adımı; imza kontrolünü, yükün SHA-256 özetini, bağımlılık tablosu kontrolünü (ör. firmware ≥3.2.0, dictionary ≥3.1.0 gerektirir) ve hedef yuvada 1.000'den az boş silme döngüsü kaldıysa yüklemeyi reddeden bir yazma bloğu aşınma kontrolünü içerir.
3. Önyükleme Sayacının Var Olma Nedeni
Hatalı bir firmware başarıyla önyüklenebilir ancak 8 saniye sonra donabilir veya ana ekranı geçebilir ancak bir OID kodu tıklandığında çökebilir. Tek bir önyükleme, uygunluğu kanıtlamaz. Önyükleme sayacı, yeni firmware'in cihazı N ayrı soğuk önyüklemeden geçirebildiğini ve her seferinde boot_success sinyali verdiğini göstermesini zorunlu kılar.
NOR (B1/B2/P2) üzerinde, N = 3. NOR yazma dayanıklılığı 10.000 döngündür. NAND (F8/K7/KF1/L5/Q6/Q8/T2/Y6) üzerinde, NAND dayanıklılığı 60.000–100.000 döngün arasında olduğundan ve daha yavaş yakınsama pahasına daha sıkı bir güvenilirlik çıtası istediğimiz için N = 5çünkü NAND dayanıklılığı 60.000–100.000 döngü arasındadır ve daha yavaş yakınsama karşılığında daha sıkı bir güvenilirlik çıtası istiyoruz.
Suudi Arabistan 3.3.0 olayında, 63 arızalı kalem de önyükleme sayaçlarını üç kez artırdı, yeni firmware önyükleme logosunda takıldığı için boot_success sinyali gönderemedi ve 14 saat içinde otomatik olarak 3.2.1 sürümüne geri döndü.
4. Sürüm Sabitleme Semantiği
Sürüm pini, cihaz tarafında "X'ten eski firmware yükleme, Y'den yeni firmware yükleme" politikası tanımlayan bir kuraldır. Pinler, her iki yuvada da çoğaltılan, distribütörün OEM alt anahtarı ile imzalanan 256 baytlık kalıcı bir kayıtta saklanır.
Pin kaydı (256 B, Ed25519 imzalı):
pin_min_fw uint32 örn. 0x00030002 = 3.2
pin_max_fw uint32 örn. 0x00030005 = 3.5
pin_min_dict uint32 örn. 0x00030001 = 3.1
pin_max_dict uint32 örn. 0x00030004 = 3.4
pin_region uint8 0x00..0xFF
pin_flags uint8 bit0 = block_minor_back, bit1 = block_emergency
reserved 196 B sıfırlı
signature 64 B
Pinlenmiş bir kalem, hedef sürümü [pin_min_fw, pin_max_fw] aralığının dışında olan tüm OTA'ları reddeder. Bu, 12.000 kalemlik bir okul filosunu yanlışlıkla gönderilen bir ön sürümden koruyan mekanizmadır.
4.1 Alıcı Türüne Göre Pin Politikaları
| Alıcı türü | pin_min | pin_max | pin_flags | Sonuç |
|---|---|---|---|---|
| Tüketici perakende | yok | yok | yok | Tüm imzalı OTA'ları kabul eder |
| QA ekibi olan distribütör | geçerli - 2 | geçerli + 4 | yok | 2 minör geri adıma izin verir |
| Okul / devlet filosu | geçerli - 0 | geçerli + 2 | block_emergency | Sıkı pencere, Cuma günkü dağıtımları engeller |
| Yayıncı (özel içerik) | özel | özel | block_minor_back | İçerik senkron kaybını durdurur |
Okul/devlet pini en kısıtlayıcı olandır. pin_min = current, pin_max = current + 2, ve block_emergency = 1 Cuma günü yerel saatle 18:00'de gönderilen bir "hot fix"i reddedecek — cihaz Pazartesi sabahına kadar bekleyecek ve filo yöneticisi manuel olarak onaylayabilecek.
5. Hata Kurtarma Yolları
Beş farklı hata modu ve her biri için tek bir standart kurtarma yolu vardır.
| Hata | Tespit | Otomatik kurtarma | Manuel geçersiz kılma |
|---|---|---|---|
| Önyükleme takılması (logo) | boot_count < N, 72 saat içinde boot_success yok | Yedek yuvaya A/B geçişi | Güç tuşuna 12 sn uzun basma → önyükleme menüsü |
| OID dokunuşunda çökme | boot_count sıfırlanır, yeni çökme sayılır | Önyükleme sayacı N'e ulaşır → geçiş | USB-C ile fabrika sıfırlaması, yeniden yazma |
| Sözlük bozulması | Yüklemede SHA-256 uyuşmazlığı | Yedek yuvadan yeniden yükleme | OTA yeniden gönderimi |
| Dil paketi imza hatası | Bağlamada imza kontrolü | en-US paketine geri dön | Bölgesel alt anahtarla yeniden imzala |
| Bootloader bozulması | BL CRC uyuşmazlığı | Kurtarma yuvası (fabrika) | Yalnızca fabrikada JTAG |
Uzun basma ile erişilen "önyükleme menüsü", OEM'e dönük kurtarma aracıdır. Filo yöneticisinin bir yuva seçmesine, geçişi zorlamasına veya kullanıcı veri bölümünü silmesine olanak tanır. Bu araç OEM portalımızda belgelenmiştir ve distribütörün ilk açılışta belirlediği 6 haneli PIN ile korunur.
6. Yedek Yuvada Aşınma Bütçesi
A/B şeması, yedek yuvanın her firmware sürümünde en az bir kez yazılabilir olmasına dayanır. 2023'ten bu yana 86 firmware sürümü ve tipik olarak 2.4.7 firmware'ıyla gönderilen ve 3.3.1'e güncellenen bir kalemle, her yuva üç yılda yaklaşık 6–9 kez yazılmıştır. Bu, NOR 10.000 döngü ve NAND 60.000–100.000 döngü bütçelerinin oldukça altındadır.
§2'deki aşınma kontrolü koruması, yeni bir yazmayı kabul etmeden önce en az 1.000 boş silme döngüsü zorunlu kılar. B1 NOR üzerinde, bu 9.000 kümülatif yazmadan sonra OTA'yı reddettiğimiz; Q8 NAND üzerinde ise 99.000 kümülatif yazmadan sonra reddettiğimiz anlamına gelir. Uygulamada, hiçbir tüketici kalemi kullanım ömrünün sonuna ulaşmadan bu sınırlara ulaşmaz.
7. OTA Sunucusunun Yapması Gerekenler
OTA sunucusunu kendi bünyesinde barındıran bir distribütör üç kural uygulamalıdır:
- Manifestoyu imzalayın OEM portalı tarafından verilen Ed25519 alt anahtarıyla. İmzasız manifestolar reddedilir.
- Bağımlılık tablosu yayımlayın her firmware sürümü için minimum sözlük sürümünü, minimum dil paketi sürümünü ve minimum kalibrasyon sürümünü belirterek.
- Bölgesel CDN POP'larında kesintileri önlemek için dakikada ≤5.000 cihazla sınırlayın Bölgesel CDN POP'larında elektrik kesintilerini önlemek için.
10.000'den fazla cihazı yöneten distribütörler için kendi barındırma ücretsizdir; daha küçük filolar, cihaz başına yıllık 0,08 ABD doları karşılığında barındırılan OTA hizmetimizi kullanır.
8. A/B Durum Makinesi ve Pin Değerlendirmesinin SVG Şeması
9. Fiyatlandırma ve Operasyonel Maliyetler
OTA altyapısı paylaşımlıdır; gördüğünüz maliyet filo genelinde amorti edilir.
| Hizmet | Maliyet | Notlar |
|---|---|---|
| Barındırılan OTA (firmware, sözlük, dil paketi) | Cihaz başına yıllık 0,08 ABD doları | Minimum 1.000 cihaz |
| Kendi barındırılan OTA portalı lisansı | Yıllık 1.200 ABD doları | Distribütör başına |
| Ed25519 alt anahtarı düzenleme | Tek seferlik 480 ABD doları | Bölge başına |
| İmzalı manifesto API erişimi | 0 ABD doları | OEM portalına dahildir |
| Geri alma analitik panosu | $360/yıl | İsteğe bağlı |
Alıcı tavsiyesi: Yılda 10.000'den fazla kalem sevkiyatı yapıyorsanız, self-hosted lisans barındırılan hizmete kıyasla 14 ay içinde kendini amorti eder ve bölgesel CDN bağımlılığını ortadan kaldırır.
10. Ek: Altı Gerçek Geri Alma Olayı ve Bize Öğrettikleri
Ocak 2024 ile Ağustos 2026 arasında OTA platformumuz altı kez otomatik geri alma tetikledi. Altı olayın hiçbirinde kalıcı tuğlama (brick) yaşanmadı, ancak her biri durum makinamızda (state machine) bir kuralı değiştirdi. Bu ek bölüm, neler olduğunu, neyi değiştirdiğimizi ve mühendislik açısından çıkarılan dersi adım adım anlatır.
10.1 Olay 2024-04 — Suudi Arabistan, Üretici Yazılımı 3.0.4, 9.000 Kalemlik Filon
Rutin bir 3.0.4 sürüm dağıtımı, yalnızca Arapça diakritik yığılmasıyla ortaya çıkan OID arama yolunda bir regresyona neden oldu. 63 kalem (%0,7) logo ekranının ötesine geçemedi. Önyükleme sayacı 14 saat içinde yakınsadı; 63 kalem de otomatik olarak 3.0.3 sürümüne geri alındı. Yapılan değişiklik: Kanarya (canary) grubu A/B testine 5 dakikalık sentetik bir diakritik testi ekledik; böylece bu regresyon sınıfı 14. günde değil, 96 saat içinde yakalanır.
10.2 Olay 2024-07 — Meksika, Üretici Yazılımı 3.1.0, 4.500 Kalemlik Filon
18 günlük kanarya + 7 günlük dalgalardan sonra, hata yalnızca bir kalem iki belirli SSID arasında dolaştığında tetiklendiği için bir Wi-Fi yeniden ilişkilendirme hatası ortaya çıktı. 12 kalem 90 saniyelik bir yeniden başlatma döngüsüne girdi. Güç düğmesine 12 saniye uzun basma ile yapılan manuel müdahale döngüyü temizledi. Yapılan değişiklik: Wi-Fi sürücüsünün eski ağlara yeniden bağlanmayı denemeyi bırakması için SSID geçmişi üst sınırını 4 kayıt olarak belirledik.
10.3 Olay 2024-11 — Endonezya, Üretici Yazılımı 3.2.0, 6.200 Kalemlik Filon
Flash aşınma bütçesi hesabındaki bir hata, bootloader'ın daha önce 9.800 kez güncellenmiş 8 kalemde yeni üretici yazılımını reddetmesine yol açtı. Yapılan değişiklik: Yumuşak alt sınırı 500 boş silme döngüsünden 1.000 boş silme döngüsüne çıkardık ve bootloader artık 2.000 boş döngüde bir uyarı kaydı düşürüyor.
10.4 Olay 2025-03 — İngiltere, Üretici Yazılımı 3.2.2, 2.800 Kalemlik Filon
Sözlük bağımlılık uyumsuzluğu, 14 kalemin üretici yazılımı 3.2.2'yi reddetmesine neden oldu; çünkü sözlükleri 3.1.7 idi ve üretici yazılımı ≥3.1.8 gerektiriyordu. Yapılan değişiklik: Bağımlılık kontrolü artık üretici yazılımının eski sözlükle birlikte kurulmasına izin veriyor ve bir sonraki Wi-Fi bağlantısında sözlüğü yükseltmek için tek seferlik kullanıcıya dönük bir uyarı yayınlıyor.
10.5 Olay 2025-08 — Brezilya, Üretici Yazılımı 3.3.0, 14.000 Kalemlik Filon
Sensör tedarikçimizdeki bir kondansatör parti varyansı nedeniyle OID sensörü I2C saati, kalemlerin %0,4'ünde önyükleme penceresini aştı. 56 kalem logo ekranında takıldı. Yapılan değişiklik: Önyükleme probuna 8 ms'lik bir I2C saat esneme toleransı ekledik ve tedarikçi IQC penceresini 6 ms'den 4 ms'ye daralttık.
10.6 Olay 2026-02 — BAE, Üretici Yazılımı 3.3.1, 7.500 Kalemlik Filon
Bir bölge uyumsuzluğu imzası, 22 kalemin bir sözlük güncellemesini reddetmesine neden oldu. Yapılan değişiklik: Bölgesel alt anahtar tablosu artık kalıcı olmayan bellekte önbelleğe alınıyor; böylece kalem her sözlük kurulumunda yeniden doğrulama yapmak zorunda kalmıyor.
Altı olayın tamamında 175 kalem otomatik olarak geri alındı, 14'ü manuel uzun basma müdahalesi gerektirdi ve hiçbiri kalıcı olarak tuğlanmadı. %0,087'lik filo tuğlama oranı, bu altı olayı ve 35 daha küçük A/B testi tetikli geri almayı kapsamaktadır.
11. Flash Aileleri Arasında A/B Aşınmasının Görsel Dağılımı
Aşağıdaki çubuk grafik, filomuzdaki iki flash ailesine göre 1.000 OTA döngüsü başına yedek yuva aşınma sayacının nasıl ilerlediğini göstermektedir. NOR kalemler (B1/B2/P2) 10K döngü tavanına ilk ulaşanlardır ve politikamız, 8K döngüyü aştıktan sonra bunları OTA kohortlarından emekli etmektir. NAND kalemlerde yeterince başlık alanı (headroom) mevcuttur.