Явно ведь делаешь для хакинга ромов?
Нет.
If-Else можно продолжать:
Знаю, но слышал, что этим увлекаться не стоит, якобы switch эффективнее. Думаю, может кто-нибудь здесь знает такого разработчика YandereDev? Слышал, что причина тормознутости его игры как раз в том, что он злоупотребляет if-else.
Спасибо всем за советы. Не смотря на предостережения от
Sharpnull, все-таки решил убрать return и break из case 2. Chip Erase не запустилось два раза, а это значит, что без break переходит на следующий вариант (в принципе, я знал об этом, но не уверен, стал бы он переходить на default), а также return прерывает функцию вместе с работающим в ней циклом.
Правда скомпилировалось не сразу - в одном месте забыл восклицательный знак в "!=", а потом еще удивлялся, про какую же lvalue говорит мне компилятор. А в функции writeByWord вообще умудрился как-то уничтожить одну "родную" фигурную скобку, когда вставлял туда свой switch.
Но когда исправил ошибки, код заработал с перврго раза. Сегодня уже попробовал прошить LH28F800BJE - микросхема прошилась и даже не сдохла после двух раз (первый раз прошил другой ROM, во второй вернул "старый"). Также прошил MX29LV320E - тоже прошилась нормально.
Осталась только загвоздка с Device ID. В программе просто захардкожены несколько Device ID:
if (((flashid >> 8) & 0xFF) == 0x22 || flashid == 0x7E7E || flashid == 0x57 || flashid == 0xF8)
То есть, если программа не "видит" знакомого Device ID, то считает, что микросхема не определилась. Стоит обратить еще внимание на это: ((flashid >> 8) & 0xFF) == 0x22 - на сколько я понимаю, это проверка только старшего байта, а у многих микросхем старший байт Device ID = 0x22. Таким образом, видимо автор пытался охватить большее количество микросхем, не прописывая все их Device ID.
Тем не менее, у многих, но не у всех - есть микросхемы, у которых Device ID "не подходит", но при этом у них такая же система комманд, и Burn2Slot потенциально может их прошить. У меня например есть TC58FVB160AFT (Device ID=0x0043), SST39VF1601 (Device ID=0x23BH), SST39VF1602 (Device ID=0x23AH). Чисто в теории, в программе нужно сделать какую-то "базу данных" по Device ID, как это уже сделано с Manufacturer ID в файле "ID.H". Но этих Device ID просто море, нужно в интернете найти какой-то список, пока не нашел. Плюс ко всему, надо еще придумать, как программа будет перебирать их все. Но судя по всему, так и делают -
нашел пример.
Но я пока не знаю, где бы взять базу данных по этим самым ID, и как их проверять. Пока придумал только довольно костыльный метод - до посылания комманды идентификации считываю данные по адресам 0x0 и 0x1, затем после комманды считываю значения по этим же самым адресам - если они изменились, то значит считаю, что микросхема откликнулась. Но это не очень хороший метод, плюс ко всему, подумал, что так не получится корректно определить busType.
P.S.: Кстати, нашел ошибку в
ID.h - в case MACRONIX_ID автор забыл break. А ведь у меня микросхемы фирмы Macronix определялись как "Sharp" в Burn2Slot. Я это сразу заметил, но сначала не предал значения - думал, может у Macronix как-то изменился Manufacturer ID, может у меня какая-то старая микросхема, у которой Manufacturer ID как у Sharp. Ну или может купили производство Flash-памяти у Sharp, а ID остался старый.
Но оказалось там просто нет break, а так как сразу за Macronix идет Sharp, то его функция и возвращала.