Перейти к содержанию
    

NANDFlash + микроконтроллер - как бороться с битыми секторами?

Если поднять YAFFS, то мне нужно этим заниматься - это делает за меня файловая система. Бэды она учитывает размещая в spare area флешки данные отличные от FF. Определяет бэдовый ли блок по результатам записи.

А если на нанд есть бэды до разворачивания файловой системы? То есть ещё до записи присутствуют битые блоки?

 

Коррекция ошибок ECC по Хаффману. Опять же это реализовано в самой файловой системе.

То есть, насколько я понял из доков, это возможность коррекции ошибки в один бит на каждые 256 байт?

 

Да я работаю NAND128. Мне понадобилось порядка 30 kB в общей сложности.

Не так уж и много ;)

 

Вы используете первую версию Yaffs, насколько я понял?

 

Можно вас попросить - приведите, пожалуйста, полный дамп нескольких блоков nand с записанными данными и spare областями, интересно посмотреть расположение тэгов\ECC кодов.

Но тут, наверное, этим занимается ваш драйвер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если на нанд есть бэды до разворачивания файловой системы? То есть ещё до записи присутствуют битые блоки?

... то производитель флешки обычно обещает "в первой странице битого блока не будет FF". Этого достаточно, чтобы при форматировании разобраться, что происходит.

 

 

То есть, насколько я понял из доков, это возможность коррекции ошибки в один бит на каждые 256 байт?

Только мужика этого Хэмминг зовут :-)

Да, возможность коррекции одного бита (и обнаружения более сложных ошибок) на один блок. Длина блока может быть произвольной (обычно считают ECC по всей странице сразу).

 

 

Можно вас попросить - приведите, пожалуйста, полный дамп нескольких блоков nand с записанными данными и spare областями, интересно посмотреть расположение тэгов\ECC кодов.

Но тут, наверное, этим занимается ваш драйвер?

По опыту изучения дампов NAND'а WinCE - занятие малоперспективное. Лучше уж эмулятор написать (исходники-то доступны!) и крутить там эту ФС, как душе угодно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, возможность коррекции одного бита (и обнаружения более сложных ошибок) на один блок. Длина блока может быть произвольной (обычно считают ECC по всей странице сразу).

Меня интересует конкретная реализация топикстартера.

И длина блока не может быть произвольной, так как от неё зависит количество избыточного кода.

А область spare данных всегда имеет конечную длину.

 

По опыту изучения дампов NAND'а WinCE - занятие малоперспективное. Лучше уж эмулятор написать (исходники-то доступны!) и крутить там эту ФС, как душе угодно.

Расположение тегов ФС и кодов ECC зависит, вероятнее всего, от драйвера NAND.

Это снова реализация автора темы.

 

Если поднять YAFFS, то мне нужно этим заниматься - это делает за меня файловая система. Бэды она учитывает размещая в spare area флешки данные отличные от FF. Определяет бэдовый ли блок по результатам записи.

То есть таблица бэдов на флеш не создаётся?

Или все же создаётся, и сохраняется, но прозрачно от пользователя?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

А если на нанд есть бэды до разворачивания файловой системы? То есть ещё до записи присутствуют битые блоки?

 

На бэды проверка там делается следующим образом. C самого начала (с завода) флешка стерта, везде, в том числе и в области spare записаны 0xFF. В даташите написано, что если блок битый, то spare области c самого начала в первых двух байтах будет число отличное от FF. Файловая система так и работает - определяет битый блок, если первые два байта не FF и помечает битые блоки записывая в первые два байта spare 'Y' 'Y'. Если блок "ломается" в процессе, то файловая система обнаружит это в результате записи - запишет, считает и сравнит записанное и то что должно быть. Если запись не удалась, то пометить блок как битый и будет работать с другим.

 

То есть, насколько я понял из доков, это возможность коррекции ошибки в один бит на каждые 256 байт?

 

Коррекция ошибок на один chunk - так они называют минимальную единицу записи. Как правило chunk совпадает по размеру со страницей, но можно это изменить. У меня ecc считается на 512 байт и в числе прочих дополнительных служебных данных располагается в области spare.

 

Вы используете первую версию Yaffs, насколько я понял?

 

Можно вас попросить - приведите, пожалуйста, полный дамп нескольких блоков nand с записанными данными и spare областями, интересно посмотреть расположение тэгов\ECC кодов.

Но тут, наверное, этим занимается ваш драйвер?

 

Да я использую первую yaffs, хотя при желании можно поднять и вторую.

 

По поводу дампа. Привожу пример работы программы для флешки, которая по-умолчанию была полностью стерта. Вот что я делаю:

 

    char str[] = "This string is placed id NAND!\r\n\0\0\0";
    int f = yaffs_open("nand/file0.txt", O_CREAT | O_RDWR, (S_IREAD | S_IWRITE)); //открываю файл для записи
    if ( f != -1)
    {
        yaffs_write(f, str, 35); //Если он успешно открылся записываю  в него тестовую строку
        yaffs_flush(f);
        yaffs_close(f);//Закрываю файл
    }

    f = yaffs_open("nand/file0.txt", O_RDONLY, S_IREAD); //Открываю для чтения
    if (f != -1)
    {
        memset (str, 0x00, 35);
        yaffs_read(f, str, 35);//Считываю, то что записал
        yaffs_close(f);
                printf("----> %s \r\n", str); // Вывожу записанное
    }

 

Файловая система общается с флешкой через 4 функции: записать странцу, считать страницу, записать spare, считать spare. Т.е. для работы нужно реализовать только эти 4 функции (это для yaffs1).

Что происходит с флешкой в момент работы вышеприведенного кода. В момент вызова yaffs_open() происходит следующее:

 

1) Считывается первый блок и его первая странци на предмет битости

yaffs_nareadPage ----------------------------------
               page 0
               len 512
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 0xFF  0xFF  0xFF   0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF 0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF   0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF 0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF 0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 0xFF  0xFF  0xFF  0xFF  0xFF
       readSpare -------------------------------
               page 0
               len 16
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF

 

2) Блок небитый. Далее производится запись:

 


       progPage ----------------------------------
               page 0
               len 512
0x01  0x00  0x00  0x00  0x01  0x00  0x00  0x00  0xFF  0xFF  0x66  0x69  0x6C  0x65  0x30  0x2E 
0x74  0x78  0x74  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00 0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0xFF  0xFF  0x80  0x01  0x00  0x00 
0x00 0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0x00  0x00  0x00  0x00 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0x00  0x00  0x00  0x00  0xFF  0xFF  0xFF  0xFF 
0x00  0x00  0x00  0x00  0xFF  0xFF  0xFF  0xFF  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00
       progSpare -------------------------------
               page 0
               len 16
0x00  0x00  0x10  0x00  0xFF  0xFF  0x01  0x03  0xCF  0xFF  0xC3  0x20  0xC1  0xFC  0xFF  0x03

 

После этого сразу проверяется запись:

 


       readPage ----------------------------------
               page 0
               len 512
0x01  0x00  0x00  0x00  0x01  0x00  0x00  0x00  0xFF  0xFF  0x66  0x69  0x6C  0x65  0x30  0x2E 
0x74  0x78  0x74  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0xFF  0xFF  0x80  0x01  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0x00  0x00  0x00  0x00 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0x00  0x00  0x00  0x00  0xFF  0xFF  0xFF  0xFF 
0x00  0x00  0x00  0x00  0xFF  0xFF  0xFF  0xFF  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00
       readSpare -------------------------------
               page 0
               len 16
0x00  0x00  0x10  0x00  0xFF  0xFF  0x01  0x03  0xCF  0xFF  0xC3  0x20  0xC1  0xFC  0xFF  0x03

 

3) Далее yaffs_write() yaffs_flush() - запись строки во флеш:

 

       progPage ----------------------------------
               page 1
               len 512
0x03  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0xFF  0xFF  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0xFF  0xFF  0xB6  0x41  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0x00  0x00  0x00  0x00 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0x00  0x00  0x00  0x00  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00
       progSpare -------------------------------
               page 1
               len 16
0x00  0x00  0x10  0x00  0xFF  0xFF  0x01  0x00  0xFF  0xFF  0xF3  0x2C  0xC1  0x5A  0xAA  0x97
       progPage ----------------------------------
               page 2
               len 512
0x54  0x68  0x69  0x73  0x20  0x73  0x74  0x72  0x69  0x6E  0x67  0x20  0x69  0x73  0x20  0x70 
0x6C  0x61  0x63  0x65  0x64  0x20  0x69  0x64  0x20  0x4E  0x41  0x4E  0x44  0x21  0x0D  0x0A 
0x00  0x00  0x00  0x00  0x00  0x00  0x00 0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00
       progSpare -------------------------------
               page 2
               len 16
0x01  0x00  0xD0  0x08  0xFF  0xFF  0x01  0x03  0x96  0xAA  0x9B  0x68  0xC1  0xFF  0xFF  0xFF
       readPage ----------------------------------
               page 0
               len 512
0x01  0x00  0x00  0x00  0x01  0x00  0x00  0x00  0xFF  0xFF  0x66  0x69  0x6C  0x65  0x30  0x2E 
0x74  0x78  0x74  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0xFF  0xFF  0x80  0x01  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0x00  0x00  0x00  0x00 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0x00  0x00  0x00  0x00  0xFF  0xFF  0xFF  0xFF 
0x00  0x00  0x00  0x00  0xFF  0xFF  0xFF  0xFF  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00
       readSpare -------------------------------
               page 0
               len 16
0x00  0x00  0x10  0x00  0xFF  0xFF  0x01  0x03  0xCF  0xFF  0xC3  0x20  0xC1  0xFC  0xFF  0x03
       progPage ----------------------------------
               page 3
               len 512
0x01  0x00  0x00  0x00  0x01  0x00  0x00  0x00  0xFF  0xFF  0x66  0x69  0x6C  0x65  0x30  0x2E 
0x74  0x78  0x74  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0xFF  0xFF  0x80  0x01  0x00  0x00 
0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
0x00  0x00  0x00  0x00  0x23  0x00  0x00  0x00  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0x00  0x00  0x00  0x00 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF 
0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0x00  0x00  0x00  0x00  0xFF  0xFF  0xFF  0xFF 
0x00  0x00  0x00  0x00  0xFF  0xFF  0xFF  0xFF  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00
       progSpare -------------------------------
               page 3
               len 16
0x00  0x00  0x20  0x00  0xFF  0xFF  0x01  0x03  0xCF  0xFF  0xC3  0x2C  0xC1  0x99  0xA6  0x97
       progSpare -------------------------------
               page 0
               len 16
0xFF  0xFF  0xFF  0xFF  0x00  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF  0xFF

 

Остальные сектора файловая система не трогает.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На бэды проверка там делается следующим образом. C самого начала (с завода) флешка стерта, везде, в том числе и в области spare записаны 0xFF. В даташите написано, что если блок битый, то spare области c самого начала в первых двух байтах будет число отличное от FF. Файловая система так и работает - определяет битый блок, если первые два байта не FF и помечает битые блоки записывая в первые два байта spare 'Y' 'Y'. Если блок "ломается" в процессе, то файловая система обнаружит это в результате записи - запишет, считает и сравнит записанное и то что должно быть. Если запись не удалась, то пометить блок как битый и будет работать с другим.

Благодарю!

Весьма исчерпывающий ответ :cheers:

 

Пару коммертариев.

 

Маркер битого блока находится не в первых двух байтах spare области, а, вероятнее всего - в шестом.

Так как в вашем примере первые 4 байта содержат, видимо, ECC коды, а последние 10 - тэги/прочая служебная информация.

 

Для 512 байт избыточный код по Хэммингу должен быть длиной 24 бита.

У вас - 32 бита. Возможно - неупакованные данные?

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Маркер битого блока находится не в первых двух байтах spare области, а, вероятнее всего - в шестом.

 

Да действительно в шестом.

 

У вас - 32 бита. Возможно - неупакованные данные?

 

Тут, признаюсь, я сбит с толку. Я не думаю что это неупакованные данные, возможно это ошибка в моем драйвере - нужно внимательно проверить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут, признаюсь, я сбит с толку. Я не думаю что это неупакованные данные, возможно это ошибка в моем драйвере - нужно внимательно проверить.

К примеру, spare область 512-ти байтовой страницы Yaffs может выглядеть так:

30 30 99 FF FF FF FF FF  00 00 10 00 05 01 04 00

Первые три байта - упакованный код ECC (два слова по 12 бит - 24 бита в сумме), последние 8 байт - тэги файловой системы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я решил описать процесс портирования yaffs, если кому интересно вот ссылка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...