Отговори на тема  [ 5 мнения ] 
RQ: Ext(App) Бутлодер за ST32F(1) - помогнете с опит 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 9:32 pm
Мнения: 710
Мнение RQ: Ext(App) Бутлодер за ST32F(1) - помогнете с опит
Като далечна переспектива ми предстои разработването на бутлодер за ST32F10x.

Код:
След ресет трябва
1. да провери дали във програмната памет - областта за приложна програма има валидна програма (чексума)
1.1. Ако има, да й вземе версията, ако няма, версията е 0.0.0 :)
1.2. Да проверява един флаш дали има валидна (и по-нова от 1.1.) програма
1.2.1. Ако има:
          - да изтрие програмната памет - всичко, освен бутлодера;
          - да я програмира;
          - да се ресетне.
1.2.2. Ако няма :
1.2.2.1. Ако версията в 1.1. не е 0.0.0.- да предаде управлението на приложната програма
1.2.2.2. Ако версията в 1.1. е 0.0.0. да прави каквото реши :)


Това, вероятно ще се прави на CooCox с GNU (или, ако остане време ще мигрираме на Atolic)


Сря Авг 23, 2017 1:59 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10368
Местоположение: Добрич
Мнение Re: RQ: Ext(App) Бутлодер за ST32F(1) - помогнете с опит
F1 серията е кофти избор, но това между другото...
Принципно STM са с големи страници на флаша, т.е. ще имаш едни 16К и в тях може да напъхаш доста повече от това дето си описал.
Обикновено фърмуера сам си тегли по-прясна версия през по-сложни интерфейси и/или протоколи. Но винаги е добре да има и резервен вариант, примерно и буутлоадера да може да дърпа от каквито прости локални итерфейчета имаш. Ако имаш да кажем UART може да го пускаш да слухти за 5-50mS докато ти си чекваш другите работи. Друг вариант за резервиране е ако имаш място във външия флаш да си пазиш производствената версия и да сложиш софтуерен или хардуерен механизъм за "restore factory...".
Може да помислиш и за защити като криптиране и подписване на фърмуера така че да не може да се клонира или подправя фърмуера ти. Май бях гледал такива проектчета, ама не помня дали бяха за STM. При всички случаи първо потърси примерни и ако не 1:1 то поне да минеш с леки модификации.


Чет Авг 24, 2017 8:31 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Съб Май 17, 2008 10:01 pm
Мнения: 238
Мнение Re: RQ: Ext(App) Бутлодер за ST32F(1) - помогнете с опит
Къде може да се види подобно изпълнение за криптиране и подписване на фърмуера с цел да не се подправя ?


Съб Сеп 22, 2018 8:00 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 10:41 am
Мнения: 1664
Мнение Re: RQ: Ext(App) Бутлодер за ST32F(1) - помогнете с опит
nikolovs написа:
Къде може да се види подобно изпълнение за криптиране и подписване на фърмуера с цел да не се подправя ?


Ето ти нещо просто:

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{   
    public partial class Form1 : Form
    {
        long x = 0, y, btn2 = 0;
        byte[] buffer = new byte[1000000];
        UInt32 fsize;

        static FileStream fsr = new FileStream("D:\\project_name.bin", FileMode.Open, FileAccess.Read);
        static FileStream fsw = new FileStream("D:\\update.bin", FileMode.Create, FileAccess.Write);
        BinaryWriter bw = new BinaryWriter(fsw);
        BinaryReader br = new BinaryReader(fsr);

       
   
        public Form1()
        {         
            InitializeComponent();
        }

        private UInt16 crc16(byte[] data_p, UInt32 length)
        {
            byte i;
            UInt16 data_;
            UInt16 crc = 0xffff;
            UInt32 idx = 0;

            if (length == 0)
                return ((UInt16)~crc);

            do
            {
                for (i = 0, data_ = (UInt16)((UInt16)0xff & (byte)data_p[idx]);
                    i < 8;
                    i++, data_ >>= 1)
                {
                    if (((crc & 0x0001) ^ (data_ & 0x0001)) != 0)
                        crc = (UInt16)((crc >> 1) ^ 0x8408);
                    else
                        crc = (UInt16)(crc >> 1);
                }
                idx++;
            }
            while (--length != 0);

            crc = (UInt16)~crc;
            data_ = crc;
            crc = (UInt16)((crc << 8) | (data_ >> 8 & 0xff));

            return (crc);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            fsize = (UInt32)fsr.Length;
            UInt16 crc;

            button1.Enabled = false;
            button1.Update();

            buffer[0] = (byte)'S';
            buffer[1] = (byte)'e';
            buffer[2] = (byte)'C';
            buffer[3] = (byte)'r';
            buffer[4] = (byte)'E';
            buffer[5] = (byte)'t';
            br.Read(buffer, 6, (Int32)fsize);
            for (x = 6; x < fsize + 6; x++)
            {
                buffer[x] += (byte)(x-6);
                buffer[x] = (byte)~buffer[x];
                buffer[x] = (byte)((byte)(buffer[x] << 4) | (byte)(buffer[x] >> 4));
                buffer[x] += (byte)(x-6);
                if (x >= 6)
                  bw.Write(buffer[x]);
            }

            crc = crc16(buffer, fsize+6);
            buffer[fsize + 6] = (byte)(crc);
            bw.Write(buffer[fsize + 6]);
            buffer[fsize + 6 + 1] = (byte)(crc >> 8);
            bw.Write(buffer[fsize + 6 + 1]);

            //MessageBox.Show("FILE WRITTEN", "[update.bin]");
            br.Close();
            bw.Close();

            fsr.Close();
            fsw.Close();

            button1.Text = "FILE [update.bin] WRITTEN!";
            button1.Update();

            System.Threading.Thread.Sleep(1000);

            Form1.ActiveForm.Close();
           
        }

       
           
    }
}


Нед Сеп 23, 2018 11:15 am
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4715
Мнение Re: RQ: Ext(App) Бутлодер за ST32F(1) - помогнете с опит
Ако желязото може да флаши word, чексума не ти трябва... проверяваш дали в началото има маджик кей...
Има: get version
Няма: триеш, update...ок? Кей в началото

magic може да ти е версията, -1 грешка

_________________
main[-1u]={1};


Нед Сеп 23, 2018 12:42 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 5 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни