TL866

компиляция информации из разных мест

ссылки:
http://forum.easyelectronics.ru/viewtopic.php?f=16&t=18067
https://github.com/vdudouyt/minipro
http://forum.easyelectronics.ru/viewtopic.php?f=18&t=11352&hilit=tl866a

модернизации:

1. For programming an old 2732 EPROM on my TL866 I designed a quick&dirty adaptor to apply an external 25V programming voltage, see attached schematics. 

2.

Структура и организация NAND памяти

источники информации:
http://www.phyton.ru/support/nand-flash-structure
http://www.stlinux.com/howto/NAND/BadBlocks

 

Data storage on NAND Flash

Single Level Cell (SLC) NAND Flash stores one single bit of information for each memory cell. This is the only type of NAND technology that the STMicroelectronics’ drivers can support. There are other NAND technologies, such as Multiple Level Cell (MLC) which stores multiple bits of information for each memory cell and so provides higher storage density. However, MLC NAND Flash is slower, less robust and consequently requires a more sophisticated error correction mechanism. A third technology, Triple Level Cell (TLC), is also available, but this demonstrates the same disadvantages as MLC.

The basic unit of operation for a NAND Flash device is the page. Generally, the page is the smallest writable unit of the NAND device. A block consists of a multiple number of pages, and is the smallest erasable unit of a NAND device. There are certain NAND Flash commands that can be applied to a given page, others that are applied to a given block, and some that can only be applied to the whole chip.

Before programming, a page is erased by setting all data bits to «1». The controller writes data to the page by setting selected cells in the page to «0». This means that the data is effectively recorded in the page by applying a logical AND to the existing state of the chip; bits at «1» can be programmed to «0», but bits at «0» can only be changed to «1» by erasing the entire block.

Every page is divided into two distinct regions, the In-Band area and the Out-Of-Band area (OOB). Both areas are freely addressable by the user. Under normal usage, the In-Band area is for main data storage and the OOB area is for Error Correcting Code (ECC) and metadata. However, there is no underlying difference between the In-Band and OOB cells and other layout strategies exist, such as interleaving data and ECC sectors, treating the Page and OOB area as a single unified entity.

NAND Flash devices can be characterized by the size of the pages. As the page is the smallest addressable unit of a Flash device, then a page size should be chosen that enables the memory to be used efficiently.

The following table gives details of the four most common page sizes, and the size of the In-Band and Out-of-Band areas for each.

In-Band area Out-of-Band area
Small page 512 bytes 16 bytes
Large page 2048 bytes 64 bytes
Very large page 4096 bytes 128 bytes
Very very large page 8192 bytes 256 bytes

Note that the command protocols for the different page sizes are different, so components that need to access NAND must be configured according to the size of the page in use.

Out-of-band (OOB) area

The OOB is traditionally 1/32 of the size of the In-Band area, although some modern NANDs require a larger OOB. It is used for Error Correcting Code (ECC) and metadata. The following list describes some of the metadata that can be found in the OOB:

In some cases, the ECC scheme is such that there is little or no free space in the OOB area for storing the required metadata. Hardware constraints may impose further restrictions on the use of the OOB area. Consequently, it is not always possible to support all users of the OOB area, or in other cases, support needs to be adapted accordingly (for example, moving the BBT signature in-band, or invoking the YAFFS2 ‘inband-tags’ option).

Large block vs. Small Block NAND
In the current NAND architecture, each page consists of 528 bytes, and each block consists of
32 pages. Future NAND devices will use the large page/large block structure in which a page will
be 2112 bytes (4 times larger) and a block will consist of 64 pages (2 times larger) resulting in a
block size that is 8 times larger. The first of these new large block NAND flash devices is the 1
Gbit TC58NVG0S3AFT00. Note that all large block devices will also have the chip enable don’t
care feature. The increased page and block size will enable faster program and erase speeds in
future high density NAND flash.

 

ECC

Small Page Size Architecture
Large Page Size Architecture
Spare Area distributions according to the page size

FTDI FT2232 Nand reader

Компиляция информации по работе с nand памятью с помощью FT2232  (описано при работе в Windows)

плата в DipTrace
плата адаптера для прошивки LPC9xx

Источники информации (комментарии — ВАЖНО):
http://spritesmods.com/?art=ftdinand&page=2    
ZADIG (драйвер для FTDI чипов
1. WinUSB
2.libusb
3.libusbK
)
 
https://github.com/bkerler/NANDReader_FTDI (чтение только 8 битных  чипов !!!)(работает через libusb или libusbK, но со странностями) *****************************************
информация для сборки проекта
*****************************************
1. Для вывода русского языка
#include <locale.h>
setlocale(LC_ALL, «Russian»);
2. использовать LUBUSB CALL
3. getopt брать из source в libusb ( <iostream> не использовать)
4. драйвер — zadig — libusbK !!!!!!!!!
5. Вызовы __cdecl
6. использовать CMAKE
*****************************************
для компиляции необходимы
libftdi
libusb
libusbX

https://github.com/ohjeongwook/NANDReader_FTDI дальнейшее развитие предыдущей версии !!!
https://github.com/ohjeongwook/DumpFlash (усеченная версияпредыдущего проекта !!!,
похоже продолжает развиваться

в частности не читает новые чипы, неправильно распознает идентификаторы чипа)
(работает через libusb но со странностями)
Необходимо установить
Python 2.6
Pyserial
PyUSB
Pyftdi
Import error: no module named pyftdi.ftdi
#from pyftdi.pyftdi.ftdi import *
from pyftdi.ftdi import *
value error: no backend available не находит устройство
http://blog.j-michel.org/post/86992432269/from-nand-chip-to-files  extractor областей из полученного дампа

Шаманство: (видимо криво установлены драйвера и библиотеки, но система нужна в этом виде)
Если при работе с NandTool чип неопределяется — возврат 00 00 00 00 00 00
1. установить libusb драйвера2. прочитать информацию с помощью DumpFlash -i
3.сменить драйвера на libusbK
4.прочитать информацию с помощью NandTool
все начинает корректно определяться
так необходимо делать после каждого нового переподключения устройства к USB (надо разбираться в причине)
на чипах Hynix HY27UV08BG5P такого не наблюдается.

Возможно это связано с этим   K9F1G08Q0A
(Power-On Auto-Read
The device is designed to offer automatic reading of the first page without command and address input sequence during power-on.
An internal voltage detector enables auto-page read functions when Vcc reaches about 1.8V.  PRE pin controls activation of auto-
page read function. Auto-page read function is enabled only when PRE pin is tied to Vcc. Serial access may be done after power-on
without latency.   Power-On Auto Read mode is available only on 3.3V device(K9F1GXXU0M).)

 

If you encounter problems with using a USB device with libusb on Windows, you may need to install a libusb device filter. This guide assumes that you already have libusb-win32 installed on Windows, and that you have the libusb-win32 binary version 1.2.2.0 in a folder called libusb-win32-bin-1.2.2.0. If not, see Compiling Openocd for information on installing libusb.

Описание проблемы
http://sourceforge.net/p/libusb-win32/wiki/Home/

Общие принципы восстановления данных с испорченных флеш накопителей на основе NAND памяти.

1.В первую очередь нужно устранить внутреннее смешивание информации на уровне чипов памяти так как: микросхема или микросхемы памяти могут состоять из нескольких частей (кристаллов) в основном 1-го, 2-ух, или 4-ёх и запись на них производится сразу в два или более мест (происходит удвоение скорости записи). Задача состоит в том, чтобы собрать данные в правильном порядке (чтобы номера секторов таблицы FAT шли по порядку) в один большой файл (результирующий dump) с которым будет производиться дальнейшая работа по извлечению данных.

2. Запись  на чипы/кристаллы памяти производится блоками (blocks), состоящими в свою очередь из страниц (page), которые состоят из секторов(чаще всего по 528 бит) —  формируя  единое целое банки (Banks). Блоки внутри банков перемешанные. Каждый блок обладает маркером, как правило, 1 или 2 бита идущие подряд (это функция от номера блока), оперируя маркерами, контроллер автоматически расставляет блоки в нужном порядке, после чего информация, находящаяся на накопителе через USB интерфейс выводится на экран. В редких случаях Банки так же могут быть перемешаны, усложняя общую смешанность данных.
Задача состоит в том, чтобы в нужном порядке расставить Блоки внутри каждого Банка как это делает контроллер флеш карты, получить образ и скопировать данные. Для чего  понадобятся знания о принципах работы алгоритмов контроллеров, по которым осуществляется нумерация блоков с помощью маркеров или таблиц трансляции.

Datasheets:
K9F1G08Q0A
Микросхемы NAND памяти фирмы HYNIX
Memory chips
NAND Flash Code Information:
nand_flash_pnd
SK Hynix

ID Data of NAND Flash:
id_data_summary

Information & manuals:
Reverse Engineering Flash Memory for Fun And Benefit(1)

Atmega48

взято тут

Каждый , кто имел дело с программированием FUSE-битов (для краткости называют фьюзы), загонял свою микросхему в глубокий сон. Другими словами неверные действия над фьюзами легко могут привести к тому, что МК никогда не проснется, либо он будет жив, но программу в него не зашьешь. Поэтому, большинство любителей электроники просто игнорируют их. Что же такое фьюзы?

FUSE – биты (с англ. Предохранительные биты) — это конфигурационные программируемые биты, которые определяют дальнейший режим работы МК. Эти биты или ячейки сгруппированы в несколько байтов: cтарший конфигурационный байт, младший конфигурационный байт и бывает еще дополнительный конфигурационный байт.

И так вы приступили к программированию фьюзов, перед вами появились перечень их: BODLEVEL, BODEN, SUT1, SUT0, CKSEL3, CKSEL2, CKSEL1, CKSEL0, S8515С, WDTON, SPIEN, CKOPT, EESAVE, BOOTSZ1,BOOTSZ0, BOOTRST, RESERVED, OCDEN, JTAGEN, SELFPRGEN, DWEN, RSTDISBL, CKDIV, CKOUT,PLLCK. Процесс программирования фьюзов обычно выглядит так: установка галочки в окошке напротив названия бита.

В AVR мегах из этого списка первые 8 бит — младший конфигурационный байт, вторые 8-бит — старший конфигурационный байт. У каждого МК свой уникальный набор этих битов, но значения у всех одинаковые. Поэтому, чтобы все работало у вас верно, ниже привожу значения каждого из этих фьюзов.

BODLEVEL2…0 — порог срабатывания супервизора питания.

Этот бит предназначены для задания номинального значения порога срабатывания супервизора питания (BOD). Во время подачи питания МК удерживается в состоянии сброса до тех пор, пока напряжение VCC не достигнет запрограммированного порога срабатывания супервизора BOD. Порог срабатывания супервизора питания, даже если он неактивен, должен быть установлен ниже уровня VCC.

1.jpg

BODEN- бит, включающий схему аппаратного детектора недопустимого уровня питающего напряжения, т. е. схему BOD (0 – разрешение, 1- запрещение).

SUT1, SUT0- (STARTUPTIME) служат для определения длительности задержки сброса. Биты, управляющие режимом запуска тактовых генераторов МК. Связаны с битами, определяющими тип и частоту тактового генератора. При ошибочной их установки возможны ситуации неустойчивого запуска генератора или неоднократного сброса МК в процессе подачи на него питания. Другими словами их используют для задания задержки времени с момента деактивации всех источников сброса и до момента деактивации внутреннего сброса, инициированного счетчиком длительности задержки. Данный счетчик синхронизируется с выхода ULP-генератора частотой 1 кГц.

2.jpg

CKSEL[3..0] – биты определяющие режим тактирования МК, а именно источник тактового сигнала и его частоту. При неверной установки этих битов , МК может не обнаруживаться последовательным программатором. Для выхода из этого состояния потребуется параллельный программатор. По умолчанию они настроены на работу МК от внутреннего тактового генератора 1 МГц, при установки всех битов в единицу, МК будет тактироватся от внешнего кварцевого резонатора.

3.jpg

WDTON – бит включения и отключения сторожевого таймера/счетчика. (0 – всегда включен. В этом случае программно его не выключить. 1 – может управляется программно. Имеется ввиду в тексте вашей программы).

SPIEN – бит, который разрешает или запрещает программирования МК через интерфейс SPI (0 – разрешено, 1- запрещено). То есть программирование через последовательный программатор.

CKOPT- этот конфигурационный бит выбирает один из двух режимов усилителя генератора. Если CKOPT запрограммирован, то амплитуда колебаний выходного сигнала генератора будет ограничена уровнями питания. Данный режим рекомендуется использовать при высоком уровне окружающих шумов или при использовании выхода XTAL2 в качестве источника синхронизации внешней схемы. Данный режим характеризуется широким частотным диапазоном. Если CKOPT – незапрограммирован, то амплитуда выходных колебаний генератора снижается. Использование данного режима позволяет существенно снизить потребляемую мощность, но при этом ограничен частотный диапазон и нельзя XTAL2 использовать для внешней синхронизации. При использовании резонаторов максимальная частота равна 8 МГц, если CKOPT – незапрограммирован, и 16 МГц, если CKOPT- запрограммирован. Вот еще табличка, которая может быть полезная:

4.jpg

EESAVE – Определяет влияния команды «стирания кристала» Если установить в 0, то при стирании памяти кристалла, содержимое EEPROM не сотрется. Если 1 – то при стирании кристалла, вместе с памятью программ и сотрутся все данные EEPROM.

BOOTSZ1, BOOTSZ0 – определяет размер секции загрузки. Два бита, определяющие размер области памяти программ, выделяемой для загрузчика (Boot Loader). Комбинация этих битов, в частности, определяет точку начала исполнения программы после сброса, если установлен бит BOOTRST.

BOOTRST — управление переносом вектора сброса в загрузочный сектор. Конфигурационный бит BOOTRST программируют при необходимости переноса вектора сброса в начало загрузочного сектора Flash-памяти. В таком случае, после сброса МК, выполнение программы начнется из загрузочного сектора.

5.jpg

RESERVED или RES– если встретится этот бит – игнорируйте его. Данный конфигурационный бит является резервными и всегда считывается с нулевыми значениями. Для совместимости с будущими микроконтроллерами, при записи в этот регистр, в данные биты необходимо всегда записывать нули.

OCDEN – разрешает или запрещает внутрисхемную отладку. (0– разрешен, 1– запрещен).

JTAGEN- разрешение или запрещения использования интерфейса JTAG (0– разрешен, 1– запрещен).

SELFPRGEN- разрешение самопрограммирования (0– разрешен, 1– запрещен).

DWEN — разрешение или запрещения использования отладочного интерфейса debagWire (0– разрешен, 1– запрещен).

RSTDISBL — определяет функционирования вывода МК, совмещенного с аппаратным выводом сброса. (0 – контакт порта ввода/вывода, 1- вывод сброса)/

CKDIV8 — бит, включающий предварительное деление частоты кварцевого (или иного имеющегося) тактового генератора на 8. То есть при включенном этом бите и применении кварцевого резонатора на 8 МГц реальная тактовая частота МК составит 1 МГц.

CKOUT — бит, разрешающий вывод тактовой частоты на один из выводов МК (для тактирования других устройств).

PLLCK- использования выходного сигнала схемы ФАПЧ в качестве тактового.

А так выглядит установка FUSE- бит в программе PonyProg. Ставим галочку — 0, снимаем галочку -1. Не путать!!!!

6.jpg

При программировании наибольшую опасность для МК, при неправильной установки фьюзов вызывают фьюзы CKSEL3..0 и RSTDISBL. Эти фьюзы нужно програмировать с особой внимательностью.

Состояния фьюзов не изменяется после выполнения операции «стирания кристала».

Новичкам советую изменять только биты CKSEL3..0. Если не используйте кварц, то и вовсе не стоит что-то изменять. Оставьте заводские настройки. Ну а если подкинули кварц, хотите чтоб ваш МК тактировался частотой свыше 1 МГц, тогда запишите в биты CKSEL3…0 все еденички, что на логике микроконтроллеров означает незапрограммированное состояние.

Есть еще кое какие неудобства при программировании фьюзов: установленным считается fuse-бит, равный нулю, а сброшенным – равный единице. Это связано с общим принципом работы с любой памятью – от ПЗУ до МК – стертая (т. е. чистая) память содержит все единицы, и только нолики могут быть в нее записаны. Никогда не забывайте об этом! Как правило в разных программаторах fuse-биты устанавливаются по разному (галочками, списком или иначе), но всегда и везде ЗАПРОГРАММИРОВАННОМУ состоянию бита соответствует НОЛЬ, а не единица!!!