Facebook RSS Feed
 
.NET Micro Framework: Uzaktan Firmware Güncellemesi
Tarih: 07.07.2012, Platform: .NET MF 4.2, IDE: Visual Studio 2010, Level: 300



Uzaktan Firmware Güncellemesi

Uzaktan firmware güncellemesi, mikrodenetleyicileri geliştirme bilgisayarına bağlamadan üzerlerindeki yazılımı güncellemek için kullanılır. Bu özellik ile son kullanıcıya teslim edilmiş yada ulaşılması zor konumdaki cihazların firmware'lerini hafiza kartı yada internet aracılığıyla güncel tutabiliyoruz.

Ön Bilgi

Sistem güncellemesine ait sınıflar .NET Micro Framework SDK'sı dahilinde bulunmaz. Bu özelliğe, kullanacağımız çipsetin SDK'sı destekliyorsa erişebiliriz. Geliştireceğimiz uygulamada GHI Electronics'in USBizi çipsetine sahip kartlarının uzaktan güncellenmesi üzerinde duracağız.

Çalışma Prensibi

Uzaktan güncellemenin aktif olabilmesi için, mikrodenetleyici altyapısının ve yazılımının buna uygun olması gerekir. Altyapı hazırlığı aşamasında, flash hafıza iki bölüme ayrılır. İlk bölümde güncellemeyi sağlayacak bootloader yazılımı, ikinci bölümde ise geliştireceğimiz uygulama yer alır. Bootloader, USBizi modelinde 48 KB yer kaplar. İstenildiğinde güncel yazılımı flash üzerindeki uygulama bölümüne yazmakla görevlidir. Güncelleme işlemi herhangi bir sebepten yarıda kalırsa, sistem yeniden başladığında işlem yeniden başlar ve güncelleme garanti altına alınır.

Gerekli altyapı hazırlandıktan sonra, sistem güncellemesi için gerekecek hex dosyası elde edilir. Visual Studio uygulamanın hex biçimini bizimle paylaşmadığından, önce uygulamayı elimizdeki bir mikrodenetleyiciye yükleriz. Daha sonra, özel bir uygulama ile mikrodenetleyici ROM'unu okuyarak hex dosyasını elde ederiz.

Güncelleme aşamasında ise, türlü cambazlıklarla elde ettiğimiz hex dosyasını SD kart, USB flash disk yada internet gibi bir kaynaktan okuyarak cihazlar üzerinde güncelleme sağlarız.

Uygulama Kodları

Adım 1: Mikrodenetleyicinin Hazırlanması

İlk  aşamada flash hafızayı bootloader ve application bölümlerine ayırıp formatlayacağız. Bunun için, Visual Studio ile yeni bir .NET Micro Framework Console Application oluşturalım. Proje referanslarına "GHIElectronics.NETMF.SystemUpdate.dll" dosyasını ekleyelim.

Program.cs dosyasının içerisine aşağıdaki kod bloğunu yazalım ve uygulamamızı deploy edelim.

[C#] Program.cs

using System;
using Microsoft.SPOT;
using GHIElectronics.NETMF.System;
 
namespace MF_System_Update_1
{
    public class Program
    {
        public static void Main()
        {
            SystemUpdate.EnableBootloader();
        }
    }
}

"SystemUpdate.EnableBootloader" metodu, mikrodenetleyici hafızasını temizleyerek ikiye böler. İşlem birkaç saniyede tamamlanır ve sistem "application" bölümü üzerinden yeniden başlar.

Şimdi sistemi bootloader moduyla başlatabilmek için basit bir uygulama geliştireceğiz. Yeni bir .NET Micro Framework Console Application oluşturalım. Proje referanslarına
- "Microsoft.SPOT.Hardware.dll"
- "GHIElectronics.NETMF.SystemUpdate.dll"
- ve kullandığınız modele göre değiştireceğiniz "FEZRhino_GhiElectronics.NETMF.FEZ.dll"
kütüphanelerini ekleyelim.

Program.cs dosyasının içerisine aşağıdaki kodları ekleyelim. InterruptPort olarak belirteceğiniz buton, kullandığınız geliştirme kitine göre değişiklik gösterecektir.

Not: Yazımızda söylenene kadar tanımladığınız butona basmayın.

[C#] Program.cs

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using GHIElectronics.NETMF.System;
using GHIElectronics.NETMF.FEZ;
 
namespace MF_System_Update_2
{
    public class Program
    {
        // Sistemi bootloader moduna getirmek için kullanılacak buton:
        static InterruptPort ip = new InterruptPort((Cpu.Pin)FEZ_Pin.Digital.LDR,
            true,
            Port.ResistorMode.PullUp,
            Port.InterruptMode.InterruptEdgeLow);
 
        static void Main()
        {
            // Application modu aktifse, bootloader moduna geçişe izin ver:
            if (SystemUpdate.GetMode() == SystemUpdate.SystemUpdateMode.Application)
            {
                // Bootloader moduna geçiş butonu için interrupt oluştur:
                ip.OnInterrupt += new NativeEventHandler(ip_OnInterrupt);
            }
 
            // Main thread'i uyut:
            Thread.Sleep(Timeout.Infinite);
        }
 
        static void ip_OnInterrupt(uint data1, uint data2, DateTime time)
        {
            // (Butona basıldığında) sistemi bootloader moduna getir:
            SystemUpdate.AccessBootloader();
        }
    }
}

Bu uygulamada, butona basıldığı anda "SystemUpdate.AccessBootloader" metodu çalışır ve sistem bootloader modunda yeniden başlar. Biz bootloader modundan çıkarana kadar bu bölüm aktif olur. Deploy edeceğimiz uygulamalar bu bölüme yazılır.

Adım 2: Hex Dosyasının Elde Edilmesi

Geliştirdiğimiz örnek uygulamayı yada kendi uygulamanızı mikrodenetleyiciye deploy ettikten sonra, GHI Bootloader'a Tera Term yada benzeri bir terminal ile bağlanacağız. (Az önce oluşturduğumuz bootloader modu değil.) Geliştirme kitinizin üzerindeki BL pinini GND'a bağlayarak, yada kit üzerinde LDR butonu varsa, USB kablosunu bağlarken LDR butonuna basılı tutarak GHI Bootloader'a bağlanabilirsiniz. Bu işlemi ilk defa yapıyorsanız, bilgisayarınıza sanal seri port sürücüsü yüklenecektir. Daha sonra, Device Manager'ınızın Ports bölümünden sanal portun numarasını öğrenebilirsiniz. Bu porta 115.200 / 8 bit / Parity: none / Stop bits: 1 / Flow control: none özellikleriyle bağlanacağız.

Uygulama kodunu okuyabilmemiz için, daha önceden terminal aracılığıyla P kodu göndererek kod korumasını aktif etmemiş olmanız gerekiyor. Terminal uygulaması ile GHI Bootloader'a bağlandıktan sonra, G yazarak XMODEM 1K Receive modunda uygulama dosyasını bilgisayarımıza kaydedelim.

Kaydettiğimiz dosya, mikrodenetleyicinin tüm ROM'unu içeriyor. Bunun işimize yarayacak application bölümünü ayırmamız gerekecek. Ayırma işlemi için HexExtractor uygulamasını kullanacağız. Bu uygulama, kaynak olarak gösterdiğiniz dosyayı bölerek, işimize yarayacak application.hex dosyasını üretecektir.

Hex dosyasının gerekli kısmını ayırdıktan sonra, geliştirme kitinizi kapatıp açın ve bootloader moduna geçirmek için 1. aşamada belirlediğiniz butona basın. Sistem bootloader modunda yeniden başlayacak.

Adım 3: Bootloader Yazılımı

Son aşamada bootloader yazılımını geliştireceğiz. Bu yazılım, sistem bootloader moduna girdiğinde çalışmaya başlayacak. SD Kart üzerinde belirtilen dosyayı okuyacak ve application bölümüne yazacak. İşlem tamamlandığında ise sistemi application modunda yeniden başlatacak.

Bootloader yazılımı için bir .NET Micro Framework Console Application oluşturalım ve proje referanslarına:
- "GHIElectronics.NETMF.Hardware.dll";
- "GHIElectronics.NETMF.IO.dll"
- "GHIElectronics.NETMF.System.dll"
- "GHIElectronics.NETMF.SystemUpdate.dll"
- "System.IO.dll"
kütüphanelerini ekleyelim.

Uygulamamızın Program.cs dosyasındaki kodlar aşağıdaki gibi olmalı:

[C#] Program.cs

using System;
using System.IO;
using Microsoft.SPOT;
using GHIElectronics.NETMF.System;
using GHIElectronics.NETMF.IO;
 
namespace MF_System_Update_3
{
    public class Program
    {
        public static void Main()
        {
            // Bootloader modu aktifse, application bölümü güncellemesine izin ver:
            if (SystemUpdate.GetMode() == SystemUpdate.SystemUpdateMode.Bootloader)
            {
                // SD Kart üzerindeki dosya sistemini başlat:
                PersistentStorage ps = new PersistentStorage("SD");
                ps.MountFileSystem();
 
                // Güncelleştirme dosyasını belirle:
                FileStream fs = new FileStream("\\SD\\app.hex"FileMode.Open, FileAccess.Read);
 
                // Application bölümü güncellemesini başlat:
                SystemUpdate.ApplicationUpdate.Start();
 
                // Bir seferde yazılacak veri:
                byte[] buffer = new byte[10240];
                int length;
 
                // Güncelleme dosyasını yaz:
                do
                {
                    length = fs.Read(buffer, 0, buffer.Length);
                    SystemUpdate.ApplicationUpdate.Write(buffer, 0, length);
 
                } while (length == buffer.Length);
 
                // Güncellemeyi tamamla:
                fs.Close();
                SystemUpdate.ApplicationUpdate.End();
 
                // Uygulama bölümü ile yeniden başla:
                SystemUpdate.AccessApplication();
            }
        }
    }
}

Geliştirdiğimiz uygulamayı çalıştırdığınızda, filestream için belirttiğiniz hex dosyası okunacak ve sisteminiz güncellenerek application modunda yeniden başlayacak. Bu aşamadan sonra, geliştireceğiniz uygulamaların hex dosyasını alarak uzaktan güncelleme yapabilirsiniz. Uygulamanız application modundayken tetikleyeceğiniz SystemUpdate.AccessBootloader metodu sistemi bootloader moduna sokacak, önceden belirlemiş olduğunuz adresteki dosyayı application bölümüne yazacak ve sisteminiz application bölümüyle yeniden başlayacak.

İpuçları

Dilerseniz USB flash disk yada İnternet üzerindeki bir kaynaktan indireceğiniz hex dosyası ile de güncelleme yapabilirsiniz. (İnternetten güncelleme yapabilmek için application modundayken WebClient ile hex dosyasını hafızaya kaydetmeniz gerekir.)

Güncelleme işlemini otomatikleştirmek için, örneğin her uygulama açılışında SD kart içerisindeki app.hex dosyasının varlığı kontrol edilebilir. Dosya varsa, SystemUpdate.AccessBootloader metodu çalıştırılır ve sistem güncellenir.  Bootloader kodunun SystemUpdate.ApplicationUpdate.End metodundan hemen sonra hex dosyası silinir ve ardından FileStream kapatılır. Fotoğraf makinelerimizin firmware güncellemek için kullandığı yöntem bu şekildedir.


Ek Dosya: Belirtilmemiş.
Okunma Sayısı: 2022

comments powered by Disqus
 
Hoşgeldiniz!
Son güncelleme: 25.12.2016
-
Yeni Teknik Yazılar
Latte Panda İncelemesi
Turta IoT HAT İncelemesi
USB Gamepad Kullanımı
GPIO Kullanımı
VEML6075 UV Sensör Kullan...
-
İlgili Gruplar
.NET MF ve Gadgeteer FB Grubu
İst. IoT & Wearables Meet-up
-
 

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Copyright © 1999 - 2017, Umut Erkal. Bu materyal, "Creative Commons Public Licence" ile sunulmuştur.
Kaynak göstererek ve ücretsiz olarak, aynı şartlar altında paylaşabilir ve kullanabilirsiniz. | Kullanım Sözleşmesi