а я весь яндекс замучил в поиске HWB FWH= SST49LF002A, SST49LF003A, SST49LF004A, SST49LF008A, A49LF040, LPC/FWH= Pm49FL002, Pm49FL004 - у этих точно есть функция Chip Erase... Про остальные пока не знаю... возможно не у всех есть данная функция... будем искать Пока тестировал на двух флешах: SST49LF002A - FWH Pm49FL004T - LPC/FWH полет нормальный... других под рукой нет...
ага... AT49LH002 не знает что такое Chip Erase
а у всех Flash, сектора по 4 килобайта? или встречаются другие?
Advanced member
Статус: Не в сети Регистрация: 10.04.2003 Откуда: Москва
Valentin_N, ты бы предусмотрел в программе какой-нибудь ini файл с конфигурацией чипов.
Ну, типа:
- DeviceID
- VendorID
- name
- size
- ChipEraseSupport
- SizeSector0
- SizeSector1....
Тогда бы никаких проблем с конфигурированием.
Я сейчас взял первый попавшийся чип W49V002FA, у него все сектора разные:
boot = 16K
1=8K
2=8K
3=32K
4=64K
5=64K
6=64K Добавлено спустя 6 минут, 54 секунды Можно несколько упростить себе жизнь - в системе команд допустимо выдавать адрес сектора не обязательно выровненную на его размер (т.е. не обязательно с начала).
Я бы сделал следующий алгоритм:
- стереть 0 сектор (или очередной). Размер не важен, скажем будем считать его в 4К
- записать этот сектор из расчета 4К
- посмотреть, пустой ли следующий сектор (4К). Если пуст, то продолжить запись и так до конца файла.
Если в секторе обнаружен байт не_FF, выдать команду стирания сектора с этим адресом и продолжить запись....
запрос идентификатора флеша в программе реализован, уже думал извлекать из внешнего файла данные о чипе по идентификации, по крайней мере о тех которые мне известны их много самых разных...
по поводу алгоритма стирания, идея прикольная... спасибо...
но возможны нюансы... к примеру выше описанный чип, 2 сектор, объем 8K, если в начале сектора значение FF и через 4К значение FF, то сектор останется в исходном виде (теоретически)... возможно на практике такого не бывает...
как вариант, читать с 0 адреса и если подается значение не равное FF (допустим адрес XXXXX), то даем команду на стирание и можно читать дальше с адреса XXXXX+4К я так понял, что сектора менее 4К не бывают...
в общем думаем варианты...
Advanced member
Статус: Не в сети Регистрация: 10.04.2003 Откуда: Москва
Если кратко - ПЕРЕД записью надо проверять весь сектор на стертость (наличие FF в всех позициях). В случае наличия не_FF сделать попытку стереть этот сектор. После стирания проверить на стертость. Если не стерлось, выдать сообщение о фатальной ошибке.
Т.о., я бы сделал такой алгоритм:
1. выдать команду стереть chip, если стоит опция переписывать и BootBlock.
(так быстрее - не придется _стирать_ сектора)
2. цикл записи:
- проверить на стертость сектора. Если грязный - стереть и проверить стертость.
- записать сектор.
При записи учитывать переписывание BootBlock. Я бы сделал ComboBox с позициями:
- игнорировать
- size1
- size2
- size3
(sizeX - типичные размеры BootBlock, я их не помню). Он располагается в конце (особенность x86), потому с ним просто, это кусок в самом конце адресов FLASH.
Теоретически, можно сделать опцию 'переписать только бутблок'.
По остальным структурам в FLASH .... тут лучше maco скажет, стоит ли заморачиваться с этой мутью.
А в исходниках Uniflash если покопаться?
там точно было отдельно сделано стирание и запись бутблока,
насколько я помню организацию флэшей, там блоки могут быть разные, но бутблок всегда фиксированный...
правда он может быть как в конце флэши , так и в начале.
По структурным особенностям флешек лучше читать документацию . От себя могу посоветовать обратить внимание на 3-хмегабитные флешки от SST (по остальным не искал) - распределение памяти у них совпадает с 4-хмегабитками, а в начале получается дырка размером 1 Мбит.
Baza писал(а):
но бутблок всегда фиксированный... правда он может быть как в конце флэши , так и в начале
Это для FWH/LPC? Я вроде не встречал bootblock в начале флешки.
Advanced member
Статус: Не в сети Регистрация: 10.04.2003 Откуда: Москва
Вот я тоже в сомнениях. Возможно, Baza имел в виду что-то типа W49V002FA? ... так - там в документации написано, что BootBlock имеет 0 сектор .... но если просмотреть сноску к таблице, то следует, что у них 0 сектор имеет самый последний адрес. Подумаешь, считают с конца? (любители моторолы, блин! )
refflex Чем прошиваете?
Кстати, в приведенных документах функция ChipErase числится в разделе OPTIONAL FEATURES, если я правильно понял. Лучше читать документацию на конкретные микросхемы/серию микросхем от производителя.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения