FirmwareUpdater

Bu eğitici, MKR1000 kartınıza veya WiFi Shield 101'e ürün yazılımını güncelleme veya sertifika yükleme sürecinde size rehberlik edecektir.

WiFi101 Bellenim Sürümünü Denetle , bellenim ve kütüphane sürümleri eşleşmediği için sorun yaşayabileceğinizi söylüyorsa, bunları hizalamanın çözümü aşağıdadır .

Donanım gerekli

  • Arduino veya Genuino kartına bağlı MKR1000 veya WiFi Shield 101

Devre

Anakart, bilgisayarın USB bağlantı noktasına Arduino Software (IDE) 1.6.10 veya üstü ile bağlanmalıdır.

Yazılım güncelleme prosedürü

Önemli Not:

19.6.1 bellenimi yalnızca WINC1500 model B için mevcuttur , bu MKR1000 kartında kullanılır. Ne yazık ki, WiFi101 kalkanı, Atmel'in desteklemeyi bıraktığı A modelini kullanıyor, bu yüzden bunun için 19.6.1 ürün yazılımı sürümü yok, 19.4.4 uyumlu en son ürün yazılımı sürümü olacak.

İşlemi basitleştirmek için, ana bilgisayar kartına (kalkan takılı olana veya MKR1000'in kendisine) yüklemeniz gereken özel bir taslak hazırladık - bu FirmwareUpdater - ve Arduino Yazılımında bulunan kullanımı kolay bir eklenti (IDE) 1.6.10 sonrası.

" FirmwareUpdater " çizimi Örnekler -> WiFi101'de mevcuttur


Çizimi yükleyin ve kartı (kalkanı takılı olan kartı veya MKR1000'in kendisini) bilgisayara bağlı tutun . Tamamlandığında, araçlar menüsünde bulunan eklentiyi açın.



Kartınız kullanılabilir seri bağlantı noktaları listesinde olmalıdır. Değilse, lütfen Araçlar menüsünde düzgün yapılandırıldığını kontrol edin.

Ürün yazılımını güncellemek için kartın doğru tipini seçmelisiniz. Modelinizi WiFi modülüne bakarak bulabilirsiniz: Etiketteki ilk satır veya PCB'nin sağ tarafındaki ipek baskının son satırı mikrodenetleyici modelini gösterir. MR210PA veya MR510PB olabilir ve son harf modeli buna göre gösterir.


Açılır listeden ünitenize uygun modeli seçin ve Ürün Yazılımını Güncelle düğmesine tıklayın . En alttaki çubuk, bellenimin silinmesi, yazılması ve doğrulanmasını içeren prosedürün ilerlemesini gösterecektir. Sonunda başarılı operasyon hakkında net bir bildirim alırsınız.

Sertifika yükleme

Aynı prosedürle, güvenli bir şekilde belirli web sitelerine erişmek için WiFi modülüne kök sertifikalar yükleyebilirsiniz. Kurulunuzda FirmwareUpdater taslağını çalıştırıyor olmanız gerekir. Kök sertifikalar sınırlı sayıda sertifika yetkilisi tarafından verilir, ancak hangi sitenin hangi otoriteyi kullandığını bilmek zordur. Hayatınızı kolaylaştırmak için, güvenli bir şekilde bağlanmanız gereken URL'yi doğrudan belirtmenize izin vererek kök sertifikayı indirme görevini bize bırakıyoruz. Oluşturduğunuz liste bir oturumdan diğerine kaydedilmez. Birkaç web sitesinin aynı kök sertifikayı paylaşması olabilir. Biz onunla ilgilenirken bunun için endişelenmene gerek yok. WiFi modülünüzde sertifika depolamak için kullanılabilir alan, sınırlı sayıda yetkili tarafından verilen yaklaşık 10 sertifika ile sınırlıdır ve ortalama projeler için fazlasıyla yeterli olmalıdır.

Yordam, kartınızı (kalkan takılı olan veya MKR1000'in kendisi) bilgisayarınıza bağlamaya ve Arduino Yazılımının (IDE) Araçlar menüsünden seçmeye başlar. FirmwareUpdater'ı panoya yükleyin ve WiFi 101 Firmware Updater'ı Araçlar'dan başlatın ve arayüzün üçüncü bölümüne gidin.


Orada sol tarafta boş bir liste ve sağ tarafta kök sertifikaları indirmek istediğiniz URL'yi eklemek veya kaldırmak için düğmeler bulabilirsiniz. URL tam olarak bağlanmanız gereken URL olmalıdır. Gereken tüm web sitelerinin URL'lerini ekleyin ve ardından yükleme işlemine devam edin. Lütfen yeni bir set yüklediğinizde mevcut tüm sertifikaları sildiğinizi unutmayın. '' Sertifikaları WiFi modülüne yükle "ye basın ve onay mesajını bekleyin.


Kod

Çizimi tahtaya yüklediğinizde, eklenti ve WiFi çipi arasındaki iletişimi hazırlar. Seri port üzerinden kartta bulunan WiFi modülüne iletişimi açar. Bellenim Yükseltici Eklentisi tarafından yönetilen tüm prosedürleri uygulamak gerekir. Her şey eklenti tarafından yönetilecek, ancak önce bu çizimi yüklemek önemlidir.

Çizimin tamamı aşağıdadır:

/*
  FirmwareUpdate.h - Firmware Updater for WiFi101 / WINC1500.
  Copyright (c) 2015 Arduino LLC.  All right reserved.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/


#include <WiFi101.h>
#include <spi_flash/include/spi_flash.h>

typedef struct __attribute__((__packed__)) {
  uint8_t command;
  uint32_t address;
  uint32_t arg1;
  uint16_t payloadLength;

  // payloadLenght bytes of data follows...
} UartPacket;

static const int MAX_PAYLOAD_SIZE = 1024;

#define CMD_READ_FLASH        0x01
#define CMD_WRITE_FLASH       0x02
#define CMD_ERASE_FLASH       0x03
#define CMD_MAX_PAYLOAD_SIZE  0x50
#define CMD_HELLO             0x99

void setup() {
  Serial.begin(115200);

  nm_bsp_init();
  if (m2m_wifi_download_mode() != M2M_SUCCESS) {
    Serial.println(F("Failed to put the WiFi module in download mode"));
    while (true)
      ;
  }
}

void receivePacket(UartPacket *pkt, uint8_t *payload) {
  // Read command
  uint8_t *p = reinterpret_cast<uint8_t *>(pkt);
  uint16_t l = sizeof(UartPacket);
  while (l > 0) {
    int c = Serial.read();
    if (c == -1)
      continue;
    *p++ = c;
    l--;
  }

  // Convert parameters from network byte order to cpu byte order
  pkt->address = fromNetwork32(pkt->address);
  pkt->arg1 = fromNetwork32(pkt->arg1);
  pkt->payloadLength = fromNetwork16(pkt->payloadLength);

  // Read payload
  l = pkt->payloadLength;
  while (l > 0) {
    int c = Serial.read();
    if (c == -1)
      continue;
    *payload++ = c;
    l--;
  }
}

// Allocated statically so the compiler can tell us
// about the amount of used RAM
static UartPacket pkt;
static uint8_t payload[MAX_PAYLOAD_SIZE];

void loop() {
  receivePacket(&pkt, payload);

  if (pkt.command == CMD_HELLO) {
    if (pkt.address == 0x11223344 && pkt.arg1 == 0x55667788)
      Serial.print("v10000");
  }

  if (pkt.command == CMD_MAX_PAYLOAD_SIZE) {
    uint16_t res = toNetwork16(MAX_PAYLOAD_SIZE);
    Serial.write(reinterpret_cast<uint8_t *>(&res), sizeof(res));
  }

  if (pkt.command == CMD_READ_FLASH) {
    uint32_t address = pkt.address;
    uint32_t len = pkt.arg1;
    if (spi_flash_read(payload, address, len) != M2M_SUCCESS) {
      Serial.println("ER");
    } else {
      Serial.write(payload, len);
      Serial.print("OK");
    }
  }

  if (pkt.command == CMD_WRITE_FLASH) {
    uint32_t address = pkt.address;
    uint32_t len = pkt.payloadLength;
    if (spi_flash_write(payload, address, len) != M2M_SUCCESS) {
      Serial.print("ER");
    } else {
      Serial.print("OK");
    }
  }

  if (pkt.command == CMD_ERASE_FLASH) {
    uint32_t address = pkt.address;
    uint32_t len = pkt.arg1;
    if (spi_flash_erase(address, len) != M2M_SUCCESS) {
      Serial.print("ER");
    } else {
      Serial.print("OK");
    }
  }
}
[Kodu Al]

Yukarıdaki paragraflarda açıklandığı gibi Arduino Yazılımında (IDE) bulunan örneklerden FirmwareUpdater'ı açmıyorsanız ve kodu bu öğreticiden kopyalayıp yapıştırmak istiyorsanız, çiziminizde başka bir SEKME oluşturmanız ve Endianess'i eklemeniz gerekir. ino aşağıda listelenmiştir.

/ *
Endianess.ino - Ağ bayt sırası dönüştürme işlevleri.
Telif Hakkı (c) 2015 Arduino LLC. Bütün hakları saklıdır.

Bu kütüphane ücretsiz bir yazılımdır; yeniden dağıtabilir ve / veya
GNU Lesser General Public koşulları altında değiştirmek
Özgür Yazılım Vakfı tarafından yayınlanan lisans; ya
Lisansın 2.1 sürümü veya (isteğe bağlı olarak) daha sonraki bir sürüm.

Bu kütüphane faydalı olacağı ümidiyle dağıtılmaktadır,
ancak HERHANGİ BİR GARANTİ OLMADAN; zımni garanti olmadan
BELİRLİ BİR AMACA UYGUNLUK veya FITNESS. GNU'yu görün
Daha fazla ayrıntı için Küçük Genel Kamu Lisansı.

GNU Lesser General Public'in bir kopyasını almış olmalısınız
Bu kütüphane ile birlikte lisans; değilse, Özgür Yazılıma yazın
Foundation, Inc., 51 Franklin St, Beşinci Kat, Boston, MA 02110-1301 ABD
* /



bool isBigEndian ( ) {
uint32_t testi = 0x11223344 ;
uint8_t * pTest = reinterpret_cast < uint8_t *> ( & test ) ;
dönüş pTest [ 0 ] == 0x11 ;
}

Ağ Ağından uint32_t ( uint32_t kaynağından ) {
statik sabit bool be = isBigEndian ( ) ;
if ( be ) {
geri dönüş ;
} başka {
uint8_t * pFrom = reinterpret_cast < uint8_t *> ( & itibaren ) ;
uint32_t ila ;
ila = pFrom [ 0 ] ; << = 8 ;
ila | = pFrom [ 1 ] ; << = 8 ;
ila | = pFrom [ 2 ] ; << = 8 ;
ila | = pFrom [ 3 ] ;
dönmek ;
}
}

Ağ16'dan uint16_t ( uint16_t from ) {
statik bool be = isBigEndian ( ) ;
if ( be ) {
geri dönüş ;
} başka {
uint8_t * pFrom = reinterpret_cast < uint8_t *> ( & itibaren ) ;
uint16_t ila ;
ila = pFrom [ 0 ] ; << = 8 ;
ila | = pFrom [ 1 ] ;
dönmek ;
}
}

uint32_t toNetwork32 ( uint32_t to ) {
Ağdan dönüş (32 ) ;
}

uint16_t toNetwork16 ( uint16_t to ) {
Ağ 16'dan dönüş (' e ) ;
}

See Also