flashchips.c 256 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887
  1. /*
  2. * This file is part of the flashrom project.
  3. *
  4. * Copyright (C) 2000 Silicon Integrated System Corporation
  5. * Copyright (C) 2004 Tyan Corp
  6. * Copyright (C) 2005-2008 coresystems GmbH <stepan@openbios.org>
  7. * Copyright (C) 2006-2009 Carl-Daniel Hailfinger
  8. * Copyright (C) 2009 Sean Nelson <audiohacked@gmail.com>
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software
  22. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  23. */
  24. #include <stdlib.h>
  25. #include <string.h>
  26. #include "flash.h"
  27. #include "flashchips.h"
  28. #include "chipdrivers.h"
  29. #include "writeprotect.h"
  30. /**
  31. * List of supported flash chips.
  32. *
  33. * Please keep the list sorted by vendor name and chip name, so that
  34. * the output of 'flashrom -L' is alphabetically sorted.
  35. */
  36. const struct flashchip flashchips[] = {
  37. /*
  38. * .vendor = Vendor name
  39. * .name = Chip name
  40. * .bustype = Supported flash bus types (Parallel, LPC...)
  41. * .manufacture_id = Manufacturer chip ID
  42. * .model_id = Model chip ID
  43. * .total_size = Total size in (binary) kbytes
  44. * .page_size = Page or eraseblock(?) size in bytes
  45. * .tested = Test status
  46. * .probe = Probe function
  47. * .probe_timing = Probe function delay
  48. * .block_erasers[] = Array of erase layouts and erase functions
  49. * {
  50. * .eraseblocks[] = Array of { blocksize, blockcount }
  51. * .block_erase = Block erase function
  52. * }
  53. * .printlock = Chip lock status function
  54. * .unlock = Chip unlock function
  55. * .write = Chip write function
  56. * .read = Chip read function
  57. * .voltage = Voltage range in millivolt
  58. */
  59. {
  60. .vendor = "AMD",
  61. .name = "Am29F010A/B",
  62. .bustype = BUS_PARALLEL,
  63. .manufacture_id = AMD_ID,
  64. .model_id = AMD_AM29F010B, /* Same as Am29F010A */
  65. .total_size = 128,
  66. .page_size = 16 * 1024,
  67. .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
  68. .tested = TEST_OK_PRE,
  69. .probe = probe_jedec,
  70. .probe_timing = TIMING_ZERO,
  71. .block_erasers =
  72. {
  73. {
  74. .eraseblocks = { {16 * 1024, 8} },
  75. .block_erase = erase_sector_jedec,
  76. }, {
  77. .eraseblocks = { {128 * 1024, 1} },
  78. .block_erase = erase_chip_block_jedec,
  79. },
  80. },
  81. .write = write_jedec_1,
  82. .read = read_memmapped,
  83. .voltage = {4500, 5500},
  84. },
  85. {
  86. .vendor = "AMD",
  87. .name = "Am29F002(N)BB",
  88. .bustype = BUS_PARALLEL,
  89. .manufacture_id = AMD_ID,
  90. .model_id = AMD_AM29F002BB,
  91. .total_size = 256,
  92. .page_size = 256,
  93. .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
  94. .tested = TEST_UNTESTED,
  95. .probe = probe_jedec,
  96. .probe_timing = TIMING_ZERO,
  97. .block_erasers =
  98. {
  99. {
  100. .eraseblocks = {
  101. {16 * 1024, 1},
  102. {8 * 1024, 2},
  103. {32 * 1024, 1},
  104. {64 * 1024, 3},
  105. },
  106. .block_erase = erase_sector_jedec,
  107. }, {
  108. .eraseblocks = { {256 * 1024, 1} },
  109. .block_erase = erase_chip_block_jedec,
  110. },
  111. },
  112. .write = write_jedec_1,
  113. .read = read_memmapped,
  114. .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
  115. },
  116. {
  117. .vendor = "AMD",
  118. .name = "Am29F002(N)BT",
  119. .bustype = BUS_PARALLEL,
  120. .manufacture_id = AMD_ID,
  121. .model_id = AMD_AM29F002BT,
  122. .total_size = 256,
  123. .page_size = 256,
  124. .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
  125. .tested = TEST_UNTESTED,
  126. .probe = probe_jedec,
  127. .probe_timing = TIMING_ZERO,
  128. .block_erasers =
  129. {
  130. {
  131. .eraseblocks = {
  132. {64 * 1024, 3},
  133. {32 * 1024, 1},
  134. {8 * 1024, 2},
  135. {16 * 1024, 1},
  136. },
  137. .block_erase = erase_sector_jedec,
  138. }, {
  139. .eraseblocks = { {256 * 1024, 1} },
  140. .block_erase = erase_chip_block_jedec,
  141. },
  142. },
  143. .write = write_jedec_1,
  144. .read = read_memmapped,
  145. .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
  146. },
  147. {
  148. .vendor = "AMD",
  149. .name = "Am29F016D",
  150. .bustype = BUS_PARALLEL,
  151. .manufacture_id = AMD_ID,
  152. .model_id = AMD_AM29F016D,
  153. .total_size = 2 * 1024,
  154. .page_size = 64 * 1024,
  155. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  156. .tested = TEST_UNTESTED,
  157. .probe = probe_jedec,
  158. .probe_timing = TIMING_ZERO,
  159. .block_erasers =
  160. {
  161. {
  162. .eraseblocks = { {64 * 1024, 32} },
  163. .block_erase = erase_sector_jedec,
  164. }, {
  165. .eraseblocks = { {2048 * 1024, 1} },
  166. .block_erase = erase_chip_block_jedec,
  167. },
  168. },
  169. .write = write_jedec_1,
  170. .read = read_memmapped,
  171. .voltage = {4500, 5500},
  172. },
  173. {
  174. .vendor = "AMD",
  175. .name = "Am29F040B",
  176. .bustype = BUS_PARALLEL,
  177. .manufacture_id = AMD_ID,
  178. .model_id = AMD_AM29F040B,
  179. .total_size = 512,
  180. .page_size = 64 * 1024,
  181. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  182. .tested = TEST_UNTESTED,
  183. .probe = probe_jedec,
  184. .probe_timing = TIMING_ZERO,
  185. .block_erasers =
  186. {
  187. {
  188. .eraseblocks = { {64 * 1024, 8} },
  189. .block_erase = erase_sector_jedec,
  190. }, {
  191. .eraseblocks = { {512 * 1024, 1} },
  192. .block_erase = erase_chip_block_jedec,
  193. },
  194. },
  195. .write = write_jedec_1,
  196. .read = read_memmapped,
  197. .voltage = {4500, 5500},
  198. },
  199. {
  200. .vendor = "AMD",
  201. .name = "Am29F080B",
  202. .bustype = BUS_PARALLEL,
  203. .manufacture_id = AMD_ID,
  204. .model_id = AMD_AM29F080B,
  205. .total_size = 1024,
  206. .page_size = 64 * 1024,
  207. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  208. .tested = TEST_UNTESTED,
  209. .probe = probe_jedec,
  210. .probe_timing = TIMING_ZERO,
  211. .block_erasers =
  212. {
  213. {
  214. .eraseblocks = { {64 * 1024, 16} },
  215. .block_erase = erase_sector_jedec,
  216. }, {
  217. .eraseblocks = { {1024 * 1024, 1} },
  218. .block_erase = erase_chip_block_jedec,
  219. },
  220. },
  221. .write = write_jedec_1,
  222. .read = read_memmapped,
  223. .voltage = {4500, 5500},
  224. },
  225. {
  226. .vendor = "AMD",
  227. .name = "Am29LV001BB",
  228. .bustype = BUS_PARALLEL,
  229. .manufacture_id = AMD_ID,
  230. .model_id = AMD_AM29LV001BB,
  231. .total_size = 128,
  232. .page_size = 64 * 1024, /* unused */
  233. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  234. .tested = TEST_OK_PREW,
  235. .probe = probe_jedec,
  236. .probe_timing = TIMING_ZERO,
  237. .block_erasers =
  238. {
  239. {
  240. .eraseblocks = {
  241. {8 * 1024, 1},
  242. {4 * 1024, 2},
  243. {16 * 1024, 7},
  244. },
  245. .block_erase = erase_sector_jedec,
  246. }, {
  247. .eraseblocks = { {128 * 1024, 1} },
  248. .block_erase = erase_chip_block_jedec,
  249. },
  250. },
  251. .write = write_jedec_1,
  252. .read = read_memmapped,
  253. .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
  254. },
  255. {
  256. .vendor = "AMD",
  257. .name = "Am29LV001BT",
  258. .bustype = BUS_PARALLEL,
  259. .manufacture_id = AMD_ID,
  260. .model_id = AMD_AM29LV001BT,
  261. .total_size = 128,
  262. .page_size = 64 * 1024, /* unused */
  263. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  264. .tested = TEST_UNTESTED,
  265. .probe = probe_jedec,
  266. .probe_timing = TIMING_ZERO,
  267. .block_erasers =
  268. {
  269. {
  270. .eraseblocks = {
  271. {16 * 1024, 7},
  272. {4 * 1024, 2},
  273. {8 * 1024, 1},
  274. },
  275. .block_erase = erase_sector_jedec,
  276. }, {
  277. .eraseblocks = { {128 * 1024, 1} },
  278. .block_erase = erase_chip_block_jedec,
  279. },
  280. },
  281. .write = write_jedec_1,
  282. .read = read_memmapped,
  283. .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
  284. },
  285. {
  286. .vendor = "AMD",
  287. .name = "Am29LV002BB",
  288. .bustype = BUS_PARALLEL,
  289. .manufacture_id = AMD_ID,
  290. .model_id = AMD_AM29LV002BB,
  291. .total_size = 256,
  292. .page_size = 64 * 1024, /* unused */
  293. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  294. .tested = TEST_UNTESTED,
  295. .probe = probe_jedec,
  296. .probe_timing = TIMING_ZERO,
  297. .block_erasers =
  298. {
  299. {
  300. .eraseblocks = {
  301. {16 * 1024, 1},
  302. {8 * 1024, 2},
  303. {32 * 1024, 1},
  304. {64 * 1024, 3},
  305. },
  306. .block_erase = erase_sector_jedec,
  307. }, {
  308. .eraseblocks = { {256 * 1024, 1} },
  309. .block_erase = erase_chip_block_jedec,
  310. },
  311. },
  312. .write = write_jedec_1,
  313. .read = read_memmapped,
  314. .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
  315. },
  316. {
  317. .vendor = "AMD",
  318. .name = "Am29LV002BT",
  319. .bustype = BUS_PARALLEL,
  320. .manufacture_id = AMD_ID,
  321. .model_id = AMD_AM29LV002BT,
  322. .total_size = 256,
  323. .page_size = 64 * 1024, /* unused */
  324. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  325. .tested = TEST_UNTESTED,
  326. .probe = probe_jedec,
  327. .probe_timing = TIMING_ZERO,
  328. .block_erasers =
  329. {
  330. {
  331. .eraseblocks = {
  332. {64 * 1024, 3},
  333. {32 * 1024, 1},
  334. {8 * 1024, 2},
  335. {16 * 1024, 1},
  336. },
  337. .block_erase = erase_sector_jedec,
  338. }, {
  339. .eraseblocks = { {256 * 1024, 1} },
  340. .block_erase = erase_chip_block_jedec,
  341. },
  342. },
  343. .write = write_jedec_1,
  344. .read = read_memmapped,
  345. .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
  346. },
  347. {
  348. .vendor = "AMD",
  349. .name = "Am29LV004BB",
  350. .bustype = BUS_PARALLEL,
  351. .manufacture_id = AMD_ID,
  352. .model_id = AMD_AM29LV004BB,
  353. .total_size = 512,
  354. .page_size = 64 * 1024, /* unused */
  355. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  356. .tested = TEST_UNTESTED,
  357. .probe = probe_jedec,
  358. .probe_timing = TIMING_ZERO,
  359. .block_erasers =
  360. {
  361. {
  362. .eraseblocks = {
  363. {16 * 1024, 1},
  364. {8 * 1024, 2},
  365. {32 * 1024, 1},
  366. {64 * 1024, 7},
  367. },
  368. .block_erase = erase_sector_jedec,
  369. }, {
  370. .eraseblocks = { {512 * 1024, 1} },
  371. .block_erase = erase_chip_block_jedec,
  372. },
  373. },
  374. .write = write_jedec_1,
  375. .read = read_memmapped,
  376. .voltage = {2700, 3600},
  377. },
  378. {
  379. .vendor = "AMD",
  380. .name = "Am29LV004BT",
  381. .bustype = BUS_PARALLEL,
  382. .manufacture_id = AMD_ID,
  383. .model_id = AMD_AM29LV004BT,
  384. .total_size = 512,
  385. .page_size = 64 * 1024, /* unused */
  386. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  387. .tested = TEST_UNTESTED,
  388. .probe = probe_jedec,
  389. .probe_timing = TIMING_ZERO,
  390. .block_erasers =
  391. {
  392. {
  393. .eraseblocks = {
  394. {64 * 1024, 7},
  395. {32 * 1024, 1},
  396. {8 * 1024, 2},
  397. {16 * 1024, 1},
  398. },
  399. .block_erase = erase_sector_jedec,
  400. }, {
  401. .eraseblocks = { {512 * 1024, 1} },
  402. .block_erase = erase_chip_block_jedec,
  403. },
  404. },
  405. .write = write_jedec_1,
  406. .read = read_memmapped,
  407. .voltage = {2700, 3600},
  408. },
  409. {
  410. .vendor = "AMD",
  411. .name = "Am29LV008BB",
  412. .bustype = BUS_PARALLEL,
  413. .manufacture_id = AMD_ID,
  414. .model_id = AMD_AM29LV008BB,
  415. .total_size = 1024,
  416. .page_size = 64 * 1024, /* unused */
  417. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  418. .tested = TEST_OK_PREW,
  419. .probe = probe_jedec,
  420. .probe_timing = TIMING_ZERO,
  421. .block_erasers =
  422. {
  423. {
  424. .eraseblocks = {
  425. {16 * 1024, 1},
  426. {8 * 1024, 2},
  427. {32 * 1024, 1},
  428. {64 * 1024, 15},
  429. },
  430. .block_erase = erase_sector_jedec,
  431. }, {
  432. .eraseblocks = { {1024 * 1024, 1} },
  433. .block_erase = erase_chip_block_jedec,
  434. },
  435. },
  436. .write = write_jedec_1,
  437. .read = read_memmapped,
  438. .voltage = {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
  439. },
  440. {
  441. .vendor = "AMD",
  442. .name = "Am29LV008BT",
  443. .bustype = BUS_PARALLEL,
  444. .manufacture_id = AMD_ID,
  445. .model_id = AMD_AM29LV008BT,
  446. .total_size = 1024,
  447. .page_size = 64 * 1024, /* unused */
  448. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  449. .tested = TEST_UNTESTED,
  450. .probe = probe_jedec,
  451. .probe_timing = TIMING_ZERO,
  452. .block_erasers =
  453. {
  454. {
  455. .eraseblocks = {
  456. {64 * 1024, 15},
  457. {32 * 1024, 1},
  458. {8 * 1024, 2},
  459. {16 * 1024, 1},
  460. },
  461. .block_erase = erase_sector_jedec,
  462. }, {
  463. .eraseblocks = { {1024 * 1024, 1} },
  464. .block_erase = erase_chip_block_jedec,
  465. },
  466. },
  467. .write = write_jedec_1,
  468. .read = read_memmapped,
  469. .voltage = {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
  470. },
  471. {
  472. .vendor = "AMD",
  473. .name = "Am29LV040B",
  474. .bustype = BUS_PARALLEL,
  475. .manufacture_id = AMD_ID,
  476. .model_id = AMD_AM29LV040B,
  477. .total_size = 512,
  478. .page_size = 64 * 1024,
  479. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  480. .tested = TEST_OK_PRE,
  481. .probe = probe_jedec,
  482. .probe_timing = TIMING_ZERO,
  483. .block_erasers =
  484. {
  485. {
  486. .eraseblocks = { {64 * 1024, 8} },
  487. .block_erase = erase_sector_jedec,
  488. }, {
  489. .eraseblocks = { {512 * 1024, 1} },
  490. .block_erase = erase_chip_block_jedec,
  491. },
  492. },
  493. .write = write_jedec_1,
  494. .read = read_memmapped,
  495. .voltage = {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
  496. },
  497. {
  498. .vendor = "AMD",
  499. .name = "Am29LV081B",
  500. .bustype = BUS_PARALLEL,
  501. .manufacture_id = AMD_ID,
  502. .model_id = AMD_AM29LV080B,
  503. .total_size = 1024,
  504. .page_size = 64 * 1024,
  505. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
  506. .tested = TEST_UNTESTED,
  507. .probe = probe_jedec,
  508. .probe_timing = TIMING_ZERO,
  509. .block_erasers =
  510. {
  511. {
  512. .eraseblocks = { {64 * 1024, 16} },
  513. .block_erase = erase_sector_jedec,
  514. }, {
  515. .eraseblocks = { {1024 * 1024, 1} },
  516. .block_erase = erase_chip_block_jedec,
  517. },
  518. },
  519. .write = write_jedec_1,
  520. .read = read_memmapped,
  521. .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
  522. },
  523. {
  524. .vendor = "AMIC",
  525. .name = "A25L05PT",
  526. .bustype = BUS_SPI,
  527. .manufacture_id = AMIC_ID,
  528. .model_id = AMIC_A25L05PT,
  529. .total_size = 64,
  530. .page_size = 256,
  531. .feature_bits = FEATURE_UNBOUND_READ,
  532. .tested = TEST_UNTESTED,
  533. .probe = probe_spi_rdid4,
  534. .probe_timing = TIMING_ZERO,
  535. .block_erasers =
  536. {
  537. {
  538. .eraseblocks = {
  539. {32 * 1024, 1},
  540. {16 * 1024, 1},
  541. {8 * 1024, 1},
  542. {4 * 1024, 2},
  543. },
  544. .block_erase = spi_block_erase_d8,
  545. }, {
  546. .eraseblocks = { {64 * 1024, 1} },
  547. .block_erase = spi_block_erase_c7,
  548. }
  549. },
  550. .printlock = spi_prettyprint_status_register_amic_a25l05p,
  551. .unlock = spi_disable_blockprotect,
  552. .write = spi_chip_write_256,
  553. .read = spi_chip_read,
  554. .voltage = {2700, 3600},
  555. },
  556. {
  557. .vendor = "AMIC",
  558. .name = "A25L05PU",
  559. .bustype = BUS_SPI,
  560. .manufacture_id = AMIC_ID,
  561. .model_id = AMIC_A25L05PU,
  562. .total_size = 64,
  563. .page_size = 256,
  564. .feature_bits = FEATURE_UNBOUND_READ,
  565. .tested = TEST_UNTESTED,
  566. .probe = probe_spi_rdid4,
  567. .probe_timing = TIMING_ZERO,
  568. .block_erasers =
  569. {
  570. {
  571. .eraseblocks = {
  572. {4 * 1024, 2},
  573. {8 * 1024, 1},
  574. {16 * 1024, 1},
  575. {32 * 1024, 1},
  576. },
  577. .block_erase = spi_block_erase_d8,
  578. }, {
  579. .eraseblocks = { {64 * 1024, 1} },
  580. .block_erase = spi_block_erase_c7,
  581. }
  582. },
  583. .printlock = spi_prettyprint_status_register_amic_a25l05p,
  584. .unlock = spi_disable_blockprotect,
  585. .write = spi_chip_write_256,
  586. .read = spi_chip_read,
  587. .voltage = {2700, 3600},
  588. },
  589. {
  590. .vendor = "AMIC",
  591. .name = "A25L10PT",
  592. .bustype = BUS_SPI,
  593. .manufacture_id = AMIC_ID,
  594. .model_id = AMIC_A25L10PT,
  595. .total_size = 128,
  596. .page_size = 256,
  597. .feature_bits = FEATURE_UNBOUND_READ,
  598. .tested = TEST_UNTESTED,
  599. .probe = probe_spi_rdid4,
  600. .probe_timing = TIMING_ZERO,
  601. .block_erasers =
  602. {
  603. {
  604. .eraseblocks = {
  605. {64 * 1024, 1},
  606. {32 * 1024, 1},
  607. {16 * 1024, 1},
  608. {8 * 1024, 1},
  609. {4 * 1024, 2},
  610. },
  611. .block_erase = spi_block_erase_d8,
  612. }, {
  613. .eraseblocks = { {128 * 1024, 1} },
  614. .block_erase = spi_block_erase_c7,
  615. }
  616. },
  617. .printlock = spi_prettyprint_status_register_amic_a25l05p,
  618. .unlock = spi_disable_blockprotect,
  619. .write = spi_chip_write_256,
  620. .read = spi_chip_read,
  621. .voltage = {2700, 3600},
  622. },
  623. {
  624. .vendor = "AMIC",
  625. .name = "A25L10PU",
  626. .bustype = BUS_SPI,
  627. .manufacture_id = AMIC_ID,
  628. .model_id = AMIC_A25L10PU,
  629. .total_size = 128,
  630. .page_size = 256,
  631. .feature_bits = FEATURE_UNBOUND_READ,
  632. .tested = TEST_UNTESTED,
  633. .probe = probe_spi_rdid4,
  634. .probe_timing = TIMING_ZERO,
  635. .block_erasers =
  636. {
  637. {
  638. .eraseblocks = {
  639. {4 * 1024, 2},
  640. {8 * 1024, 1},
  641. {16 * 1024, 1},
  642. {32 * 1024, 1},
  643. {64 * 1024, 1},
  644. },
  645. .block_erase = spi_block_erase_d8,
  646. }, {
  647. .eraseblocks = { {128 * 1024, 1} },
  648. .block_erase = spi_block_erase_c7,
  649. }
  650. },
  651. .printlock = spi_prettyprint_status_register_amic_a25l05p,
  652. .unlock = spi_disable_blockprotect,
  653. .write = spi_chip_write_256,
  654. .read = spi_chip_read,
  655. .voltage = {2700, 3600},
  656. },
  657. {
  658. .vendor = "AMIC",
  659. .name = "A25L20PT",
  660. .bustype = BUS_SPI,
  661. .manufacture_id = AMIC_ID,
  662. .model_id = AMIC_A25L20PT,
  663. .total_size = 256,
  664. .page_size = 256,
  665. .feature_bits = FEATURE_UNBOUND_READ,
  666. .tested = TEST_UNTESTED,
  667. .probe = probe_spi_rdid4,
  668. .probe_timing = TIMING_ZERO,
  669. .block_erasers =
  670. {
  671. {
  672. .eraseblocks = {
  673. {64 * 1024, 3},
  674. {32 * 1024, 1},
  675. {16 * 1024, 1},
  676. {8 * 1024, 1},
  677. {4 * 1024, 2},
  678. },
  679. .block_erase = spi_block_erase_d8,
  680. }, {
  681. .eraseblocks = { {256 * 1024, 1} },
  682. .block_erase = spi_block_erase_c7,
  683. }
  684. },
  685. .printlock = spi_prettyprint_status_register_amic_a25l05p,
  686. .unlock = spi_disable_blockprotect,
  687. .write = spi_chip_write_256,
  688. .read = spi_chip_read,
  689. .voltage = {2700, 3600},
  690. },
  691. {
  692. .vendor = "AMIC",
  693. .name = "A25L20PU",
  694. .bustype = BUS_SPI,
  695. .manufacture_id = AMIC_ID,
  696. .model_id = AMIC_A25L20PU,
  697. .total_size = 256,
  698. .page_size = 256,
  699. .feature_bits = FEATURE_UNBOUND_READ,
  700. .tested = TEST_UNTESTED,
  701. .probe = probe_spi_rdid4,
  702. .probe_timing = TIMING_ZERO,
  703. .block_erasers =
  704. {
  705. {
  706. .eraseblocks = {
  707. {4 * 1024, 2},
  708. {8 * 1024, 1},
  709. {16 * 1024, 1},
  710. {32 * 1024, 1},
  711. {64 * 1024, 3},
  712. },
  713. .block_erase = spi_block_erase_d8,
  714. }, {
  715. .eraseblocks = { {256 * 1024, 1} },
  716. .block_erase = spi_block_erase_c7,
  717. }
  718. },
  719. .printlock = spi_prettyprint_status_register_amic_a25l05p,
  720. .unlock = spi_disable_blockprotect,
  721. .write = spi_chip_write_256,
  722. .read = spi_chip_read,
  723. .voltage = {2700, 3600},
  724. },
  725. /* The A25L40P{T,U} chips are distinguished by their
  726. * erase block layouts, but without any distinction in RDID.
  727. * This inexplicable quirk was verified by Rudolf Marek
  728. * and discussed on the flashrom mailing list on 2010-07-12.
  729. */
  730. {
  731. .vendor = "AMIC",
  732. .name = "A25L40PT",
  733. .bustype = BUS_SPI,
  734. .manufacture_id = AMIC_ID,
  735. .model_id = AMIC_A25L40PT,
  736. .total_size = 512,
  737. .page_size = 256,
  738. .feature_bits = FEATURE_UNBOUND_READ,
  739. .tested = TEST_OK_PRU,
  740. .probe = probe_spi_rdid4,
  741. .probe_timing = TIMING_ZERO,
  742. .block_erasers =
  743. {
  744. {
  745. .eraseblocks = {
  746. {64 * 1024, 7},
  747. {32 * 1024, 1},
  748. {16 * 1024, 1},
  749. {8 * 1024, 1},
  750. {4 * 1024, 2},
  751. },
  752. .block_erase = spi_block_erase_d8,
  753. }, {
  754. .eraseblocks = { {512 * 1024, 1} },
  755. .block_erase = spi_block_erase_c7,
  756. }
  757. },
  758. .printlock = spi_prettyprint_status_register_amic_a25l40p,
  759. .unlock = spi_disable_blockprotect,
  760. .write = spi_chip_write_256,
  761. .read = spi_chip_read,
  762. .voltage = {2700, 3600},
  763. },
  764. {
  765. .vendor = "AMIC",
  766. .name = "A25L40PU",
  767. .bustype = BUS_SPI,
  768. .manufacture_id = AMIC_ID,
  769. .model_id = AMIC_A25L40PU,
  770. .total_size = 512,
  771. .page_size = 256,
  772. .feature_bits = FEATURE_UNBOUND_READ,
  773. .tested = TEST_OK_PRU,
  774. .probe = probe_spi_rdid4,
  775. .probe_timing = TIMING_ZERO,
  776. .block_erasers =
  777. {
  778. {
  779. .eraseblocks = {
  780. {4 * 1024, 2},
  781. {8 * 1024, 1},
  782. {16 * 1024, 1},
  783. {32 * 1024, 1},
  784. {64 * 1024, 7},
  785. },
  786. .block_erase = spi_block_erase_d8,
  787. }, {
  788. .eraseblocks = { {512 * 1024, 1} },
  789. .block_erase = spi_block_erase_c7,
  790. }
  791. },
  792. .printlock = spi_prettyprint_status_register_amic_a25l40p,
  793. .unlock = spi_disable_blockprotect,
  794. .write = spi_chip_write_256,
  795. .read = spi_chip_read,
  796. .voltage = {2700, 3600},
  797. },
  798. {
  799. .vendor = "AMIC",
  800. .name = "A25L80P",
  801. .bustype = BUS_SPI,
  802. .manufacture_id = AMIC_ID,
  803. .model_id = AMIC_A25L80P,
  804. .total_size = 1024,
  805. .page_size = 256,
  806. .feature_bits = FEATURE_UNBOUND_READ,
  807. .tested = TEST_OK_PREU,
  808. .probe = probe_spi_rdid4,
  809. .probe_timing = TIMING_ZERO,
  810. .block_erasers =
  811. {
  812. {
  813. .eraseblocks = {
  814. {4 * 1024, 2},
  815. {8 * 1024, 1},
  816. {16 * 1024, 1},
  817. {32 * 1024, 1},
  818. {64 * 1024, 15},
  819. },
  820. .block_erase = spi_block_erase_d8,
  821. }, {
  822. .eraseblocks = { {1024 * 1024, 1} },
  823. .block_erase = spi_block_erase_c7,
  824. }
  825. },
  826. .printlock = spi_prettyprint_status_register_amic_a25l40p,
  827. .unlock = spi_disable_blockprotect,
  828. .write = spi_chip_write_256,
  829. .read = spi_chip_read,
  830. .voltage = {2700, 3600},
  831. },
  832. {
  833. .vendor = "AMIC",
  834. .name = "A25L16PT",
  835. .bustype = BUS_SPI,
  836. .manufacture_id = AMIC_ID,
  837. .model_id = AMIC_A25L16PT,
  838. .total_size = 2048,
  839. .page_size = 256,
  840. .feature_bits = FEATURE_UNBOUND_READ,
  841. .tested = TEST_UNTESTED,
  842. .probe = probe_spi_rdid4,
  843. .probe_timing = TIMING_ZERO,
  844. .block_erasers =
  845. {
  846. {
  847. .eraseblocks = {
  848. {64 * 1024, 31},
  849. {32 * 1024, 1},
  850. {16 * 1024, 1},
  851. {8 * 1024, 1},
  852. {4 * 1024, 2},
  853. },
  854. .block_erase = spi_block_erase_d8,
  855. }, {
  856. .eraseblocks = { {2048 * 1024, 1} },
  857. .block_erase = spi_block_erase_60,
  858. }, {
  859. .eraseblocks = { {2048 * 1024, 1} },
  860. .block_erase = spi_block_erase_c7,
  861. }
  862. },
  863. .printlock = spi_prettyprint_status_register_amic_a25l40p,
  864. .unlock = spi_disable_blockprotect,
  865. .write = spi_chip_write_256,
  866. .read = spi_chip_read,
  867. .voltage = {2700, 3600},
  868. },
  869. {
  870. .vendor = "AMIC",
  871. .name = "A25L16PU",
  872. .bustype = BUS_SPI,
  873. .manufacture_id = AMIC_ID,
  874. .model_id = AMIC_A25L16PU,
  875. .total_size = 2048,
  876. .page_size = 256,
  877. .feature_bits = FEATURE_UNBOUND_READ,
  878. .tested = TEST_OK_PRU,
  879. .probe = probe_spi_rdid4,
  880. .probe_timing = TIMING_ZERO,
  881. .block_erasers =
  882. {
  883. {
  884. .eraseblocks = {
  885. {4 * 1024, 2},
  886. {8 * 1024, 1},
  887. {16 * 1024, 1},
  888. {32 * 1024, 1},
  889. {64 * 1024, 31},
  890. },
  891. .block_erase = spi_block_erase_d8,
  892. }, {
  893. .eraseblocks = { {2048 * 1024, 1} },
  894. .block_erase = spi_block_erase_60,
  895. }, {
  896. .eraseblocks = { {2048 * 1024, 1} },
  897. .block_erase = spi_block_erase_c7,
  898. }
  899. },
  900. .printlock = spi_prettyprint_status_register_amic_a25l40p,
  901. .unlock = spi_disable_blockprotect,
  902. .write = spi_chip_write_256,
  903. .read = spi_chip_read,
  904. .voltage = {2700, 3600},
  905. },
  906. {
  907. .vendor = "AMIC",
  908. .name = "A25L512",
  909. .bustype = BUS_SPI,
  910. .manufacture_id = AMIC_ID_NOPREFIX,
  911. .model_id = AMIC_A25L512,
  912. .total_size = 64,
  913. .page_size = 256,
  914. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  915. .tested = TEST_UNTESTED,
  916. .probe = probe_spi_rdid,
  917. .probe_timing = TIMING_ZERO,
  918. .block_erasers =
  919. {
  920. {
  921. .eraseblocks = { { 4 * 1024, 16 } },
  922. .block_erase = spi_block_erase_20,
  923. }, {
  924. .eraseblocks = { { 64 * 1024, 1 } },
  925. .block_erase = spi_block_erase_d8,
  926. }, {
  927. .eraseblocks = { { 64 * 1024, 1 } },
  928. .block_erase = spi_block_erase_c7,
  929. }
  930. },
  931. .printlock = spi_prettyprint_status_register_amic_a25l40p,
  932. .unlock = spi_disable_blockprotect,
  933. .write = spi_chip_write_256,
  934. .read = spi_chip_read,
  935. .voltage = {2700, 3600},
  936. },
  937. {
  938. .vendor = "AMIC",
  939. .name = "A25L010",
  940. .bustype = BUS_SPI,
  941. .manufacture_id = AMIC_ID_NOPREFIX,
  942. .model_id = AMIC_A25L010,
  943. .total_size = 128,
  944. .page_size = 256,
  945. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  946. .tested = TEST_UNTESTED,
  947. .probe = probe_spi_rdid,
  948. .probe_timing = TIMING_ZERO,
  949. .block_erasers =
  950. {
  951. {
  952. .eraseblocks = { { 4 * 1024, 32 } },
  953. .block_erase = spi_block_erase_20,
  954. }, {
  955. .eraseblocks = { { 64 * 1024, 2 } },
  956. .block_erase = spi_block_erase_d8,
  957. }, {
  958. .eraseblocks = { { 128 * 1024, 1 } },
  959. .block_erase = spi_block_erase_c7,
  960. }
  961. },
  962. .printlock = spi_prettyprint_status_register_amic_a25l40p,
  963. .unlock = spi_disable_blockprotect,
  964. .write = spi_chip_write_256,
  965. .read = spi_chip_read,
  966. .voltage = {2700, 3600},
  967. },
  968. {
  969. .vendor = "AMIC",
  970. .name = "A25L020",
  971. .bustype = BUS_SPI,
  972. .manufacture_id = AMIC_ID_NOPREFIX,
  973. .model_id = AMIC_A25L020,
  974. .total_size = 256,
  975. .page_size = 256,
  976. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  977. .tested = TEST_UNTESTED,
  978. .probe = probe_spi_rdid,
  979. .probe_timing = TIMING_ZERO,
  980. .block_erasers =
  981. {
  982. {
  983. .eraseblocks = { { 4 * 1024, 64 } },
  984. .block_erase = spi_block_erase_20,
  985. }, {
  986. .eraseblocks = { { 64 * 1024, 4 } },
  987. .block_erase = spi_block_erase_d8,
  988. }, {
  989. .eraseblocks = { { 256 * 1024, 1 } },
  990. .block_erase = spi_block_erase_c7,
  991. }
  992. },
  993. .printlock = spi_prettyprint_status_register_amic_a25l40p,
  994. .unlock = spi_disable_blockprotect,
  995. .write = spi_chip_write_256,
  996. .read = spi_chip_read,
  997. .voltage = {2700, 3600},
  998. },
  999. {
  1000. .vendor = "AMIC",
  1001. .name = "A25L040",
  1002. .bustype = BUS_SPI,
  1003. .manufacture_id = AMIC_ID_NOPREFIX,
  1004. .model_id = AMIC_A25L040,
  1005. .total_size = 512,
  1006. .page_size = 256,
  1007. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  1008. .tested = TEST_UNTESTED,
  1009. .probe = probe_spi_rdid,
  1010. .probe_timing = TIMING_ZERO,
  1011. .block_erasers =
  1012. {
  1013. {
  1014. .eraseblocks = { { 4 * 1024, 128 } },
  1015. .block_erase = spi_block_erase_20,
  1016. }, {
  1017. .eraseblocks = { { 64 * 1024, 8 } },
  1018. .block_erase = spi_block_erase_d8,
  1019. }, {
  1020. .eraseblocks = { { 512 * 1024, 1 } },
  1021. .block_erase = spi_block_erase_c7,
  1022. }
  1023. },
  1024. .printlock = spi_prettyprint_status_register_amic_a25l40p,
  1025. .unlock = spi_disable_blockprotect,
  1026. .write = spi_chip_write_256,
  1027. .read = spi_chip_read,
  1028. .voltage = {2700, 3600},
  1029. .wp = &wp_w25,
  1030. },
  1031. {
  1032. .vendor = "AMIC",
  1033. .name = "A25L080",
  1034. .bustype = BUS_SPI,
  1035. .manufacture_id = AMIC_ID_NOPREFIX,
  1036. .model_id = AMIC_A25L080,
  1037. .total_size = 1024,
  1038. .page_size = 256,
  1039. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  1040. .tested = TEST_UNTESTED,
  1041. .probe = probe_spi_rdid,
  1042. .probe_timing = TIMING_ZERO,
  1043. .block_erasers =
  1044. {
  1045. {
  1046. .eraseblocks = { { 4 * 1024, 256 } },
  1047. .block_erase = spi_block_erase_20,
  1048. }, {
  1049. .eraseblocks = { { 64 * 1024, 16 } },
  1050. .block_erase = spi_block_erase_d8,
  1051. }, {
  1052. .eraseblocks = { { 1024 * 1024, 1 } },
  1053. .block_erase = spi_block_erase_c7,
  1054. }
  1055. },
  1056. .printlock = spi_prettyprint_status_register_amic_a25l40p,
  1057. .unlock = spi_disable_blockprotect,
  1058. .write = spi_chip_write_256,
  1059. .read = spi_chip_read,
  1060. .voltage = {2700, 3600},
  1061. },
  1062. {
  1063. .vendor = "AMIC",
  1064. .name = "A25L016",
  1065. .bustype = BUS_SPI,
  1066. .manufacture_id = AMIC_ID_NOPREFIX,
  1067. .model_id = AMIC_A25L016,
  1068. .total_size = 2048,
  1069. .page_size = 256,
  1070. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  1071. .tested = TEST_UNTESTED,
  1072. .probe = probe_spi_rdid,
  1073. .probe_timing = TIMING_ZERO,
  1074. .block_erasers =
  1075. {
  1076. {
  1077. .eraseblocks = { { 4 * 1024, 512 } },
  1078. .block_erase = spi_block_erase_20,
  1079. }, {
  1080. .eraseblocks = { { 64 * 1024, 32 } },
  1081. .block_erase = spi_block_erase_d8,
  1082. }, {
  1083. .eraseblocks = { { 2048 * 1024, 1 } },
  1084. .block_erase = spi_block_erase_c7,
  1085. }
  1086. },
  1087. .printlock = spi_prettyprint_status_register_amic_a25l40p,
  1088. .unlock = spi_disable_blockprotect,
  1089. .write = spi_chip_write_256,
  1090. .read = spi_chip_read,
  1091. .voltage = {2700, 3600},
  1092. },
  1093. {
  1094. .vendor = "AMIC",
  1095. .name = "A25L032",
  1096. .bustype = BUS_SPI,
  1097. .manufacture_id = AMIC_ID_NOPREFIX,
  1098. .model_id = AMIC_A25L032,
  1099. .total_size = 4096,
  1100. .page_size = 256,
  1101. /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
  1102. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  1103. .tested = TEST_UNTESTED,
  1104. .probe = probe_spi_rdid,
  1105. .probe_timing = TIMING_ZERO,
  1106. .block_erasers =
  1107. {
  1108. {
  1109. .eraseblocks = { { 4 * 1024, 1024 } },
  1110. .block_erase = spi_block_erase_20,
  1111. }, {
  1112. .eraseblocks = { { 64 * 1024, 64 } },
  1113. .block_erase = spi_block_erase_52,
  1114. }, {
  1115. .eraseblocks = { { 64 * 1024, 64 } },
  1116. .block_erase = spi_block_erase_d8,
  1117. }, {
  1118. .eraseblocks = { { 4096 * 1024, 1 } },
  1119. .block_erase = spi_block_erase_60,
  1120. }, {
  1121. .eraseblocks = { { 4096 * 1024, 1 } },
  1122. .block_erase = spi_block_erase_c7,
  1123. }
  1124. },
  1125. .printlock = spi_prettyprint_status_register_amic_a25l032,
  1126. .unlock = NULL, /* Two status reg bytes (read with 0x35 and 0x05) */
  1127. .write = spi_chip_write_256,
  1128. .read = spi_chip_read,
  1129. .voltage = {2700, 3600},
  1130. },
  1131. {
  1132. .vendor = "AMIC",
  1133. .name = "A25LQ032",
  1134. .bustype = BUS_SPI,
  1135. .manufacture_id = AMIC_ID_NOPREFIX,
  1136. .model_id = AMIC_A25LQ032,
  1137. .total_size = 4096,
  1138. .page_size = 256,
  1139. /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
  1140. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  1141. .tested = TEST_UNTESTED,
  1142. .probe = probe_spi_rdid,
  1143. .probe_timing = TIMING_ZERO,
  1144. .block_erasers =
  1145. {
  1146. {
  1147. .eraseblocks = { { 4 * 1024, 1024 } },
  1148. .block_erase = spi_block_erase_20,
  1149. }, {
  1150. .eraseblocks = { { 64 * 1024, 64 } },
  1151. .block_erase = spi_block_erase_52,
  1152. }, {
  1153. .eraseblocks = { { 64 * 1024, 64 } },
  1154. .block_erase = spi_block_erase_d8,
  1155. }, {
  1156. .eraseblocks = { { 4096 * 1024, 1 } },
  1157. .block_erase = spi_block_erase_60,
  1158. }, {
  1159. .eraseblocks = { { 4096 * 1024, 1 } },
  1160. .block_erase = spi_block_erase_c7,
  1161. }
  1162. },
  1163. .printlock = spi_prettyprint_status_register_amic_a25lq032,
  1164. .unlock = NULL, /* Two status reg bytes (read with 0x35 and 0x05) */
  1165. .write = spi_chip_write_256,
  1166. .read = spi_chip_read,
  1167. .voltage = {2700, 3600},
  1168. },
  1169. {
  1170. .vendor = "AMIC",
  1171. .name = "A29002B",
  1172. .bustype = BUS_PARALLEL,
  1173. .manufacture_id = AMIC_ID_NOPREFIX,
  1174. .model_id = AMIC_A29002B,
  1175. .total_size = 256,
  1176. .page_size = 64 * 1024,
  1177. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  1178. .tested = TEST_UNTESTED,
  1179. .probe = probe_jedec,
  1180. .probe_timing = TIMING_ZERO,
  1181. .block_erasers =
  1182. {
  1183. {
  1184. .eraseblocks = {
  1185. {16 * 1024, 1},
  1186. {8 * 1024, 2},
  1187. {32 * 1024, 1},
  1188. {64 * 1024, 3},
  1189. },
  1190. .block_erase = erase_sector_jedec,
  1191. }, {
  1192. .eraseblocks = { {256 * 1024, 1} },
  1193. .block_erase = erase_chip_block_jedec,
  1194. },
  1195. },
  1196. .write = write_jedec_1,
  1197. .read = read_memmapped,
  1198. .voltage = {4500, 5500},
  1199. },
  1200. {
  1201. .vendor = "AMIC",
  1202. .name = "A29002T",
  1203. .bustype = BUS_PARALLEL,
  1204. .manufacture_id = AMIC_ID_NOPREFIX,
  1205. .model_id = AMIC_A29002T,
  1206. .total_size = 256,
  1207. .page_size = 64 * 1024,
  1208. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  1209. .tested = TEST_OK_PREW,
  1210. .probe = probe_jedec,
  1211. .probe_timing = TIMING_ZERO,
  1212. .block_erasers =
  1213. {
  1214. {
  1215. .eraseblocks = {
  1216. {64 * 1024, 3},
  1217. {32 * 1024, 1},
  1218. {8 * 1024, 2},
  1219. {16 * 1024, 1},
  1220. },
  1221. .block_erase = erase_sector_jedec,
  1222. }, {
  1223. .eraseblocks = { {256 * 1024, 1} },
  1224. .block_erase = erase_chip_block_jedec,
  1225. },
  1226. },
  1227. .write = write_jedec_1,
  1228. .read = read_memmapped,
  1229. .voltage = {4500, 5500},
  1230. },
  1231. {
  1232. .vendor = "AMIC",
  1233. .name = "A29040B",
  1234. .bustype = BUS_PARALLEL,
  1235. .manufacture_id = AMIC_ID_NOPREFIX,
  1236. .model_id = AMIC_A29040B,
  1237. .total_size = 512,
  1238. .page_size = 64 * 1024,
  1239. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  1240. .tested = TEST_UNTESTED,
  1241. .probe = probe_jedec,
  1242. .probe_timing = TIMING_ZERO,
  1243. .block_erasers =
  1244. {
  1245. {
  1246. .eraseblocks = { {64 * 1024, 8} },
  1247. .block_erase = erase_sector_jedec,
  1248. }, {
  1249. .eraseblocks = { {512 * 1024, 1} },
  1250. .block_erase = erase_chip_block_jedec,
  1251. },
  1252. },
  1253. .write = write_jedec_1,
  1254. .read = read_memmapped,
  1255. .voltage = {4500, 5500},
  1256. },
  1257. {
  1258. .vendor = "AMIC",
  1259. .name = "A49LF040A",
  1260. .bustype = BUS_LPC,
  1261. .manufacture_id = AMIC_ID_NOPREFIX,
  1262. .model_id = AMIC_A49LF040A,
  1263. .total_size = 512,
  1264. .page_size = 64 * 1024,
  1265. .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
  1266. .tested = TEST_OK_PREW,
  1267. .probe = probe_jedec,
  1268. .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
  1269. .block_erasers =
  1270. {
  1271. {
  1272. .eraseblocks = { {64 * 1024, 8} },
  1273. .block_erase = erase_block_jedec,
  1274. }, {
  1275. .eraseblocks = { {512 * 1024, 1} },
  1276. .block_erase = erase_chip_block_jedec,
  1277. }
  1278. },
  1279. .unlock = unlock_49fl00x,
  1280. .write = write_jedec_1,
  1281. .read = read_memmapped,
  1282. .voltage = {3000, 3600},
  1283. },
  1284. {
  1285. .vendor = "Atmel",
  1286. .name = "AT25DF021",
  1287. .bustype = BUS_SPI,
  1288. .manufacture_id = ATMEL_ID,
  1289. .model_id = ATMEL_AT25DF021,
  1290. .total_size = 256,
  1291. .page_size = 256,
  1292. /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
  1293. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  1294. .tested = TEST_UNTESTED,
  1295. .probe = probe_spi_rdid,
  1296. .probe_timing = TIMING_ZERO,
  1297. .block_erasers =
  1298. {
  1299. {
  1300. .eraseblocks = { {4 * 1024, 64} },
  1301. .block_erase = spi_block_erase_20,
  1302. }, {
  1303. .eraseblocks = { {32 * 1024, 8} },
  1304. .block_erase = spi_block_erase_52,
  1305. }, {
  1306. .eraseblocks = { {64 * 1024, 4} },
  1307. .block_erase = spi_block_erase_d8,
  1308. }, {
  1309. .eraseblocks = { {256 * 1024, 1} },
  1310. .block_erase = spi_block_erase_60,
  1311. }, {
  1312. .eraseblocks = { {256 * 1024, 1} },
  1313. .block_erase = spi_block_erase_c7,
  1314. }
  1315. },
  1316. .printlock = spi_prettyprint_status_register_at25df,
  1317. .unlock = spi_disable_blockprotect_at25df,
  1318. .write = spi_chip_write_256,
  1319. .read = spi_chip_read,
  1320. .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
  1321. },
  1322. {
  1323. .vendor = "Atmel",
  1324. .name = "AT25DF041A",
  1325. .bustype = BUS_SPI,
  1326. .manufacture_id = ATMEL_ID,
  1327. .model_id = ATMEL_AT25DF041A,
  1328. .total_size = 512,
  1329. .page_size = 256,
  1330. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  1331. .tested = TEST_UNTESTED,
  1332. .probe = probe_spi_rdid,
  1333. .probe_timing = TIMING_ZERO,
  1334. .block_erasers =
  1335. {
  1336. {
  1337. .eraseblocks = { {4 * 1024, 128} },
  1338. .block_erase = spi_block_erase_20,
  1339. }, {
  1340. .eraseblocks = { {32 * 1024, 16} },
  1341. .block_erase = spi_block_erase_52,
  1342. }, {
  1343. .eraseblocks = { {64 * 1024, 8} },
  1344. .block_erase = spi_block_erase_d8,
  1345. }, {
  1346. .eraseblocks = { {512 * 1024, 1} },
  1347. .block_erase = spi_block_erase_60,
  1348. }, {
  1349. .eraseblocks = { {512 * 1024, 1} },
  1350. .block_erase = spi_block_erase_c7,
  1351. }
  1352. },
  1353. .printlock = spi_prettyprint_status_register_at25df,
  1354. .unlock = spi_disable_blockprotect_at25df,
  1355. .write = spi_chip_write_256,
  1356. .read = spi_chip_read,
  1357. .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
  1358. },
  1359. {
  1360. .vendor = "Atmel",
  1361. .name = "AT25DF081",
  1362. .bustype = BUS_SPI,
  1363. .manufacture_id = ATMEL_ID,
  1364. .model_id = ATMEL_AT25DF081,
  1365. .total_size = 1024,
  1366. .page_size = 256,
  1367. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  1368. .tested = TEST_UNTESTED,
  1369. .probe = probe_spi_rdid,
  1370. .probe_timing = TIMING_ZERO,
  1371. .block_erasers =
  1372. {
  1373. {
  1374. .eraseblocks = { {4 * 1024, 256} },
  1375. .block_erase = spi_block_erase_20,
  1376. }, {
  1377. .eraseblocks = { {32 * 1024, 32} },
  1378. .block_erase = spi_block_erase_52,
  1379. }, {
  1380. .eraseblocks = { {64 * 1024, 16} },
  1381. .block_erase = spi_block_erase_d8,
  1382. }, {
  1383. .eraseblocks = { {1024 * 1024, 1} },
  1384. .block_erase = spi_block_erase_60,
  1385. }, {
  1386. .eraseblocks = { {1024 * 1024, 1} },
  1387. .block_erase = spi_block_erase_c7,
  1388. }
  1389. },
  1390. .printlock = spi_prettyprint_status_register_at25df,
  1391. .unlock = spi_disable_blockprotect_at25df,
  1392. .write = spi_chip_write_256,
  1393. .read = spi_chip_read,
  1394. .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
  1395. },
  1396. {
  1397. .vendor = "Atmel",
  1398. .name = "AT25DF081A",
  1399. .bustype = BUS_SPI,
  1400. .manufacture_id = ATMEL_ID,
  1401. .model_id = ATMEL_AT25DF081A,
  1402. .total_size = 1024,
  1403. .page_size = 256,
  1404. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  1405. .tested = TEST_UNTESTED,
  1406. .probe = probe_spi_rdid,
  1407. .probe_timing = TIMING_ZERO,
  1408. .block_erasers =
  1409. {
  1410. {
  1411. .eraseblocks = { {4 * 1024, 256} },
  1412. .block_erase = spi_block_erase_20,
  1413. }, {
  1414. .eraseblocks = { {32 * 1024, 32} },
  1415. .block_erase = spi_block_erase_52,
  1416. }, {
  1417. .eraseblocks = { {64 * 1024, 16} },
  1418. .block_erase = spi_block_erase_d8,
  1419. }, {
  1420. .eraseblocks = { {1024 * 1024, 1} },
  1421. .block_erase = spi_block_erase_60,
  1422. }, {
  1423. .eraseblocks = { {1024 * 1024, 1} },
  1424. .block_erase = spi_block_erase_c7,
  1425. }
  1426. },
  1427. .printlock = spi_prettyprint_status_register_at25df_sec,
  1428. .unlock = spi_disable_blockprotect_at25df_sec,
  1429. .write = spi_chip_write_256,
  1430. .read = spi_chip_read,
  1431. .voltage = {2700, 3600},
  1432. },
  1433. {
  1434. .vendor = "Atmel",
  1435. .name = "AT25DF161",
  1436. .bustype = BUS_SPI,
  1437. .manufacture_id = ATMEL_ID,
  1438. .model_id = ATMEL_AT25DF161,
  1439. .total_size = 2048,
  1440. .page_size = 256,
  1441. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  1442. .tested = TEST_UNTESTED,
  1443. .probe = probe_spi_rdid,
  1444. .probe_timing = TIMING_ZERO,
  1445. .block_erasers =
  1446. {
  1447. {
  1448. .eraseblocks = { {4 * 1024, 512} },
  1449. .block_erase = spi_block_erase_20,
  1450. }, {
  1451. .eraseblocks = { {32 * 1024, 64} },
  1452. .block_erase = spi_block_erase_52,
  1453. }, {
  1454. .eraseblocks = { {64 * 1024, 32} },
  1455. .block_erase = spi_block_erase_d8,
  1456. }, {
  1457. .eraseblocks = { {2 * 1024 * 1024, 1} },
  1458. .block_erase = spi_block_erase_60,
  1459. }, {
  1460. .eraseblocks = { {2 * 1024 * 1024, 1} },
  1461. .block_erase = spi_block_erase_c7,
  1462. }
  1463. },
  1464. .printlock = spi_prettyprint_status_register_at25df_sec,
  1465. .unlock = spi_disable_blockprotect_at25df_sec,
  1466. .write = spi_chip_write_256,
  1467. .read = spi_chip_read,
  1468. .voltage = {2700, 3600},
  1469. },
  1470. {
  1471. .vendor = "Atmel",
  1472. .name = "AT25DF321",
  1473. .bustype = BUS_SPI,
  1474. .manufacture_id = ATMEL_ID,
  1475. .model_id = ATMEL_AT25DF321,
  1476. .total_size = 4096,
  1477. .page_size = 256,
  1478. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  1479. .tested = TEST_OK_PREU,
  1480. .probe = probe_spi_rdid,
  1481. .probe_timing = TIMING_ZERO,
  1482. .block_erasers =
  1483. {
  1484. {
  1485. .eraseblocks = { {4 * 1024, 1024} },
  1486. .block_erase = spi_block_erase_20,
  1487. }, {
  1488. .eraseblocks = { {32 * 1024, 128} },
  1489. .block_erase = spi_block_erase_52,
  1490. }, {
  1491. .eraseblocks = { {64 * 1024, 64} },
  1492. .block_erase = spi_block_erase_d8,
  1493. }, {
  1494. .eraseblocks = { {4 * 1024 * 1024, 1} },
  1495. .block_erase = spi_block_erase_60,
  1496. }, {
  1497. .eraseblocks = { {4 * 1024 * 1024, 1} },
  1498. .block_erase = spi_block_erase_c7,
  1499. }
  1500. },
  1501. .printlock = spi_prettyprint_status_register_at25df,
  1502. .unlock = spi_disable_blockprotect_at25df,
  1503. .write = spi_chip_write_256,
  1504. .read = spi_chip_read,
  1505. .voltage = {2700, 3600},
  1506. },
  1507. {
  1508. .vendor = "Atmel",
  1509. .name = "AT25DF321A",
  1510. .bustype = BUS_SPI,
  1511. .manufacture_id = ATMEL_ID,
  1512. .model_id = ATMEL_AT25DF321A,
  1513. .total_size = 4096,
  1514. .page_size = 256,
  1515. /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
  1516. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  1517. .tested = TEST_OK_PROBE,
  1518. .probe = probe_spi_rdid,
  1519. .probe_timing = TIMING_ZERO,
  1520. .block_erasers =
  1521. {
  1522. {
  1523. .eraseblocks = { {4 * 1024, 1024} },
  1524. .block_erase = spi_block_erase_20,
  1525. }, {
  1526. .eraseblocks = { {32 * 1024, 128} },
  1527. .block_erase = spi_block_erase_52,
  1528. }, {
  1529. .eraseblocks = { {64 * 1024, 64} },
  1530. .block_erase = spi_block_erase_d8,
  1531. }, {
  1532. .eraseblocks = { {4 * 1024 * 1024, 1} },
  1533. .block_erase = spi_block_erase_60,
  1534. }, {
  1535. .eraseblocks = { {4 * 1024 * 1024, 1} },
  1536. .block_erase = spi_block_erase_c7,
  1537. }
  1538. },
  1539. .printlock = spi_prettyprint_status_register_at25df_sec,
  1540. .unlock = spi_disable_blockprotect_at25df_sec,
  1541. .write = spi_chip_write_256,
  1542. .read = spi_chip_read,
  1543. .voltage = {2700, 3600},
  1544. },
  1545. {
  1546. .vendor = "Atmel",
  1547. .name = "AT25DF641(A)",
  1548. .bustype = BUS_SPI,
  1549. .manufacture_id = ATMEL_ID,
  1550. .model_id = ATMEL_AT25DF641,
  1551. .total_size = 8192,
  1552. .page_size = 256,
  1553. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  1554. .tested = TEST_UNTESTED,
  1555. .probe = probe_spi_rdid,
  1556. .probe_timing = TIMING_ZERO,
  1557. .block_erasers =
  1558. {
  1559. {
  1560. .eraseblocks = { {4 * 1024, 2048} },
  1561. .block_erase = spi_block_erase_20,
  1562. }, {
  1563. .eraseblocks = { {32 * 1024, 256} },
  1564. .block_erase = spi_block_erase_52,
  1565. }, {
  1566. .eraseblocks = { {64 * 1024, 128} },
  1567. .block_erase = spi_block_erase_d8,
  1568. }, {
  1569. .eraseblocks = { {8 * 1024 * 1024, 1} },
  1570. .block_erase = spi_block_erase_60,
  1571. }, {
  1572. .eraseblocks = { {8 * 1024 * 1024, 1} },
  1573. .block_erase = spi_block_erase_c7,
  1574. }
  1575. },
  1576. .printlock = spi_prettyprint_status_register_at25df_sec,
  1577. .unlock = spi_disable_blockprotect_at25df_sec,
  1578. .write = spi_chip_write_256,
  1579. .read = spi_chip_read,
  1580. .voltage = {2700, 3600},
  1581. },
  1582. {
  1583. .vendor = "Atmel",
  1584. .name = "AT25DQ161",
  1585. .bustype = BUS_SPI,
  1586. .manufacture_id = ATMEL_ID,
  1587. .model_id = ATMEL_AT25DQ161,
  1588. .total_size = 2048,
  1589. .page_size = 256,
  1590. /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
  1591. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  1592. .tested = TEST_UNTESTED,
  1593. .probe = probe_spi_rdid,
  1594. .probe_timing = TIMING_ZERO,
  1595. .block_erasers =
  1596. {
  1597. {
  1598. .eraseblocks = { {4 * 1024, 512} },
  1599. .block_erase = spi_block_erase_20,
  1600. }, {
  1601. .eraseblocks = { {32 * 1024, 64} },
  1602. .block_erase = spi_block_erase_52,
  1603. }, {
  1604. .eraseblocks = { {64 * 1024, 32} },
  1605. .block_erase = spi_block_erase_d8,
  1606. }, {
  1607. .eraseblocks = { {2 * 1024 * 1024, 1} },
  1608. .block_erase = spi_block_erase_60,
  1609. }, {
  1610. .eraseblocks = { {2 * 1024 * 1024, 1} },
  1611. .block_erase = spi_block_erase_c7,
  1612. }
  1613. },
  1614. .printlock = spi_prettyprint_status_register_at25df_sec,
  1615. .unlock = spi_disable_blockprotect_at25df_sec,
  1616. .write = spi_chip_write_256,
  1617. .read = spi_chip_read,
  1618. .voltage = {2700, 3600},
  1619. },
  1620. {
  1621. .vendor = "Atmel",
  1622. .name = "AT25F512B",
  1623. .bustype = BUS_SPI,
  1624. .manufacture_id = ATMEL_ID,
  1625. .model_id = ATMEL_AT25F512B,
  1626. .total_size = 64,
  1627. .page_size = 256,
  1628. /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
  1629. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  1630. .tested = TEST_UNTESTED,
  1631. .probe = probe_spi_rdid,
  1632. .probe_timing = TIMING_ZERO,
  1633. .block_erasers =
  1634. {
  1635. {
  1636. .eraseblocks = { {4 * 1024, 16} },
  1637. .block_erase = spi_block_erase_20,
  1638. }, {
  1639. .eraseblocks = { {32 * 1024, 2} },
  1640. .block_erase = spi_block_erase_52,
  1641. }, {
  1642. .eraseblocks = { {32 * 1024, 2} },
  1643. .block_erase = spi_block_erase_d8,
  1644. }, {
  1645. .eraseblocks = { {64 * 1024, 1} },
  1646. .block_erase = spi_block_erase_60,
  1647. }, {
  1648. .eraseblocks = { {64 * 1024, 1} },
  1649. .block_erase = spi_block_erase_c7,
  1650. }
  1651. },
  1652. .printlock = spi_prettyprint_status_register_at25f,
  1653. .unlock = spi_disable_blockprotect_at25f,
  1654. .write = spi_chip_write_256,
  1655. .read = spi_chip_read,
  1656. .voltage = {2700, 3600},
  1657. },
  1658. {
  1659. .vendor = "Atmel",
  1660. .name = "AT25FS010",
  1661. .bustype = BUS_SPI,
  1662. .manufacture_id = ATMEL_ID,
  1663. .model_id = ATMEL_AT25FS010,
  1664. .total_size = 128,
  1665. .page_size = 256,
  1666. .feature_bits = FEATURE_UNBOUND_READ,
  1667. .tested = TEST_UNTESTED,
  1668. .probe = probe_spi_rdid,
  1669. .probe_timing = TIMING_ZERO,
  1670. .block_erasers =
  1671. {
  1672. {
  1673. .eraseblocks = { {4 * 1024, 32} },
  1674. .block_erase = spi_block_erase_20,
  1675. }, {
  1676. .eraseblocks = { {4 * 1024, 32} },
  1677. .block_erase = spi_block_erase_d7,
  1678. }, {
  1679. .eraseblocks = { {32 * 1024, 4} },
  1680. .block_erase = spi_block_erase_52,
  1681. }, {
  1682. .eraseblocks = { {32 * 1024, 4} },
  1683. .block_erase = spi_block_erase_d8,
  1684. }, {
  1685. .eraseblocks = { {128 * 1024, 1} },
  1686. .block_erase = spi_block_erase_60,
  1687. }, {
  1688. .eraseblocks = { {128 * 1024, 1} },
  1689. .block_erase = spi_block_erase_c7,
  1690. }
  1691. },
  1692. .printlock = spi_prettyprint_status_register_at25fs010,
  1693. .unlock = spi_disable_blockprotect_at25fs010,
  1694. .write = spi_chip_write_256,
  1695. .read = spi_chip_read,
  1696. .voltage = {2700, 3600},
  1697. },
  1698. {
  1699. .vendor = "Atmel",
  1700. .name = "AT25FS040",
  1701. .bustype = BUS_SPI,
  1702. .manufacture_id = ATMEL_ID,
  1703. .model_id = ATMEL_AT25FS040,
  1704. .total_size = 512,
  1705. .page_size = 256,
  1706. .feature_bits = FEATURE_UNBOUND_READ,
  1707. .tested = TEST_UNTESTED,
  1708. .probe = probe_spi_rdid,
  1709. .probe_timing = TIMING_ZERO,
  1710. .block_erasers =
  1711. {
  1712. {
  1713. .eraseblocks = { {4 * 1024, 128} },
  1714. .block_erase = spi_block_erase_20,
  1715. }, {
  1716. .eraseblocks = { {64 * 1024, 8} },
  1717. .block_erase = spi_block_erase_52,
  1718. }, {
  1719. .eraseblocks = { {64 * 1024, 8} },
  1720. .block_erase = spi_block_erase_d8,
  1721. }, {
  1722. .eraseblocks = { {512 * 1024, 1} },
  1723. .block_erase = spi_block_erase_60,
  1724. }, {
  1725. .eraseblocks = { {512 * 1024, 1} },
  1726. .block_erase = spi_block_erase_c7,
  1727. }
  1728. },
  1729. .printlock = spi_prettyprint_status_register_at25fs040,
  1730. .unlock = spi_disable_blockprotect_at25fs040,
  1731. .write = spi_chip_write_256,
  1732. .read = spi_chip_read,
  1733. .voltage = {2700, 3600},
  1734. },
  1735. {
  1736. .vendor = "Atmel",
  1737. .name = "AT26DF041",
  1738. .bustype = BUS_SPI,
  1739. .manufacture_id = ATMEL_ID,
  1740. .model_id = ATMEL_AT26DF041,
  1741. .total_size = 512,
  1742. .page_size = 256,
  1743. .tested = TEST_UNTESTED,
  1744. .probe = probe_spi_rdid,
  1745. .probe_timing = TIMING_ZERO,
  1746. .block_erasers =
  1747. {
  1748. {
  1749. .eraseblocks = { {4 * 1024, 128} },
  1750. .block_erase = spi_block_erase_20,
  1751. }
  1752. },
  1753. .write = NULL /* Incompatible Page write */,
  1754. .read = spi_chip_read,
  1755. .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
  1756. },
  1757. {
  1758. .vendor = "Atmel",
  1759. .name = "AT26DF081A",
  1760. .bustype = BUS_SPI,
  1761. .manufacture_id = ATMEL_ID,
  1762. .model_id = ATMEL_AT26DF081A,
  1763. .total_size = 1024,
  1764. .page_size = 256,
  1765. .feature_bits = FEATURE_WRSR_WREN,
  1766. .tested = TEST_OK_PREW,
  1767. .probe = probe_spi_rdid,
  1768. .probe_timing = TIMING_ZERO,
  1769. .block_erasers =
  1770. {
  1771. {
  1772. .eraseblocks = { {4 * 1024, 256} },
  1773. .block_erase = spi_block_erase_20,
  1774. }, {
  1775. .eraseblocks = { {32 * 1024, 32} },
  1776. .block_erase = spi_block_erase_52,
  1777. }, {
  1778. .eraseblocks = { {64 * 1024, 16} },
  1779. .block_erase = spi_block_erase_d8,
  1780. }, {
  1781. .eraseblocks = { {1024 * 1024, 1} },
  1782. .block_erase = spi_block_erase_60,
  1783. }, {
  1784. .eraseblocks = { {1024 * 1024, 1} },
  1785. .block_erase = spi_block_erase_c7,
  1786. }
  1787. },
  1788. .printlock = spi_prettyprint_status_register_atmel_at26df081a,
  1789. .unlock = spi_disable_blockprotect_at25df,
  1790. .write = spi_chip_write_256,
  1791. .read = spi_chip_read,
  1792. .voltage = {2700, 3600},
  1793. },
  1794. {
  1795. .vendor = "Atmel",
  1796. .name = "AT26DF161",
  1797. .bustype = BUS_SPI,
  1798. .manufacture_id = ATMEL_ID,
  1799. .model_id = ATMEL_AT26DF161,
  1800. .total_size = 2048,
  1801. .page_size = 256,
  1802. .tested = TEST_UNTESTED,
  1803. .probe = probe_spi_rdid,
  1804. .probe_timing = TIMING_ZERO,
  1805. .block_erasers =
  1806. {
  1807. {
  1808. .eraseblocks = { {4 * 1024, 512} },
  1809. .block_erase = spi_block_erase_20,
  1810. }, {
  1811. .eraseblocks = { {32 * 1024, 64} },
  1812. .block_erase = spi_block_erase_52,
  1813. }, {
  1814. .eraseblocks = { {64 * 1024, 32} },
  1815. .block_erase = spi_block_erase_d8,
  1816. }, {
  1817. .eraseblocks = { {2 * 1024 * 1024, 1} },
  1818. .block_erase = spi_block_erase_60,
  1819. }, {
  1820. .eraseblocks = { {2 * 1024 * 1024, 1} },
  1821. .block_erase = spi_block_erase_c7,
  1822. }
  1823. },
  1824. .printlock = spi_prettyprint_status_register_at25df,
  1825. .unlock = spi_disable_blockprotect,
  1826. .write = spi_chip_write_256,
  1827. .read = spi_chip_read,
  1828. .voltage = {2700, 3600},
  1829. },
  1830. {
  1831. .vendor = "Atmel",
  1832. .name = "AT26DF161A",
  1833. .bustype = BUS_SPI,
  1834. .manufacture_id = ATMEL_ID,
  1835. .model_id = ATMEL_AT26DF161A,
  1836. .total_size = 2048,
  1837. .page_size = 256,
  1838. .tested = TEST_UNTESTED,
  1839. .probe = probe_spi_rdid,
  1840. .probe_timing = TIMING_ZERO,
  1841. .block_erasers =
  1842. {
  1843. {
  1844. .eraseblocks = { {4 * 1024, 512} },
  1845. .block_erase = spi_block_erase_20,
  1846. }, {
  1847. .eraseblocks = { {32 * 1024, 64} },
  1848. .block_erase = spi_block_erase_52,
  1849. }, {
  1850. .eraseblocks = { {64 * 1024, 32} },
  1851. .block_erase = spi_block_erase_d8,
  1852. }, {
  1853. .eraseblocks = { {2 * 1024 * 1024, 1} },
  1854. .block_erase = spi_block_erase_60,
  1855. }, {
  1856. .eraseblocks = { {2 * 1024 * 1024, 1} },
  1857. .block_erase = spi_block_erase_c7,
  1858. }
  1859. },
  1860. .printlock = spi_prettyprint_status_register_atmel_at26df081a,
  1861. .unlock = spi_disable_blockprotect,
  1862. .write = spi_chip_write_256,
  1863. .read = spi_chip_read,
  1864. .voltage = {2700, 3600},
  1865. },
  1866. /*The AT26DF321 has the same ID as the AT25DF321. */
  1867. /*{
  1868. .vendor = "Atmel",
  1869. .name = "AT26DF321",
  1870. .bustype = BUS_SPI,
  1871. .manufacture_id = ATMEL_ID,
  1872. .model_id = ATMEL_AT26DF321,
  1873. .total_size = 4096,
  1874. .page_size = 256,
  1875. .tested = TEST_UNTESTED,
  1876. .probe = probe_spi_rdid,
  1877. .probe_timing = TIMING_ZERO,
  1878. .printlock = spi_prettyprint_status_register_atmel_at26df081a,
  1879. .unlock = spi_disable_blockprotect,
  1880. .write = spi_chip_write_256,
  1881. .read = spi_chip_read,
  1882. },*/
  1883. {
  1884. .vendor = "Atmel",
  1885. .name = "AT26F004",
  1886. .bustype = BUS_SPI,
  1887. .manufacture_id = ATMEL_ID,
  1888. .model_id = ATMEL_AT26F004,
  1889. .total_size = 512,
  1890. .page_size = 256,
  1891. .tested = TEST_UNTESTED,
  1892. .probe = probe_spi_rdid,
  1893. .probe_timing = TIMING_ZERO,
  1894. .block_erasers =
  1895. {
  1896. {
  1897. .eraseblocks = { {4 * 1024, 128} },
  1898. .block_erase = spi_block_erase_20,
  1899. }, {
  1900. .eraseblocks = { {32 * 1024, 16} },
  1901. .block_erase = spi_block_erase_52,
  1902. }, {
  1903. .eraseblocks = { {64 * 1024, 8} },
  1904. .block_erase = spi_block_erase_d8,
  1905. }, {
  1906. .eraseblocks = { {512 * 1024, 1} },
  1907. .block_erase = spi_block_erase_60,
  1908. }, {
  1909. .eraseblocks = { {512 * 1024, 1} },
  1910. .block_erase = spi_block_erase_c7,
  1911. }
  1912. },
  1913. .write = NULL /* Incompatible Page write */,
  1914. .read = spi_chip_read,
  1915. .voltage = {2700, 3600},
  1916. },
  1917. {
  1918. .vendor = "Atmel",
  1919. .name = "AT29C512",
  1920. .bustype = BUS_PARALLEL,
  1921. .manufacture_id = ATMEL_ID,
  1922. .model_id = ATMEL_AT29C512,
  1923. .total_size = 64,
  1924. .page_size = 128,
  1925. .feature_bits = FEATURE_LONG_RESET,
  1926. .tested = TEST_OK_PREW,
  1927. .probe = probe_jedec,
  1928. .probe_timing = 10000, /* 10mS, Enter=Exec */
  1929. .block_erasers =
  1930. {
  1931. {
  1932. .eraseblocks = { {64 * 1024, 1} },
  1933. .block_erase = erase_chip_block_jedec,
  1934. }
  1935. },
  1936. .write = write_jedec,
  1937. .read = read_memmapped,
  1938. .voltage = {4500, 5500},
  1939. },
  1940. {
  1941. .vendor = "Atmel",
  1942. .name = "AT29C010A",
  1943. .bustype = BUS_PARALLEL,
  1944. .manufacture_id = ATMEL_ID,
  1945. .model_id = ATMEL_AT29C010A,
  1946. .total_size = 128,
  1947. .page_size = 128,
  1948. .feature_bits = FEATURE_LONG_RESET,
  1949. .tested = TEST_OK_PRE,
  1950. .probe = probe_jedec,
  1951. .probe_timing = 10000, /* 10mS, Enter=Exec */
  1952. .block_erasers =
  1953. {
  1954. {
  1955. .eraseblocks = { {128 * 1024, 1} },
  1956. .block_erase = erase_chip_block_jedec,
  1957. }
  1958. },
  1959. .write = write_jedec, /* FIXME */
  1960. .read = read_memmapped,
  1961. .voltage = {4500, 5500},
  1962. },
  1963. {
  1964. .vendor = "Atmel",
  1965. .name = "AT29C020",
  1966. .bustype = BUS_PARALLEL,
  1967. .manufacture_id = ATMEL_ID,
  1968. .model_id = ATMEL_AT29C020,
  1969. .total_size = 256,
  1970. .page_size = 256,
  1971. .feature_bits = FEATURE_LONG_RESET,
  1972. .tested = TEST_UNTESTED,
  1973. .probe = probe_jedec,
  1974. .probe_timing = 10000, /* 10ms */
  1975. .block_erasers =
  1976. {
  1977. {
  1978. .eraseblocks = { {256 * 1024, 1} },
  1979. .block_erase = erase_chip_block_jedec,
  1980. }
  1981. },
  1982. .write = write_jedec,
  1983. .read = read_memmapped,
  1984. .voltage = {4500, 5500},
  1985. },
  1986. {
  1987. .vendor = "Atmel",
  1988. .name = "AT29C040A",
  1989. .bustype = BUS_PARALLEL,
  1990. .manufacture_id = ATMEL_ID,
  1991. .model_id = ATMEL_AT29C040A,
  1992. .total_size = 512,
  1993. .page_size = 256,
  1994. .feature_bits = FEATURE_LONG_RESET,
  1995. .tested = TEST_UNTESTED,
  1996. .probe = probe_jedec,
  1997. .probe_timing = 10000, /* 10 ms */
  1998. .block_erasers =
  1999. {
  2000. {
  2001. .eraseblocks = { {512 * 1024, 1} },
  2002. .block_erase = erase_chip_block_jedec,
  2003. }
  2004. },
  2005. .write = write_jedec,
  2006. .read = read_memmapped,
  2007. .voltage = {4500, 5500},
  2008. },
  2009. {
  2010. .vendor = "Atmel",
  2011. .name = "AT45CS1282",
  2012. .bustype = BUS_SPI,
  2013. .manufacture_id = ATMEL_ID,
  2014. .model_id = ATMEL_AT45CS1282,
  2015. .total_size = 16896 /* No power of two sizes */,
  2016. .page_size = 1056 /* No power of two sizes */,
  2017. .tested = TEST_BAD_READ,
  2018. .probe = probe_spi_rdid,
  2019. .probe_timing = TIMING_ZERO,
  2020. .write = NULL /* Incompatible Page write */,
  2021. .read = NULL /* Incompatible read */,
  2022. .voltage = {2700, 3600},
  2023. },
  2024. {
  2025. .vendor = "Atmel",
  2026. .name = "AT45DB011D",
  2027. .bustype = BUS_SPI,
  2028. .manufacture_id = ATMEL_ID,
  2029. .model_id = ATMEL_AT45DB011D,
  2030. .total_size = 128 /* Size can only be determined from status register */,
  2031. .page_size = 256 /* Size can only be determined from status register */,
  2032. .tested = TEST_BAD_READ,
  2033. .probe = probe_spi_rdid,
  2034. .probe_timing = TIMING_ZERO,
  2035. .write = NULL,
  2036. .read = NULL,
  2037. .voltage = {2700, 3600},
  2038. },
  2039. {
  2040. .vendor = "Atmel",
  2041. .name = "AT45DB021D",
  2042. .bustype = BUS_SPI,
  2043. .manufacture_id = ATMEL_ID,
  2044. .model_id = ATMEL_AT45DB021D,
  2045. .total_size = 256 /* Size can only be determined from status register */,
  2046. .page_size = 256 /* Size can only be determined from status register */,
  2047. .tested = TEST_BAD_READ,
  2048. .probe = probe_spi_rdid,
  2049. .probe_timing = TIMING_ZERO,
  2050. .write = NULL,
  2051. .read = NULL,
  2052. .voltage = {2700, 3600},
  2053. },
  2054. {
  2055. .vendor = "Atmel",
  2056. .name = "AT45DB041D",
  2057. .bustype = BUS_SPI,
  2058. .manufacture_id = ATMEL_ID,
  2059. .model_id = ATMEL_AT45DB041D,
  2060. .total_size = 512 /* Size can only be determined from status register */,
  2061. .page_size = 256 /* Size can only be determined from status register */,
  2062. .tested = TEST_BAD_READ,
  2063. .probe = probe_spi_rdid,
  2064. .probe_timing = TIMING_ZERO,
  2065. .write = NULL,
  2066. .read = NULL,
  2067. .voltage = {2500, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
  2068. },
  2069. {
  2070. .vendor = "Atmel",
  2071. .name = "AT45DB081D",
  2072. .bustype = BUS_SPI,
  2073. .manufacture_id = ATMEL_ID,
  2074. .model_id = ATMEL_AT45DB081D,
  2075. .total_size = 1024 /* Size can only be determined from status register */,
  2076. .page_size = 256 /* Size can only be determined from status register */,
  2077. .tested = TEST_BAD_READ,
  2078. .probe = probe_spi_rdid,
  2079. .probe_timing = TIMING_ZERO,
  2080. .write = NULL,
  2081. .read = NULL,
  2082. .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
  2083. },
  2084. {
  2085. .vendor = "Atmel",
  2086. .name = "AT45DB161D",
  2087. .bustype = BUS_SPI,
  2088. .manufacture_id = ATMEL_ID,
  2089. .model_id = ATMEL_AT45DB161D,
  2090. .total_size = 2048 /* Size can only be determined from status register */,
  2091. .page_size = 512 /* Size can only be determined from status register */,
  2092. .tested = TEST_BAD_READ,
  2093. .probe = probe_spi_rdid,
  2094. .probe_timing = TIMING_ZERO,
  2095. .write = NULL,
  2096. .read = NULL,
  2097. .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
  2098. },
  2099. {
  2100. .vendor = "Atmel",
  2101. .name = "AT45DB321C",
  2102. .bustype = BUS_SPI,
  2103. .manufacture_id = ATMEL_ID,
  2104. .model_id = ATMEL_AT45DB321C,
  2105. .total_size = 4224 /* No power of two sizes */,
  2106. .page_size = 528 /* No power of two sizes */,
  2107. .tested = TEST_BAD_READ,
  2108. .probe = probe_spi_rdid,
  2109. .probe_timing = TIMING_ZERO,
  2110. .write = NULL,
  2111. .read = NULL /* Incompatible read */,
  2112. .voltage = {2700, 3600},
  2113. },
  2114. {
  2115. .vendor = "Atmel",
  2116. .name = "AT45DB321D",
  2117. .bustype = BUS_SPI,
  2118. .manufacture_id = ATMEL_ID,
  2119. .model_id = ATMEL_AT45DB321D,
  2120. .total_size = 4096 /* Size can only be determined from status register */,
  2121. .page_size = 512 /* Size can only be determined from status register */,
  2122. /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
  2123. .feature_bits = FEATURE_OTP,
  2124. .tested = TEST_BAD_READ,
  2125. .probe = probe_spi_rdid,
  2126. .probe_timing = TIMING_ZERO,
  2127. .write = NULL,
  2128. .read = NULL,
  2129. .voltage = {2700, 3600},
  2130. },
  2131. {
  2132. .vendor = "Atmel",
  2133. .name = "AT45DB642D",
  2134. .bustype = BUS_SPI,
  2135. .manufacture_id = ATMEL_ID,
  2136. .model_id = ATMEL_AT45DB642D,
  2137. .total_size = 8192 /* Size can only be determined from status register */,
  2138. .page_size = 1024 /* Size can only be determined from status register */,
  2139. .tested = TEST_BAD_READ,
  2140. .probe = probe_spi_rdid,
  2141. .probe_timing = TIMING_ZERO,
  2142. .write = NULL,
  2143. .read = NULL,
  2144. .voltage = {2700, 3600},
  2145. },
  2146. {
  2147. .vendor = "Atmel",
  2148. .name = "AT49BV512",
  2149. .bustype = BUS_PARALLEL,
  2150. .manufacture_id = ATMEL_ID,
  2151. .model_id = ATMEL_AT49BV512,
  2152. .total_size = 64,
  2153. .page_size = 64,
  2154. .feature_bits = FEATURE_EITHER_RESET,
  2155. .tested = TEST_OK_PREW,
  2156. .probe = probe_jedec,
  2157. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  2158. .block_erasers =
  2159. {
  2160. {
  2161. .eraseblocks = { {64 * 1024, 1} },
  2162. .block_erase = erase_chip_block_jedec,
  2163. }
  2164. },
  2165. .write = write_jedec_1,
  2166. .read = read_memmapped,
  2167. .voltage = {2700, 3600},
  2168. },
  2169. {
  2170. .vendor = "Atmel",
  2171. .name = "AT49F020",
  2172. .bustype = BUS_PARALLEL,
  2173. .manufacture_id = ATMEL_ID,
  2174. .model_id = ATMEL_AT49F020,
  2175. .total_size = 256,
  2176. .page_size = 256,
  2177. .feature_bits = FEATURE_EITHER_RESET,
  2178. .tested = TEST_OK_PRE,
  2179. .probe = probe_jedec,
  2180. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  2181. .block_erasers =
  2182. {
  2183. {
  2184. .eraseblocks = { {256 * 1024, 1} },
  2185. .block_erase = erase_chip_block_jedec,
  2186. }
  2187. },
  2188. .write = write_jedec_1,
  2189. .read = read_memmapped,
  2190. .voltage = {4500, 5500},
  2191. },
  2192. {
  2193. .vendor = "Atmel",
  2194. .name = "AT49F002(N)",
  2195. .bustype = BUS_PARALLEL,
  2196. .manufacture_id = ATMEL_ID,
  2197. .model_id = ATMEL_AT49F002N,
  2198. .total_size = 256,
  2199. .page_size = 256,
  2200. .feature_bits = FEATURE_EITHER_RESET,
  2201. .tested = TEST_UNTESTED,
  2202. .probe = probe_jedec,
  2203. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  2204. .block_erasers =
  2205. {
  2206. {
  2207. .eraseblocks = {
  2208. {16 * 1024, 1},
  2209. {8 * 1024, 2},
  2210. {96 * 1024, 1},
  2211. {128 * 1024, 1},
  2212. },
  2213. .block_erase = erase_sector_jedec,
  2214. }, {
  2215. .eraseblocks = { {256 * 1024, 1} },
  2216. .block_erase = erase_chip_block_jedec,
  2217. }
  2218. },
  2219. .write = write_jedec_1,
  2220. .read = read_memmapped,
  2221. .voltage = {4500, 5500},
  2222. },
  2223. {
  2224. .vendor = "Atmel",
  2225. .name = "AT49F002(N)T",
  2226. .bustype = BUS_PARALLEL,
  2227. .manufacture_id = ATMEL_ID,
  2228. .model_id = ATMEL_AT49F002NT,
  2229. .total_size = 256,
  2230. .page_size = 256,
  2231. .feature_bits = FEATURE_EITHER_RESET,
  2232. .tested = TEST_OK_PR,
  2233. .probe = probe_jedec,
  2234. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  2235. .block_erasers =
  2236. {
  2237. {
  2238. .eraseblocks = {
  2239. {128 * 1024, 1},
  2240. {96 * 1024, 1},
  2241. {8 * 1024, 2},
  2242. {16 * 1024, 1},
  2243. },
  2244. .block_erase = erase_sector_jedec,
  2245. }, {
  2246. .eraseblocks = { {256 * 1024, 1} },
  2247. .block_erase = erase_chip_block_jedec,
  2248. }
  2249. },
  2250. .write = write_jedec_1,
  2251. .read = read_memmapped,
  2252. .voltage = {4500, 5500},
  2253. },
  2254. {
  2255. .vendor = "Atmel",
  2256. .name = "AT49LH002",
  2257. .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
  2258. .manufacture_id = ATMEL_ID,
  2259. .model_id = ATMEL_AT49LH002,
  2260. .total_size = 256,
  2261. .page_size = 0, /* unused */
  2262. .feature_bits = FEATURE_REGISTERMAP, /* TODO: LPC OK too? */
  2263. .tested = TEST_UNTESTED,
  2264. .probe = probe_82802ab, /* TODO: 0xff cmd not documented? */
  2265. .probe_timing = TIMING_FIXME,
  2266. .block_erasers =
  2267. {
  2268. {
  2269. .eraseblocks = {
  2270. {64 * 1024, 3},
  2271. {32 * 1024, 1},
  2272. {8 * 1024, 2},
  2273. {16 * 1024, 1},
  2274. },
  2275. .block_erase = erase_block_82802ab,
  2276. }, {
  2277. .eraseblocks = {
  2278. {64 * 1024, 4},
  2279. },
  2280. .block_erase = NULL, /* TODO: Implement. */
  2281. },
  2282. },
  2283. .printlock = NULL, /* TODO */
  2284. .unlock = NULL, /* unlock_82802ab() not correct(?) */
  2285. .write = write_82802ab,
  2286. .read = read_memmapped,
  2287. .voltage = {3000, 3600},
  2288. },
  2289. {
  2290. .vendor = "Catalyst",
  2291. .name = "CAT28F512",
  2292. .bustype = BUS_PARALLEL,
  2293. .manufacture_id = CATALYST_ID,
  2294. .model_id = CATALYST_CAT28F512,
  2295. .total_size = 64,
  2296. .page_size = 0, /* unused */
  2297. .feature_bits = 0,
  2298. .tested = TEST_OK_PR,
  2299. .probe = probe_jedec, /* FIXME! */
  2300. .probe_timing = TIMING_ZERO,
  2301. .block_erasers =
  2302. {
  2303. {
  2304. .eraseblocks = { {64 * 1024, 1} },
  2305. .block_erase = NULL, /* TODO */
  2306. },
  2307. },
  2308. .write = NULL, /* TODO */
  2309. .read = read_memmapped,
  2310. .voltage = {4500, 5500},
  2311. },
  2312. {
  2313. .vendor = "Bright",
  2314. .name = "BM29F040",
  2315. .bustype = BUS_PARALLEL,
  2316. .manufacture_id = BRIGHT_ID,
  2317. .model_id = BRIGHT_BM29F040,
  2318. .total_size = 512,
  2319. .page_size = 64 * 1024,
  2320. .feature_bits = FEATURE_EITHER_RESET,
  2321. .tested = TEST_OK_PR,
  2322. .probe = probe_jedec,
  2323. .probe_timing = TIMING_ZERO,
  2324. .block_erasers =
  2325. {
  2326. {
  2327. .eraseblocks = { {64 * 1024, 8} },
  2328. .block_erase = erase_sector_jedec,
  2329. }, {
  2330. .eraseblocks = { {512 * 1024, 1} },
  2331. .block_erase = erase_chip_block_jedec,
  2332. },
  2333. },
  2334. .write = write_jedec_1,
  2335. .read = read_memmapped,
  2336. .voltage = {4500, 5500},
  2337. },
  2338. {
  2339. .vendor = "Bright",
  2340. .name = "BM29F040",
  2341. .bustype = BUS_PARALLEL,
  2342. .manufacture_id = BRIGHT_ID,
  2343. .model_id = BRIGHT_BM29F040,
  2344. .total_size = 512,
  2345. .page_size = 64 * 1024,
  2346. .feature_bits = FEATURE_EITHER_RESET,
  2347. .tested = TEST_OK_PR,
  2348. .probe = probe_jedec,
  2349. .probe_timing = TIMING_ZERO,
  2350. .block_erasers =
  2351. {
  2352. {
  2353. .eraseblocks = { {64 * 1024, 8} },
  2354. .block_erase = erase_sector_jedec,
  2355. }, {
  2356. .eraseblocks = { {512 * 1024, 1} },
  2357. .block_erase = erase_chip_block_jedec,
  2358. },
  2359. },
  2360. .write = write_jedec_1,
  2361. .read = read_memmapped,
  2362. },
  2363. {
  2364. .vendor = "EMST",
  2365. .name = "F49B002UA",
  2366. .bustype = BUS_PARALLEL,
  2367. .manufacture_id = EMST_ID,
  2368. .model_id = EMST_F49B002UA,
  2369. .total_size = 256,
  2370. .page_size = 4096,
  2371. .feature_bits = FEATURE_EITHER_RESET,
  2372. .tested = TEST_UNTESTED,
  2373. .probe = probe_jedec,
  2374. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  2375. .block_erasers =
  2376. {
  2377. {
  2378. .eraseblocks = {
  2379. {128 * 1024, 1},
  2380. {96 * 1024, 1},
  2381. {8 * 1024, 2},
  2382. {16 * 1024, 1},
  2383. },
  2384. .block_erase = erase_sector_jedec,
  2385. }, {
  2386. .eraseblocks = { {256 * 1024, 1} },
  2387. .block_erase = erase_chip_block_jedec,
  2388. }
  2389. },
  2390. .write = write_jedec_1,
  2391. .read = read_memmapped,
  2392. .voltage = {4500, 5500},
  2393. },
  2394. {
  2395. .vendor = "EMST",
  2396. .name = "F25L008A",
  2397. .bustype = BUS_SPI,
  2398. .manufacture_id = EMST_ID,
  2399. .model_id = EMST_F25L008A,
  2400. .total_size = 1024,
  2401. .page_size = 256,
  2402. .feature_bits = FEATURE_UNBOUND_READ,
  2403. .tested = TEST_UNTESTED,
  2404. .probe = probe_spi_rdid,
  2405. .probe_timing = TIMING_ZERO,
  2406. .block_erasers =
  2407. {
  2408. {
  2409. .eraseblocks = { {4 * 1024, 256} },
  2410. .block_erase = spi_block_erase_20,
  2411. }, {
  2412. .eraseblocks = { {64 * 1024, 16} },
  2413. .block_erase = spi_block_erase_d8,
  2414. }, {
  2415. .eraseblocks = { {1024 * 1024, 1} },
  2416. .block_erase = spi_block_erase_60,
  2417. }, {
  2418. .eraseblocks = { {1024 * 1024, 1} },
  2419. .block_erase = spi_block_erase_c7,
  2420. }
  2421. },
  2422. .unlock = spi_disable_blockprotect,
  2423. .write = spi_chip_write_1,
  2424. .read = spi_chip_read,
  2425. .voltage = {2700, 3600},
  2426. },
  2427. {
  2428. .vendor = "Eon",
  2429. .name = "EN25B05",
  2430. .bustype = BUS_SPI,
  2431. .manufacture_id = EON_ID_NOPREFIX,
  2432. .model_id = EON_EN25B05,
  2433. .total_size = 64,
  2434. .page_size = 256,
  2435. .feature_bits = FEATURE_UNBOUND_READ,
  2436. .tested = TEST_UNTESTED,
  2437. .probe = probe_spi_rdid,
  2438. .probe_timing = TIMING_ZERO,
  2439. .block_erasers =
  2440. {
  2441. {
  2442. .eraseblocks = {
  2443. {4 * 1024, 2},
  2444. {8 * 1024, 1},
  2445. {16 * 1024, 1},
  2446. {32 * 1024, 1},
  2447. },
  2448. .block_erase = spi_block_erase_d8,
  2449. }, {
  2450. .eraseblocks = { {64 * 1024, 1} },
  2451. .block_erase = spi_block_erase_c7,
  2452. }
  2453. },
  2454. .unlock = spi_disable_blockprotect,
  2455. .write = spi_chip_write_256,
  2456. .read = spi_chip_read,
  2457. .voltage = {2700, 3600},
  2458. },
  2459. {
  2460. .vendor = "Eon",
  2461. .name = "EN25B05T",
  2462. .bustype = BUS_SPI,
  2463. .manufacture_id = EON_ID_NOPREFIX,
  2464. .model_id = EON_EN25B05,
  2465. .total_size = 64,
  2466. .page_size = 256,
  2467. .feature_bits = FEATURE_UNBOUND_READ,
  2468. .tested = TEST_UNTESTED,
  2469. .probe = probe_spi_rdid,
  2470. .probe_timing = TIMING_ZERO,
  2471. .block_erasers =
  2472. {
  2473. {
  2474. .eraseblocks = {
  2475. {32 * 1024, 1},
  2476. {16 * 1024, 1},
  2477. {8 * 1024, 1},
  2478. {4 * 1024, 2},
  2479. },
  2480. .block_erase = spi_block_erase_d8,
  2481. }, {
  2482. .eraseblocks = { {64 * 1024, 1} },
  2483. .block_erase = spi_block_erase_c7,
  2484. }
  2485. },
  2486. .unlock = spi_disable_blockprotect,
  2487. .write = spi_chip_write_256,
  2488. .read = spi_chip_read,
  2489. .voltage = {2700, 3600},
  2490. },
  2491. {
  2492. .vendor = "Eon",
  2493. .name = "EN25B10",
  2494. .bustype = BUS_SPI,
  2495. .manufacture_id = EON_ID_NOPREFIX,
  2496. .model_id = EON_EN25B10,
  2497. .total_size = 128,
  2498. .page_size = 256,
  2499. .feature_bits = FEATURE_UNBOUND_READ,
  2500. .tested = TEST_UNTESTED,
  2501. .probe = probe_spi_rdid,
  2502. .probe_timing = TIMING_ZERO,
  2503. .block_erasers =
  2504. {
  2505. {
  2506. .eraseblocks = {
  2507. {4 * 1024, 2},
  2508. {8 * 1024, 1},
  2509. {16 * 1024, 1},
  2510. {32 * 1024, 3},
  2511. },
  2512. .block_erase = spi_block_erase_d8,
  2513. }, {
  2514. .eraseblocks = { {128 * 1024, 1} },
  2515. .block_erase = spi_block_erase_c7,
  2516. }
  2517. },
  2518. .unlock = spi_disable_blockprotect,
  2519. .write = spi_chip_write_256,
  2520. .read = spi_chip_read,
  2521. .voltage = {2700, 3600},
  2522. },
  2523. {
  2524. .vendor = "Eon",
  2525. .name = "EN25B10T",
  2526. .bustype = BUS_SPI,
  2527. .manufacture_id = EON_ID_NOPREFIX,
  2528. .model_id = EON_EN25B10,
  2529. .total_size = 128,
  2530. .page_size = 256,
  2531. .feature_bits = FEATURE_UNBOUND_READ,
  2532. .tested = TEST_UNTESTED,
  2533. .probe = probe_spi_rdid,
  2534. .probe_timing = TIMING_ZERO,
  2535. .block_erasers =
  2536. {
  2537. {
  2538. .eraseblocks = {
  2539. {32 * 1024, 3},
  2540. {16 * 1024, 1},
  2541. {8 * 1024, 1},
  2542. {4 * 1024, 2},
  2543. },
  2544. .block_erase = spi_block_erase_d8,
  2545. }, {
  2546. .eraseblocks = { {128 * 1024, 1} },
  2547. .block_erase = spi_block_erase_c7,
  2548. }
  2549. },
  2550. .unlock = spi_disable_blockprotect,
  2551. .write = spi_chip_write_256,
  2552. .read = spi_chip_read,
  2553. .voltage = {2700, 3600},
  2554. },
  2555. {
  2556. .vendor = "Eon",
  2557. .name = "EN25B20",
  2558. .bustype = BUS_SPI,
  2559. .manufacture_id = EON_ID_NOPREFIX,
  2560. .model_id = EON_EN25B20,
  2561. .total_size = 256,
  2562. .page_size = 256,
  2563. .feature_bits = FEATURE_UNBOUND_READ,
  2564. .tested = TEST_UNTESTED,
  2565. .probe = probe_spi_rdid,
  2566. .probe_timing = TIMING_ZERO,
  2567. .block_erasers =
  2568. {
  2569. {
  2570. .eraseblocks = {
  2571. {4 * 1024, 2},
  2572. {8 * 1024, 1},
  2573. {16 * 1024, 1},
  2574. {32 * 1024, 1},
  2575. {64 * 1024, 3}
  2576. },
  2577. .block_erase = spi_block_erase_d8,
  2578. }, {
  2579. .eraseblocks = { {256 * 1024, 1} },
  2580. .block_erase = spi_block_erase_c7,
  2581. }
  2582. },
  2583. .unlock = spi_disable_blockprotect,
  2584. .write = spi_chip_write_256,
  2585. .read = spi_chip_read,
  2586. .voltage = {2700, 3600},
  2587. },
  2588. {
  2589. .vendor = "Eon",
  2590. .name = "EN25B20T",
  2591. .bustype = BUS_SPI,
  2592. .manufacture_id = EON_ID_NOPREFIX,
  2593. .model_id = EON_EN25B20,
  2594. .total_size = 256,
  2595. .page_size = 256,
  2596. .feature_bits = FEATURE_UNBOUND_READ,
  2597. .tested = TEST_UNTESTED,
  2598. .probe = probe_spi_rdid,
  2599. .probe_timing = TIMING_ZERO,
  2600. .block_erasers =
  2601. {
  2602. {
  2603. .eraseblocks = {
  2604. {64 * 1024, 3},
  2605. {32 * 1024, 1},
  2606. {16 * 1024, 1},
  2607. {8 * 1024, 1},
  2608. {4 * 1024, 2},
  2609. },
  2610. .block_erase = spi_block_erase_d8,
  2611. }, {
  2612. .eraseblocks = { {256 * 1024, 1} },
  2613. .block_erase = spi_block_erase_c7,
  2614. }
  2615. },
  2616. .unlock = spi_disable_blockprotect,
  2617. .write = spi_chip_write_256,
  2618. .read = spi_chip_read,
  2619. .voltage = {2700, 3600},
  2620. },
  2621. {
  2622. .vendor = "Eon",
  2623. .name = "EN25B40",
  2624. .bustype = BUS_SPI,
  2625. .manufacture_id = EON_ID_NOPREFIX,
  2626. .model_id = EON_EN25B40,
  2627. .total_size = 512,
  2628. .page_size = 256,
  2629. .feature_bits = FEATURE_UNBOUND_READ,
  2630. .tested = TEST_UNTESTED,
  2631. .probe = probe_spi_rdid,
  2632. .probe_timing = TIMING_ZERO,
  2633. .block_erasers =
  2634. {
  2635. {
  2636. .eraseblocks = {
  2637. {4 * 1024, 2},
  2638. {8 * 1024, 1},
  2639. {16 * 1024, 1},
  2640. {32 * 1024, 1},
  2641. {64 * 1024, 7}
  2642. },
  2643. .block_erase = spi_block_erase_d8,
  2644. }, {
  2645. .eraseblocks = { {512 * 1024, 1} },
  2646. .block_erase = spi_block_erase_c7,
  2647. }
  2648. },
  2649. .unlock = spi_disable_blockprotect,
  2650. .write = spi_chip_write_256,
  2651. .read = spi_chip_read,
  2652. .voltage = {2700, 3600},
  2653. },
  2654. {
  2655. .vendor = "Eon",
  2656. .name = "EN25B40T",
  2657. .bustype = BUS_SPI,
  2658. .manufacture_id = EON_ID_NOPREFIX,
  2659. .model_id = EON_EN25B40,
  2660. .total_size = 512,
  2661. .page_size = 256,
  2662. .feature_bits = FEATURE_UNBOUND_READ,
  2663. .tested = TEST_UNTESTED,
  2664. .probe = probe_spi_rdid,
  2665. .probe_timing = TIMING_ZERO,
  2666. .block_erasers =
  2667. {
  2668. {
  2669. .eraseblocks = {
  2670. {64 * 1024, 7},
  2671. {32 * 1024, 1},
  2672. {16 * 1024, 1},
  2673. {8 * 1024, 1},
  2674. {4 * 1024, 2},
  2675. },
  2676. .block_erase = spi_block_erase_d8,
  2677. }, {
  2678. .eraseblocks = { {512 * 1024, 1} },
  2679. .block_erase = spi_block_erase_c7,
  2680. }
  2681. },
  2682. .unlock = spi_disable_blockprotect,
  2683. .write = spi_chip_write_256,
  2684. .read = spi_chip_read,
  2685. .voltage = {2700, 3600},
  2686. },
  2687. {
  2688. .vendor = "Eon",
  2689. .name = "EN25B80",
  2690. .bustype = BUS_SPI,
  2691. .manufacture_id = EON_ID_NOPREFIX,
  2692. .model_id = EON_EN25B80,
  2693. .total_size = 1024,
  2694. .page_size = 256,
  2695. .feature_bits = FEATURE_UNBOUND_READ,
  2696. .tested = TEST_UNTESTED,
  2697. .probe = probe_spi_rdid,
  2698. .probe_timing = TIMING_ZERO,
  2699. .block_erasers =
  2700. {
  2701. {
  2702. .eraseblocks = {
  2703. {4 * 1024, 2},
  2704. {8 * 1024, 1},
  2705. {16 * 1024, 1},
  2706. {32 * 1024, 1},
  2707. {64 * 1024, 15}
  2708. },
  2709. .block_erase = spi_block_erase_d8,
  2710. }, {
  2711. .eraseblocks = { {1024 * 1024, 1} },
  2712. .block_erase = spi_block_erase_c7,
  2713. }
  2714. },
  2715. .unlock = spi_disable_blockprotect,
  2716. .write = spi_chip_write_256,
  2717. .read = spi_chip_read,
  2718. .voltage = {2700, 3600},
  2719. },
  2720. {
  2721. .vendor = "Eon",
  2722. .name = "EN25B80T",
  2723. .bustype = BUS_SPI,
  2724. .manufacture_id = EON_ID_NOPREFIX,
  2725. .model_id = EON_EN25B80,
  2726. .total_size = 1024,
  2727. .page_size = 256,
  2728. .feature_bits = FEATURE_UNBOUND_READ,
  2729. .tested = TEST_UNTESTED,
  2730. .probe = probe_spi_rdid,
  2731. .probe_timing = TIMING_ZERO,
  2732. .block_erasers =
  2733. {
  2734. {
  2735. .eraseblocks = {
  2736. {64 * 1024, 15},
  2737. {32 * 1024, 1},
  2738. {16 * 1024, 1},
  2739. {8 * 1024, 1},
  2740. {4 * 1024, 2},
  2741. },
  2742. .block_erase = spi_block_erase_d8,
  2743. }, {
  2744. .eraseblocks = { {1024 * 1024, 1} },
  2745. .block_erase = spi_block_erase_c7,
  2746. }
  2747. },
  2748. .unlock = spi_disable_blockprotect,
  2749. .write = spi_chip_write_256,
  2750. .read = spi_chip_read,
  2751. .voltage = {2700, 3600},
  2752. },
  2753. {
  2754. .vendor = "Eon",
  2755. .name = "EN25B16",
  2756. .bustype = BUS_SPI,
  2757. .manufacture_id = EON_ID_NOPREFIX,
  2758. .model_id = EON_EN25B16,
  2759. .total_size = 2048,
  2760. .page_size = 256,
  2761. .feature_bits = FEATURE_UNBOUND_READ,
  2762. .tested = TEST_UNTESTED,
  2763. .probe = probe_spi_rdid,
  2764. .probe_timing = TIMING_ZERO,
  2765. .block_erasers =
  2766. {
  2767. {
  2768. .eraseblocks = {
  2769. {4 * 1024, 2},
  2770. {8 * 1024, 1},
  2771. {16 * 1024, 1},
  2772. {32 * 1024, 1},
  2773. {64 * 1024, 31},
  2774. },
  2775. .block_erase = spi_block_erase_d8,
  2776. }, {
  2777. .eraseblocks = { {2 * 1024 * 1024, 1} },
  2778. .block_erase = spi_block_erase_c7,
  2779. }
  2780. },
  2781. .unlock = spi_disable_blockprotect,
  2782. .write = spi_chip_write_256,
  2783. .read = spi_chip_read,
  2784. .voltage = {2700, 3600},
  2785. },
  2786. {
  2787. .vendor = "Eon",
  2788. .name = "EN25B16T",
  2789. .bustype = BUS_SPI,
  2790. .manufacture_id = EON_ID_NOPREFIX,
  2791. .model_id = EON_EN25B16,
  2792. .total_size = 2048,
  2793. .page_size = 256,
  2794. .feature_bits = FEATURE_UNBOUND_READ,
  2795. .tested = TEST_UNTESTED,
  2796. .probe = probe_spi_rdid,
  2797. .probe_timing = TIMING_ZERO,
  2798. .block_erasers =
  2799. {
  2800. {
  2801. .eraseblocks = {
  2802. {64 * 1024, 31},
  2803. {32 * 1024, 1},
  2804. {16 * 1024, 1},
  2805. {8 * 1024, 1},
  2806. {4 * 1024, 2},
  2807. },
  2808. .block_erase = spi_block_erase_d8,
  2809. }, {
  2810. .eraseblocks = { {2 * 1024 * 1024, 1} },
  2811. .block_erase = spi_block_erase_c7,
  2812. }
  2813. },
  2814. .unlock = spi_disable_blockprotect,
  2815. .write = spi_chip_write_256,
  2816. .read = spi_chip_read,
  2817. .voltage = {2700, 3600},
  2818. },
  2819. {
  2820. .vendor = "Eon",
  2821. .name = "EN25B32",
  2822. .bustype = BUS_SPI,
  2823. .manufacture_id = EON_ID_NOPREFIX,
  2824. .model_id = EON_EN25B32,
  2825. .total_size = 4096,
  2826. .page_size = 256,
  2827. .feature_bits = FEATURE_UNBOUND_READ,
  2828. .tested = TEST_UNTESTED,
  2829. .probe = probe_spi_rdid,
  2830. .probe_timing = TIMING_ZERO,
  2831. .block_erasers =
  2832. {
  2833. {
  2834. .eraseblocks = {
  2835. {4 * 1024, 2},
  2836. {8 * 1024, 1},
  2837. {16 * 1024, 1},
  2838. {32 * 1024, 1},
  2839. {64 * 1024, 63},
  2840. },
  2841. .block_erase = spi_block_erase_d8,
  2842. }, {
  2843. .eraseblocks = { {4 * 1024 * 1024, 1} },
  2844. .block_erase = spi_block_erase_c7,
  2845. }
  2846. },
  2847. .unlock = spi_disable_blockprotect,
  2848. .write = spi_chip_write_256,
  2849. .read = spi_chip_read,
  2850. .voltage = {2700, 3600},
  2851. },
  2852. {
  2853. .vendor = "Eon",
  2854. .name = "EN25B32T",
  2855. .bustype = BUS_SPI,
  2856. .manufacture_id = EON_ID_NOPREFIX,
  2857. .model_id = EON_EN25B32,
  2858. .total_size = 4096,
  2859. .page_size = 256,
  2860. .feature_bits = FEATURE_UNBOUND_READ,
  2861. .tested = TEST_UNTESTED,
  2862. .probe = probe_spi_rdid,
  2863. .probe_timing = TIMING_ZERO,
  2864. .block_erasers =
  2865. {
  2866. {
  2867. .eraseblocks = {
  2868. {64 * 1024, 63},
  2869. {32 * 1024, 1},
  2870. {16 * 1024, 1},
  2871. {8 * 1024, 1},
  2872. {4 * 1024, 2},
  2873. },
  2874. .block_erase = spi_block_erase_d8,
  2875. }, {
  2876. .eraseblocks = { {4 * 1024 * 1024, 1} },
  2877. .block_erase = spi_block_erase_c7,
  2878. }
  2879. },
  2880. .unlock = spi_disable_blockprotect,
  2881. .write = spi_chip_write_256,
  2882. .read = spi_chip_read,
  2883. .voltage = {2700, 3600},
  2884. },
  2885. {
  2886. .vendor = "Eon",
  2887. .name = "EN25B64",
  2888. .bustype = BUS_SPI,
  2889. .manufacture_id = EON_ID_NOPREFIX,
  2890. .model_id = EON_EN25B64,
  2891. .total_size = 8192,
  2892. .page_size = 256,
  2893. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  2894. .tested = TEST_UNTESTED,
  2895. .probe = probe_spi_rdid,
  2896. .probe_timing = TIMING_ZERO,
  2897. .block_erasers =
  2898. {
  2899. {
  2900. .eraseblocks = {
  2901. {4 * 1024, 2},
  2902. {8 * 1024, 1},
  2903. {16 * 1024, 1},
  2904. {32 * 1024, 1},
  2905. {64 * 1024, 127},
  2906. },
  2907. .block_erase = spi_block_erase_d8,
  2908. }, {
  2909. .eraseblocks = { {8 * 1024 * 1024, 1} },
  2910. .block_erase = spi_block_erase_c7,
  2911. }
  2912. },
  2913. .unlock = spi_disable_blockprotect,
  2914. .write = spi_chip_write_256,
  2915. .read = spi_chip_read,
  2916. .voltage = {2700, 3600},
  2917. },
  2918. {
  2919. .vendor = "Eon",
  2920. .name = "EN25B64T",
  2921. .bustype = BUS_SPI,
  2922. .manufacture_id = EON_ID_NOPREFIX,
  2923. .model_id = EON_EN25B64,
  2924. .total_size = 8192,
  2925. .page_size = 256,
  2926. .feature_bits = FEATURE_UNBOUND_READ,
  2927. .tested = TEST_UNTESTED,
  2928. .probe = probe_spi_rdid,
  2929. .probe_timing = TIMING_ZERO,
  2930. .block_erasers =
  2931. {
  2932. {
  2933. .eraseblocks = {
  2934. {64 * 1024, 127},
  2935. {32 * 1024, 1},
  2936. {16 * 1024, 1},
  2937. {8 * 1024, 1},
  2938. {4 * 1024, 2},
  2939. },
  2940. .block_erase = spi_block_erase_d8,
  2941. }, {
  2942. .eraseblocks = { {8 * 1024 * 1024, 1} },
  2943. .block_erase = spi_block_erase_c7,
  2944. }
  2945. },
  2946. .unlock = spi_disable_blockprotect,
  2947. .write = spi_chip_write_256,
  2948. .read = spi_chip_read,
  2949. .voltage = {2700, 3600},
  2950. },
  2951. {
  2952. /* Note: EN25Q16 is an evil twin which shares the model ID
  2953. but has different write protection capabilities */
  2954. .vendor = "Eon",
  2955. .name = "EN25D16",
  2956. .bustype = BUS_SPI,
  2957. .manufacture_id = EON_ID_NOPREFIX,
  2958. .model_id = EON_EN25D16,
  2959. .total_size = 2048,
  2960. .page_size = 256,
  2961. /* OTP: D16 512B/Q16 128B total; enter 0x3A */
  2962. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  2963. .tested = TEST_UNTESTED,
  2964. .probe = probe_spi_rdid,
  2965. .probe_timing = TIMING_ZERO,
  2966. .block_erasers =
  2967. {
  2968. {
  2969. .eraseblocks = { {4 * 1024, 512} },
  2970. .block_erase = spi_block_erase_20,
  2971. }, {
  2972. .eraseblocks = { {64 * 1024, 32} },
  2973. .block_erase = spi_block_erase_d8,
  2974. }, {
  2975. .eraseblocks = { {64 * 1024, 32} },
  2976. .block_erase = spi_block_erase_52,
  2977. }, {
  2978. .eraseblocks = { {2 * 1024 * 1024, 1} },
  2979. .block_erase = spi_block_erase_60,
  2980. }, {
  2981. .eraseblocks = { {2 * 1024 * 1024, 1} },
  2982. .block_erase = spi_block_erase_c7,
  2983. }
  2984. },
  2985. .unlock = spi_disable_blockprotect,
  2986. .write = spi_chip_write_256,
  2987. .read = spi_chip_read,
  2988. .voltage = {2700, 3600},
  2989. },
  2990. {
  2991. .vendor = "Eon",
  2992. .name = "EN25F05",
  2993. .bustype = BUS_SPI,
  2994. .manufacture_id = EON_ID_NOPREFIX,
  2995. .model_id = EON_EN25F05,
  2996. .total_size = 64,
  2997. .page_size = 256,
  2998. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  2999. .tested = TEST_UNTESTED,
  3000. .probe = probe_spi_rdid,
  3001. .probe_timing = TIMING_ZERO,
  3002. .block_erasers =
  3003. {
  3004. {
  3005. .eraseblocks = { {4 * 1024, 16} },
  3006. .block_erase = spi_block_erase_20,
  3007. }, {
  3008. .eraseblocks = { {32 * 1024, 2} },
  3009. .block_erase = spi_block_erase_d8,
  3010. }, {
  3011. .eraseblocks = { {32 * 1024, 2} },
  3012. .block_erase = spi_block_erase_52,
  3013. }, {
  3014. .eraseblocks = { {64 * 1024, 1} },
  3015. .block_erase = spi_block_erase_60,
  3016. }, {
  3017. .eraseblocks = { {64 * 1024, 1} },
  3018. .block_erase = spi_block_erase_c7,
  3019. }
  3020. },
  3021. .unlock = spi_disable_blockprotect,
  3022. .write = spi_chip_write_256,
  3023. .read = spi_chip_read,
  3024. .voltage = {2700, 3600},
  3025. },
  3026. {
  3027. .vendor = "Eon",
  3028. .name = "EN25F10",
  3029. .bustype = BUS_SPI,
  3030. .manufacture_id = EON_ID_NOPREFIX,
  3031. .model_id = EON_EN25F10,
  3032. .total_size = 128,
  3033. .page_size = 256,
  3034. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  3035. .tested = TEST_UNTESTED,
  3036. .probe = probe_spi_rdid,
  3037. .probe_timing = TIMING_ZERO,
  3038. .block_erasers =
  3039. {
  3040. {
  3041. .eraseblocks = { {4 * 1024, 32} },
  3042. .block_erase = spi_block_erase_20,
  3043. }, {
  3044. .eraseblocks = { {32 * 1024, 4} },
  3045. .block_erase = spi_block_erase_d8,
  3046. }, {
  3047. .eraseblocks = { {32 * 1024, 4} },
  3048. .block_erase = spi_block_erase_52,
  3049. }, {
  3050. .eraseblocks = { {128 * 1024, 1} },
  3051. .block_erase = spi_block_erase_60,
  3052. }, {
  3053. .eraseblocks = { {128 * 1024, 1} },
  3054. .block_erase = spi_block_erase_c7,
  3055. }
  3056. },
  3057. .unlock = spi_disable_blockprotect,
  3058. .write = spi_chip_write_256,
  3059. .read = spi_chip_read,
  3060. .voltage = {2700, 3600},
  3061. },
  3062. {
  3063. .vendor = "Eon",
  3064. .name = "EN25F20",
  3065. .bustype = BUS_SPI,
  3066. .manufacture_id = EON_ID_NOPREFIX,
  3067. .model_id = EON_EN25F20,
  3068. .total_size = 256,
  3069. .page_size = 256,
  3070. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  3071. .tested = TEST_UNTESTED,
  3072. .probe = probe_spi_rdid,
  3073. .probe_timing = TIMING_ZERO,
  3074. .block_erasers =
  3075. {
  3076. {
  3077. .eraseblocks = { {4 * 1024, 64} },
  3078. .block_erase = spi_block_erase_20,
  3079. }, {
  3080. .eraseblocks = { {64 * 1024, 4} },
  3081. .block_erase = spi_block_erase_d8,
  3082. }, {
  3083. .eraseblocks = { {64 * 1024, 4} },
  3084. .block_erase = spi_block_erase_52,
  3085. }, {
  3086. .eraseblocks = { {256 * 1024, 1} },
  3087. .block_erase = spi_block_erase_60,
  3088. }, {
  3089. .eraseblocks = { {256 * 1024, 1} },
  3090. .block_erase = spi_block_erase_c7,
  3091. }
  3092. },
  3093. .unlock = spi_disable_blockprotect,
  3094. .write = spi_chip_write_256,
  3095. .read = spi_chip_read,
  3096. .voltage = {2700, 3600},
  3097. },
  3098. {
  3099. .vendor = "Eon",
  3100. .name = "EN25F40",
  3101. .bustype = BUS_SPI,
  3102. .manufacture_id = EON_ID_NOPREFIX,
  3103. .model_id = EON_EN25F40,
  3104. .total_size = 512,
  3105. .page_size = 256,
  3106. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  3107. .tested = TEST_OK_PROBE,
  3108. .probe = probe_spi_rdid,
  3109. .probe_timing = TIMING_ZERO,
  3110. .block_erasers =
  3111. {
  3112. {
  3113. .eraseblocks = { {4 * 1024, 128} },
  3114. .block_erase = spi_block_erase_20,
  3115. }, {
  3116. .eraseblocks = { {64 * 1024, 8} },
  3117. .block_erase = spi_block_erase_d8,
  3118. }, {
  3119. .eraseblocks = { {512 * 1024, 1} },
  3120. .block_erase = spi_block_erase_60,
  3121. }, {
  3122. .eraseblocks = { {512 * 1024, 1} },
  3123. .block_erase = spi_block_erase_c7,
  3124. },
  3125. },
  3126. .unlock = spi_disable_blockprotect,
  3127. .write = spi_chip_write_256,
  3128. .read = spi_chip_read,
  3129. .voltage = {2700, 3600},
  3130. .wp = &wp_w25,
  3131. },
  3132. {
  3133. .vendor = "Eon",
  3134. .name = "EN25F80",
  3135. .bustype = BUS_SPI,
  3136. .manufacture_id = EON_ID_NOPREFIX,
  3137. .model_id = EON_EN25F80,
  3138. .total_size = 1024,
  3139. .page_size = 256,
  3140. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  3141. .tested = TEST_OK_PREWU,
  3142. .probe = probe_spi_rdid,
  3143. .probe_timing = TIMING_ZERO,
  3144. .block_erasers =
  3145. {
  3146. {
  3147. .eraseblocks = { {4 * 1024, 256} },
  3148. .block_erase = spi_block_erase_20,
  3149. }, {
  3150. .eraseblocks = { {64 * 1024, 16} },
  3151. .block_erase = spi_block_erase_d8,
  3152. }, {
  3153. .eraseblocks = { {1024 * 1024, 1} },
  3154. .block_erase = spi_block_erase_60,
  3155. }, {
  3156. .eraseblocks = { {1024 * 1024, 1} },
  3157. .block_erase = spi_block_erase_c7,
  3158. }
  3159. },
  3160. .unlock = spi_disable_blockprotect,
  3161. .write = spi_chip_write_256,
  3162. .read = spi_chip_read,
  3163. .voltage = {2700, 3600},
  3164. },
  3165. {
  3166. .vendor = "Eon",
  3167. .name = "EN25F16",
  3168. .bustype = BUS_SPI,
  3169. .manufacture_id = EON_ID_NOPREFIX,
  3170. .model_id = EON_EN25F16,
  3171. .total_size = 2048,
  3172. .page_size = 256,
  3173. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  3174. .tested = TEST_OK_PREWU,
  3175. .probe = probe_spi_rdid,
  3176. .probe_timing = TIMING_ZERO,
  3177. .block_erasers =
  3178. {
  3179. {
  3180. .eraseblocks = { {4 * 1024, 512} },
  3181. .block_erase = spi_block_erase_20,
  3182. }, {
  3183. .eraseblocks = { {64 * 1024, 32} },
  3184. .block_erase = spi_block_erase_d8,
  3185. }, {
  3186. .eraseblocks = { {2 * 1024 * 1024, 1} },
  3187. .block_erase = spi_block_erase_60,
  3188. }, {
  3189. .eraseblocks = { {2 * 1024 * 1024, 1} },
  3190. .block_erase = spi_block_erase_c7,
  3191. }
  3192. },
  3193. .unlock = spi_disable_blockprotect,
  3194. .write = spi_chip_write_256,
  3195. .read = spi_chip_read,
  3196. .voltage = {2700, 3600},
  3197. },
  3198. {
  3199. .vendor = "Eon",
  3200. .name = "EN25F32",
  3201. .bustype = BUS_SPI,
  3202. .manufacture_id = EON_ID_NOPREFIX,
  3203. .model_id = EON_EN25F32,
  3204. .total_size = 4096,
  3205. .page_size = 256,
  3206. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  3207. .tested = TEST_UNTESTED,
  3208. .probe = probe_spi_rdid,
  3209. .probe_timing = TIMING_ZERO,
  3210. .block_erasers =
  3211. {
  3212. {
  3213. .eraseblocks = { {4 * 1024, 1024} },
  3214. .block_erase = spi_block_erase_20,
  3215. }, {
  3216. .eraseblocks = { {64 * 1024, 64} },
  3217. .block_erase = spi_block_erase_d8,
  3218. }, {
  3219. .eraseblocks = { {4 * 1024 * 1024, 1} },
  3220. .block_erase = spi_block_erase_60,
  3221. }, {
  3222. .eraseblocks = { {4 * 1024 * 1024, 1} },
  3223. .block_erase = spi_block_erase_c7,
  3224. }
  3225. },
  3226. .unlock = spi_disable_blockprotect,
  3227. .write = spi_chip_write_256,
  3228. .read = spi_chip_read,
  3229. },
  3230. {
  3231. .vendor = "Eon",
  3232. .name = "EN25Q40",
  3233. .bustype = BUS_SPI,
  3234. .manufacture_id = EON_ID_NOPREFIX,
  3235. .model_id = EON_EN25Q40,
  3236. .total_size = 512,
  3237. .page_size = 256,
  3238. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  3239. .tested = TEST_UNTESTED,
  3240. .probe = probe_spi_rdid,
  3241. .probe_timing = TIMING_ZERO,
  3242. .block_erasers =
  3243. {
  3244. {
  3245. .eraseblocks = { {4 * 1024, 128} },
  3246. .block_erase = spi_block_erase_20,
  3247. }, {
  3248. .eraseblocks = { {64 * 1024, 8} },
  3249. .block_erase = spi_block_erase_d8,
  3250. }, {
  3251. .eraseblocks = { {512 * 1024, 1} },
  3252. .block_erase = spi_block_erase_60,
  3253. }, {
  3254. .eraseblocks = { {512 * 1024, 1} },
  3255. .block_erase = spi_block_erase_c7,
  3256. }
  3257. },
  3258. .unlock = spi_disable_blockprotect,
  3259. .write = spi_chip_write_256,
  3260. .read = spi_chip_read,
  3261. .wp = &wp_w25,
  3262. },
  3263. {
  3264. .vendor = "Eon",
  3265. .name = "EN25Q80(A)",
  3266. .bustype = BUS_SPI,
  3267. .manufacture_id = EON_ID_NOPREFIX,
  3268. .model_id = EON_EN25Q80,
  3269. .total_size = 1024,
  3270. .page_size = 256,
  3271. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  3272. .tested = TEST_UNTESTED,
  3273. .probe = probe_spi_rdid,
  3274. .probe_timing = TIMING_ZERO,
  3275. .block_erasers =
  3276. {
  3277. {
  3278. .eraseblocks = { {4 * 1024, 256} },
  3279. .block_erase = spi_block_erase_20,
  3280. }, {
  3281. .eraseblocks = { {64 * 1024, 16} },
  3282. .block_erase = spi_block_erase_d8,
  3283. }, {
  3284. .eraseblocks = { {1024 * 1024, 1} },
  3285. .block_erase = spi_block_erase_60,
  3286. }, {
  3287. .eraseblocks = { {1024 * 1024, 1} },
  3288. .block_erase = spi_block_erase_c7,
  3289. }
  3290. },
  3291. .unlock = spi_disable_blockprotect,
  3292. .write = spi_chip_write_256,
  3293. .read = spi_chip_read,
  3294. .wp = &wp_w25,
  3295. },
  3296. {
  3297. .vendor = "Eon",
  3298. .name = "EN25Q32(A)(B)",
  3299. .bustype = BUS_SPI,
  3300. .manufacture_id = EON_ID_NOPREFIX,
  3301. .model_id = EON_EN25Q32,
  3302. .total_size = 4096,
  3303. .page_size = 256,
  3304. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  3305. .tested = TEST_UNTESTED,
  3306. .probe = probe_spi_rdid,
  3307. .probe_timing = TIMING_ZERO,
  3308. .block_erasers =
  3309. {
  3310. {
  3311. .eraseblocks = { {4 * 1024, 1024} },
  3312. .block_erase = spi_block_erase_20,
  3313. }, {
  3314. .eraseblocks = { {64 * 1024, 64} },
  3315. .block_erase = spi_block_erase_d8,
  3316. }, {
  3317. .eraseblocks = { {4 * 1024 * 1024, 1} },
  3318. .block_erase = spi_block_erase_60,
  3319. }, {
  3320. .eraseblocks = { {4 * 1024 * 1024, 1} },
  3321. .block_erase = spi_block_erase_c7,
  3322. }
  3323. },
  3324. .unlock = spi_disable_blockprotect,
  3325. .write = spi_chip_write_256,
  3326. .read = spi_chip_read,
  3327. .voltage = {2700, 3600},
  3328. .wp = &wp_w25,
  3329. },
  3330. {
  3331. .vendor = "Eon",
  3332. .name = "EN25Q64",
  3333. .bustype = BUS_SPI,
  3334. .manufacture_id = EON_ID_NOPREFIX,
  3335. .model_id = EON_EN25Q64,
  3336. .total_size = 8192,
  3337. .page_size = 256,
  3338. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  3339. .tested = TEST_UNTESTED,
  3340. .probe = probe_spi_rdid,
  3341. .probe_timing = TIMING_ZERO,
  3342. .block_erasers =
  3343. {
  3344. {
  3345. .eraseblocks = { {4 * 1024, 2048} },
  3346. .block_erase = spi_block_erase_20,
  3347. }, {
  3348. .eraseblocks = { {64 * 1024, 128} },
  3349. .block_erase = spi_block_erase_d8,
  3350. }, {
  3351. .eraseblocks = { {8 * 1024 * 1024, 1} },
  3352. .block_erase = spi_block_erase_60,
  3353. }, {
  3354. .eraseblocks = { {8 * 1024 * 1024, 1} },
  3355. .block_erase = spi_block_erase_c7,
  3356. }
  3357. },
  3358. .unlock = spi_disable_blockprotect,
  3359. .write = spi_chip_write_256,
  3360. .read = spi_chip_read,
  3361. .wp = &wp_w25,
  3362. },
  3363. {
  3364. .vendor = "Eon",
  3365. .name = "EN25Q128",
  3366. .bustype = BUS_SPI,
  3367. .manufacture_id = EON_ID_NOPREFIX,
  3368. .model_id = EON_EN25Q128,
  3369. .total_size = 16384,
  3370. .page_size = 256,
  3371. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  3372. .tested = TEST_UNTESTED,
  3373. .probe = probe_spi_rdid,
  3374. .probe_timing = TIMING_ZERO,
  3375. .block_erasers =
  3376. {
  3377. {
  3378. .eraseblocks = { {4 * 1024, 4096} },
  3379. .block_erase = spi_block_erase_20,
  3380. }, {
  3381. .eraseblocks = { {64 * 1024, 256} },
  3382. .block_erase = spi_block_erase_d8,
  3383. }, {
  3384. .eraseblocks = { {16 * 1024 * 1024, 1} },
  3385. .block_erase = spi_block_erase_60,
  3386. }, {
  3387. .eraseblocks = { {16 * 1024 * 1024, 1} },
  3388. .block_erase = spi_block_erase_c7,
  3389. }
  3390. },
  3391. .unlock = spi_disable_blockprotect,
  3392. .write = spi_chip_write_256,
  3393. .read = spi_chip_read,
  3394. .wp = &wp_w25,
  3395. },
  3396. {
  3397. .vendor = "Eon",
  3398. .name = "EN25Q40",
  3399. .bustype = BUS_SPI,
  3400. .manufacture_id = EON_ID_NOPREFIX,
  3401. .model_id = EON_EN25Q40,
  3402. .total_size = 512,
  3403. .page_size = 256,
  3404. /* OTP: 256B total; enter 0x3A */
  3405. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  3406. .tested = TEST_UNTESTED,
  3407. .probe = probe_spi_rdid,
  3408. .probe_timing = TIMING_ZERO,
  3409. .block_erasers =
  3410. {
  3411. {
  3412. .eraseblocks = { {4 * 1024, 128} },
  3413. .block_erase = spi_block_erase_20,
  3414. }, {
  3415. .eraseblocks = { {64 * 1024, 8} },
  3416. .block_erase = spi_block_erase_d8,
  3417. }, {
  3418. .eraseblocks = { {512 * 1024, 1} },
  3419. .block_erase = spi_block_erase_60,
  3420. }, {
  3421. .eraseblocks = { {512 * 1024, 1} },
  3422. .block_erase = spi_block_erase_c7,
  3423. }
  3424. },
  3425. .unlock = spi_disable_blockprotect,
  3426. .write = spi_chip_write_256,
  3427. .read = spi_chip_read,
  3428. .voltage = {2700, 3600},
  3429. },
  3430. {
  3431. .vendor = "Eon",
  3432. .name = "EN25Q80(A)",
  3433. .bustype = BUS_SPI,
  3434. .manufacture_id = EON_ID_NOPREFIX,
  3435. .model_id = EON_EN25Q80,
  3436. .total_size = 1024,
  3437. .page_size = 256,
  3438. /* OTP: 256B total; enter 0x3A */
  3439. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  3440. .tested = TEST_UNTESTED,
  3441. .probe = probe_spi_rdid,
  3442. .probe_timing = TIMING_ZERO,
  3443. .block_erasers =
  3444. {
  3445. {
  3446. .eraseblocks = { {4 * 1024, 256} },
  3447. .block_erase = spi_block_erase_20,
  3448. }, {
  3449. .eraseblocks = { {64 * 1024, 16} },
  3450. .block_erase = spi_block_erase_d8,
  3451. }, {
  3452. .eraseblocks = { {1024 * 1024, 1} },
  3453. .block_erase = spi_block_erase_60,
  3454. }, {
  3455. .eraseblocks = { {1024 * 1024, 1} },
  3456. .block_erase = spi_block_erase_c7,
  3457. }
  3458. },
  3459. .unlock = spi_disable_blockprotect,
  3460. .write = spi_chip_write_256,
  3461. .read = spi_chip_read,
  3462. .voltage = {2700, 3600},
  3463. },
  3464. {
  3465. .vendor = "Eon",
  3466. .name = "EN25Q32(A/B)",
  3467. .bustype = BUS_SPI,
  3468. .manufacture_id = EON_ID_NOPREFIX,
  3469. .model_id = EON_EN25Q32,
  3470. .total_size = 4096,
  3471. .page_size = 256,
  3472. /* OTP: 512B total; enter 0x3A */
  3473. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  3474. .tested = TEST_UNTESTED,
  3475. .probe = probe_spi_rdid,
  3476. .probe_timing = TIMING_ZERO,
  3477. .block_erasers =
  3478. {
  3479. {
  3480. .eraseblocks = { {4 * 1024, 1024} },
  3481. .block_erase = spi_block_erase_20,
  3482. }, {
  3483. .eraseblocks = { {64 * 1024, 64} },
  3484. .block_erase = spi_block_erase_d8,
  3485. }, {
  3486. .eraseblocks = { {4 * 1024 * 1024, 1} },
  3487. .block_erase = spi_block_erase_60,
  3488. }, {
  3489. .eraseblocks = { {4 * 1024 * 1024, 1} },
  3490. .block_erase = spi_block_erase_c7,
  3491. }
  3492. },
  3493. .unlock = spi_disable_blockprotect,
  3494. .write = spi_chip_write_256,
  3495. .read = spi_chip_read,
  3496. .voltage = {2700, 3600},
  3497. },
  3498. {
  3499. .vendor = "Eon",
  3500. .name = "EN25Q64",
  3501. .bustype = BUS_SPI,
  3502. .manufacture_id = EON_ID_NOPREFIX,
  3503. .model_id = EON_EN25Q64,
  3504. .total_size = 8192,
  3505. .page_size = 256,
  3506. /* OTP: 512B total; enter 0x3A */
  3507. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  3508. .tested = TEST_UNTESTED,
  3509. .probe = probe_spi_rdid,
  3510. .probe_timing = TIMING_ZERO,
  3511. .block_erasers =
  3512. {
  3513. {
  3514. .eraseblocks = { {4 * 1024, 2048} },
  3515. .block_erase = spi_block_erase_20,
  3516. }, {
  3517. .eraseblocks = { {64 * 1024, 128} },
  3518. .block_erase = spi_block_erase_d8,
  3519. }, {
  3520. .eraseblocks = { {8 * 1024 * 1024, 1} },
  3521. .block_erase = spi_block_erase_60,
  3522. }, {
  3523. .eraseblocks = { {8 * 1024 * 1024, 1} },
  3524. .block_erase = spi_block_erase_c7,
  3525. }
  3526. },
  3527. .unlock = spi_disable_blockprotect,
  3528. .write = spi_chip_write_256,
  3529. .read = spi_chip_read,
  3530. .voltage = {2700, 3600},
  3531. },
  3532. {
  3533. .vendor = "Eon",
  3534. .name = "EN25Q128",
  3535. .bustype = BUS_SPI,
  3536. .manufacture_id = EON_ID_NOPREFIX,
  3537. .model_id = EON_EN25Q128,
  3538. .total_size = 16384,
  3539. .page_size = 256,
  3540. /* OTP: 512B total; enter 0x3A */
  3541. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  3542. .tested = TEST_UNTESTED,
  3543. .probe = probe_spi_rdid,
  3544. .probe_timing = TIMING_ZERO,
  3545. .block_erasers =
  3546. {
  3547. {
  3548. .eraseblocks = { {4 * 1024, 4096} },
  3549. .block_erase = spi_block_erase_20,
  3550. }, {
  3551. .eraseblocks = { {64 * 1024, 256} },
  3552. .block_erase = spi_block_erase_d8,
  3553. }, {
  3554. .eraseblocks = { {16 * 1024 * 1024, 1} },
  3555. .block_erase = spi_block_erase_60,
  3556. }, {
  3557. .eraseblocks = { {16 * 1024 * 1024, 1} },
  3558. .block_erase = spi_block_erase_c7,
  3559. }
  3560. },
  3561. .unlock = spi_disable_blockprotect,
  3562. .write = spi_chip_write_256,
  3563. .read = spi_chip_read,
  3564. },
  3565. {
  3566. .vendor = "Eon",
  3567. .name = "EN25QH16",
  3568. .bustype = BUS_SPI,
  3569. .manufacture_id = EON_ID_NOPREFIX,
  3570. .model_id = EON_EN25QH16,
  3571. .total_size = 2048,
  3572. .page_size = 256,
  3573. /* supports SFDP */
  3574. /* OTP: 512B total; enter 0x3A */
  3575. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  3576. .tested = TEST_UNTESTED,
  3577. .probe = probe_spi_rdid,
  3578. .probe_timing = TIMING_ZERO,
  3579. .block_erasers =
  3580. {
  3581. {
  3582. .eraseblocks = { {4 * 1024, 512} },
  3583. .block_erase = spi_block_erase_20,
  3584. }, {
  3585. .eraseblocks = { {64 * 1024, 32} },
  3586. .block_erase = spi_block_erase_d8,
  3587. }, {
  3588. .eraseblocks = { {1024 * 2048, 1} },
  3589. .block_erase = spi_block_erase_60,
  3590. }, {
  3591. .eraseblocks = { {1024 * 2048, 1} },
  3592. .block_erase = spi_block_erase_c7,
  3593. }
  3594. },
  3595. .unlock = spi_disable_blockprotect,
  3596. .write = spi_chip_write_256,
  3597. .read = spi_chip_read,
  3598. .voltage = {2700, 3600},
  3599. },
  3600. {
  3601. .vendor = "Eon",
  3602. .name = "EN25S64",
  3603. .bustype = BUS_SPI,
  3604. .manufacture_id = EON_ID_NOPREFIX,
  3605. .model_id = EON_EN25S64,
  3606. .total_size = 8192,
  3607. .page_size = 256,
  3608. /* FIXME: add FEATURE_QPI removed */
  3609. /* OTP: 512B total; enter 0x3A */
  3610. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  3611. .tested = TEST_OK_PREWU,
  3612. .probe = probe_spi_rdid,
  3613. .probe_timing = TIMING_ZERO,
  3614. .block_erasers = {
  3615. {
  3616. .eraseblocks = { {4 * 1024, 2048} },
  3617. .block_erase = spi_block_erase_20,
  3618. }, {
  3619. .eraseblocks = { {64 * 1024, 128} },
  3620. .block_erase = spi_block_erase_d8,
  3621. }, {
  3622. .eraseblocks = { {8192 * 1024, 1} },
  3623. .block_erase = spi_block_erase_60,
  3624. }, {
  3625. .eraseblocks = { {8192 * 1024, 1} },
  3626. .block_erase = spi_block_erase_c7,
  3627. }
  3628. },
  3629. .unlock = spi_disable_blockprotect,
  3630. .write = spi_chip_write_256,
  3631. .read = spi_chip_read,
  3632. .voltage = {1650, 1950},
  3633. .wp = &wp_w25,
  3634. },
  3635. {
  3636. .vendor = "Eon",
  3637. .name = "EN29F010",
  3638. .bustype = BUS_PARALLEL,
  3639. .manufacture_id = EON_ID,
  3640. .model_id = EON_EN29F010,
  3641. .total_size = 128,
  3642. .page_size = 128,
  3643. .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
  3644. .tested = TEST_OK_PRE,
  3645. .probe = probe_jedec,
  3646. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  3647. .block_erasers =
  3648. {
  3649. {
  3650. .eraseblocks = { {16 * 1024, 8} },
  3651. .block_erase = erase_sector_jedec,
  3652. },
  3653. {
  3654. .eraseblocks = { {128 * 1024, 1} },
  3655. .block_erase = erase_chip_block_jedec,
  3656. },
  3657. },
  3658. .write = write_jedec_1,
  3659. .read = read_memmapped,
  3660. .voltage = {4500, 5500},
  3661. },
  3662. {
  3663. .vendor = "Eon",
  3664. .name = "EN29F002(A)(N)B",
  3665. .bustype = BUS_PARALLEL,
  3666. .manufacture_id = EON_ID,
  3667. .model_id = EON_EN29F002B,
  3668. .total_size = 256,
  3669. .page_size = 256,
  3670. .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
  3671. .tested = TEST_OK_PREW,
  3672. .probe = probe_jedec,
  3673. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  3674. .block_erasers =
  3675. {
  3676. {
  3677. .eraseblocks = {
  3678. {16 * 1024, 1},
  3679. {8 * 1024, 2},
  3680. {32 * 1024, 1},
  3681. {64 * 1024, 3},
  3682. },
  3683. .block_erase = erase_sector_jedec,
  3684. }, {
  3685. .eraseblocks = { {256 * 1024, 1} },
  3686. .block_erase = erase_chip_block_jedec,
  3687. },
  3688. },
  3689. .write = write_jedec_1,
  3690. .read = read_memmapped,
  3691. .voltage = {4500, 5500},
  3692. },
  3693. {
  3694. .vendor = "Eon",
  3695. .name = "EN29F002(A)(N)T",
  3696. .bustype = BUS_PARALLEL,
  3697. .manufacture_id = EON_ID,
  3698. .model_id = EON_EN29F002T,
  3699. .total_size = 256,
  3700. .page_size = 256,
  3701. .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
  3702. .tested = TEST_OK_PR,
  3703. .probe = probe_jedec,
  3704. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  3705. .block_erasers =
  3706. {
  3707. {
  3708. .eraseblocks = {
  3709. {64 * 1024, 3},
  3710. {32 * 1024, 1},
  3711. {8 * 1024, 2},
  3712. {16 * 1024, 1},
  3713. },
  3714. .block_erase = erase_sector_jedec,
  3715. }, {
  3716. .eraseblocks = { {256 * 1024, 1} },
  3717. .block_erase = erase_chip_block_jedec,
  3718. },
  3719. },
  3720. .write = write_jedec_1,
  3721. .read = read_memmapped,
  3722. .voltage = {4500, 5500},
  3723. },
  3724. {
  3725. .vendor = "Fujitsu",
  3726. .name = "MBM29F004BC",
  3727. .bustype = BUS_PARALLEL,
  3728. .manufacture_id = FUJITSU_ID,
  3729. .model_id = FUJITSU_MBM29F004BC,
  3730. .total_size = 512,
  3731. .page_size = 64 * 1024,
  3732. .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
  3733. .tested = TEST_UNTESTED,
  3734. .probe = probe_jedec,
  3735. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  3736. .block_erasers =
  3737. {
  3738. {
  3739. .eraseblocks = {
  3740. {16 * 1024, 1},
  3741. {8 * 1024, 2},
  3742. {32 * 1024, 1},
  3743. {64 * 1024, 7},
  3744. },
  3745. .block_erase = erase_sector_jedec,
  3746. }, {
  3747. .eraseblocks = { {512 * 1024, 1} },
  3748. .block_erase = erase_chip_block_jedec,
  3749. },
  3750. },
  3751. .write = NULL,
  3752. .read = read_memmapped,
  3753. .voltage = {4500, 5500},
  3754. },
  3755. {
  3756. .vendor = "Fujitsu",
  3757. .name = "MBM29F004TC",
  3758. .bustype = BUS_PARALLEL,
  3759. .manufacture_id = FUJITSU_ID,
  3760. .model_id = FUJITSU_MBM29F004TC,
  3761. .total_size = 512,
  3762. .page_size = 64 * 1024,
  3763. .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
  3764. .tested = TEST_UNTESTED,
  3765. .probe = probe_jedec,
  3766. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  3767. .block_erasers =
  3768. {
  3769. {
  3770. .eraseblocks = {
  3771. {64 * 1024, 7},
  3772. {32 * 1024, 1},
  3773. {8 * 1024, 2},
  3774. {16 * 1024, 1},
  3775. },
  3776. .block_erase = erase_sector_jedec,
  3777. }, {
  3778. .eraseblocks = { {512 * 1024, 1} },
  3779. .block_erase = erase_chip_block_jedec,
  3780. },
  3781. },
  3782. .write = NULL,
  3783. .read = read_memmapped,
  3784. .voltage = {4500, 5500},
  3785. },
  3786. {
  3787. /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
  3788. .vendor = "Fujitsu",
  3789. .name = "MBM29F400BC",
  3790. .bustype = BUS_PARALLEL,
  3791. .manufacture_id = FUJITSU_ID,
  3792. .model_id = FUJITSU_MBM29F400BC,
  3793. .total_size = 512,
  3794. .page_size = 64 * 1024,
  3795. .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
  3796. .tested = TEST_UNTESTED,
  3797. .probe = probe_m29f400bt,
  3798. .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
  3799. .block_erasers =
  3800. {
  3801. {
  3802. .eraseblocks = {
  3803. {16 * 1024, 1},
  3804. {8 * 1024, 2},
  3805. {32 * 1024, 1},
  3806. {64 * 1024, 7},
  3807. },
  3808. .block_erase = block_erase_m29f400bt,
  3809. }, {
  3810. .eraseblocks = { {512 * 1024, 1} },
  3811. .block_erase = block_erase_chip_m29f400bt,
  3812. },
  3813. },
  3814. .write = write_m29f400bt,
  3815. .read = read_memmapped,
  3816. .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
  3817. },
  3818. {
  3819. .vendor = "GigaDevice",
  3820. .name = "GD25Q20",
  3821. .bustype = BUS_SPI,
  3822. .manufacture_id = GIGADEVICE_ID,
  3823. .model_id = GIGADEVICE_GD25Q20,
  3824. .total_size = 256,
  3825. .page_size = 256,
  3826. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  3827. .tested = TEST_UNTESTED,
  3828. .probe = probe_spi_rdid,
  3829. .probe_timing = TIMING_ZERO,
  3830. .block_erasers =
  3831. {
  3832. {
  3833. .eraseblocks = { {4 * 1024, 64} },
  3834. .block_erase = spi_block_erase_20,
  3835. }, {
  3836. .eraseblocks = { {32 * 1024, 8} },
  3837. .block_erase = spi_block_erase_52,
  3838. }, {
  3839. .eraseblocks = { {64 * 1024, 4} },
  3840. .block_erase = spi_block_erase_d8,
  3841. }, {
  3842. .eraseblocks = { {256 * 1024, 1} },
  3843. .block_erase = spi_block_erase_60,
  3844. }, {
  3845. .eraseblocks = { {256 * 1024, 1} },
  3846. .block_erase = spi_block_erase_c7,
  3847. }
  3848. },
  3849. .unlock = spi_disable_blockprotect,
  3850. .write = spi_chip_write_256,
  3851. .read = spi_chip_read,
  3852. .voltage = {2700, 3600},
  3853. },
  3854. {
  3855. .vendor = "GigaDevice",
  3856. .name = "GD25Q40",
  3857. .bustype = BUS_SPI,
  3858. .manufacture_id = GIGADEVICE_ID,
  3859. .model_id = GIGADEVICE_GD25Q40,
  3860. .total_size = 512,
  3861. .page_size = 256,
  3862. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  3863. .tested = TEST_UNTESTED,
  3864. .probe = probe_spi_rdid,
  3865. .probe_timing = TIMING_ZERO,
  3866. .block_erasers =
  3867. {
  3868. {
  3869. .eraseblocks = { {4 * 1024, 128} },
  3870. .block_erase = spi_block_erase_20,
  3871. }, {
  3872. .eraseblocks = { {32 * 1024, 16} },
  3873. .block_erase = spi_block_erase_52,
  3874. }, {
  3875. .eraseblocks = { {64 * 1024, 8} },
  3876. .block_erase = spi_block_erase_d8,
  3877. }, {
  3878. .eraseblocks = { {512 * 1024, 1} },
  3879. .block_erase = spi_block_erase_60,
  3880. }, {
  3881. .eraseblocks = { {512 * 1024, 1} },
  3882. .block_erase = spi_block_erase_c7,
  3883. }
  3884. },
  3885. .unlock = spi_disable_blockprotect,
  3886. .write = spi_chip_write_256,
  3887. .read = spi_chip_read,
  3888. .voltage = {2700, 3600},
  3889. },
  3890. {
  3891. .vendor = "GigaDevice",
  3892. .name = "GD25LQ40",
  3893. .bustype = BUS_SPI,
  3894. .manufacture_id = GIGADEVICE_ID,
  3895. .model_id = GIGADEVICE_GD25LQ40,
  3896. .total_size = 512,
  3897. .page_size = 256,
  3898. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  3899. .tested = TEST_UNTESTED,
  3900. .probe = probe_spi_rdid,
  3901. .probe_timing = TIMING_ZERO,
  3902. .block_erasers =
  3903. {
  3904. {
  3905. .eraseblocks = { {4 * 1024, 128} },
  3906. .block_erase = spi_block_erase_20,
  3907. }, {
  3908. .eraseblocks = { {32 * 1024, 16} },
  3909. .block_erase = spi_block_erase_52,
  3910. }, {
  3911. .eraseblocks = { {64 * 1024, 8} },
  3912. .block_erase = spi_block_erase_d8,
  3913. }, {
  3914. .eraseblocks = { {512 * 1024, 1} },
  3915. .block_erase = spi_block_erase_60,
  3916. }, {
  3917. .eraseblocks = { {512 * 1024, 1} },
  3918. .block_erase = spi_block_erase_c7,
  3919. }
  3920. },
  3921. .unlock = spi_disable_blockprotect,
  3922. .write = spi_chip_write_256,
  3923. .read = spi_chip_read,
  3924. .voltage = {1650, 1950},
  3925. },
  3926. {
  3927. .vendor = "GigaDevice",
  3928. .name = "GD25Q80",
  3929. .bustype = BUS_SPI,
  3930. .manufacture_id = GIGADEVICE_ID,
  3931. .model_id = GIGADEVICE_GD25Q80,
  3932. .total_size = 1024,
  3933. .page_size = 256,
  3934. /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
  3935. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  3936. .tested = TEST_OK_PREWU,
  3937. .probe = probe_spi_rdid,
  3938. .probe_timing = TIMING_ZERO,
  3939. .block_erasers =
  3940. {
  3941. {
  3942. .eraseblocks = { {4 * 1024, 256} },
  3943. .block_erase = spi_block_erase_20,
  3944. }, {
  3945. .eraseblocks = { {32 * 1024, 32} },
  3946. .block_erase = spi_block_erase_52,
  3947. }, {
  3948. .eraseblocks = { {64 * 1024, 16} },
  3949. .block_erase = spi_block_erase_d8,
  3950. }, {
  3951. .eraseblocks = { {1024 * 1024, 1} },
  3952. .block_erase = spi_block_erase_60,
  3953. }, {
  3954. .eraseblocks = { {1024 * 1024, 1} },
  3955. .block_erase = spi_block_erase_c7,
  3956. }
  3957. },
  3958. .unlock = spi_disable_blockprotect,
  3959. .write = spi_chip_write_256,
  3960. .read = spi_chip_read,
  3961. .voltage = {2700, 3600},
  3962. },
  3963. {
  3964. .vendor = "GigaDevice",
  3965. .name = "GD25Q16",
  3966. .bustype = BUS_SPI,
  3967. .manufacture_id = GIGADEVICE_ID,
  3968. .model_id = GIGADEVICE_GD25Q16,
  3969. .total_size = 2048,
  3970. .page_size = 256,
  3971. /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
  3972. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  3973. .tested = TEST_UNTESTED,
  3974. .probe = probe_spi_rdid,
  3975. .probe_timing = TIMING_ZERO,
  3976. .block_erasers =
  3977. {
  3978. {
  3979. .eraseblocks = { {4 * 1024, 512} },
  3980. .block_erase = spi_block_erase_20,
  3981. }, {
  3982. .eraseblocks = { {32 * 1024, 64} },
  3983. .block_erase = spi_block_erase_52,
  3984. }, {
  3985. .eraseblocks = { {64 * 1024, 32} },
  3986. .block_erase = spi_block_erase_d8,
  3987. }, {
  3988. .eraseblocks = { {2 * 1024 * 1024, 1} },
  3989. .block_erase = spi_block_erase_60,
  3990. }, {
  3991. .eraseblocks = { {2 * 1024 * 1024, 1} },
  3992. .block_erase = spi_block_erase_c7,
  3993. }
  3994. },
  3995. .unlock = spi_disable_blockprotect,
  3996. .write = spi_chip_write_256,
  3997. .read = spi_chip_read,
  3998. .voltage = {2700, 3600},
  3999. },
  4000. {
  4001. .vendor = "GigaDevice",
  4002. .name = "GD25Q32",
  4003. .bustype = BUS_SPI,
  4004. .manufacture_id = GIGADEVICE_ID,
  4005. .model_id = GIGADEVICE_GD25Q32,
  4006. .total_size = 4096,
  4007. .page_size = 256,
  4008. /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
  4009. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  4010. .tested = TEST_OK_PREWU,
  4011. .probe = probe_spi_rdid,
  4012. .probe_timing = TIMING_ZERO,
  4013. .block_erasers =
  4014. {
  4015. {
  4016. .eraseblocks = { {4 * 1024, 1024} },
  4017. .block_erase = spi_block_erase_20,
  4018. }, {
  4019. .eraseblocks = { {32 * 1024, 128} },
  4020. .block_erase = spi_block_erase_52,
  4021. }, {
  4022. .eraseblocks = { {64 * 1024, 64} },
  4023. .block_erase = spi_block_erase_d8,
  4024. }, {
  4025. .eraseblocks = { {4 * 1024 * 1024, 1} },
  4026. .block_erase = spi_block_erase_60,
  4027. }, {
  4028. .eraseblocks = { {4 * 1024 * 1024, 1} },
  4029. .block_erase = spi_block_erase_c7,
  4030. }
  4031. },
  4032. .unlock = spi_disable_blockprotect,
  4033. .write = spi_chip_write_256,
  4034. .read = spi_chip_read,
  4035. .wp = &wp_generic,
  4036. .voltage = {2700, 3600},
  4037. },
  4038. {
  4039. .vendor = "GigaDevice",
  4040. .name = "GD25Q64",
  4041. .bustype = BUS_SPI,
  4042. .manufacture_id = GIGADEVICE_ID,
  4043. .model_id = GIGADEVICE_GD25Q64,
  4044. .total_size = 8192,
  4045. .page_size = 256,
  4046. /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
  4047. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  4048. .tested = TEST_OK_PREWU,
  4049. .probe = probe_spi_rdid,
  4050. .probe_timing = TIMING_ZERO,
  4051. .block_erasers =
  4052. {
  4053. {
  4054. .eraseblocks = { {4 * 1024, 2048} },
  4055. .block_erase = spi_block_erase_20,
  4056. }, {
  4057. .eraseblocks = { {32 * 1024, 256} },
  4058. .block_erase = spi_block_erase_52,
  4059. }, {
  4060. .eraseblocks = { {64 * 1024, 128} },
  4061. .block_erase = spi_block_erase_d8,
  4062. }, {
  4063. .eraseblocks = { {8 * 1024 * 1024, 1} },
  4064. .block_erase = spi_block_erase_60,
  4065. }, {
  4066. .eraseblocks = { {8 * 1024 * 1024, 1} },
  4067. .block_erase = spi_block_erase_c7,
  4068. }
  4069. },
  4070. .unlock = spi_disable_blockprotect,
  4071. .write = spi_chip_write_256,
  4072. .read = spi_chip_read,
  4073. .wp = &wp_w25,
  4074. },
  4075. {
  4076. /*
  4077. * TODO: There is a GD25Q128B without QPI support which can
  4078. * be differentiated using SFDP, but for now we only care
  4079. * about the GD25Q128C.
  4080. */
  4081. .vendor = "GigaDevice",
  4082. .name = "GD25Q128C",
  4083. .bustype = BUS_SPI,
  4084. .manufacture_id = GIGADEVICE_ID,
  4085. .model_id = GIGADEVICE_GD25Q128,
  4086. .total_size = 16384,
  4087. .page_size = 256,
  4088. /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
  4089. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  4090. .tested = TEST_OK_PREWU,
  4091. .probe = probe_spi_rdid,
  4092. .probe_timing = TIMING_ZERO,
  4093. .block_erasers =
  4094. {
  4095. {
  4096. .eraseblocks = { {4 * 1024, 4096} },
  4097. .block_erase = spi_block_erase_20,
  4098. }, {
  4099. .eraseblocks = { {32 * 1024, 512} },
  4100. .block_erase = spi_block_erase_52,
  4101. }, {
  4102. .eraseblocks = { {64 * 1024, 256} },
  4103. .block_erase = spi_block_erase_d8,
  4104. }, {
  4105. .eraseblocks = { {16 * 1024 * 1024, 1} },
  4106. .block_erase = spi_block_erase_60,
  4107. }, {
  4108. .eraseblocks = { {16 * 1024 * 1024, 1} },
  4109. .block_erase = spi_block_erase_c7,
  4110. }
  4111. },
  4112. .unlock = spi_disable_blockprotect,
  4113. .write = spi_chip_write_256,
  4114. .read = spi_chip_read,
  4115. .wp = &wp_generic,
  4116. },
  4117. {
  4118. .vendor = "Fujitsu",
  4119. .name = "MBM29F400TC",
  4120. .bustype = BUS_PARALLEL,
  4121. .manufacture_id = FUJITSU_ID,
  4122. .model_id = FUJITSU_MBM29F400TC,
  4123. .total_size = 512,
  4124. .page_size = 64 * 1024,
  4125. .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
  4126. .tested = TEST_UNTESTED,
  4127. .probe = probe_m29f400bt,
  4128. .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
  4129. .block_erasers =
  4130. {
  4131. {
  4132. .eraseblocks = {
  4133. {64 * 1024, 7},
  4134. {32 * 1024, 1},
  4135. {8 * 1024, 2},
  4136. {16 * 1024, 1},
  4137. },
  4138. .block_erase = block_erase_m29f400bt,
  4139. }, {
  4140. .eraseblocks = { {512 * 1024, 1} },
  4141. .block_erase = block_erase_chip_m29f400bt,
  4142. },
  4143. },
  4144. .write = write_m29f400bt,
  4145. .read = read_memmapped,
  4146. .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
  4147. },
  4148. {
  4149. .vendor = "GigaDevice",
  4150. .name = "GD25LQ32",
  4151. .bustype = BUS_SPI,
  4152. .manufacture_id = GIGADEVICE_ID,
  4153. .model_id = GIGADEVICE_GD25LQ32,
  4154. .total_size = 4096,
  4155. .page_size = 256,
  4156. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  4157. .tested = TEST_OK_PREWU,
  4158. .probe = probe_spi_rdid,
  4159. .probe_timing = TIMING_ZERO,
  4160. .block_erasers =
  4161. {
  4162. {
  4163. .eraseblocks = { {4 * 1024, 1024} },
  4164. .block_erase = spi_block_erase_20,
  4165. }, {
  4166. .eraseblocks = { {32 * 1024, 128} },
  4167. .block_erase = spi_block_erase_52,
  4168. }, {
  4169. .eraseblocks = { {64 * 1024, 64} },
  4170. .block_erase = spi_block_erase_d8,
  4171. }, {
  4172. .eraseblocks = { {4 * 1024 * 1024, 1} },
  4173. .block_erase = spi_block_erase_60,
  4174. }, {
  4175. .eraseblocks = { {4 * 1024 * 1024, 1} },
  4176. .block_erase = spi_block_erase_c7,
  4177. }
  4178. },
  4179. .unlock = spi_disable_blockprotect,
  4180. .write = spi_chip_write_256,
  4181. .read = spi_chip_read,
  4182. .voltage = {1700, 1950},
  4183. .wp = &wp_w25,
  4184. },
  4185. {
  4186. .vendor = "GigaDevice",
  4187. .name = "GD25LQ64",
  4188. .bustype = BUS_SPI,
  4189. .manufacture_id = GIGADEVICE_ID,
  4190. .model_id = GIGADEVICE_GD25LQ64,
  4191. .total_size = 8192,
  4192. .page_size = 256,
  4193. /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
  4194. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  4195. .tested = TEST_OK_PREWU,
  4196. .probe = probe_spi_rdid,
  4197. .probe_timing = TIMING_ZERO,
  4198. .block_erasers =
  4199. {
  4200. {
  4201. .eraseblocks = { {4 * 1024, 2048} },
  4202. .block_erase = spi_block_erase_20,
  4203. }, {
  4204. .eraseblocks = { {32 * 1024, 256} },
  4205. .block_erase = spi_block_erase_52,
  4206. }, {
  4207. .eraseblocks = { {64 * 1024, 128} },
  4208. .block_erase = spi_block_erase_d8,
  4209. }, {
  4210. .eraseblocks = { {8 * 1024 * 1024, 1} },
  4211. .block_erase = spi_block_erase_60,
  4212. }, {
  4213. .eraseblocks = { {8 * 1024 * 1024, 1} },
  4214. .block_erase = spi_block_erase_c7,
  4215. }
  4216. },
  4217. .unlock = spi_disable_blockprotect,
  4218. .write = spi_chip_write_256,
  4219. .read = spi_chip_read,
  4220. .wp = &wp_w25,
  4221. },
  4222. {
  4223. .vendor = "GigaDevice",
  4224. .name = "GD25LQ128C",
  4225. .bustype = BUS_SPI,
  4226. .manufacture_id = GIGADEVICE_ID,
  4227. .model_id = GIGADEVICE_GD25LQ128C,
  4228. .total_size = 16384,
  4229. .page_size = 256,
  4230. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  4231. .tested = TEST_OK_PREWU,
  4232. .probe = probe_spi_rdid,
  4233. .probe_timing = TIMING_ZERO,
  4234. .block_erasers =
  4235. {
  4236. {
  4237. .eraseblocks = { {4 * 1024, 4096} },
  4238. .block_erase = spi_block_erase_20,
  4239. }, {
  4240. .eraseblocks = { {32 * 1024, 512} },
  4241. .block_erase = spi_block_erase_52,
  4242. }, {
  4243. .eraseblocks = { {64 * 1024, 256} },
  4244. .block_erase = spi_block_erase_d8,
  4245. }, {
  4246. .eraseblocks = { {16 * 1024 * 1024, 1} },
  4247. .block_erase = spi_block_erase_60,
  4248. }, {
  4249. .eraseblocks = { {16 * 1024 * 1024, 1} },
  4250. .block_erase = spi_block_erase_c7,
  4251. }
  4252. },
  4253. .unlock = spi_disable_blockprotect,
  4254. .write = spi_chip_write_256,
  4255. .read = spi_chip_read,
  4256. .wp = &wp_generic,
  4257. },
  4258. {
  4259. .vendor = "Hyundai",
  4260. .name = "HY29F002T",
  4261. .bustype = BUS_PARALLEL,
  4262. .manufacture_id = HYUNDAI_ID,
  4263. .model_id = HYUNDAI_HY29F002T,
  4264. .total_size = 256,
  4265. .page_size = 256 * 1024,
  4266. .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
  4267. .tested = TEST_OK_PRE,
  4268. .probe = probe_jedec,
  4269. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  4270. .block_erasers =
  4271. {
  4272. {
  4273. .eraseblocks = {
  4274. {64 * 1024, 3},
  4275. {32 * 1024, 1},
  4276. {8 * 1024, 2},
  4277. {16 * 1024, 1},
  4278. },
  4279. .block_erase = erase_sector_jedec,
  4280. }, {
  4281. .eraseblocks = { {256 * 1024, 1} },
  4282. .block_erase = erase_chip_block_jedec,
  4283. },
  4284. },
  4285. .write = write_jedec_1,
  4286. .read = read_memmapped,
  4287. .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
  4288. },
  4289. {
  4290. .vendor = "Hyundai",
  4291. .name = "HY29F002B",
  4292. .bustype = BUS_PARALLEL,
  4293. .manufacture_id = HYUNDAI_ID,
  4294. .model_id = HYUNDAI_HY29F002B,
  4295. .total_size = 256,
  4296. .page_size = 256 * 1024,
  4297. .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
  4298. .tested = TEST_UNTESTED,
  4299. .probe = probe_jedec,
  4300. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  4301. .block_erasers =
  4302. {
  4303. {
  4304. .eraseblocks = {
  4305. {16 * 1024, 1},
  4306. {8 * 1024, 2},
  4307. {32 * 1024, 1},
  4308. {64 * 1024, 3},
  4309. },
  4310. .block_erase = erase_sector_jedec,
  4311. }, {
  4312. .eraseblocks = { {256 * 1024, 1} },
  4313. .block_erase = erase_chip_block_jedec,
  4314. },
  4315. },
  4316. .write = write_jedec_1,
  4317. .read = read_memmapped,
  4318. .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
  4319. },
  4320. {
  4321. .vendor = "Hyundai",
  4322. .name = "HY29F040A",
  4323. .bustype = BUS_PARALLEL,
  4324. .manufacture_id = HYUNDAI_ID,
  4325. .model_id = HYUNDAI_HY29F040A,
  4326. .total_size = 512,
  4327. .page_size = 64 * 1024,
  4328. .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
  4329. .tested = TEST_UNTESTED,
  4330. .probe = probe_jedec,
  4331. .probe_timing = TIMING_ZERO,
  4332. .block_erasers =
  4333. {
  4334. {
  4335. .eraseblocks = { {64 * 1024, 8} },
  4336. .block_erase = erase_sector_jedec,
  4337. }, {
  4338. .eraseblocks = { {512 * 1024, 1} },
  4339. .block_erase = erase_chip_block_jedec,
  4340. },
  4341. },
  4342. .write = write_jedec_1,
  4343. .read = read_memmapped,
  4344. .voltage = {4500, 5500},
  4345. },
  4346. {
  4347. .vendor = "Intel",
  4348. .name = "28F001BN/BX-B",
  4349. .bustype = BUS_PARALLEL,
  4350. .manufacture_id = INTEL_ID,
  4351. .model_id = INTEL_28F001B,
  4352. .total_size = 128,
  4353. .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
  4354. .tested = TEST_UNTESTED,
  4355. .probe = probe_jedec,
  4356. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  4357. .block_erasers =
  4358. {
  4359. {
  4360. .eraseblocks = {
  4361. {8 * 1024, 1},
  4362. {4 * 1024, 2},
  4363. {112 * 1024, 1},
  4364. },
  4365. .block_erase = erase_block_82802ab,
  4366. },
  4367. },
  4368. .write = write_82802ab,
  4369. .read = read_memmapped,
  4370. .voltage = {4500, 5500},
  4371. },
  4372. {
  4373. .vendor = "Intel",
  4374. .name = "28F001BN/BX-T",
  4375. .bustype = BUS_PARALLEL,
  4376. .manufacture_id = INTEL_ID,
  4377. .model_id = INTEL_28F001T,
  4378. .total_size = 128,
  4379. .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
  4380. .tested = TEST_OK_PR,
  4381. .probe = probe_jedec,
  4382. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  4383. .block_erasers =
  4384. {
  4385. {
  4386. .eraseblocks = {
  4387. {112 * 1024, 1},
  4388. {4 * 1024, 2},
  4389. {8 * 1024, 1},
  4390. },
  4391. .block_erase = erase_block_82802ab,
  4392. },
  4393. },
  4394. .write = write_82802ab,
  4395. .read = read_memmapped,
  4396. .voltage = {4500, 5500},
  4397. },
  4398. {
  4399. .vendor = "Intel",
  4400. .name = "28F002BC/BL/BV/BX-T",
  4401. .bustype = BUS_PARALLEL,
  4402. .manufacture_id = INTEL_ID,
  4403. .model_id = INTEL_28F002T,
  4404. .total_size = 256,
  4405. .page_size = 256 * 1024,
  4406. .tested = TEST_OK_PRE,
  4407. .probe = probe_82802ab,
  4408. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  4409. .block_erasers =
  4410. {
  4411. {
  4412. .eraseblocks = {
  4413. {128 * 1024, 1},
  4414. {96 * 1024, 1},
  4415. {8 * 1024, 2},
  4416. {16 * 1024, 1},
  4417. },
  4418. .block_erase = erase_block_82802ab,
  4419. },
  4420. },
  4421. .write = write_82802ab,
  4422. .read = read_memmapped,
  4423. },
  4424. {
  4425. .vendor = "Intel",
  4426. .name = "28F008S3/S5/SC",
  4427. .bustype = BUS_PARALLEL,
  4428. .manufacture_id = INTEL_ID,
  4429. .model_id = INTEL_28F004S3,
  4430. .total_size = 512,
  4431. .page_size = 256,
  4432. .tested = TEST_UNTESTED,
  4433. .probe = probe_82802ab,
  4434. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  4435. .block_erasers =
  4436. {
  4437. {
  4438. .eraseblocks = { {64 * 1024, 8} },
  4439. .block_erase = erase_block_82802ab,
  4440. },
  4441. },
  4442. .unlock = unlock_28f004s5,
  4443. .write = write_82802ab,
  4444. .read = read_memmapped,
  4445. },
  4446. {
  4447. .vendor = "Intel",
  4448. .name = "28F004B5/BE/BV/BX-B",
  4449. .bustype = BUS_PARALLEL,
  4450. .manufacture_id = INTEL_ID,
  4451. .model_id = INTEL_28F004B,
  4452. .total_size = 512,
  4453. .page_size = 128 * 1024, /* maximal block size */
  4454. .tested = TEST_UNTESTED,
  4455. .probe = probe_82802ab,
  4456. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  4457. .block_erasers =
  4458. {
  4459. {
  4460. .eraseblocks = {
  4461. {16 * 1024, 1},
  4462. {8 * 1024, 2},
  4463. {96 * 1024, 1},
  4464. {128 * 1024, 3},
  4465. },
  4466. .block_erase = erase_block_82802ab,
  4467. },
  4468. },
  4469. .write = write_82802ab,
  4470. .read = read_memmapped,
  4471. },
  4472. {
  4473. .vendor = "Intel",
  4474. .name = "28F004B5/BE/BV/BX-T",
  4475. .bustype = BUS_PARALLEL,
  4476. .manufacture_id = INTEL_ID,
  4477. .model_id = INTEL_28F004T,
  4478. .total_size = 512,
  4479. .page_size = 128 * 1024, /* maximal block size */
  4480. .tested = TEST_UNTESTED,
  4481. .probe = probe_82802ab,
  4482. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  4483. .block_erasers =
  4484. {
  4485. {
  4486. .eraseblocks = {
  4487. {128 * 1024, 3},
  4488. {96 * 1024, 1},
  4489. {8 * 1024, 2},
  4490. {16 * 1024, 1},
  4491. },
  4492. .block_erase = erase_block_82802ab,
  4493. },
  4494. },
  4495. .write = write_82802ab,
  4496. .read = read_memmapped,
  4497. },
  4498. {
  4499. .vendor = "Intel",
  4500. .name = "28F400BV/BX/CE/CV-B",
  4501. .bustype = BUS_PARALLEL,
  4502. .manufacture_id = INTEL_ID,
  4503. .model_id = INTEL_28F400B,
  4504. .total_size = 512,
  4505. .page_size = 128 * 1024, /* maximal block size */
  4506. .feature_bits = FEATURE_ADDR_SHIFTED,
  4507. .tested = TEST_UNTESTED,
  4508. .probe = probe_82802ab,
  4509. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  4510. .block_erasers =
  4511. {
  4512. {
  4513. .eraseblocks = {
  4514. {16 * 1024, 1},
  4515. {8 * 1024, 2},
  4516. {96 * 1024, 1},
  4517. {128 * 1024, 3},
  4518. },
  4519. .block_erase = erase_block_82802ab,
  4520. },
  4521. },
  4522. .write = write_82802ab,
  4523. .read = read_memmapped,
  4524. },
  4525. {
  4526. .vendor = "Intel",
  4527. .name = "28F400BV/BX/CE/CV-T",
  4528. .bustype = BUS_PARALLEL,
  4529. .manufacture_id = INTEL_ID,
  4530. .model_id = INTEL_28F400T,
  4531. .total_size = 512,
  4532. .page_size = 128 * 1024, /* maximal block size */
  4533. .feature_bits = FEATURE_ADDR_SHIFTED,
  4534. .tested = TEST_UNTESTED,
  4535. .probe = probe_82802ab,
  4536. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  4537. .block_erasers =
  4538. {
  4539. {
  4540. .eraseblocks = {
  4541. {128 * 1024, 3},
  4542. {96 * 1024, 1},
  4543. {8 * 1024, 2},
  4544. {16 * 1024, 1},
  4545. },
  4546. .block_erase = erase_block_82802ab,
  4547. },
  4548. },
  4549. .write = write_82802ab,
  4550. .read = read_memmapped,
  4551. },
  4552. {
  4553. .vendor = "Intel",
  4554. .name = "82802AB",
  4555. .bustype = BUS_FWH,
  4556. .manufacture_id = INTEL_ID,
  4557. .model_id = INTEL_82802AB,
  4558. .total_size = 512,
  4559. .page_size = 64 * 1024,
  4560. .feature_bits = FEATURE_REGISTERMAP,
  4561. .tested = TEST_OK_PREW,
  4562. .probe = probe_82802ab,
  4563. .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
  4564. .block_erasers =
  4565. {
  4566. {
  4567. .eraseblocks = { {64 * 1024, 8} },
  4568. .block_erase = erase_block_82802ab,
  4569. },
  4570. },
  4571. .unlock = unlock_82802ab,
  4572. .write = write_82802ab,
  4573. .read = read_memmapped,
  4574. .voltage = {3000, 3600},
  4575. },
  4576. {
  4577. .vendor = "Intel",
  4578. .name = "82802AC",
  4579. .bustype = BUS_FWH,
  4580. .manufacture_id = INTEL_ID,
  4581. .model_id = INTEL_82802AC,
  4582. .total_size = 1024,
  4583. .page_size = 64 * 1024,
  4584. .feature_bits = FEATURE_REGISTERMAP,
  4585. .tested = TEST_OK_PR,
  4586. .probe = probe_82802ab,
  4587. .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
  4588. .block_erasers =
  4589. {
  4590. {
  4591. .eraseblocks = { {64 * 1024, 16} },
  4592. .block_erase = erase_block_82802ab,
  4593. },
  4594. },
  4595. .unlock = unlock_82802ab,
  4596. .write = write_82802ab,
  4597. .read = read_memmapped,
  4598. .voltage = {3000, 3600},
  4599. },
  4600. {
  4601. .vendor = "Macronix",
  4602. .name = "MX25L512(E)/MX25V512(C)",
  4603. .bustype = BUS_SPI,
  4604. .manufacture_id = MACRONIX_ID,
  4605. .model_id = MACRONIX_MX25L512,
  4606. .total_size = 64,
  4607. .page_size = 256,
  4608. /* MX25L512E supports SFDP */
  4609. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  4610. .tested = TEST_UNTESTED,
  4611. .probe = probe_spi_rdid,
  4612. .probe_timing = TIMING_ZERO,
  4613. .block_erasers =
  4614. {
  4615. {
  4616. .eraseblocks = { {4 * 1024, 16} },
  4617. .block_erase = spi_block_erase_20,
  4618. }, {
  4619. .eraseblocks = { {64 * 1024, 1} },
  4620. .block_erase = spi_block_erase_52,
  4621. }, {
  4622. .eraseblocks = { {64 * 1024, 1} },
  4623. .block_erase = spi_block_erase_d8,
  4624. }, {
  4625. .eraseblocks = { {64 * 1024, 1} },
  4626. .block_erase = spi_block_erase_60,
  4627. }, {
  4628. .eraseblocks = { {64 * 1024, 1} },
  4629. .block_erase = spi_block_erase_c7,
  4630. },
  4631. },
  4632. .unlock = spi_disable_blockprotect,
  4633. .write = spi_chip_write_256,
  4634. .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
  4635. .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
  4636. },
  4637. {
  4638. .vendor = "Macronix",
  4639. .name = "MX25L1005(C)/MX25L1006E",
  4640. .bustype = BUS_SPI,
  4641. .manufacture_id = MACRONIX_ID,
  4642. .model_id = MACRONIX_MX25L1005,
  4643. .total_size = 128,
  4644. .page_size = 256,
  4645. /* MX25L1006E supports SFDP */
  4646. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  4647. .tested = TEST_OK_PREWU,
  4648. .probe = probe_spi_rdid,
  4649. .probe_timing = TIMING_ZERO,
  4650. .block_erasers =
  4651. {
  4652. {
  4653. .eraseblocks = { {4 * 1024, 32} },
  4654. .block_erase = spi_block_erase_20,
  4655. }, {
  4656. .eraseblocks = { {64 * 1024, 2} },
  4657. .block_erase = spi_block_erase_d8,
  4658. }, {
  4659. .eraseblocks = { {128 * 1024, 1} },
  4660. .block_erase = spi_block_erase_60,
  4661. }, {
  4662. .eraseblocks = { {128 * 1024, 1} },
  4663. .block_erase = spi_block_erase_c7,
  4664. },
  4665. },
  4666. .unlock = spi_disable_blockprotect,
  4667. .write = spi_chip_write_256,
  4668. .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
  4669. .voltage = {2700, 3600},
  4670. .wp = &wp_w25,
  4671. },
  4672. {
  4673. .vendor = "Macronix",
  4674. .name = "MX25L2005(C)",
  4675. .bustype = BUS_SPI,
  4676. .manufacture_id = MACRONIX_ID,
  4677. .model_id = MACRONIX_MX25L2005,
  4678. .total_size = 256,
  4679. .page_size = 256,
  4680. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  4681. .tested = TEST_UNTESTED,
  4682. .probe = probe_spi_rdid,
  4683. .probe_timing = TIMING_ZERO,
  4684. .block_erasers =
  4685. {
  4686. {
  4687. .eraseblocks = { {4 * 1024, 64} },
  4688. .block_erase = spi_block_erase_20,
  4689. }, {
  4690. .eraseblocks = { {64 * 1024, 4} },
  4691. .block_erase = spi_block_erase_52,
  4692. }, {
  4693. .eraseblocks = { {64 * 1024, 4} },
  4694. .block_erase = spi_block_erase_d8,
  4695. }, {
  4696. .eraseblocks = { {256 * 1024, 1} },
  4697. .block_erase = spi_block_erase_60,
  4698. }, {
  4699. .eraseblocks = { {256 * 1024, 1} },
  4700. .block_erase = spi_block_erase_c7,
  4701. },
  4702. },
  4703. .unlock = spi_disable_blockprotect,
  4704. .write = spi_chip_write_256,
  4705. .read = spi_chip_read, /* Fast read (0x0B) supported */
  4706. .voltage = {2700, 3600},
  4707. .wp = &wp_w25,
  4708. },
  4709. {
  4710. .vendor = "Macronix",
  4711. .name = "MX25L4005(A/C)",
  4712. .bustype = BUS_SPI,
  4713. .manufacture_id = MACRONIX_ID,
  4714. .model_id = MACRONIX_MX25L4005,
  4715. .total_size = 512,
  4716. .page_size = 256,
  4717. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  4718. .tested = TEST_OK_PREWU,
  4719. .probe = probe_spi_rdid,
  4720. .probe_timing = TIMING_ZERO,
  4721. .block_erasers =
  4722. {
  4723. {
  4724. .eraseblocks = { {4 * 1024, 128} },
  4725. .block_erase = spi_block_erase_20,
  4726. }, {
  4727. .eraseblocks = { {64 * 1024, 8} },
  4728. .block_erase = spi_block_erase_52,
  4729. }, {
  4730. .eraseblocks = { {64 * 1024, 8} },
  4731. .block_erase = spi_block_erase_d8,
  4732. }, {
  4733. .eraseblocks = { {512 * 1024, 1} },
  4734. .block_erase = spi_block_erase_60,
  4735. }, {
  4736. .eraseblocks = { {512 * 1024, 1} },
  4737. .block_erase = spi_block_erase_c7,
  4738. },
  4739. },
  4740. .unlock = spi_disable_blockprotect,
  4741. .write = spi_chip_write_256,
  4742. .read = spi_chip_read, /* Fast read (0x0B) supported */
  4743. .voltage = {2700, 3600},
  4744. .wp = &wp_w25,
  4745. },
  4746. {
  4747. .vendor = "Macronix",
  4748. .name = "MX25L8005/MX25V8005",
  4749. .bustype = BUS_SPI,
  4750. .manufacture_id = MACRONIX_ID,
  4751. .model_id = MACRONIX_MX25L8005,
  4752. .total_size = 1024,
  4753. .page_size = 256,
  4754. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  4755. .tested = TEST_OK_PREWU,
  4756. .probe = probe_spi_rdid,
  4757. .probe_timing = TIMING_ZERO,
  4758. .block_erasers =
  4759. {
  4760. {
  4761. .eraseblocks = { {4 * 1024, 256} },
  4762. .block_erase = spi_block_erase_20,
  4763. }, {
  4764. .eraseblocks = { {64 * 1024, 16} },
  4765. .block_erase = spi_block_erase_52,
  4766. }, {
  4767. .eraseblocks = { {64 * 1024, 16} },
  4768. .block_erase = spi_block_erase_d8,
  4769. }, {
  4770. .eraseblocks = { {1024 * 1024, 1} },
  4771. .block_erase = spi_block_erase_60,
  4772. }, {
  4773. .eraseblocks = { {1024 * 1024, 1} },
  4774. .block_erase = spi_block_erase_c7,
  4775. },
  4776. },
  4777. .unlock = spi_disable_blockprotect,
  4778. .write = spi_chip_write_256,
  4779. .read = spi_chip_read,
  4780. .voltage = {2700, 3600},
  4781. .wp = &wp_w25,
  4782. },
  4783. {
  4784. .vendor = "Macronix",
  4785. .name = "MX25L1605",
  4786. .bustype = BUS_SPI,
  4787. .manufacture_id = MACRONIX_ID,
  4788. .model_id = MACRONIX_MX25L1605,
  4789. .total_size = 2048,
  4790. .page_size = 256,
  4791. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  4792. .tested = TEST_OK_PREWU,
  4793. .probe = probe_spi_rdid,
  4794. .probe_timing = TIMING_ZERO,
  4795. .block_erasers =
  4796. {
  4797. {
  4798. .eraseblocks = { {4 * 1024, 512} },
  4799. .block_erase = spi_block_erase_20, /* This erase function has 64k blocksize for eLiteFlash */
  4800. }, {
  4801. .eraseblocks = { {64 * 1024, 32} }, /* Not supported in MX25L1605 (eLiteFlash) and MX25L1605D */
  4802. .block_erase = spi_block_erase_52,
  4803. }, {
  4804. .eraseblocks = { {64 * 1024, 32} },
  4805. .block_erase = spi_block_erase_d8,
  4806. }, {
  4807. .eraseblocks = { {2 * 1024 * 1024, 1} },
  4808. .block_erase = spi_block_erase_60,
  4809. }, {
  4810. .eraseblocks = { {2 * 1024 * 1024, 1} },
  4811. .block_erase = spi_block_erase_c7,
  4812. },
  4813. },
  4814. .unlock = spi_disable_blockprotect,
  4815. .write = spi_chip_write_256,
  4816. .read = spi_chip_read,
  4817. .voltage = {2700, 3600},
  4818. .wp = &wp_w25,
  4819. },
  4820. {
  4821. .vendor = "Macronix",
  4822. .name = "MX25L1635D",
  4823. .bustype = BUS_SPI,
  4824. .manufacture_id = MACRONIX_ID,
  4825. .model_id = MACRONIX_MX25L1635D,
  4826. .total_size = 2048,
  4827. .page_size = 256,
  4828. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  4829. .tested = TEST_UNTESTED,
  4830. .probe = probe_spi_rdid,
  4831. .probe_timing = TIMING_ZERO,
  4832. .block_erasers =
  4833. {
  4834. {
  4835. .eraseblocks = { {4 * 1024, 512} },
  4836. .block_erase = spi_block_erase_20,
  4837. }, {
  4838. .eraseblocks = { {64 * 1024, 32} },
  4839. .block_erase = spi_block_erase_d8,
  4840. }, {
  4841. .eraseblocks = { {2 * 1024 * 1024, 1} },
  4842. .block_erase = spi_block_erase_60,
  4843. }, {
  4844. .eraseblocks = { {2 * 1024 * 1024, 1} },
  4845. .block_erase = spi_block_erase_c7,
  4846. }
  4847. },
  4848. .unlock = spi_disable_blockprotect,
  4849. .write = spi_chip_write_256,
  4850. .read = spi_chip_read,
  4851. .voltage = {2700, 3600},
  4852. },
  4853. {
  4854. .vendor = "Macronix",
  4855. .name = "MX25L1635E",
  4856. .bustype = BUS_SPI,
  4857. .manufacture_id = MACRONIX_ID,
  4858. .model_id = MACRONIX_MX25L1635E,
  4859. .total_size = 2048,
  4860. .page_size = 256,
  4861. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  4862. .tested = TEST_UNTESTED,
  4863. .probe = probe_spi_rdid,
  4864. .probe_timing = TIMING_ZERO,
  4865. .block_erasers =
  4866. {
  4867. {
  4868. .eraseblocks = { {4 * 1024, 512} },
  4869. .block_erase = spi_block_erase_20,
  4870. }, {
  4871. .eraseblocks = { {64 * 1024, 32} },
  4872. .block_erase = spi_block_erase_d8,
  4873. }, {
  4874. .eraseblocks = { {2 * 1024 * 1024, 1} },
  4875. .block_erase = spi_block_erase_60,
  4876. }, {
  4877. .eraseblocks = { {2 * 1024 * 1024, 1} },
  4878. .block_erase = spi_block_erase_c7,
  4879. }
  4880. },
  4881. .unlock = spi_disable_blockprotect,
  4882. .write = spi_chip_write_256,
  4883. .read = spi_chip_read,
  4884. .voltage = {2700, 3600},
  4885. },
  4886. {
  4887. .vendor = "Macronix",
  4888. .name = "MX25L3205",
  4889. .bustype = BUS_SPI,
  4890. .manufacture_id = MACRONIX_ID,
  4891. .model_id = MACRONIX_MX25L3205,
  4892. .total_size = 4096,
  4893. .page_size = 256,
  4894. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  4895. .tested = TEST_OK_PREWU,
  4896. .probe = probe_spi_rdid,
  4897. .probe_timing = TIMING_ZERO,
  4898. .block_erasers =
  4899. {
  4900. {
  4901. .eraseblocks = { {4 * 1024, 1024} },
  4902. .block_erase = spi_block_erase_20,
  4903. }, {
  4904. .eraseblocks = { {4 * 1024, 1024} },
  4905. .block_erase = spi_block_erase_d8,
  4906. }, {
  4907. .eraseblocks = { {4 * 1024 * 1024, 1} },
  4908. .block_erase = spi_block_erase_60,
  4909. }, {
  4910. .eraseblocks = { {4 * 1024 * 1024, 1} },
  4911. .block_erase = spi_block_erase_c7,
  4912. },
  4913. },
  4914. .unlock = spi_disable_blockprotect,
  4915. .write = spi_chip_write_256,
  4916. .read = spi_chip_read,
  4917. .voltage = {2700, 3600},
  4918. .wp = &wp_w25,
  4919. },
  4920. {
  4921. .vendor = "Macronix",
  4922. .name = "MX25L3235D",
  4923. .bustype = BUS_SPI,
  4924. .manufacture_id = MACRONIX_ID,
  4925. .model_id = MACRONIX_MX25L3235D,
  4926. .total_size = 4096,
  4927. .page_size = 256,
  4928. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  4929. .tested = TEST_UNTESTED,
  4930. .probe = probe_spi_rdid,
  4931. .probe_timing = TIMING_ZERO,
  4932. .block_erasers =
  4933. {
  4934. {
  4935. .eraseblocks = { {4 * 1024, 1024} },
  4936. .block_erase = spi_block_erase_20,
  4937. }, {
  4938. .eraseblocks = { {64 * 1024, 64} },
  4939. .block_erase = spi_block_erase_d8,
  4940. }, {
  4941. .eraseblocks = { {4 * 1024 * 1024, 1} },
  4942. .block_erase = spi_block_erase_60,
  4943. }, {
  4944. .eraseblocks = { {4 * 1024 * 1024, 1} },
  4945. .block_erase = spi_block_erase_c7,
  4946. }
  4947. },
  4948. .unlock = spi_disable_blockprotect,
  4949. .write = spi_chip_write_256,
  4950. .read = spi_chip_read,
  4951. .voltage = {2700, 3600},
  4952. },
  4953. {
  4954. .vendor = "Macronix",
  4955. .name = "MX25U3235E/F",
  4956. .bustype = BUS_SPI,
  4957. .manufacture_id = MACRONIX_ID,
  4958. .model_id = MACRONIX_MX25U3235E,
  4959. .total_size = 4096,
  4960. .page_size = 256,
  4961. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  4962. .tested = TEST_UNTESTED,
  4963. .probe = probe_spi_rdid,
  4964. .probe_timing = TIMING_ZERO,
  4965. .block_erasers =
  4966. {
  4967. {
  4968. .eraseblocks = { {4 * 1024, 1024} },
  4969. .block_erase = spi_block_erase_20,
  4970. }, {
  4971. .eraseblocks = { {32 * 1024, 128} },
  4972. .block_erase = spi_block_erase_52,
  4973. }, {
  4974. .eraseblocks = { {64 * 1024, 64} },
  4975. .block_erase = spi_block_erase_d8,
  4976. }, {
  4977. .eraseblocks = { {4 * 1024 * 1024, 1} },
  4978. .block_erase = spi_block_erase_60,
  4979. }, {
  4980. .eraseblocks = { {4 * 1024 * 1024, 1} },
  4981. .block_erase = spi_block_erase_c7,
  4982. }
  4983. },
  4984. .unlock = spi_disable_blockprotect,
  4985. .write = spi_chip_write_256,
  4986. .read = spi_chip_read, /* Fast read (0x0B) supported */
  4987. .voltage = {1650, 2000},
  4988. .wp = &wp_w25,
  4989. },
  4990. #if 0
  4991. {
  4992. .vendor = "Macronix",
  4993. .name = "MX25L6405",
  4994. .bustype = BUS_SPI,
  4995. .manufacture_id = MACRONIX_ID,
  4996. .model_id = MACRONIX_MX25L6405,
  4997. .total_size = 8192,
  4998. .page_size = 256,
  4999. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  5000. .tested = TEST_OK_PREW,
  5001. .probe = probe_spi_rdid,
  5002. .probe_timing = TIMING_ZERO,
  5003. .block_erasers =
  5004. {
  5005. {
  5006. .eraseblocks = { {64 * 1024, 128} },
  5007. .block_erase = spi_block_erase_20,
  5008. }, {
  5009. .eraseblocks = { {64 * 1024, 128} },
  5010. .block_erase = spi_block_erase_d8,
  5011. }, {
  5012. .eraseblocks = { {8 * 1024 * 1024, 1} },
  5013. .block_erase = spi_block_erase_60,
  5014. }, {
  5015. .eraseblocks = { {8 * 1024 * 1024, 1} },
  5016. .block_erase = spi_block_erase_c7,
  5017. }
  5018. },
  5019. .unlock = spi_disable_blockprotect,
  5020. .write = spi_chip_write_256,
  5021. .read = spi_chip_read,
  5022. .voltage = {2700, 3600},
  5023. .wp = &wp_w25,
  5024. },
  5025. #endif
  5026. {
  5027. /* FIXME: This is an evil twin of the MX25L6405, with the same
  5028. * ID bytes but different block erase capabilities */
  5029. .vendor = "Macronix",
  5030. .name = "MX25L6406E",
  5031. .bustype = BUS_SPI,
  5032. .manufacture_id = MACRONIX_ID,
  5033. .model_id = MACRONIX_MX25L6405,
  5034. .total_size = 8192,
  5035. .page_size = 256,
  5036. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  5037. .tested = TEST_OK_PREWU,
  5038. .probe = probe_spi_rdid,
  5039. .probe_timing = TIMING_ZERO,
  5040. .block_erasers =
  5041. {
  5042. {
  5043. .eraseblocks = { {4 * 1024, 2048} },
  5044. .block_erase = spi_block_erase_20,
  5045. }, {
  5046. .eraseblocks = { {64 * 1024, 128} },
  5047. .block_erase = spi_block_erase_d8,
  5048. }, {
  5049. .eraseblocks = { {64 * 1024, 128} },
  5050. .block_erase = spi_block_erase_52,
  5051. }, {
  5052. .eraseblocks = { {8 * 1024 * 1024, 1} },
  5053. .block_erase = spi_block_erase_60,
  5054. }, {
  5055. .eraseblocks = { {8 * 1024 * 1024, 1} },
  5056. .block_erase = spi_block_erase_c7,
  5057. }
  5058. },
  5059. .unlock = spi_disable_blockprotect,
  5060. .write = spi_chip_write_256,
  5061. .read = spi_chip_read, /* Fast read (0x0B) supported */
  5062. .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
  5063. .wp = &wp_generic,
  5064. },
  5065. {
  5066. .vendor = "Macronix",
  5067. .name = "MX25L6495F",
  5068. .bustype = BUS_SPI,
  5069. .manufacture_id = MACRONIX_ID,
  5070. .model_id = MACRONIX_MX25L6495F,
  5071. .total_size = 8192,
  5072. .page_size = 256,
  5073. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  5074. .tested = TEST_OK_PREWU,
  5075. .probe = probe_spi_rdid,
  5076. .probe_timing = TIMING_ZERO,
  5077. .block_erasers =
  5078. {
  5079. {
  5080. .eraseblocks = { {4 * 1024, 2048} },
  5081. .block_erase = spi_block_erase_20,
  5082. }, {
  5083. .eraseblocks = { {64 * 1024, 128} },
  5084. .block_erase = spi_block_erase_d8,
  5085. }, {
  5086. .eraseblocks = { {32 * 1024, 256} },
  5087. .block_erase = spi_block_erase_52,
  5088. }, {
  5089. .eraseblocks = { {8 * 1024 * 1024, 1} },
  5090. .block_erase = spi_block_erase_60,
  5091. }, {
  5092. .eraseblocks = { {8 * 1024 * 1024, 1} },
  5093. .block_erase = spi_block_erase_c7,
  5094. }
  5095. },
  5096. .unlock = spi_disable_blockprotect,
  5097. .write = spi_chip_write_256,
  5098. .read = spi_chip_read, /* Fast read (0x0B) supported */
  5099. .voltage = {2700, 3600},
  5100. .wp = &wp_generic,
  5101. },
  5102. {
  5103. .vendor = "Macronix",
  5104. .name = "MX25U6435E/F",
  5105. .bustype = BUS_SPI,
  5106. .manufacture_id = MACRONIX_ID,
  5107. .model_id = MACRONIX_MX25U6435E,
  5108. .total_size = 8192,
  5109. .page_size = 256,
  5110. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  5111. .tested = TEST_OK_PREWU,
  5112. .probe = probe_spi_rdid,
  5113. .probe_timing = TIMING_ZERO,
  5114. .block_erasers =
  5115. {
  5116. {
  5117. .eraseblocks = { {4 * 1024, 2048} },
  5118. .block_erase = spi_block_erase_20,
  5119. }, {
  5120. .eraseblocks = { {32 * 1024, 256} },
  5121. .block_erase = spi_block_erase_52,
  5122. }, {
  5123. .eraseblocks = { {64 * 1024, 128} },
  5124. .block_erase = spi_block_erase_d8,
  5125. }, {
  5126. .eraseblocks = { {8 * 1024 * 1024, 1} },
  5127. .block_erase = spi_block_erase_60,
  5128. }, {
  5129. .eraseblocks = { {8 * 1024 * 1024, 1} },
  5130. .block_erase = spi_block_erase_c7,
  5131. }
  5132. },
  5133. .unlock = spi_disable_blockprotect,
  5134. .write = spi_chip_write_256,
  5135. .read = spi_chip_read, /* Fast read (0x0B) supported */
  5136. .voltage = {1650, 2000},
  5137. .wp = &wp_w25,
  5138. },
  5139. {
  5140. .vendor = "Macronix",
  5141. .name = "MX25U25635F",
  5142. .bustype = BUS_SPI,
  5143. .manufacture_id = MACRONIX_ID,
  5144. .model_id = MACRONIX_MX25U25635F,
  5145. /* FIXME(dhendrix): support 32-bit addressing */
  5146. .total_size = 32768/2,
  5147. .page_size = 256,
  5148. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  5149. .tested = TEST_OK_PREWU,
  5150. .probe = probe_spi_rdid,
  5151. .probe_timing = TIMING_ZERO,
  5152. .block_erasers =
  5153. {
  5154. /* FIXME(dhendrix): support 32-bit addressing */
  5155. {
  5156. .eraseblocks = { {4 * 1024, 8192/2} },
  5157. .block_erase = spi_block_erase_20,
  5158. }, {
  5159. .eraseblocks = { {32 * 1024, 1024/2} },
  5160. .block_erase = spi_block_erase_52,
  5161. }, {
  5162. .eraseblocks = { {64 * 1024, 512/2} },
  5163. .block_erase = spi_block_erase_d8,
  5164. }, {
  5165. .eraseblocks = { {32/2 * 1024 * 1024, 1} },
  5166. .block_erase = spi_block_erase_60,
  5167. }, {
  5168. .eraseblocks = { {32/2 * 1024 * 1024, 1} },
  5169. .block_erase = spi_block_erase_c7,
  5170. }
  5171. },
  5172. .unlock = spi_disable_blockprotect,
  5173. .write = spi_chip_write_256,
  5174. .read = spi_chip_read, /* Fast read (0x0B) supported */
  5175. .voltage = {1650, 2000},
  5176. /* FIXME(dhendrix): write-protect support */
  5177. // .wp = &wp_generic,
  5178. },
  5179. {
  5180. .vendor = "Macronix",
  5181. .name = "MX25L12805",
  5182. .bustype = BUS_SPI,
  5183. .manufacture_id = MACRONIX_ID,
  5184. .model_id = MACRONIX_MX25L12805,
  5185. .total_size = 16384,
  5186. .page_size = 256,
  5187. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  5188. .tested = TEST_UNTESTED,
  5189. .probe = probe_spi_rdid,
  5190. .probe_timing = TIMING_ZERO,
  5191. .block_erasers =
  5192. {
  5193. {
  5194. .eraseblocks = { {4 * 1024, 4096} },
  5195. .block_erase = spi_block_erase_20,
  5196. }, {
  5197. .eraseblocks = { {64 * 1024, 256} },
  5198. .block_erase = spi_block_erase_d8,
  5199. }, {
  5200. .eraseblocks = { {16 * 1024 * 1024, 1} },
  5201. .block_erase = spi_block_erase_60,
  5202. }, {
  5203. .eraseblocks = { {16 * 1024 * 1024, 1} },
  5204. .block_erase = spi_block_erase_c7,
  5205. }
  5206. },
  5207. .unlock = spi_disable_blockprotect,
  5208. .write = spi_chip_write_256,
  5209. .read = spi_chip_read,
  5210. .voltage = {2700, 3600},
  5211. },
  5212. {
  5213. .vendor = "Macronix",
  5214. .name = "MX29F001B",
  5215. .bustype = BUS_PARALLEL,
  5216. .manufacture_id = MACRONIX_ID,
  5217. .model_id = MACRONIX_MX29F001B,
  5218. .total_size = 128,
  5219. .page_size = 32 * 1024,
  5220. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  5221. .tested = TEST_UNTESTED,
  5222. .probe = probe_jedec,
  5223. .probe_timing = TIMING_ZERO,
  5224. .block_erasers =
  5225. {
  5226. {
  5227. .eraseblocks = {
  5228. {8 * 1024, 1},
  5229. {4 * 1024, 2},
  5230. {8 * 1024, 2},
  5231. {32 * 1024, 1},
  5232. {64 * 1024, 1},
  5233. },
  5234. .block_erase = erase_sector_jedec,
  5235. }, {
  5236. .eraseblocks = { {128 * 1024, 1} },
  5237. .block_erase = erase_chip_block_jedec,
  5238. }
  5239. },
  5240. .write = write_jedec_1,
  5241. .read = read_memmapped,
  5242. .voltage = {4500, 5500},
  5243. },
  5244. {
  5245. .vendor = "Macronix",
  5246. .name = "MX29F001T",
  5247. .bustype = BUS_PARALLEL,
  5248. .manufacture_id = MACRONIX_ID,
  5249. .model_id = MACRONIX_MX29F001T,
  5250. .total_size = 128,
  5251. .page_size = 32 * 1024,
  5252. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  5253. .tested = TEST_OK_PREW,
  5254. .probe = probe_jedec,
  5255. .probe_timing = TIMING_ZERO,
  5256. .block_erasers =
  5257. {
  5258. {
  5259. .eraseblocks = {
  5260. {64 * 1024, 1},
  5261. {32 * 1024, 1},
  5262. {8 * 1024, 2},
  5263. {4 * 1024, 2},
  5264. {8 * 1024, 1},
  5265. },
  5266. .block_erase = erase_sector_jedec,
  5267. }, {
  5268. .eraseblocks = { {128 * 1024, 1} },
  5269. .block_erase = erase_chip_block_jedec,
  5270. }
  5271. },
  5272. .write = write_jedec_1,
  5273. .read = read_memmapped,
  5274. .voltage = {4500, 5500},
  5275. },
  5276. {
  5277. .vendor = "Macronix",
  5278. .name = "MX29F002(N)B",
  5279. .bustype = BUS_PARALLEL,
  5280. .manufacture_id = MACRONIX_ID,
  5281. .model_id = MACRONIX_MX29F002B,
  5282. .total_size = 256,
  5283. .page_size = 64 * 1024,
  5284. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  5285. .tested = TEST_UNTESTED,
  5286. .probe = probe_jedec,
  5287. .probe_timing = TIMING_ZERO,
  5288. .block_erasers =
  5289. {
  5290. {
  5291. .eraseblocks = {
  5292. {16 * 1024, 1},
  5293. {8 * 1024, 2},
  5294. {32 * 1024, 1},
  5295. {64 * 1024, 3},
  5296. },
  5297. .block_erase = erase_sector_jedec,
  5298. }, {
  5299. .eraseblocks = { {256 * 1024, 1} },
  5300. .block_erase = erase_chip_block_jedec,
  5301. },
  5302. },
  5303. .write = write_jedec_1,
  5304. .read = read_memmapped,
  5305. .voltage = {4500, 5500},
  5306. },
  5307. {
  5308. .vendor = "Macronix",
  5309. .name = "MX29F002(N)T",
  5310. .bustype = BUS_PARALLEL,
  5311. .manufacture_id = MACRONIX_ID,
  5312. .model_id = MACRONIX_MX29F002T,
  5313. .total_size = 256,
  5314. .page_size = 64 * 1024,
  5315. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  5316. .tested = TEST_OK_PREW,
  5317. .probe = probe_jedec,
  5318. .probe_timing = TIMING_ZERO,
  5319. .block_erasers =
  5320. {
  5321. {
  5322. .eraseblocks = {
  5323. {64 * 1024, 3},
  5324. {32 * 1024, 1},
  5325. {8 * 1024, 2},
  5326. {16 * 1024, 1},
  5327. },
  5328. .block_erase = erase_sector_jedec,
  5329. }, {
  5330. .eraseblocks = { {256 * 1024, 1} },
  5331. .block_erase = erase_chip_block_jedec,
  5332. },
  5333. },
  5334. .write = write_jedec_1,
  5335. .read = read_memmapped,
  5336. .voltage = {4500, 5500},
  5337. },
  5338. {
  5339. .vendor = "Macronix",
  5340. .name = "MX29F040",
  5341. .bustype = BUS_PARALLEL,
  5342. .manufacture_id = MACRONIX_ID,
  5343. .model_id = MACRONIX_MX29F040,
  5344. .total_size = 512,
  5345. .page_size = 64 * 1024,
  5346. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  5347. .tested = TEST_UNTESTED,
  5348. .probe = probe_jedec,
  5349. .probe_timing = TIMING_ZERO,
  5350. .block_erasers =
  5351. {
  5352. {
  5353. .eraseblocks = { {64 * 1024, 8} },
  5354. .block_erase = erase_sector_jedec,
  5355. }, {
  5356. .eraseblocks = { {512 * 1024, 1} },
  5357. .block_erase = erase_chip_block_jedec,
  5358. },
  5359. },
  5360. .write = write_jedec_1,
  5361. .read = read_memmapped,
  5362. .voltage = {4500, 5500},
  5363. },
  5364. {
  5365. .vendor = "Macronix",
  5366. .name = "MX29F040",
  5367. .bustype = BUS_PARALLEL,
  5368. .manufacture_id = MACRONIX_ID,
  5369. .model_id = MACRONIX_MX29F040,
  5370. .total_size = 512,
  5371. .page_size = 64 * 1024,
  5372. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  5373. .tested = TEST_UNTESTED,
  5374. .probe = probe_jedec,
  5375. .probe_timing = TIMING_ZERO,
  5376. .block_erasers =
  5377. {
  5378. {
  5379. .eraseblocks = { {64 * 1024, 8} },
  5380. .block_erase = erase_sector_jedec,
  5381. }, {
  5382. .eraseblocks = { {512 * 1024, 1} },
  5383. .block_erase = erase_chip_block_jedec,
  5384. },
  5385. },
  5386. .write = write_jedec_1,
  5387. .read = read_memmapped,
  5388. },
  5389. {
  5390. .vendor = "Macronix",
  5391. .name = "MX29LV040",
  5392. .bustype = BUS_PARALLEL,
  5393. .manufacture_id = MACRONIX_ID,
  5394. .model_id = MACRONIX_MX29LV040,
  5395. .total_size = 512,
  5396. .page_size = 64 * 1024,
  5397. .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
  5398. .tested = TEST_UNTESTED,
  5399. .probe = probe_jedec,
  5400. .probe_timing = TIMING_ZERO,
  5401. .block_erasers =
  5402. {
  5403. {
  5404. .eraseblocks = { {64 * 1024, 8}, },
  5405. .block_erase = erase_sector_jedec,
  5406. }, {
  5407. .eraseblocks = { {512 * 1024, 1} },
  5408. .block_erase = erase_chip_block_jedec,
  5409. },
  5410. },
  5411. .write = write_jedec_1,
  5412. .read = read_memmapped,
  5413. .voltage = {2700, 3600},
  5414. },
  5415. {
  5416. .vendor = "MoselVitelic",
  5417. .name = "V29C51000B",
  5418. .bustype = BUS_PARALLEL,
  5419. .manufacture_id = SYNCMOS_MVC_ID,
  5420. .model_id = MVC_V29C51000B,
  5421. .total_size = 64,
  5422. .page_size = 512,
  5423. .feature_bits = FEATURE_EITHER_RESET,
  5424. .tested = TEST_UNTESTED,
  5425. .probe = probe_jedec,
  5426. .probe_timing = TIMING_ZERO,
  5427. .block_erasers =
  5428. {
  5429. {
  5430. .eraseblocks = { {512, 128} },
  5431. .block_erase = erase_sector_jedec,
  5432. }, {
  5433. .eraseblocks = { {64 * 1024, 1} },
  5434. .block_erase = erase_chip_block_jedec,
  5435. },
  5436. },
  5437. .write = write_jedec_1,
  5438. .read = read_memmapped,
  5439. .voltage = {4500, 5500},
  5440. },
  5441. {
  5442. .vendor = "MoselVitelic",
  5443. .name = "V29C51000T",
  5444. .bustype = BUS_PARALLEL,
  5445. .manufacture_id = SYNCMOS_MVC_ID,
  5446. .model_id = MVC_V29C51000T,
  5447. .total_size = 64,
  5448. .page_size = 512,
  5449. .feature_bits = FEATURE_EITHER_RESET,
  5450. .tested = TEST_UNTESTED,
  5451. .probe = probe_jedec,
  5452. .probe_timing = TIMING_ZERO,
  5453. .block_erasers =
  5454. {
  5455. {
  5456. .eraseblocks = { {512, 128} },
  5457. .block_erase = erase_sector_jedec,
  5458. }, {
  5459. .eraseblocks = { {64 * 1024, 1} },
  5460. .block_erase = erase_chip_block_jedec,
  5461. },
  5462. },
  5463. .write = write_jedec_1,
  5464. .read = read_memmapped,
  5465. .voltage = {4500, 5500},
  5466. },
  5467. {
  5468. .vendor = "MoselVitelic",
  5469. .name = "V29C51400B",
  5470. .bustype = BUS_PARALLEL,
  5471. .manufacture_id = SYNCMOS_MVC_ID,
  5472. .model_id = MVC_V29C51400B,
  5473. .total_size = 512,
  5474. .page_size = 1024,
  5475. .feature_bits = FEATURE_EITHER_RESET,
  5476. .tested = TEST_UNTESTED,
  5477. .probe = probe_jedec,
  5478. .probe_timing = TIMING_ZERO,
  5479. .block_erasers =
  5480. {
  5481. {
  5482. .eraseblocks = { {1024, 512} },
  5483. .block_erase = erase_sector_jedec,
  5484. }, {
  5485. .eraseblocks = { {512 * 1024, 1} },
  5486. .block_erase = erase_chip_block_jedec,
  5487. },
  5488. },
  5489. .write = write_jedec_1,
  5490. .read = read_memmapped,
  5491. .voltage = {4500, 5500},
  5492. },
  5493. {
  5494. .vendor = "MoselVitelic",
  5495. .name = "V29C51400T",
  5496. .bustype = BUS_PARALLEL,
  5497. .manufacture_id = SYNCMOS_MVC_ID,
  5498. .model_id = MVC_V29C51400T,
  5499. .total_size = 512,
  5500. .page_size = 1024,
  5501. .feature_bits = FEATURE_EITHER_RESET,
  5502. .tested = TEST_UNTESTED,
  5503. .probe = probe_jedec,
  5504. .probe_timing = TIMING_ZERO,
  5505. .block_erasers =
  5506. {
  5507. {
  5508. .eraseblocks = { {1024, 512} },
  5509. .block_erase = erase_sector_jedec,
  5510. }, {
  5511. .eraseblocks = { {512 * 1024, 1} },
  5512. .block_erase = erase_chip_block_jedec,
  5513. },
  5514. },
  5515. .write = write_jedec_1,
  5516. .read = read_memmapped,
  5517. .voltage = {4500, 5500},
  5518. },
  5519. {
  5520. .vendor = "MoselVitelic",
  5521. .name = "V29LC51000",
  5522. .bustype = BUS_PARALLEL,
  5523. .manufacture_id = SYNCMOS_MVC_ID,
  5524. .model_id = MVC_V29LC51000,
  5525. .total_size = 64,
  5526. .page_size = 512,
  5527. .feature_bits = FEATURE_EITHER_RESET,
  5528. .tested = TEST_UNTESTED,
  5529. .probe = probe_jedec,
  5530. .probe_timing = TIMING_ZERO,
  5531. .block_erasers =
  5532. {
  5533. {
  5534. .eraseblocks = { {512, 128} },
  5535. .block_erase = erase_sector_jedec,
  5536. }, {
  5537. .eraseblocks = { {64 * 1024, 1} },
  5538. .block_erase = erase_chip_block_jedec,
  5539. },
  5540. },
  5541. .write = write_jedec_1,
  5542. .read = read_memmapped,
  5543. .voltage = {4500, 5500},
  5544. },
  5545. {
  5546. .vendor = "MoselVitelic",
  5547. .name = "V29LC51001",
  5548. .bustype = BUS_PARALLEL,
  5549. .manufacture_id = SYNCMOS_MVC_ID,
  5550. .model_id = MVC_V29LC51001,
  5551. .total_size = 128,
  5552. .page_size = 512,
  5553. .feature_bits = FEATURE_EITHER_RESET,
  5554. .tested = TEST_UNTESTED,
  5555. .probe = probe_jedec,
  5556. .probe_timing = TIMING_ZERO,
  5557. .block_erasers =
  5558. {
  5559. {
  5560. .eraseblocks = { {512, 256} },
  5561. .block_erase = erase_sector_jedec,
  5562. }, {
  5563. .eraseblocks = { {128 * 1024, 1} },
  5564. .block_erase = erase_chip_block_jedec,
  5565. },
  5566. },
  5567. .write = write_jedec_1,
  5568. .read = read_memmapped,
  5569. .voltage = {4500, 5500},
  5570. },
  5571. {
  5572. .vendor = "MoselVitelic",
  5573. .name = "V29LC51002",
  5574. .bustype = BUS_PARALLEL,
  5575. .manufacture_id = SYNCMOS_MVC_ID,
  5576. .model_id = MVC_V29LC51002,
  5577. .total_size = 256,
  5578. .page_size = 512,
  5579. .feature_bits = FEATURE_EITHER_RESET,
  5580. .tested = TEST_UNTESTED,
  5581. .probe = probe_jedec,
  5582. .probe_timing = TIMING_ZERO,
  5583. .block_erasers =
  5584. {
  5585. {
  5586. .eraseblocks = { {512, 512} },
  5587. .block_erase = erase_sector_jedec,
  5588. }, {
  5589. .eraseblocks = { {256 * 1024, 1} },
  5590. .block_erase = erase_chip_block_jedec,
  5591. },
  5592. },
  5593. .write = write_jedec_1,
  5594. .read = read_memmapped,
  5595. .voltage = {4500, 5500},
  5596. },
  5597. {
  5598. .vendor = "Numonyx",
  5599. .name = "M25PE10",
  5600. .bustype = BUS_SPI,
  5601. .manufacture_id = ST_ID,
  5602. .model_id = ST_M25PE10,
  5603. .total_size = 128,
  5604. .page_size = 256,
  5605. .feature_bits = FEATURE_UNBOUND_READ,
  5606. .tested = TEST_UNTESTED,
  5607. .probe = probe_spi_rdid,
  5608. .probe_timing = TIMING_ZERO,
  5609. .block_erasers =
  5610. {
  5611. {
  5612. .eraseblocks = { {4 * 1024, 32} },
  5613. .block_erase = spi_block_erase_20,
  5614. }, {
  5615. .eraseblocks = { {64 * 1024, 2} },
  5616. .block_erase = spi_block_erase_d8,
  5617. }, {
  5618. .eraseblocks = { {128 * 1024, 1} },
  5619. .block_erase = spi_block_erase_c7,
  5620. }
  5621. },
  5622. .unlock = spi_disable_blockprotect,
  5623. .write = spi_chip_write_256,
  5624. .read = spi_chip_read,
  5625. .voltage = {2700, 3600},
  5626. },
  5627. {
  5628. .vendor = "Numonyx",
  5629. .name = "M25PE20",
  5630. .bustype = BUS_SPI,
  5631. .manufacture_id = ST_ID,
  5632. .model_id = ST_M25PE20,
  5633. .total_size = 256,
  5634. .page_size = 256,
  5635. .feature_bits = FEATURE_UNBOUND_READ,
  5636. .tested = TEST_UNTESTED,
  5637. .probe = probe_spi_rdid,
  5638. .probe_timing = TIMING_ZERO,
  5639. .block_erasers =
  5640. {
  5641. {
  5642. .eraseblocks = { {4 * 1024, 64} },
  5643. .block_erase = spi_block_erase_20,
  5644. }, {
  5645. .eraseblocks = { {64 * 1024, 4} },
  5646. .block_erase = spi_block_erase_d8,
  5647. }, {
  5648. .eraseblocks = { {256 * 1024, 1} },
  5649. .block_erase = spi_block_erase_c7,
  5650. }
  5651. },
  5652. .unlock = spi_disable_blockprotect,
  5653. .write = spi_chip_write_256,
  5654. .read = spi_chip_read,
  5655. .voltage = {2700, 3600},
  5656. },
  5657. {
  5658. .vendor = "Numonyx",
  5659. .name = "M25PE40",
  5660. .bustype = BUS_SPI,
  5661. .manufacture_id = ST_ID,
  5662. .model_id = ST_M25PE40,
  5663. .total_size = 512,
  5664. .page_size = 256,
  5665. .feature_bits = FEATURE_UNBOUND_READ,
  5666. .tested = TEST_UNTESTED,
  5667. .probe = probe_spi_rdid,
  5668. .probe_timing = TIMING_ZERO,
  5669. .block_erasers =
  5670. {
  5671. {
  5672. .eraseblocks = { {4 * 1024, 128} },
  5673. .block_erase = spi_block_erase_20,
  5674. }, {
  5675. .eraseblocks = { {64 * 1024, 8} },
  5676. .block_erase = spi_block_erase_d8,
  5677. }, {
  5678. .eraseblocks = { {512 * 1024, 1} },
  5679. .block_erase = spi_block_erase_c7,
  5680. }
  5681. },
  5682. .unlock = spi_disable_blockprotect,
  5683. .write = spi_chip_write_256,
  5684. .read = spi_chip_read,
  5685. .voltage = {2700, 3600},
  5686. },
  5687. {
  5688. .vendor = "Numonyx",
  5689. .name = "M25PE80",
  5690. .bustype = BUS_SPI,
  5691. .manufacture_id = ST_ID,
  5692. .model_id = ST_M25PE80,
  5693. .total_size = 1024,
  5694. .page_size = 256,
  5695. .feature_bits = FEATURE_UNBOUND_READ,
  5696. .tested = TEST_OK_PREWU,
  5697. .probe = probe_spi_rdid,
  5698. .probe_timing = TIMING_ZERO,
  5699. .block_erasers =
  5700. {
  5701. {
  5702. .eraseblocks = { {4 * 1024, 256} },
  5703. .block_erase = spi_block_erase_20,
  5704. }, {
  5705. .eraseblocks = { {64 * 1024, 16} },
  5706. .block_erase = spi_block_erase_d8,
  5707. }, {
  5708. .eraseblocks = { {1024 * 1024, 1} },
  5709. .block_erase = spi_block_erase_c7,
  5710. }
  5711. },
  5712. .unlock = spi_disable_blockprotect,
  5713. .write = spi_chip_write_256,
  5714. .read = spi_chip_read,
  5715. .voltage = {2700, 3600},
  5716. },
  5717. {
  5718. .vendor = "Numonyx",
  5719. .name = "M25PE16",
  5720. .bustype = BUS_SPI,
  5721. .manufacture_id = ST_ID,
  5722. .model_id = ST_M25PE16,
  5723. .total_size = 2048,
  5724. .page_size = 256,
  5725. .feature_bits = FEATURE_UNBOUND_READ,
  5726. .tested = TEST_UNTESTED,
  5727. .probe = probe_spi_rdid,
  5728. .probe_timing = TIMING_ZERO,
  5729. .block_erasers =
  5730. {
  5731. {
  5732. .eraseblocks = { {4 * 1024, 512} },
  5733. .block_erase = spi_block_erase_20,
  5734. }, {
  5735. .eraseblocks = { {64 * 1024, 32} },
  5736. .block_erase = spi_block_erase_d8,
  5737. }, {
  5738. .eraseblocks = { {2 * 1024 * 1024, 1} },
  5739. .block_erase = spi_block_erase_c7,
  5740. }
  5741. },
  5742. .unlock = spi_disable_blockprotect,
  5743. .write = spi_chip_write_256,
  5744. .read = spi_chip_read,
  5745. .voltage = {2700, 3600},
  5746. },
  5747. {
  5748. .vendor = "Numonyx",
  5749. /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
  5750. .name = "N25Q064..1E",
  5751. .bustype = BUS_SPI,
  5752. .manufacture_id = ST_ID,
  5753. .model_id = ST_N25Q064__1E,
  5754. .total_size = 8192,
  5755. .page_size = 256,
  5756. /* supports SFDP */
  5757. /* OTP: 64B total; read 0x4B, write 0x42 */
  5758. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  5759. .tested = TEST_OK_PREWU,
  5760. .probe = probe_spi_rdid,
  5761. .probe_timing = TIMING_ZERO,
  5762. .block_erasers =
  5763. {
  5764. {
  5765. .eraseblocks = { {4 * 1024, 2048 } },
  5766. .block_erase = spi_block_erase_20,
  5767. }, {
  5768. .eraseblocks = { {64 * 1024, 128} },
  5769. .block_erase = spi_block_erase_d8,
  5770. }, {
  5771. .eraseblocks = { {8 * 1024 * 1024, 1} },
  5772. .block_erase = spi_block_erase_c7,
  5773. }
  5774. },
  5775. .unlock = spi_disable_blockprotect,
  5776. .write = spi_chip_write_256,
  5777. .read = spi_chip_read,
  5778. .voltage = {1700, 2000},
  5779. .wp = &wp_w25,
  5780. },
  5781. {
  5782. .vendor = "Numonyx",
  5783. /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
  5784. .name = "N25Q064..3E",
  5785. .bustype = BUS_SPI,
  5786. .manufacture_id = ST_ID,
  5787. .model_id = ST_N25Q064__3E,
  5788. .total_size = 8192,
  5789. .page_size = 256,
  5790. /* supports SFDP */
  5791. /* OTP: 64B total; read 0x4B, write 0x42 */
  5792. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  5793. .tested = TEST_OK_PREWU,
  5794. .probe = probe_spi_rdid,
  5795. .probe_timing = TIMING_ZERO,
  5796. .block_erasers =
  5797. {
  5798. {
  5799. .eraseblocks = { {4 * 1024, 2048 } },
  5800. .block_erase = spi_block_erase_20,
  5801. }, {
  5802. .eraseblocks = { {64 * 1024, 128} },
  5803. .block_erase = spi_block_erase_d8,
  5804. }, {
  5805. .eraseblocks = { {8 * 1024 * 1024, 1} },
  5806. .block_erase = spi_block_erase_c7,
  5807. }
  5808. },
  5809. .unlock = spi_disable_blockprotect,
  5810. .write = spi_chip_write_256,
  5811. .read = spi_chip_read,
  5812. .voltage = {2700, 3600},
  5813. .wp = &wp_w25,
  5814. },
  5815. {
  5816. .vendor = "Numonyx",
  5817. /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
  5818. .name = "N25Q256..3E",
  5819. .bustype = BUS_SPI,
  5820. .manufacture_id = ST_ID,
  5821. .model_id = ST_N25Q256__3E,
  5822. // .total_size = 32768,
  5823. /* FIXME(dhendrix): support 32-bit addressing */
  5824. .total_size = 32768/2,
  5825. .page_size = 256,
  5826. /* supports SFDP */
  5827. /* OTP: 64B total; read 0x4B, write 0x42 */
  5828. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  5829. .tested = TEST_OK_PREWU,
  5830. .probe = probe_spi_rdid,
  5831. .probe_timing = TIMING_ZERO,
  5832. .block_erasers =
  5833. {
  5834. #if 0
  5835. /* FIXME(dhendrix): support 32-bit addressing */
  5836. {
  5837. .eraseblocks = { {4 * 1024, 8192 } },
  5838. .block_erase = spi_block_erase_20,
  5839. }, {
  5840. .eraseblocks = { {64 * 1024, 512} },
  5841. .block_erase = spi_block_erase_d8,
  5842. }, {
  5843. .eraseblocks = { {32 * 1024 * 1024, 1} },
  5844. .block_erase = spi_block_erase_c7,
  5845. }
  5846. #endif
  5847. {
  5848. .eraseblocks = { {4 * 1024, 8192/2 } },
  5849. .block_erase = spi_block_erase_20,
  5850. }, {
  5851. .eraseblocks = { {64 * 1024, 512/2 } },
  5852. .block_erase = spi_block_erase_d8,
  5853. }, {
  5854. .eraseblocks = { {32/2 * 1024 * 1024, 1} },
  5855. .block_erase = spi_block_erase_c7,
  5856. }
  5857. },
  5858. .unlock = spi_disable_blockprotect,
  5859. .write = spi_chip_write_256,
  5860. .read = spi_chip_read,
  5861. .voltage = {2700, 3600},
  5862. /* FIXME(dhendrix): write-protect support */
  5863. // .wp = &wp_w25,
  5864. },
  5865. {
  5866. .vendor = "PMC",
  5867. .name = "Pm25LV010",
  5868. .bustype = BUS_SPI,
  5869. .manufacture_id = PMC_ID,
  5870. .model_id = PMC_PM25LV010,
  5871. .total_size = 128,
  5872. .page_size = 256,
  5873. .feature_bits = FEATURE_UNBOUND_READ,
  5874. .tested = TEST_UNTESTED,
  5875. .probe = probe_spi_rdid,
  5876. .probe_timing = TIMING_ZERO,
  5877. .block_erasers =
  5878. {
  5879. {
  5880. .eraseblocks = { {4 * 1024, 32} },
  5881. .block_erase = spi_block_erase_d7,
  5882. }, {
  5883. .eraseblocks = { {32 * 1024, 4} },
  5884. .block_erase = spi_block_erase_d8,
  5885. }, {
  5886. .eraseblocks = { {128 * 1024, 1} },
  5887. .block_erase = spi_block_erase_c7,
  5888. }
  5889. },
  5890. .unlock = spi_disable_blockprotect,
  5891. .write = spi_chip_write_256,
  5892. .read = spi_chip_read,
  5893. .voltage = {2700, 3600},
  5894. },
  5895. {
  5896. .vendor = "PMC",
  5897. .name = "Pm25LV016B",
  5898. .bustype = BUS_SPI,
  5899. .manufacture_id = PMC_ID,
  5900. .model_id = PMC_PM25LV016B,
  5901. .total_size = 2048,
  5902. .page_size = 256,
  5903. .feature_bits = FEATURE_UNBOUND_READ,
  5904. .tested = TEST_UNTESTED,
  5905. .probe = probe_spi_rdid,
  5906. .probe_timing = TIMING_ZERO,
  5907. .block_erasers =
  5908. {
  5909. {
  5910. .eraseblocks = { {4 * 1024, 512} },
  5911. .block_erase = spi_block_erase_d7,
  5912. }, {
  5913. .eraseblocks = { {4 * 1024, 512} },
  5914. .block_erase = spi_block_erase_20,
  5915. }, {
  5916. .eraseblocks = { {64 * 1024, 32} },
  5917. .block_erase = spi_block_erase_d8,
  5918. }, {
  5919. .eraseblocks = { {2 * 1024 * 1024, 1} },
  5920. .block_erase = spi_block_erase_60,
  5921. }, {
  5922. .eraseblocks = { {2 * 1024 * 1024, 1} },
  5923. .block_erase = spi_block_erase_c7,
  5924. }
  5925. },
  5926. .unlock = spi_disable_blockprotect,
  5927. .write = spi_chip_write_256,
  5928. .read = spi_chip_read,
  5929. .voltage = {2700, 3600},
  5930. },
  5931. {
  5932. .vendor = "PMC",
  5933. .name = "Pm25LV020",
  5934. .bustype = BUS_SPI,
  5935. .manufacture_id = PMC_ID,
  5936. .model_id = PMC_PM25LV020,
  5937. .total_size = 256,
  5938. .page_size = 256,
  5939. .feature_bits = FEATURE_UNBOUND_READ,
  5940. .tested = TEST_UNTESTED,
  5941. .probe = probe_spi_rdid,
  5942. .probe_timing = TIMING_ZERO,
  5943. .block_erasers =
  5944. {
  5945. {
  5946. .eraseblocks = { {4 * 1024, 64} },
  5947. .block_erase = spi_block_erase_d7,
  5948. }, {
  5949. .eraseblocks = { {64 * 1024, 4} },
  5950. .block_erase = spi_block_erase_d8,
  5951. }, {
  5952. .eraseblocks = { {256 * 1024, 1} },
  5953. .block_erase = spi_block_erase_c7,
  5954. }
  5955. },
  5956. .unlock = spi_disable_blockprotect,
  5957. .write = spi_chip_write_256,
  5958. .read = spi_chip_read,
  5959. .voltage = {2700, 3600},
  5960. },
  5961. {
  5962. .vendor = "PMC",
  5963. .name = "Pm25LV040",
  5964. .bustype = BUS_SPI,
  5965. .manufacture_id = PMC_ID,
  5966. .model_id = PMC_PM25LV040,
  5967. .total_size = 512,
  5968. .page_size = 256,
  5969. .feature_bits = FEATURE_UNBOUND_READ,
  5970. .tested = TEST_OK_PREWU,
  5971. .probe = probe_spi_rdid,
  5972. .probe_timing = TIMING_ZERO,
  5973. .block_erasers =
  5974. {
  5975. {
  5976. .eraseblocks = { {4 * 1024, 128} },
  5977. .block_erase = spi_block_erase_d7,
  5978. }, {
  5979. .eraseblocks = { {64 * 1024, 8} },
  5980. .block_erase = spi_block_erase_d8,
  5981. }, {
  5982. .eraseblocks = { {512 * 1024, 1} },
  5983. .block_erase = spi_block_erase_c7,
  5984. }
  5985. },
  5986. .unlock = spi_disable_blockprotect,
  5987. .write = spi_chip_write_256,
  5988. .read = spi_chip_read,
  5989. .voltage = {2700, 3600},
  5990. },
  5991. {
  5992. .vendor = "PMC",
  5993. .name = "Pm25LV080B",
  5994. .bustype = BUS_SPI,
  5995. .manufacture_id = PMC_ID,
  5996. .model_id = PMC_PM25LV080B,
  5997. .total_size = 1024,
  5998. .page_size = 256,
  5999. .feature_bits = FEATURE_UNBOUND_READ,
  6000. .tested = TEST_UNTESTED,
  6001. .probe = probe_spi_rdid,
  6002. .probe_timing = TIMING_ZERO,
  6003. .block_erasers =
  6004. {
  6005. {
  6006. .eraseblocks = { {4 * 1024, 256} },
  6007. .block_erase = spi_block_erase_d7,
  6008. }, {
  6009. .eraseblocks = { {4 * 1024, 256} },
  6010. .block_erase = spi_block_erase_20,
  6011. }, {
  6012. .eraseblocks = { {64 * 1024, 16} },
  6013. .block_erase = spi_block_erase_d8,
  6014. }, {
  6015. .eraseblocks = { {1024 * 1024, 1} },
  6016. .block_erase = spi_block_erase_60,
  6017. }, {
  6018. .eraseblocks = { {1024 * 1024, 1} },
  6019. .block_erase = spi_block_erase_c7,
  6020. }
  6021. },
  6022. .unlock = spi_disable_blockprotect,
  6023. .write = spi_chip_write_256,
  6024. .read = spi_chip_read,
  6025. .voltage = {2700, 3600},
  6026. },
  6027. {
  6028. .vendor = "PMC",
  6029. .name = "Pm25LV512",
  6030. .bustype = BUS_SPI,
  6031. .manufacture_id = PMC_ID,
  6032. .model_id = PMC_PM25LV512,
  6033. .total_size = 64,
  6034. .page_size = 256,
  6035. .feature_bits = FEATURE_UNBOUND_READ,
  6036. .tested = TEST_UNTESTED,
  6037. .probe = probe_spi_rdid,
  6038. .probe_timing = TIMING_ZERO,
  6039. .block_erasers =
  6040. {
  6041. {
  6042. .eraseblocks = { {4 * 1024, 16} },
  6043. .block_erase = spi_block_erase_d7,
  6044. }, {
  6045. .eraseblocks = { {32 * 1024, 2} },
  6046. .block_erase = spi_block_erase_d8,
  6047. }, {
  6048. .eraseblocks = { {64 * 1024, 1} },
  6049. .block_erase = spi_block_erase_c7,
  6050. }
  6051. },
  6052. .unlock = spi_disable_blockprotect,
  6053. .write = spi_chip_write_256,
  6054. .read = spi_chip_read,
  6055. .voltage = {2700, 3600},
  6056. },
  6057. {
  6058. .vendor = "PMC",
  6059. .name = "Pm29F002T",
  6060. .bustype = BUS_PARALLEL,
  6061. .manufacture_id = PMC_ID_NOPREFIX,
  6062. .model_id = PMC_PM29F002T,
  6063. .total_size = 256,
  6064. .page_size = 8 * 1024,
  6065. .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
  6066. .tested = TEST_OK_PREW,
  6067. .probe = probe_jedec,
  6068. .probe_timing = TIMING_FIXME,
  6069. .block_erasers =
  6070. {
  6071. {
  6072. .eraseblocks = {
  6073. {128 * 1024, 1},
  6074. {96 * 1024, 1},
  6075. {8 * 1024, 2},
  6076. {16 * 1024, 1},
  6077. },
  6078. .block_erase = erase_sector_jedec,
  6079. }, {
  6080. .eraseblocks = { {256 * 1024, 1} },
  6081. .block_erase = erase_chip_block_jedec,
  6082. },
  6083. },
  6084. .write = write_jedec_1,
  6085. .read = read_memmapped,
  6086. .voltage = {4500, 5500},
  6087. },
  6088. {
  6089. .vendor = "PMC",
  6090. .name = "Pm29F002B",
  6091. .bustype = BUS_PARALLEL,
  6092. .manufacture_id = PMC_ID_NOPREFIX,
  6093. .model_id = PMC_PM29F002B,
  6094. .total_size = 256,
  6095. .page_size = 8 * 1024,
  6096. .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
  6097. .tested = TEST_UNTESTED,
  6098. .probe = probe_jedec,
  6099. .probe_timing = TIMING_FIXME,
  6100. .block_erasers =
  6101. {
  6102. {
  6103. .eraseblocks = {
  6104. {16 * 1024, 1},
  6105. {8 * 1024, 2},
  6106. {96 * 1024, 1},
  6107. {128 * 1024, 1},
  6108. },
  6109. .block_erase = erase_sector_jedec,
  6110. }, {
  6111. .eraseblocks = { {256 * 1024, 1} },
  6112. .block_erase = erase_chip_block_jedec,
  6113. },
  6114. },
  6115. .write = write_jedec_1,
  6116. .read = read_memmapped,
  6117. .voltage = {4500, 5500},
  6118. },
  6119. {
  6120. .vendor = "PMC",
  6121. .name = "Pm39LV010",
  6122. .bustype = BUS_PARALLEL,
  6123. .manufacture_id = PMC_ID_NOPREFIX,
  6124. .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
  6125. .total_size = 128,
  6126. .page_size = 4096,
  6127. .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
  6128. .tested = TEST_OK_PREW,
  6129. .probe = probe_jedec,
  6130. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  6131. .block_erasers =
  6132. {
  6133. {
  6134. .eraseblocks = { {4 * 1024, 32} },
  6135. .block_erase = erase_sector_jedec,
  6136. }, {
  6137. .eraseblocks = { {64 * 1024, 2} },
  6138. .block_erase = erase_block_jedec,
  6139. }, {
  6140. .eraseblocks = { {128 * 1024, 1} },
  6141. .block_erase = erase_chip_block_jedec,
  6142. }
  6143. },
  6144. .write = write_jedec_1,
  6145. .read = read_memmapped,
  6146. .voltage = {2700, 3600},
  6147. },
  6148. {
  6149. .vendor = "PMC",
  6150. .name = "Pm39LV020",
  6151. .bustype = BUS_PARALLEL,
  6152. .manufacture_id = PMC_ID_NOPREFIX,
  6153. .model_id = PMC_PM39LV020,
  6154. .total_size = 256,
  6155. .page_size = 4096,
  6156. .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
  6157. .tested = TEST_UNTESTED,
  6158. .probe = probe_jedec,
  6159. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  6160. .block_erasers =
  6161. {
  6162. {
  6163. .eraseblocks = { {4 * 1024, 64} },
  6164. .block_erase = erase_sector_jedec,
  6165. }, {
  6166. .eraseblocks = { {64 * 1024, 4} },
  6167. .block_erase = erase_block_jedec,
  6168. }, {
  6169. .eraseblocks = { {256 * 1024, 1} },
  6170. .block_erase = erase_chip_block_jedec,
  6171. }
  6172. },
  6173. .write = write_jedec_1,
  6174. .read = read_memmapped,
  6175. .voltage = {2700, 3600},
  6176. },
  6177. {
  6178. .vendor = "PMC",
  6179. .name = "Pm39LV040",
  6180. .bustype = BUS_PARALLEL,
  6181. .manufacture_id = PMC_ID_NOPREFIX,
  6182. .model_id = PMC_PM39LV040,
  6183. .total_size = 512,
  6184. .page_size = 4096,
  6185. .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
  6186. .tested = TEST_OK_PR,
  6187. .probe = probe_jedec,
  6188. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  6189. .block_erasers =
  6190. {
  6191. {
  6192. .eraseblocks = { {4 * 1024, 128} },
  6193. .block_erase = erase_sector_jedec,
  6194. }, {
  6195. .eraseblocks = { {64 * 1024, 8} },
  6196. .block_erase = erase_block_jedec,
  6197. }, {
  6198. .eraseblocks = { {512 * 1024, 1} },
  6199. .block_erase = erase_chip_block_jedec,
  6200. }
  6201. },
  6202. .write = write_jedec_1,
  6203. .read = read_memmapped,
  6204. .voltage = {2700, 3600},
  6205. },
  6206. {
  6207. .vendor = "PMC",
  6208. .name = "Pm49FL002",
  6209. .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
  6210. .manufacture_id = PMC_ID_NOPREFIX,
  6211. .model_id = PMC_PM49FL002,
  6212. .total_size = 256,
  6213. .page_size = 16 * 1024,
  6214. .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
  6215. .tested = TEST_OK_PRE,
  6216. .probe = probe_jedec,
  6217. .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
  6218. .block_erasers =
  6219. {
  6220. {
  6221. .eraseblocks = { {4 * 1024, 64} },
  6222. .block_erase = erase_sector_jedec,
  6223. }, {
  6224. .eraseblocks = { {16 * 1024, 16} },
  6225. .block_erase = erase_block_jedec,
  6226. }, {
  6227. .eraseblocks = { {256 * 1024, 1} },
  6228. .block_erase = erase_chip_block_jedec,
  6229. }
  6230. },
  6231. .unlock = unlock_49fl00x,
  6232. .write = write_jedec_1,
  6233. .read = read_memmapped,
  6234. .voltage = {3000, 3600},
  6235. },
  6236. {
  6237. .vendor = "PMC",
  6238. .name = "Pm49FL004",
  6239. .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
  6240. .manufacture_id = PMC_ID_NOPREFIX,
  6241. .model_id = PMC_PM49FL004,
  6242. .total_size = 512,
  6243. .page_size = 64 * 1024,
  6244. .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
  6245. .tested = TEST_OK_PRE,
  6246. .probe = probe_jedec,
  6247. .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
  6248. .block_erasers =
  6249. {
  6250. {
  6251. .eraseblocks = { {4 * 1024, 128} },
  6252. .block_erase = erase_sector_jedec,
  6253. }, {
  6254. .eraseblocks = { {64 * 1024, 8} },
  6255. .block_erase = erase_block_jedec,
  6256. }, {
  6257. .eraseblocks = { {512 * 1024, 1} },
  6258. .block_erase = erase_chip_block_jedec,
  6259. }
  6260. },
  6261. .unlock = unlock_49fl00x,
  6262. .write = write_jedec_1,
  6263. .read = read_memmapped,
  6264. .voltage = {3000, 3600},
  6265. },
  6266. {
  6267. .vendor = "Sanyo",
  6268. .name = "LF25FW203A",
  6269. .bustype = BUS_SPI,
  6270. .manufacture_id = SANYO_ID,
  6271. .model_id = SANYO_LE25FW203A,
  6272. .total_size = 2048,
  6273. .page_size = 256,
  6274. .feature_bits = FEATURE_UNBOUND_READ,
  6275. .tested = TEST_UNTESTED,
  6276. .probe = probe_spi_rdid,
  6277. .probe_timing = TIMING_ZERO,
  6278. .block_erasers =
  6279. {
  6280. {
  6281. .eraseblocks = { {64 * 1024, 32} },
  6282. .block_erase = spi_block_erase_d8,
  6283. }, {
  6284. .eraseblocks = { {2 * 1024 * 1024, 1} },
  6285. .block_erase = spi_block_erase_c7,
  6286. }
  6287. },
  6288. .unlock = spi_disable_blockprotect,
  6289. .write = spi_chip_write_256,
  6290. .read = spi_chip_read,
  6291. },
  6292. {
  6293. .vendor = "Sharp",
  6294. .name = "LH28F008BJT-BTLZ1",
  6295. .bustype = BUS_PARALLEL,
  6296. .manufacture_id = SHARP_ID,
  6297. .model_id = SHARP_LH28F008BJxxPB,
  6298. .total_size = 1024,
  6299. .page_size = 64 * 1024,
  6300. .tested = TEST_OK_PREW,
  6301. .probe = probe_82802ab,
  6302. .probe_timing = TIMING_ZERO,
  6303. .block_erasers =
  6304. {
  6305. {
  6306. .eraseblocks = {
  6307. {8 * 1024, 8},
  6308. {64 * 1024, 15}
  6309. },
  6310. .block_erase = erase_block_82802ab,
  6311. }, {
  6312. .eraseblocks = { {1024 * 1024, 1} },
  6313. .block_erase = erase_sector_49lfxxxc,
  6314. }
  6315. },
  6316. .unlock = unlock_lh28f008bjt,
  6317. .write = write_82802ab,
  6318. .read = read_memmapped,
  6319. .voltage = {2700, 3600},
  6320. },
  6321. {
  6322. .vendor = "Sharp",
  6323. .name = "LHF00L04",
  6324. .bustype = BUS_FWH, /* A/A Mux */
  6325. .manufacture_id = SHARP_ID,
  6326. .model_id = SHARP_LHF00L04,
  6327. .total_size = 1024,
  6328. .page_size = 64 * 1024,
  6329. .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
  6330. .tested = TEST_UNTESTED,
  6331. .probe = probe_82802ab,
  6332. .probe_timing = TIMING_ZERO,
  6333. .block_erasers =
  6334. {
  6335. {
  6336. .eraseblocks = {
  6337. {64 * 1024, 15},
  6338. {8 * 1024, 8}
  6339. },
  6340. .block_erase = erase_block_82802ab,
  6341. }, {
  6342. .eraseblocks = {
  6343. {1024 * 1024, 1}
  6344. },
  6345. .block_erase = NULL, /* 30 D0, only in A/A mux mode */
  6346. },
  6347. },
  6348. .unlock = unlock_82802ab,
  6349. .write = write_82802ab,
  6350. .read = read_memmapped,
  6351. .voltage = {3000, 3600},
  6352. },
  6353. {
  6354. .vendor = "Spansion",
  6355. .name = "S25FL004A",
  6356. .bustype = BUS_SPI,
  6357. .manufacture_id = SPANSION_ID,
  6358. .model_id = SPANSION_S25FL004A,
  6359. .total_size = 512,
  6360. .page_size = 256,
  6361. .feature_bits = FEATURE_UNBOUND_READ,
  6362. .tested = TEST_UNTESTED,
  6363. .probe = probe_spi_rdid,
  6364. .probe_timing = TIMING_ZERO,
  6365. .block_erasers =
  6366. {
  6367. {
  6368. .eraseblocks = { {64 * 1024, 8} },
  6369. .block_erase = spi_block_erase_d8,
  6370. }, {
  6371. .eraseblocks = { {512 * 1024, 1} },
  6372. .block_erase = spi_block_erase_c7,
  6373. }
  6374. },
  6375. .unlock = spi_disable_blockprotect,
  6376. .write = spi_chip_write_256,
  6377. .read = spi_chip_read,
  6378. .voltage = {2700, 3600},
  6379. },
  6380. {
  6381. .vendor = "Spansion",
  6382. .name = "S25FL004A",
  6383. .bustype = BUS_SPI,
  6384. .manufacture_id = SPANSION_ID,
  6385. .model_id = SPANSION_S25FL004A,
  6386. .total_size = 512,
  6387. .page_size = 256,
  6388. .feature_bits = FEATURE_UNBOUND_READ,
  6389. .tested = TEST_UNTESTED,
  6390. .probe = probe_spi_rdid,
  6391. .probe_timing = TIMING_ZERO,
  6392. .block_erasers =
  6393. {
  6394. {
  6395. .eraseblocks = { {64 * 1024, 8} },
  6396. .block_erase = spi_block_erase_d8,
  6397. }, {
  6398. .eraseblocks = { {512 * 1024, 1} },
  6399. .block_erase = spi_block_erase_c7,
  6400. }
  6401. },
  6402. .unlock = spi_disable_blockprotect,
  6403. .write = spi_chip_write_256,
  6404. .read = spi_chip_read,
  6405. },
  6406. {
  6407. .vendor = "Spansion",
  6408. .name = "S25FL008A",
  6409. .bustype = BUS_SPI,
  6410. .manufacture_id = SPANSION_ID,
  6411. .model_id = SPANSION_S25FL008A,
  6412. .total_size = 1024,
  6413. .page_size = 256,
  6414. .feature_bits = FEATURE_UNBOUND_READ,
  6415. .tested = TEST_OK_PREU,
  6416. .probe = probe_spi_rdid,
  6417. .probe_timing = TIMING_ZERO,
  6418. .block_erasers =
  6419. {
  6420. {
  6421. .eraseblocks = { {64 * 1024, 16} },
  6422. .block_erase = spi_block_erase_d8,
  6423. }, {
  6424. .eraseblocks = { {1024 * 1024, 1} },
  6425. .block_erase = spi_block_erase_c7,
  6426. }
  6427. },
  6428. .unlock = spi_disable_blockprotect,
  6429. .write = spi_chip_write_256,
  6430. .read = spi_chip_read,
  6431. .voltage = {2700, 3600},
  6432. },
  6433. {
  6434. .vendor = "Spansion",
  6435. .name = "S25FL016A",
  6436. .bustype = BUS_SPI,
  6437. .manufacture_id = SPANSION_ID,
  6438. .model_id = SPANSION_S25FL016A,
  6439. .total_size = 2048,
  6440. .page_size = 256,
  6441. .feature_bits = FEATURE_UNBOUND_READ,
  6442. .tested = TEST_OK_PRU,
  6443. .probe = probe_spi_rdid,
  6444. .probe_timing = TIMING_ZERO,
  6445. .block_erasers =
  6446. {
  6447. {
  6448. .eraseblocks = { {64 * 1024, 32} },
  6449. .block_erase = spi_block_erase_d8,
  6450. }, {
  6451. .eraseblocks = { {2 * 1024 * 1024, 1} },
  6452. .block_erase = spi_block_erase_c7,
  6453. }
  6454. },
  6455. .unlock = spi_disable_blockprotect,
  6456. .write = spi_chip_write_256,
  6457. .read = spi_chip_read,
  6458. .voltage = {2700, 3600},
  6459. },
  6460. {
  6461. .vendor = "Spansion",
  6462. .name = "S25FL032A",
  6463. .bustype = BUS_SPI,
  6464. .manufacture_id = SPANSION_ID,
  6465. .model_id = SPANSION_S25FL032A,
  6466. .total_size = 4096,
  6467. .page_size = 256,
  6468. .feature_bits = FEATURE_UNBOUND_READ,
  6469. .tested = TEST_UNTESTED,
  6470. .probe = probe_spi_rdid,
  6471. .probe_timing = TIMING_ZERO,
  6472. .block_erasers =
  6473. {
  6474. {
  6475. .eraseblocks = { {64 * 1024, 64} },
  6476. .block_erase = spi_block_erase_d8,
  6477. }, {
  6478. .eraseblocks = { {4 * 1024 * 1024, 1} },
  6479. .block_erase = spi_block_erase_c7,
  6480. }
  6481. },
  6482. .unlock = spi_disable_blockprotect,
  6483. .write = spi_chip_write_256,
  6484. .read = spi_chip_read,
  6485. .voltage = {2700, 3600},
  6486. },
  6487. {
  6488. .vendor = "Spansion",
  6489. .name = "S25FL064A",
  6490. .bustype = BUS_SPI,
  6491. .manufacture_id = SPANSION_ID,
  6492. .model_id = SPANSION_S25FL064A,
  6493. .total_size = 8192,
  6494. .page_size = 256,
  6495. .feature_bits = FEATURE_UNBOUND_READ,
  6496. .tested = TEST_OK_PREWU,
  6497. .probe = probe_spi_rdid,
  6498. .probe_timing = TIMING_ZERO,
  6499. .block_erasers =
  6500. {
  6501. {
  6502. .eraseblocks = { {64 * 1024, 128} },
  6503. .block_erase = spi_block_erase_d8,
  6504. }, {
  6505. .eraseblocks = { {8 * 1024 * 1024, 1} },
  6506. .block_erase = spi_block_erase_c7,
  6507. }
  6508. },
  6509. .unlock = spi_disable_blockprotect,
  6510. .write = spi_chip_write_256,
  6511. .read = spi_chip_read,
  6512. .voltage = {2700, 3600},
  6513. },
  6514. {
  6515. .vendor = "Spansion",
  6516. .name = "S25FL116K",
  6517. .bustype = BUS_SPI,
  6518. .manufacture_id = SPANSION_ID,
  6519. .model_id = SPANSION_S25FL116K,
  6520. .total_size = 2048,
  6521. .page_size = 256,
  6522. .feature_bits = FEATURE_UNBOUND_READ,
  6523. .tested = TEST_OK_PREWU,
  6524. .probe = probe_spi_rdid,
  6525. .probe_timing = TIMING_ZERO,
  6526. .block_erasers =
  6527. {
  6528. {
  6529. .eraseblocks = { {4 * 1024, 512} },
  6530. .block_erase = spi_block_erase_20,
  6531. }, {
  6532. .eraseblocks = { {64 * 1024, 32} },
  6533. .block_erase = spi_block_erase_d8,
  6534. }, {
  6535. .eraseblocks = { {2 * 1024 * 1024, 1} },
  6536. .block_erase = spi_block_erase_c7,
  6537. }
  6538. },
  6539. .unlock = spi_disable_blockprotect,
  6540. .write = spi_chip_write_256,
  6541. .read = spi_chip_read,
  6542. .voltage = {2700, 3600},
  6543. /* TODO: write-protection */
  6544. },
  6545. {
  6546. .vendor = "Spansion",
  6547. .name = "S25FS128S Large Sectors",
  6548. .bustype = BUS_SPI,
  6549. .manufacture_id = SPANSION_ID,
  6550. .model_id = SPANSION_S25FS128S_L,
  6551. .total_size = 16384,
  6552. .page_size = 256,
  6553. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  6554. .tested = TEST_UNTESTED,
  6555. .probe = probe_spi_big_spansion,
  6556. .probe_timing = TIMING_ZERO,
  6557. .block_erasers =
  6558. {
  6559. {
  6560. .eraseblocks = { {64 * 1024, 256} },
  6561. .block_erase = s25fs_block_erase_d8,
  6562. }, {
  6563. .eraseblocks = { {16 * 1024 * 1024, 1} },
  6564. .block_erase = spi_block_erase_60,
  6565. }, {
  6566. .eraseblocks = { {16 * 1024 * 1024, 1} },
  6567. .block_erase = spi_block_erase_c7,
  6568. },
  6569. },
  6570. .unlock = spi_disable_blockprotect,
  6571. .write = spi_chip_write_256,
  6572. .read = spi_chip_read,
  6573. .voltage = {1700, 2000},
  6574. .wp = &wp_generic,
  6575. },
  6576. {
  6577. .vendor = "Spansion",
  6578. .name = "S25FS128S Small Sectors",
  6579. .bustype = BUS_SPI,
  6580. .manufacture_id = SPANSION_ID,
  6581. .model_id = SPANSION_S25FS128S_S,
  6582. .total_size = 16384,
  6583. .page_size = 256,
  6584. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  6585. .tested = TEST_OK_PREWU,
  6586. .probe = probe_spi_big_spansion,
  6587. .probe_timing = TIMING_ZERO,
  6588. .block_erasers =
  6589. {
  6590. {
  6591. .eraseblocks = { {64 * 1024, 256} },
  6592. .block_erase = s25fs_block_erase_d8,
  6593. }, {
  6594. .eraseblocks = { {16 * 1024 * 1024, 1} },
  6595. .block_erase = spi_block_erase_60,
  6596. }, {
  6597. .eraseblocks = { {16 * 1024 * 1024, 1} },
  6598. .block_erase = spi_block_erase_c7,
  6599. },
  6600. },
  6601. .unlock = spi_disable_blockprotect,
  6602. .write = spi_chip_write_256,
  6603. .read = spi_chip_read,
  6604. .voltage = {1700, 2000},
  6605. .wp = &wp_generic,
  6606. },
  6607. {
  6608. .vendor = "Spansion",
  6609. .name = "S25FL256S Large Sectors",
  6610. .bustype = BUS_SPI,
  6611. .manufacture_id = SPANSION_ID,
  6612. .model_id = SPANSION_S25FL256S_UL,
  6613. .total_size = 16384, /* This is just half the size.... */
  6614. .page_size = 256,
  6615. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  6616. .tested = TEST_UNTESTED,
  6617. .probe = probe_spi_big_spansion,
  6618. .probe_timing = TIMING_ZERO,
  6619. .block_erasers =
  6620. {
  6621. {
  6622. .eraseblocks = { {256 * 1024, 64} },
  6623. .block_erase = s25fl_block_erase,
  6624. }, {
  6625. .eraseblocks = { {16 * 1024 * 1024, 1} },
  6626. .block_erase = spi_block_erase_60,
  6627. },
  6628. },
  6629. .unlock = spi_disable_blockprotect,
  6630. .write = spi_chip_write_256,
  6631. .read = spi_chip_read,
  6632. .voltage = {1700, 2000},
  6633. .wp = &wp_generic,
  6634. },
  6635. {
  6636. .vendor = "Spansion",
  6637. .name = "S25FL256S Small Sectors",
  6638. .bustype = BUS_SPI,
  6639. .manufacture_id = SPANSION_ID,
  6640. .model_id = SPANSION_S25FL256S_US,
  6641. .total_size = 16384, /* This is just half the size.... */
  6642. .page_size = 256,
  6643. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  6644. .tested = TEST_OK_PREWU,
  6645. .probe = probe_spi_big_spansion,
  6646. .probe_timing = TIMING_ZERO,
  6647. .block_erasers =
  6648. {
  6649. {
  6650. .eraseblocks = { {64 * 1024, 256} },
  6651. .block_erase = s25fl_block_erase,
  6652. }, {
  6653. .eraseblocks = { {16 * 1024 * 1024, 1} },
  6654. .block_erase = spi_block_erase_60,
  6655. },
  6656. },
  6657. .unlock = spi_disable_blockprotect,
  6658. .write = spi_chip_write_256,
  6659. .read = spi_chip_read,
  6660. .voltage = {1700, 2000},
  6661. .wp = &wp_generic,
  6662. },
  6663. {
  6664. .vendor = "Spansion",
  6665. .name = "S25FL128S_UL Uniform 128 kB Sectors",
  6666. .bustype = BUS_SPI,
  6667. .manufacture_id = SPANSION_ID,
  6668. .model_id = SPANSION_S25FL128S_UL,
  6669. .total_size = 16384,
  6670. .page_size = 256,
  6671. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  6672. .tested = TEST_UNTESTED,
  6673. .probe = probe_spi_big_spansion,
  6674. .probe_timing = TIMING_ZERO,
  6675. .block_erasers =
  6676. {
  6677. {
  6678. .eraseblocks = { {128 * 1024, 128} },
  6679. .block_erase = spi_block_erase_d8,
  6680. }, {
  6681. .eraseblocks = { {16 * 1024 * 1024, 1} },
  6682. .block_erase = spi_block_erase_60,
  6683. }, {
  6684. .eraseblocks = { {16 * 1024 * 1024, 1} },
  6685. .block_erase = spi_block_erase_c7,
  6686. },
  6687. },
  6688. .unlock = spi_disable_blockprotect,
  6689. .write = spi_chip_write_256,
  6690. .read = spi_chip_read,
  6691. .voltage = {1700, 2000},
  6692. .wp = &wp_generic,
  6693. },
  6694. {
  6695. .vendor = "Spansion",
  6696. .name = "S25FL128S_US Uniform 64 kB Sectors",
  6697. .bustype = BUS_SPI,
  6698. .manufacture_id = SPANSION_ID,
  6699. .model_id = SPANSION_S25FL128S_US,
  6700. .total_size = 16384,
  6701. .page_size = 256,
  6702. .feature_bits = FEATURE_WRSR_WREN,
  6703. .tested = TEST_UNTESTED,
  6704. .probe = probe_spi_big_spansion,
  6705. .probe_timing = TIMING_ZERO,
  6706. .block_erasers =
  6707. {
  6708. {
  6709. .eraseblocks = { {64 * 1024, 256} },
  6710. .block_erase = spi_block_erase_d8,
  6711. }, {
  6712. .eraseblocks = { {16 * 1024 * 1024, 1} },
  6713. .block_erase = spi_block_erase_60,
  6714. }, {
  6715. .eraseblocks = { {16 * 1024 * 1024, 1} },
  6716. .block_erase = spi_block_erase_c7,
  6717. },
  6718. },
  6719. .unlock = spi_disable_blockprotect,
  6720. .write = spi_chip_write_256,
  6721. .read = spi_chip_read,
  6722. .voltage = {1700, 2000},
  6723. .wp = &wp_generic,
  6724. },
  6725. {
  6726. .vendor = "SST",
  6727. .name = "SST25LF040A",
  6728. .bustype = BUS_SPI,
  6729. .manufacture_id = SST_ID,
  6730. .model_id = SST_SST25VF040_REMS,
  6731. .total_size = 512,
  6732. .page_size = 256,
  6733. .feature_bits = FEATURE_UNBOUND_READ,
  6734. .tested = TEST_OK_PREWU,
  6735. .probe = probe_spi_res2,
  6736. .probe_timing = TIMING_ZERO,
  6737. .block_erasers =
  6738. {
  6739. {
  6740. .eraseblocks = { {4 * 1024, 128} },
  6741. .block_erase = spi_block_erase_20,
  6742. }, {
  6743. .eraseblocks = { {32 * 1024, 16} },
  6744. .block_erase = spi_block_erase_52,
  6745. }, {
  6746. .eraseblocks = { {512 * 1024, 1} },
  6747. .block_erase = spi_block_erase_60,
  6748. },
  6749. },
  6750. .unlock = spi_disable_blockprotect,
  6751. .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
  6752. .read = spi_chip_read,
  6753. .voltage = {3000, 3600},
  6754. },
  6755. {
  6756. .vendor = "SST",
  6757. .name = "SST25LF080A",
  6758. .bustype = BUS_SPI,
  6759. .manufacture_id = SST_ID,
  6760. .model_id = SST_SST25VF080_REMS,
  6761. .total_size = 1024,
  6762. .page_size = 256,
  6763. .feature_bits = FEATURE_UNBOUND_READ,
  6764. .tested = TEST_UNTESTED,
  6765. .probe = probe_spi_res2,
  6766. .probe_timing = TIMING_ZERO,
  6767. .block_erasers =
  6768. {
  6769. {
  6770. .eraseblocks = { {4 * 1024, 256} },
  6771. .block_erase = spi_block_erase_20,
  6772. }, {
  6773. .eraseblocks = { {32 * 1024, 32} },
  6774. .block_erase = spi_block_erase_52,
  6775. }, {
  6776. .eraseblocks = { {1024 * 1024, 1} },
  6777. .block_erase = spi_block_erase_60,
  6778. },
  6779. },
  6780. .unlock = spi_disable_blockprotect,
  6781. .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
  6782. .read = spi_chip_read,
  6783. .voltage = {3000, 3600},
  6784. },
  6785. {
  6786. .vendor = "SST",
  6787. .name = "SST25VF010",
  6788. .bustype = BUS_SPI,
  6789. .manufacture_id = SST_ID,
  6790. .model_id = SST_SST25VF010_REMS,
  6791. .total_size = 128,
  6792. .page_size = 256,
  6793. .feature_bits = FEATURE_UNBOUND_READ,
  6794. .tested = TEST_OK_PREWU,
  6795. .probe = probe_spi_rems,
  6796. .probe_timing = TIMING_ZERO,
  6797. .block_erasers =
  6798. {
  6799. {
  6800. .eraseblocks = { {4 * 1024, 32} },
  6801. .block_erase = spi_block_erase_20,
  6802. }, {
  6803. .eraseblocks = { {32 * 1024, 4} },
  6804. .block_erase = spi_block_erase_52,
  6805. }, {
  6806. .eraseblocks = { {128 * 1024, 1} },
  6807. .block_erase = spi_block_erase_60,
  6808. },
  6809. },
  6810. .unlock = spi_disable_blockprotect,
  6811. .write = spi_aai_write,
  6812. .read = spi_chip_read,
  6813. .voltage = {2700, 3600},
  6814. },
  6815. {
  6816. .vendor = "Spansion",
  6817. .name = "S25FL032A",
  6818. .bustype = BUS_SPI,
  6819. .manufacture_id = SPANSION_ID,
  6820. .model_id = SPANSION_S25FL032A,
  6821. .total_size = 4096,
  6822. .page_size = 256,
  6823. .feature_bits = FEATURE_UNBOUND_READ,
  6824. .tested = TEST_UNTESTED,
  6825. .probe = probe_spi_rdid,
  6826. .probe_timing = TIMING_ZERO,
  6827. .block_erasers =
  6828. {
  6829. {
  6830. .eraseblocks = { {64 * 1024, 64} },
  6831. .block_erase = spi_block_erase_d8,
  6832. }, {
  6833. .eraseblocks = { {4 * 1024 * 1024, 1} },
  6834. .block_erase = spi_block_erase_c7,
  6835. }
  6836. },
  6837. .unlock = spi_disable_blockprotect,
  6838. .write = spi_chip_write_256,
  6839. .read = spi_chip_read,
  6840. },
  6841. {
  6842. .vendor = "Spansion",
  6843. .name = "S25FL064A",
  6844. .bustype = BUS_SPI,
  6845. .manufacture_id = SPANSION_ID,
  6846. .model_id = SPANSION_S25FL064A,
  6847. .total_size = 8192,
  6848. .page_size = 256,
  6849. .feature_bits = FEATURE_UNBOUND_READ,
  6850. .tested = TEST_OK_PREWU,
  6851. .probe = probe_spi_rdid,
  6852. .probe_timing = TIMING_ZERO,
  6853. .block_erasers =
  6854. {
  6855. {
  6856. .eraseblocks = { {64 * 1024, 128} },
  6857. .block_erase = spi_block_erase_d8,
  6858. }, {
  6859. .eraseblocks = { {8 * 1024 * 1024, 1} },
  6860. .block_erase = spi_block_erase_c7,
  6861. }
  6862. },
  6863. .unlock = spi_disable_blockprotect,
  6864. .write = spi_chip_write_256,
  6865. .read = spi_chip_read,
  6866. },
  6867. {
  6868. .vendor = "SST",
  6869. .name = "SST25VF010.REMS",
  6870. .bustype = BUS_SPI,
  6871. .manufacture_id = SST_ID,
  6872. .model_id = SST_SST25VF010_REMS,
  6873. .total_size = 128,
  6874. .page_size = 256,
  6875. .feature_bits = FEATURE_UNBOUND_READ,
  6876. .tested = TEST_OK_PREWU,
  6877. .probe = probe_spi_rems,
  6878. .probe_timing = TIMING_ZERO,
  6879. .block_erasers =
  6880. {
  6881. {
  6882. .eraseblocks = { {4 * 1024, 32} },
  6883. .block_erase = spi_block_erase_20,
  6884. }, {
  6885. .eraseblocks = { {32 * 1024, 4} },
  6886. .block_erase = spi_block_erase_52,
  6887. }, {
  6888. .eraseblocks = { {128 * 1024, 1} },
  6889. .block_erase = spi_block_erase_60,
  6890. },
  6891. },
  6892. .unlock = spi_disable_blockprotect,
  6893. .write = spi_chip_write_1,
  6894. .read = spi_chip_read,
  6895. },
  6896. {
  6897. .vendor = "SST",
  6898. .name = "SST25VF016B",
  6899. .bustype = BUS_SPI,
  6900. .manufacture_id = SST_ID,
  6901. .model_id = SST_SST25VF016B,
  6902. .total_size = 2048,
  6903. .page_size = 256,
  6904. .feature_bits = FEATURE_UNBOUND_READ,
  6905. .tested = TEST_OK_PREWU,
  6906. .probe = probe_spi_rdid,
  6907. .probe_timing = TIMING_ZERO,
  6908. .block_erasers =
  6909. {
  6910. {
  6911. .eraseblocks = { {4 * 1024, 512} },
  6912. .block_erase = spi_block_erase_20,
  6913. }, {
  6914. .eraseblocks = { {32 * 1024, 64} },
  6915. .block_erase = spi_block_erase_52,
  6916. }, {
  6917. .eraseblocks = { {64 * 1024, 32} },
  6918. .block_erase = spi_block_erase_d8,
  6919. }, {
  6920. .eraseblocks = { {2 * 1024 * 1024, 1} },
  6921. .block_erase = spi_block_erase_60,
  6922. }, {
  6923. .eraseblocks = { {2 * 1024 * 1024, 1} },
  6924. .block_erase = spi_block_erase_c7,
  6925. },
  6926. },
  6927. .unlock = spi_disable_blockprotect,
  6928. .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
  6929. .read = spi_chip_read,
  6930. .voltage = {2700, 3600},
  6931. },
  6932. {
  6933. .vendor = "SST",
  6934. .name = "SST25VF032B",
  6935. .bustype = BUS_SPI,
  6936. .manufacture_id = SST_ID,
  6937. .model_id = SST_SST25VF032B,
  6938. .total_size = 4096,
  6939. .page_size = 256,
  6940. .feature_bits = FEATURE_UNBOUND_READ,
  6941. .tested = TEST_OK_PREWU,
  6942. .probe = probe_spi_rdid,
  6943. .probe_timing = TIMING_ZERO,
  6944. .block_erasers =
  6945. {
  6946. {
  6947. .eraseblocks = { {4 * 1024, 1024} },
  6948. .block_erase = spi_block_erase_20,
  6949. }, {
  6950. .eraseblocks = { {32 * 1024, 128} },
  6951. .block_erase = spi_block_erase_52,
  6952. }, {
  6953. .eraseblocks = { {64 * 1024, 64} },
  6954. .block_erase = spi_block_erase_d8,
  6955. }, {
  6956. .eraseblocks = { {4 * 1024 * 1024, 1} },
  6957. .block_erase = spi_block_erase_60,
  6958. }, {
  6959. .eraseblocks = { {4 * 1024 * 1024, 1} },
  6960. .block_erase = spi_block_erase_c7,
  6961. },
  6962. },
  6963. .unlock = spi_disable_blockprotect,
  6964. .write = spi_aai_write,
  6965. .read = spi_chip_read,
  6966. .voltage = {2700, 3600},
  6967. },
  6968. {
  6969. .vendor = "SST",
  6970. .name = "SST25VF064C",
  6971. .bustype = BUS_SPI,
  6972. .manufacture_id = SST_ID,
  6973. .model_id = SST_SST25VF064C,
  6974. .total_size = 8192,
  6975. .page_size = 256,
  6976. .feature_bits = FEATURE_UNBOUND_READ,
  6977. .tested = TEST_OK_PREU,
  6978. .probe = probe_spi_rdid,
  6979. .probe_timing = TIMING_ZERO,
  6980. .block_erasers =
  6981. {
  6982. {
  6983. .eraseblocks = { {4 * 1024, 2048} },
  6984. .block_erase = spi_block_erase_20,
  6985. }, {
  6986. .eraseblocks = { {32 * 1024, 256} },
  6987. .block_erase = spi_block_erase_52,
  6988. }, {
  6989. .eraseblocks = { {64 * 1024, 128} },
  6990. .block_erase = spi_block_erase_d8,
  6991. }, {
  6992. .eraseblocks = { {8 * 1024 * 1024, 1} },
  6993. .block_erase = spi_block_erase_60,
  6994. }, {
  6995. .eraseblocks = { {8 * 1024 * 1024, 1} },
  6996. .block_erase = spi_block_erase_c7,
  6997. },
  6998. },
  6999. .unlock = spi_disable_blockprotect,
  7000. .write = spi_chip_write_256,
  7001. .read = spi_chip_read,
  7002. .voltage = {2700, 3600},
  7003. },
  7004. {
  7005. .vendor = "SST",
  7006. .name = "SST25VF040",
  7007. .bustype = BUS_SPI,
  7008. .manufacture_id = SST_ID,
  7009. .model_id = SST_SST25VF040_REMS,
  7010. .total_size = 512,
  7011. .page_size = 256,
  7012. .feature_bits = FEATURE_UNBOUND_READ,
  7013. .tested = TEST_OK_PRU,
  7014. .probe = probe_spi_rems,
  7015. .probe_timing = TIMING_ZERO,
  7016. .block_erasers =
  7017. {
  7018. {
  7019. .eraseblocks = { {4 * 1024, 128} },
  7020. .block_erase = spi_block_erase_20,
  7021. }, {
  7022. .eraseblocks = { {32 * 1024, 16} },
  7023. .block_erase = spi_block_erase_52,
  7024. }, {
  7025. .eraseblocks = { {512 * 1024, 1} },
  7026. .block_erase = spi_block_erase_60,
  7027. },
  7028. },
  7029. .unlock = spi_disable_blockprotect,
  7030. .write = spi_aai_write,
  7031. .read = spi_chip_read,
  7032. .voltage = {2700, 3600},
  7033. },
  7034. {
  7035. .vendor = "SST",
  7036. .name = "SST25VF040B",
  7037. .bustype = BUS_SPI,
  7038. .manufacture_id = SST_ID,
  7039. .model_id = SST_SST25VF040B,
  7040. .total_size = 512,
  7041. .page_size = 256,
  7042. .feature_bits = FEATURE_UNBOUND_READ,
  7043. .tested = TEST_UNTESTED,
  7044. .probe = probe_spi_rdid,
  7045. .probe_timing = TIMING_ZERO,
  7046. .block_erasers =
  7047. {
  7048. {
  7049. .eraseblocks = { {4 * 1024, 128} },
  7050. .block_erase = spi_block_erase_20,
  7051. }, {
  7052. .eraseblocks = { {32 * 1024, 16} },
  7053. .block_erase = spi_block_erase_52,
  7054. }, {
  7055. .eraseblocks = { {64 * 1024, 8} },
  7056. .block_erase = spi_block_erase_d8,
  7057. }, {
  7058. .eraseblocks = { {512 * 1024, 1} },
  7059. .block_erase = spi_block_erase_60,
  7060. }, {
  7061. .eraseblocks = { {512 * 1024, 1} },
  7062. .block_erase = spi_block_erase_c7,
  7063. },
  7064. },
  7065. .unlock = spi_disable_blockprotect,
  7066. .write = spi_aai_write,
  7067. .read = spi_chip_read,
  7068. .voltage = {2700, 3600},
  7069. },
  7070. {
  7071. .vendor = "SST",
  7072. .name = "SST25VF040B.REMS",
  7073. .bustype = BUS_SPI,
  7074. .manufacture_id = SST_ID,
  7075. .model_id = SST_SST25VF040B_REMS,
  7076. .total_size = 512,
  7077. .page_size = 256,
  7078. .feature_bits = FEATURE_UNBOUND_READ,
  7079. .tested = TEST_OK_PRU,
  7080. .probe = probe_spi_rems,
  7081. .probe_timing = TIMING_ZERO,
  7082. .block_erasers =
  7083. {
  7084. {
  7085. .eraseblocks = { {4 * 1024, 128} },
  7086. .block_erase = spi_block_erase_20,
  7087. }, {
  7088. .eraseblocks = { {32 * 1024, 16} },
  7089. .block_erase = spi_block_erase_52,
  7090. }, {
  7091. .eraseblocks = { {64 * 1024, 8} },
  7092. .block_erase = spi_block_erase_d8,
  7093. }, {
  7094. .eraseblocks = { {512 * 1024, 1} },
  7095. .block_erase = spi_block_erase_60,
  7096. }, {
  7097. .eraseblocks = { {512 * 1024, 1} },
  7098. .block_erase = spi_block_erase_c7,
  7099. },
  7100. },
  7101. .unlock = spi_disable_blockprotect,
  7102. .write = spi_aai_write,
  7103. .read = spi_chip_read,
  7104. .voltage = {2700, 3600},
  7105. },
  7106. {
  7107. .vendor = "SST",
  7108. .name = "SST25VF080B",
  7109. .bustype = BUS_SPI,
  7110. .manufacture_id = SST_ID,
  7111. .model_id = SST_SST25VF080B,
  7112. .total_size = 1024,
  7113. .page_size = 256,
  7114. .feature_bits = FEATURE_UNBOUND_READ,
  7115. .tested = TEST_OK_PREU,
  7116. .probe = probe_spi_rdid,
  7117. .probe_timing = TIMING_ZERO,
  7118. .block_erasers =
  7119. {
  7120. {
  7121. .eraseblocks = { {4 * 1024, 256} },
  7122. .block_erase = spi_block_erase_20,
  7123. }, {
  7124. .eraseblocks = { {32 * 1024, 32} },
  7125. .block_erase = spi_block_erase_52,
  7126. }, {
  7127. .eraseblocks = { {64 * 1024, 16} },
  7128. .block_erase = spi_block_erase_d8,
  7129. }, {
  7130. .eraseblocks = { {1024 * 1024, 1} },
  7131. .block_erase = spi_block_erase_60,
  7132. }, {
  7133. .eraseblocks = { {1024 * 1024, 1} },
  7134. .block_erase = spi_block_erase_c7,
  7135. },
  7136. },
  7137. .unlock = spi_disable_blockprotect,
  7138. .write = spi_chip_write_1,
  7139. .read = spi_chip_read,
  7140. .voltage = {2700, 3600},
  7141. },
  7142. {
  7143. .vendor = "SST",
  7144. .name = "SST28SF040A",
  7145. .bustype = BUS_PARALLEL,
  7146. .manufacture_id = SST_ID,
  7147. .model_id = SST_SST28SF040,
  7148. .total_size = 512,
  7149. .page_size = 256,
  7150. .feature_bits = 0,
  7151. .tested = TEST_UNTESTED,
  7152. .probe = probe_82802ab,
  7153. .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
  7154. .block_erasers =
  7155. {
  7156. {
  7157. .eraseblocks = { {128, 4096} },
  7158. .block_erase = erase_sector_28sf040,
  7159. }, {
  7160. .eraseblocks = { {512 * 1024, 1} },
  7161. .block_erase = erase_chip_28sf040,
  7162. }
  7163. },
  7164. .unlock = unprotect_28sf040,
  7165. .write = write_28sf040,
  7166. .read = read_memmapped,
  7167. .voltage = {4500, 5500},
  7168. },
  7169. {
  7170. .vendor = "SST",
  7171. .name = "SST29EE010",
  7172. .bustype = BUS_PARALLEL,
  7173. .manufacture_id = SST_ID,
  7174. .model_id = SST_SST29EE010,
  7175. .total_size = 128,
  7176. .page_size = 128,
  7177. .feature_bits = FEATURE_LONG_RESET,
  7178. .tested = TEST_OK_PR,
  7179. .probe = probe_jedec,
  7180. .probe_timing = 10,
  7181. .block_erasers =
  7182. {
  7183. {
  7184. .eraseblocks = { {128 * 1024, 1} },
  7185. .block_erase = erase_chip_block_jedec,
  7186. }
  7187. },
  7188. .write = write_jedec,
  7189. .read = read_memmapped,
  7190. .voltage = {4500, 5500},
  7191. },
  7192. {
  7193. .vendor = "SST",
  7194. .name = "SST29LE010",
  7195. .bustype = BUS_PARALLEL,
  7196. .manufacture_id = SST_ID,
  7197. .model_id = SST_SST29LE010,
  7198. .total_size = 128,
  7199. .page_size = 128,
  7200. .feature_bits = FEATURE_LONG_RESET,
  7201. .tested = TEST_UNTESTED,
  7202. .probe = probe_jedec,
  7203. .probe_timing = 10,
  7204. .block_erasers =
  7205. {
  7206. {
  7207. .eraseblocks = { {128 * 1024, 1} },
  7208. .block_erase = erase_chip_block_jedec,
  7209. }
  7210. },
  7211. .write = write_jedec,
  7212. .read = read_memmapped,
  7213. .voltage = {3000, 3600},
  7214. },
  7215. {
  7216. .vendor = "SST",
  7217. .name = "SST29EE020A",
  7218. .bustype = BUS_PARALLEL,
  7219. .manufacture_id = SST_ID,
  7220. .model_id = SST_SST29EE020A,
  7221. .total_size = 256,
  7222. .page_size = 128,
  7223. .feature_bits = FEATURE_LONG_RESET,
  7224. .tested = TEST_OK_PRE,
  7225. .probe = probe_jedec,
  7226. .probe_timing = 10,
  7227. .block_erasers =
  7228. {
  7229. {
  7230. .eraseblocks = { {256 * 1024, 1} },
  7231. .block_erase = erase_chip_block_jedec,
  7232. }
  7233. },
  7234. .write = write_jedec,
  7235. .read = read_memmapped,
  7236. .voltage = {4500, 5500},
  7237. },
  7238. {
  7239. .vendor = "SST",
  7240. .name = "SST29LE020",
  7241. .bustype = BUS_PARALLEL,
  7242. .manufacture_id = SST_ID,
  7243. .model_id = SST_SST29LE020,
  7244. .total_size = 256,
  7245. .page_size = 128,
  7246. .feature_bits = FEATURE_LONG_RESET,
  7247. .tested = TEST_OK_PRE,
  7248. .probe = probe_jedec,
  7249. .probe_timing = 10,
  7250. .block_erasers =
  7251. {
  7252. {
  7253. .eraseblocks = { {256 * 1024, 1} },
  7254. .block_erase = erase_chip_block_jedec,
  7255. }
  7256. },
  7257. .write = write_jedec,
  7258. .read = read_memmapped,
  7259. .voltage = {3000, 3600},
  7260. },
  7261. {
  7262. .vendor = "SST",
  7263. .name = "SST39SF512",
  7264. .bustype = BUS_PARALLEL,
  7265. .manufacture_id = SST_ID,
  7266. .model_id = SST_SST39SF512,
  7267. .total_size = 64,
  7268. .page_size = 4096,
  7269. .feature_bits = FEATURE_EITHER_RESET,
  7270. .tested = TEST_OK_PREW,
  7271. .probe = probe_jedec,
  7272. .probe_timing = 1, /* 150 ns */
  7273. .block_erasers =
  7274. {
  7275. {
  7276. .eraseblocks = { {4 * 1024, 16} },
  7277. .block_erase = erase_sector_jedec,
  7278. }, {
  7279. .eraseblocks = { {64 * 1024, 1} },
  7280. .block_erase = erase_chip_block_jedec,
  7281. }
  7282. },
  7283. .write = write_jedec_1,
  7284. .read = read_memmapped,
  7285. .voltage = {4500, 5500},
  7286. },
  7287. {
  7288. .vendor = "SST",
  7289. .name = "SST39SF010A",
  7290. .bustype = BUS_PARALLEL,
  7291. .manufacture_id = SST_ID,
  7292. .model_id = SST_SST39SF010,
  7293. .total_size = 128,
  7294. .page_size = 4096,
  7295. .feature_bits = FEATURE_EITHER_RESET,
  7296. .tested = TEST_OK_PREW,
  7297. .probe = probe_jedec,
  7298. .probe_timing = 1, /* 150 ns */
  7299. .block_erasers =
  7300. {
  7301. {
  7302. .eraseblocks = { {4 * 1024, 32} },
  7303. .block_erase = erase_sector_jedec,
  7304. }, {
  7305. .eraseblocks = { {128 * 1024, 1} },
  7306. .block_erase = erase_chip_block_jedec,
  7307. }
  7308. },
  7309. .write = write_jedec_1,
  7310. .read = read_memmapped,
  7311. .voltage = {4500, 5500},
  7312. },
  7313. {
  7314. .vendor = "SST",
  7315. .name = "SST39SF020A",
  7316. .bustype = BUS_PARALLEL,
  7317. .manufacture_id = SST_ID,
  7318. .model_id = SST_SST39SF020,
  7319. .total_size = 256,
  7320. .page_size = 4096,
  7321. .feature_bits = FEATURE_EITHER_RESET,
  7322. .tested = TEST_OK_PRE,
  7323. .probe = probe_jedec,
  7324. .probe_timing = 1, /* 150 ns */
  7325. .block_erasers =
  7326. {
  7327. {
  7328. .eraseblocks = { {4 * 1024, 64} },
  7329. .block_erase = erase_sector_jedec,
  7330. }, {
  7331. .eraseblocks = { {256 * 1024, 1} },
  7332. .block_erase = erase_chip_block_jedec,
  7333. }
  7334. },
  7335. .write = write_jedec_1,
  7336. .read = read_memmapped,
  7337. .voltage = {4500, 5500},
  7338. },
  7339. {
  7340. .vendor = "SST",
  7341. .name = "SST39SF040",
  7342. .bustype = BUS_PARALLEL,
  7343. .manufacture_id = SST_ID,
  7344. .model_id = SST_SST39SF040,
  7345. .total_size = 512,
  7346. .page_size = 4096,
  7347. .feature_bits = FEATURE_EITHER_RESET,
  7348. .tested = TEST_OK_PREW,
  7349. .probe = probe_jedec,
  7350. .probe_timing = 1, /* 150 ns */
  7351. .block_erasers =
  7352. {
  7353. {
  7354. .eraseblocks = { {4 * 1024, 128} },
  7355. .block_erase = erase_sector_jedec,
  7356. }, {
  7357. .eraseblocks = { {512 * 1024, 1} },
  7358. .block_erase = erase_chip_block_jedec,
  7359. }
  7360. },
  7361. .write = write_jedec_1,
  7362. .read = read_memmapped,
  7363. .voltage = {4500, 5500},
  7364. },
  7365. {
  7366. .vendor = "SST",
  7367. .name = "SST39VF512",
  7368. .bustype = BUS_PARALLEL,
  7369. .manufacture_id = SST_ID,
  7370. .model_id = SST_SST39VF512,
  7371. .total_size = 64,
  7372. .page_size = 4096,
  7373. .feature_bits = FEATURE_EITHER_RESET,
  7374. .tested = TEST_OK_PRE,
  7375. .probe = probe_jedec,
  7376. .probe_timing = 1, /* 150 ns */
  7377. .block_erasers =
  7378. {
  7379. {
  7380. .eraseblocks = { {4 * 1024, 16} },
  7381. .block_erase = erase_sector_jedec,
  7382. }, {
  7383. .eraseblocks = { {64 * 1024, 1} },
  7384. .block_erase = erase_chip_block_jedec,
  7385. }
  7386. },
  7387. .write = write_jedec_1,
  7388. .read = read_memmapped,
  7389. .voltage = {2700, 3600},
  7390. },
  7391. {
  7392. .vendor = "SST",
  7393. .name = "SST39VF010",
  7394. .bustype = BUS_PARALLEL,
  7395. .manufacture_id = SST_ID,
  7396. .model_id = SST_SST39VF010,
  7397. .total_size = 128,
  7398. .page_size = 4096,
  7399. .feature_bits = FEATURE_EITHER_RESET,
  7400. .tested = TEST_OK_PRE,
  7401. .probe = probe_jedec,
  7402. .probe_timing = 1, /* 150 ns */
  7403. .block_erasers =
  7404. {
  7405. {
  7406. .eraseblocks = { {4 * 1024, 32} },
  7407. .block_erase = erase_sector_jedec,
  7408. }, {
  7409. .eraseblocks = { {128 * 1024, 1} },
  7410. .block_erase = erase_chip_block_jedec,
  7411. }
  7412. },
  7413. .write = write_jedec_1,
  7414. .read = read_memmapped,
  7415. .voltage = {2700, 3600},
  7416. },
  7417. {
  7418. .vendor = "SST",
  7419. .name = "SST39VF020",
  7420. .bustype = BUS_PARALLEL,
  7421. .manufacture_id = SST_ID,
  7422. .model_id = SST_SST39VF020,
  7423. .total_size = 256,
  7424. .page_size = 4096,
  7425. .feature_bits = FEATURE_EITHER_RESET,
  7426. .tested = TEST_UNTESTED,
  7427. .probe = probe_jedec,
  7428. .probe_timing = 1, /* 150 ns */
  7429. .block_erasers =
  7430. {
  7431. {
  7432. .eraseblocks = { {4 * 1024, 64} },
  7433. .block_erase = erase_sector_jedec,
  7434. }, {
  7435. .eraseblocks = { {256 * 1024, 1} },
  7436. .block_erase = erase_chip_block_jedec,
  7437. }
  7438. },
  7439. .write = write_jedec_1,
  7440. .read = read_memmapped,
  7441. .voltage = {2700, 3600},
  7442. },
  7443. {
  7444. .vendor = "SST",
  7445. .name = "SST39VF040",
  7446. .bustype = BUS_PARALLEL,
  7447. .manufacture_id = SST_ID,
  7448. .model_id = SST_SST39VF040,
  7449. .total_size = 512,
  7450. .page_size = 4096,
  7451. .feature_bits = FEATURE_EITHER_RESET,
  7452. .tested = TEST_UNTESTED,
  7453. .probe = probe_jedec,
  7454. .probe_timing = 1, /* 150 ns */
  7455. .block_erasers =
  7456. {
  7457. {
  7458. .eraseblocks = { {4 * 1024, 128} },
  7459. .block_erase = erase_sector_jedec,
  7460. }, {
  7461. .eraseblocks = { {512 * 1024, 1} },
  7462. .block_erase = erase_chip_block_jedec,
  7463. }
  7464. },
  7465. .write = write_jedec_1,
  7466. .read = read_memmapped,
  7467. .voltage = {2700, 3600},
  7468. },
  7469. {
  7470. .vendor = "SST",
  7471. .name = "SST39VF080",
  7472. .bustype = BUS_PARALLEL,
  7473. .manufacture_id = SST_ID,
  7474. .model_id = SST_SST39VF080,
  7475. .total_size = 1024,
  7476. .page_size = 4096,
  7477. .feature_bits = FEATURE_EITHER_RESET,
  7478. .tested = TEST_UNTESTED,
  7479. .probe = probe_jedec,
  7480. .probe_timing = 1, /* 150 ns */
  7481. .block_erasers =
  7482. {
  7483. {
  7484. .eraseblocks = { {4 * 1024, 256} },
  7485. .block_erase = erase_sector_jedec,
  7486. }, {
  7487. .eraseblocks = { {64 * 1024, 16} },
  7488. .block_erase = erase_block_jedec,
  7489. }, {
  7490. .eraseblocks = { {1024 * 1024, 1} },
  7491. .block_erase = erase_chip_block_jedec,
  7492. }
  7493. },
  7494. .write = write_jedec_1,
  7495. .read = read_memmapped,
  7496. .voltage = {2700, 3600},
  7497. },
  7498. {
  7499. .vendor = "SST",
  7500. .name = "SST49LF002A/B",
  7501. .bustype = BUS_FWH, /* A/A Mux */
  7502. .manufacture_id = SST_ID,
  7503. .model_id = SST_SST49LF002A,
  7504. .total_size = 256,
  7505. .page_size = 16 * 1024,
  7506. .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
  7507. .tested = TEST_OK_PRE,
  7508. .probe = probe_jedec,
  7509. .probe_timing = 1, /* 150 ns */
  7510. .block_erasers =
  7511. {
  7512. {
  7513. .eraseblocks = { {4 * 1024, 64} },
  7514. .block_erase = erase_sector_jedec,
  7515. }, {
  7516. .eraseblocks = { {16 * 1024, 16} },
  7517. .block_erase = erase_block_jedec,
  7518. }, {
  7519. .eraseblocks = { {256 * 1024, 1} },
  7520. .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
  7521. }
  7522. },
  7523. .printlock = printlock_sst_fwhub,
  7524. .unlock = unlock_sst_fwhub,
  7525. .write = write_jedec_1,
  7526. .read = read_memmapped,
  7527. .voltage = {3000, 3600},
  7528. },
  7529. {
  7530. .vendor = "SST",
  7531. .name = "SST49LF003A/B",
  7532. .bustype = BUS_FWH, /* A/A Mux */
  7533. .manufacture_id = SST_ID,
  7534. .model_id = SST_SST49LF003A,
  7535. .total_size = 384,
  7536. .page_size = 64 * 1024,
  7537. .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
  7538. .tested = TEST_OK_PR,
  7539. .probe = probe_jedec,
  7540. .probe_timing = 1, /* 150 ns */
  7541. .block_erasers =
  7542. {
  7543. {
  7544. .eraseblocks = { {4 * 1024, 96} },
  7545. .block_erase = erase_sector_jedec,
  7546. }, {
  7547. .eraseblocks = { {64 * 1024, 6} },
  7548. .block_erase = erase_block_jedec,
  7549. }, {
  7550. .eraseblocks = { {384 * 1024, 1} },
  7551. .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
  7552. }
  7553. },
  7554. .printlock = printlock_sst_fwhub,
  7555. .unlock = unlock_sst_fwhub,
  7556. .write = write_jedec_1,
  7557. .read = read_memmapped,
  7558. .voltage = {3000, 3600},
  7559. },
  7560. {
  7561. /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
  7562. * and is only honored for 64k block erase, but not 4k sector erase.
  7563. */
  7564. .vendor = "SST",
  7565. .name = "SST49LF004A/B",
  7566. .bustype = BUS_FWH, /* A/A Mux */
  7567. .manufacture_id = SST_ID,
  7568. .model_id = SST_SST49LF004A,
  7569. .total_size = 512,
  7570. .page_size = 64 * 1024,
  7571. .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
  7572. .tested = TEST_OK_PRE,
  7573. .probe = probe_jedec,
  7574. .probe_timing = 1, /* 150 ns */
  7575. .block_erasers =
  7576. {
  7577. {
  7578. .eraseblocks = { {4 * 1024, 128} },
  7579. .block_erase = erase_sector_jedec,
  7580. }, {
  7581. .eraseblocks = { {64 * 1024, 8} },
  7582. .block_erase = erase_block_jedec,
  7583. }, {
  7584. .eraseblocks = { {512 * 1024, 1} },
  7585. .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
  7586. },
  7587. },
  7588. .printlock = printlock_sst_fwhub,
  7589. .unlock = unlock_sst_fwhub,
  7590. .write = write_jedec_1,
  7591. .read = read_memmapped,
  7592. .voltage = {3000, 3600},
  7593. },
  7594. {
  7595. .vendor = "SST",
  7596. .name = "SST49LF004C",
  7597. .bustype = BUS_FWH,
  7598. .manufacture_id = SST_ID,
  7599. .model_id = SST_SST49LF004C,
  7600. .total_size = 512,
  7601. .page_size = 4 * 1024,
  7602. .feature_bits = FEATURE_REGISTERMAP,
  7603. .tested = TEST_UNTESTED,
  7604. .probe = probe_82802ab,
  7605. .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
  7606. .block_erasers =
  7607. {
  7608. {
  7609. .eraseblocks = { {4 * 1024, 128} },
  7610. .block_erase = erase_sector_49lfxxxc,
  7611. }, {
  7612. .eraseblocks = {
  7613. {64 * 1024, 7},
  7614. {32 * 1024, 1},
  7615. {8 * 1024, 2},
  7616. {16 * 1024, 1},
  7617. },
  7618. .block_erase = erase_block_82802ab,
  7619. }
  7620. },
  7621. .unlock = unlock_49lfxxxc,
  7622. .write = write_82802ab,
  7623. .read = read_memmapped,
  7624. .voltage = {3000, 3600},
  7625. },
  7626. {
  7627. .vendor = "SST",
  7628. .name = "SST49LF008A",
  7629. .bustype = BUS_FWH, /* A/A Mux */
  7630. .manufacture_id = SST_ID,
  7631. .model_id = SST_SST49LF008A,
  7632. .total_size = 1024,
  7633. .page_size = 64 * 1024,
  7634. .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
  7635. .tested = TEST_OK_PREW,
  7636. .probe = probe_jedec,
  7637. .probe_timing = 1, /* 150 ns */
  7638. .block_erasers =
  7639. {
  7640. {
  7641. .eraseblocks = { {4 * 1024, 256} },
  7642. .block_erase = erase_sector_jedec,
  7643. }, {
  7644. .eraseblocks = { {64 * 1024, 16} },
  7645. .block_erase = erase_block_jedec,
  7646. }, {
  7647. .eraseblocks = { {1024 * 1024, 1} },
  7648. .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
  7649. }
  7650. },
  7651. .printlock = printlock_sst_fwhub,
  7652. .unlock = unlock_sst_fwhub,
  7653. .write = write_jedec_1,
  7654. .read = read_memmapped,
  7655. .voltage = {3000, 3600},
  7656. },
  7657. {
  7658. .vendor = "SST",
  7659. .name = "SST49LF008C",
  7660. .bustype = BUS_FWH,
  7661. .manufacture_id = SST_ID,
  7662. .model_id = SST_SST49LF008C,
  7663. .total_size = 1024,
  7664. .page_size = 4 * 1024,
  7665. .feature_bits = FEATURE_REGISTERMAP,
  7666. .tested = TEST_UNTESTED,
  7667. .probe = probe_82802ab,
  7668. .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
  7669. .block_erasers =
  7670. {
  7671. {
  7672. .eraseblocks = { {4 * 1024, 256} },
  7673. .block_erase = erase_sector_49lfxxxc,
  7674. }, {
  7675. .eraseblocks = {
  7676. {64 * 1024, 15},
  7677. {32 * 1024, 1},
  7678. {8 * 1024, 2},
  7679. {16 * 1024, 1},
  7680. },
  7681. .block_erase = erase_block_82802ab,
  7682. }
  7683. },
  7684. .unlock = unlock_49lfxxxc,
  7685. .write = write_82802ab,
  7686. .read = read_memmapped,
  7687. .voltage = {3000, 3600},
  7688. },
  7689. {
  7690. .vendor = "SST",
  7691. .name = "SST49LF016C",
  7692. .bustype = BUS_FWH,
  7693. .manufacture_id = SST_ID,
  7694. .model_id = SST_SST49LF016C,
  7695. .total_size = 2048,
  7696. .page_size = 4 * 1024,
  7697. .feature_bits = FEATURE_REGISTERMAP,
  7698. .tested = TEST_OK_PR,
  7699. .probe = probe_82802ab,
  7700. .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
  7701. .block_erasers =
  7702. {
  7703. {
  7704. .eraseblocks = { {4 * 1024, 512} },
  7705. .block_erase = erase_sector_49lfxxxc,
  7706. }, {
  7707. .eraseblocks = {
  7708. {64 * 1024, 31},
  7709. {32 * 1024, 1},
  7710. {8 * 1024, 2},
  7711. {16 * 1024, 1},
  7712. },
  7713. .block_erase = erase_block_82802ab,
  7714. }
  7715. },
  7716. .unlock = unlock_49lfxxxc,
  7717. .write = write_82802ab,
  7718. .read = read_memmapped,
  7719. .voltage = {3000, 3600},
  7720. },
  7721. {
  7722. .vendor = "SST",
  7723. .name = "SST49LF020",
  7724. .bustype = BUS_LPC,
  7725. .manufacture_id = SST_ID,
  7726. .model_id = SST_SST49LF020,
  7727. .total_size = 256,
  7728. .page_size = 16 * 1024,
  7729. .feature_bits = FEATURE_EITHER_RESET,
  7730. .tested = TEST_OK_PRE,
  7731. .probe = probe_jedec,
  7732. .probe_timing = 1, /* 150 ns */
  7733. .block_erasers =
  7734. {
  7735. {
  7736. .eraseblocks = { {4 * 1024, 64} },
  7737. .block_erase = erase_sector_jedec,
  7738. }, {
  7739. .eraseblocks = { {16 * 1024, 16} },
  7740. .block_erase = erase_block_jedec,
  7741. }, {
  7742. .eraseblocks = { {256 * 1024, 1} },
  7743. .block_erase = NULL,
  7744. }
  7745. },
  7746. .write = write_jedec_1,
  7747. .read = read_memmapped,
  7748. .voltage = {3000, 3600},
  7749. },
  7750. {
  7751. .vendor = "SST",
  7752. .name = "SST49LF020A",
  7753. .bustype = BUS_LPC,
  7754. .manufacture_id = SST_ID,
  7755. .model_id = SST_SST49LF020A,
  7756. .total_size = 256,
  7757. .page_size = 4 * 1024,
  7758. .feature_bits = FEATURE_EITHER_RESET,
  7759. .tested = TEST_OK_PRE,
  7760. .probe = probe_jedec,
  7761. .probe_timing = 1, /* 150 ns */
  7762. .block_erasers =
  7763. {
  7764. {
  7765. .eraseblocks = { {4 * 1024, 64} },
  7766. .block_erase = erase_sector_jedec,
  7767. }, {
  7768. .eraseblocks = { {16 * 1024, 16} },
  7769. .block_erase = erase_block_jedec,
  7770. }, {
  7771. .eraseblocks = { {256 * 1024, 1} },
  7772. .block_erase = NULL,
  7773. }
  7774. },
  7775. .write = write_jedec_1,
  7776. .read = read_memmapped,
  7777. .voltage = {3000, 3600},
  7778. },
  7779. {
  7780. .vendor = "SST",
  7781. .name = "SST49LF040",
  7782. .bustype = BUS_LPC,
  7783. .manufacture_id = SST_ID,
  7784. .model_id = SST_SST49LF040,
  7785. .total_size = 512,
  7786. .page_size = 4096,
  7787. .feature_bits = FEATURE_EITHER_RESET,
  7788. .tested = TEST_OK_PRE,
  7789. .probe = probe_jedec,
  7790. .probe_timing = 1, /* 150 ns */
  7791. .block_erasers =
  7792. {
  7793. {
  7794. .eraseblocks = { {4 * 1024, 128} },
  7795. .block_erase = erase_sector_jedec,
  7796. }, {
  7797. .eraseblocks = { {64 * 1024, 8} },
  7798. .block_erase = erase_block_jedec,
  7799. }, {
  7800. .eraseblocks = { {512 * 1024, 1} },
  7801. .block_erase = NULL,
  7802. }
  7803. },
  7804. .write = write_jedec_1,
  7805. .read = read_memmapped,
  7806. .voltage = {3000, 3600},
  7807. },
  7808. {
  7809. .vendor = "SST",
  7810. .name = "SST49LF040B",
  7811. .bustype = BUS_LPC, /* A/A Mux */
  7812. .manufacture_id = SST_ID,
  7813. .model_id = SST_SST49LF040B,
  7814. .total_size = 512,
  7815. .page_size = 64 * 1024,
  7816. .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
  7817. .tested = TEST_OK_PREW,
  7818. .probe = probe_jedec,
  7819. .probe_timing = 1, /* 150ns */
  7820. .block_erasers =
  7821. {
  7822. {
  7823. .eraseblocks = { {4 * 1024, 128} },
  7824. .block_erase = erase_sector_jedec,
  7825. }, {
  7826. .eraseblocks = { {64 * 1024, 8} },
  7827. .block_erase = erase_block_jedec,
  7828. }, {
  7829. .eraseblocks = { {512 * 1024, 1} },
  7830. .block_erase = NULL,
  7831. }
  7832. },
  7833. .unlock = unlock_82802ab,
  7834. .write = write_jedec_1,
  7835. .read = read_memmapped,
  7836. .voltage = {3000, 3600},
  7837. },
  7838. {
  7839. .vendor = "SST",
  7840. .name = "SST49LF080A",
  7841. .bustype = BUS_LPC, /* A/A Mux */
  7842. .manufacture_id = SST_ID,
  7843. .model_id = SST_SST49LF080A,
  7844. .total_size = 1024,
  7845. .page_size = 4096,
  7846. .feature_bits = FEATURE_EITHER_RESET,
  7847. .tested = TEST_OK_PRE,
  7848. .probe = probe_jedec,
  7849. .probe_timing = TIMING_FIXME,
  7850. .block_erasers =
  7851. {
  7852. {
  7853. .eraseblocks = { {4 * 1024, 256} },
  7854. .block_erase = erase_sector_jedec,
  7855. }, {
  7856. .eraseblocks = { {64 * 1024, 16} },
  7857. .block_erase = erase_block_jedec,
  7858. }, {
  7859. .eraseblocks = { {1024 * 1024, 1} },
  7860. .block_erase = NULL,
  7861. }
  7862. },
  7863. .write = write_jedec_1,
  7864. .read = read_memmapped,
  7865. .voltage = {3000, 3600},
  7866. },
  7867. {
  7868. .vendor = "SST",
  7869. .name = "SST49LF160C",
  7870. .bustype = BUS_LPC,
  7871. .manufacture_id = SST_ID,
  7872. .model_id = SST_SST49LF160C,
  7873. .total_size = 2048,
  7874. .page_size = 4 * 1024,
  7875. .feature_bits = FEATURE_REGISTERMAP,
  7876. .tested = TEST_OK_PRE,
  7877. .probe = probe_82802ab,
  7878. .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
  7879. .block_erasers =
  7880. {
  7881. {
  7882. .eraseblocks = { {4 * 1024, 512} },
  7883. .block_erase = erase_sector_49lfxxxc,
  7884. }, {
  7885. .eraseblocks = {
  7886. {64 * 1024, 31},
  7887. {32 * 1024, 1},
  7888. {8 * 1024, 2},
  7889. {16 * 1024, 1},
  7890. },
  7891. .block_erase = erase_block_82802ab,
  7892. }
  7893. },
  7894. .unlock = unlock_49lfxxxc,
  7895. .write = write_82802ab,
  7896. .read = read_memmapped,
  7897. .voltage = {3000, 3600},
  7898. },
  7899. {
  7900. .vendor = "ST",
  7901. .name = "M25P05-A",
  7902. .bustype = BUS_SPI,
  7903. .manufacture_id = ST_ID,
  7904. .model_id = ST_M25P05A,
  7905. .total_size = 64,
  7906. .page_size = 256,
  7907. .feature_bits = FEATURE_UNBOUND_READ,
  7908. .tested = TEST_UNTESTED,
  7909. .probe = probe_spi_rdid,
  7910. .probe_timing = TIMING_ZERO,
  7911. .block_erasers =
  7912. {
  7913. {
  7914. .eraseblocks = { {32 * 1024, 2} },
  7915. .block_erase = spi_block_erase_d8,
  7916. }, {
  7917. .eraseblocks = { {64 * 1024, 1} },
  7918. .block_erase = spi_block_erase_c7,
  7919. }
  7920. },
  7921. .unlock = spi_disable_blockprotect,
  7922. .write = spi_chip_write_256,
  7923. .read = spi_chip_read,
  7924. .voltage = {2700, 3600},
  7925. },
  7926. /* The ST M25P05 is a bit of a problem. It has the same ID as the
  7927. * ST M25P05-A in RES mode, but supports only 128 byte writes instead
  7928. * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
  7929. * only is successful if RDID does not work.
  7930. */
  7931. {
  7932. .vendor = "ST",
  7933. .name = "M25P05",
  7934. .bustype = BUS_SPI,
  7935. .manufacture_id = 0, /* Not used. */
  7936. .model_id = ST_M25P05_RES,
  7937. .total_size = 64,
  7938. .page_size = 256,
  7939. .feature_bits = FEATURE_UNBOUND_READ,
  7940. .tested = TEST_UNTESTED,
  7941. .probe = probe_spi_res1,
  7942. .probe_timing = TIMING_ZERO,
  7943. .block_erasers =
  7944. {
  7945. {
  7946. .eraseblocks = { {32 * 1024, 2} },
  7947. .block_erase = spi_block_erase_d8,
  7948. }, {
  7949. .eraseblocks = { {64 * 1024, 1} },
  7950. .block_erase = spi_block_erase_c7,
  7951. }
  7952. },
  7953. .unlock = spi_disable_blockprotect,
  7954. .write = spi_chip_write_1, /* 128 */
  7955. .read = spi_chip_read,
  7956. .voltage = {2700, 3600},
  7957. },
  7958. {
  7959. .vendor = "ST",
  7960. .name = "M25P10-A",
  7961. .bustype = BUS_SPI,
  7962. .manufacture_id = ST_ID,
  7963. .model_id = ST_M25P10A,
  7964. .total_size = 128,
  7965. .page_size = 256,
  7966. .feature_bits = FEATURE_UNBOUND_READ,
  7967. .tested = TEST_OK_PREU,
  7968. .probe = probe_spi_rdid,
  7969. .probe_timing = TIMING_ZERO,
  7970. .block_erasers =
  7971. {
  7972. {
  7973. .eraseblocks = { {32 * 1024, 4} },
  7974. .block_erase = spi_block_erase_d8,
  7975. }, {
  7976. .eraseblocks = { {128 * 1024, 1} },
  7977. .block_erase = spi_block_erase_c7,
  7978. }
  7979. },
  7980. .unlock = spi_disable_blockprotect,
  7981. .write = spi_chip_write_256,
  7982. .read = spi_chip_read,
  7983. .voltage = {2700, 3600},
  7984. },
  7985. /* The ST M25P10 has the same problem as the M25P05. */
  7986. {
  7987. .vendor = "ST",
  7988. .name = "M25P10",
  7989. .bustype = BUS_SPI,
  7990. .manufacture_id = 0, /* Not used. */
  7991. .model_id = ST_M25P10_RES,
  7992. .total_size = 128,
  7993. .page_size = 256,
  7994. .feature_bits = FEATURE_UNBOUND_READ,
  7995. .tested = TEST_UNTESTED,
  7996. .probe = probe_spi_res1,
  7997. .probe_timing = TIMING_ZERO,
  7998. .block_erasers =
  7999. {
  8000. {
  8001. .eraseblocks = { {32 * 1024, 4} },
  8002. .block_erase = spi_block_erase_d8,
  8003. }, {
  8004. .eraseblocks = { {128 * 1024, 1} },
  8005. .block_erase = spi_block_erase_c7,
  8006. }
  8007. },
  8008. .unlock = spi_disable_blockprotect,
  8009. .write = spi_chip_write_1, /* 128 */
  8010. .read = spi_chip_read,
  8011. .voltage = {2700, 3600},
  8012. },
  8013. {
  8014. .vendor = "ST",
  8015. .name = "M25P20",
  8016. .bustype = BUS_SPI,
  8017. .manufacture_id = ST_ID,
  8018. .model_id = ST_M25P20,
  8019. .total_size = 256,
  8020. .page_size = 256,
  8021. .feature_bits = FEATURE_UNBOUND_READ,
  8022. .tested = TEST_UNTESTED,
  8023. .probe = probe_spi_rdid,
  8024. .probe_timing = TIMING_ZERO,
  8025. .block_erasers =
  8026. {
  8027. {
  8028. .eraseblocks = { {64 * 1024, 4} },
  8029. .block_erase = spi_block_erase_d8,
  8030. }, {
  8031. .eraseblocks = { {256 * 1024, 1} },
  8032. .block_erase = spi_block_erase_c7,
  8033. }
  8034. },
  8035. .unlock = spi_disable_blockprotect,
  8036. .write = spi_chip_write_256,
  8037. .read = spi_chip_read,
  8038. .voltage = {2700, 3600},
  8039. },
  8040. {
  8041. .vendor = "ST", /* Numonyx */
  8042. .name = "M25P40",
  8043. .bustype = BUS_SPI,
  8044. .manufacture_id = ST_ID,
  8045. .model_id = ST_M25P40,
  8046. .total_size = 512,
  8047. .page_size = 256,
  8048. .feature_bits = FEATURE_UNBOUND_READ,
  8049. .tested = TEST_OK_PREWU,
  8050. .probe = probe_spi_rdid,
  8051. .probe_timing = TIMING_ZERO,
  8052. .block_erasers =
  8053. {
  8054. {
  8055. .eraseblocks = { {64 * 1024, 8} },
  8056. .block_erase = spi_block_erase_d8,
  8057. }, {
  8058. .eraseblocks = { {512 * 1024, 1} },
  8059. .block_erase = spi_block_erase_c7,
  8060. }
  8061. },
  8062. .unlock = spi_disable_blockprotect,
  8063. .write = spi_chip_write_256,
  8064. .read = spi_chip_read,
  8065. .voltage = {2700, 3600},
  8066. },
  8067. {
  8068. .vendor = "ST",
  8069. .name = "M25P40-old",
  8070. .bustype = BUS_SPI,
  8071. .manufacture_id = 0, /* Not used. */
  8072. .model_id = ST_M25P40_RES,
  8073. .total_size = 512,
  8074. .page_size = 256,
  8075. .feature_bits = FEATURE_UNBOUND_READ,
  8076. .tested = TEST_UNTESTED,
  8077. .probe = probe_spi_res1,
  8078. .probe_timing = TIMING_ZERO,
  8079. .block_erasers =
  8080. {
  8081. {
  8082. .eraseblocks = { {64 * 1024, 8} },
  8083. .block_erase = spi_block_erase_d8,
  8084. }, {
  8085. .eraseblocks = { {512 * 1024, 1} },
  8086. .block_erase = spi_block_erase_c7,
  8087. }
  8088. },
  8089. .unlock = spi_disable_blockprotect,
  8090. .write = spi_chip_write_256,
  8091. .read = spi_chip_read,
  8092. },
  8093. {
  8094. .vendor = "ST",
  8095. .name = "M25P80",
  8096. .bustype = BUS_SPI,
  8097. .manufacture_id = ST_ID,
  8098. .model_id = ST_M25P80,
  8099. .total_size = 1024,
  8100. .page_size = 256,
  8101. .feature_bits = FEATURE_UNBOUND_READ,
  8102. .tested = TEST_OK_PREWU,
  8103. .probe = probe_spi_rdid,
  8104. .probe_timing = TIMING_ZERO,
  8105. .block_erasers =
  8106. {
  8107. {
  8108. .eraseblocks = { {64 * 1024, 16} },
  8109. .block_erase = spi_block_erase_d8,
  8110. }, {
  8111. .eraseblocks = { {1024 * 1024, 1} },
  8112. .block_erase = spi_block_erase_c7,
  8113. }
  8114. },
  8115. .unlock = spi_disable_blockprotect,
  8116. .write = spi_chip_write_256,
  8117. .read = spi_chip_read,
  8118. .voltage = {2700, 3600},
  8119. },
  8120. {
  8121. .vendor = "ST",
  8122. .name = "M25P16",
  8123. .bustype = BUS_SPI,
  8124. .manufacture_id = ST_ID,
  8125. .model_id = ST_M25P16,
  8126. .total_size = 2048,
  8127. .page_size = 256,
  8128. .feature_bits = FEATURE_UNBOUND_READ,
  8129. .tested = TEST_OK_PRU,
  8130. .probe = probe_spi_rdid,
  8131. .probe_timing = TIMING_ZERO,
  8132. .block_erasers =
  8133. {
  8134. {
  8135. .eraseblocks = { {64 * 1024, 32} },
  8136. .block_erase = spi_block_erase_d8,
  8137. }, {
  8138. .eraseblocks = { {2 * 1024 * 1024, 1} },
  8139. .block_erase = spi_block_erase_c7,
  8140. }
  8141. },
  8142. .unlock = spi_disable_blockprotect,
  8143. .write = spi_chip_write_256,
  8144. .read = spi_chip_read,
  8145. .voltage = {2700, 3600},
  8146. },
  8147. {
  8148. .vendor = "ST",
  8149. .name = "M25P32",
  8150. .bustype = BUS_SPI,
  8151. .manufacture_id = ST_ID,
  8152. .model_id = ST_M25P32,
  8153. .total_size = 4096,
  8154. .page_size = 256,
  8155. .feature_bits = FEATURE_UNBOUND_READ,
  8156. .tested = TEST_OK_PREWU,
  8157. .probe = probe_spi_rdid,
  8158. .probe_timing = TIMING_ZERO,
  8159. .block_erasers =
  8160. {
  8161. {
  8162. .eraseblocks = { {64 * 1024, 64} },
  8163. .block_erase = spi_block_erase_d8,
  8164. }, {
  8165. .eraseblocks = { {4 * 1024 * 1024, 1} },
  8166. .block_erase = spi_block_erase_c7,
  8167. }
  8168. },
  8169. .unlock = spi_disable_blockprotect,
  8170. .write = spi_chip_write_256,
  8171. .read = spi_chip_read,
  8172. .voltage = {2700, 3600},
  8173. },
  8174. {
  8175. .vendor = "ST",
  8176. .name = "M25P64",
  8177. .bustype = BUS_SPI,
  8178. .manufacture_id = ST_ID,
  8179. .model_id = ST_M25P64,
  8180. .total_size = 8192,
  8181. .page_size = 256,
  8182. .feature_bits = FEATURE_UNBOUND_READ,
  8183. .tested = TEST_UNTESTED,
  8184. .probe = probe_spi_rdid,
  8185. .probe_timing = TIMING_ZERO,
  8186. .block_erasers =
  8187. {
  8188. {
  8189. .eraseblocks = { {64 * 1024, 128} },
  8190. .block_erase = spi_block_erase_d8,
  8191. }, {
  8192. .eraseblocks = { {8 * 1024 * 1024, 1} },
  8193. .block_erase = spi_block_erase_c7,
  8194. }
  8195. },
  8196. .unlock = spi_disable_blockprotect,
  8197. .write = spi_chip_write_256,
  8198. .read = spi_chip_read,
  8199. .voltage = {2700, 3600},
  8200. },
  8201. {
  8202. .vendor = "ST",
  8203. .name = "M25P128",
  8204. .bustype = BUS_SPI,
  8205. .manufacture_id = ST_ID,
  8206. .model_id = ST_M25P128,
  8207. .total_size = 16384,
  8208. .page_size = 256,
  8209. .feature_bits = FEATURE_UNBOUND_READ,
  8210. .tested = TEST_OK_PREWU,
  8211. .probe = probe_spi_rdid,
  8212. .probe_timing = TIMING_ZERO,
  8213. .block_erasers =
  8214. {
  8215. {
  8216. .eraseblocks = { {256 * 1024, 64} },
  8217. .block_erase = spi_block_erase_d8,
  8218. }, {
  8219. .eraseblocks = { {16 * 1024 * 1024, 1} },
  8220. .block_erase = spi_block_erase_c7,
  8221. }
  8222. },
  8223. .unlock = spi_disable_blockprotect,
  8224. .write = spi_chip_write_256,
  8225. .read = spi_chip_read,
  8226. .voltage = {2700, 3600},
  8227. },
  8228. {
  8229. .vendor = "ST",
  8230. .name = "M25PX16",
  8231. .bustype = BUS_SPI,
  8232. .manufacture_id = ST_ID,
  8233. .model_id = ST_M25PX16,
  8234. .total_size = 2048,
  8235. .page_size = 256,
  8236. /* OTP: 64B total; read 0x4B; write 0x42 */
  8237. .feature_bits = FEATURE_UNBOUND_READ | FEATURE_OTP,
  8238. .tested = TEST_OK_PREWU,
  8239. .probe = probe_spi_rdid,
  8240. .probe_timing = TIMING_ZERO,
  8241. .block_erasers =
  8242. {
  8243. {
  8244. .eraseblocks = { { 4 * 1024, 512 } },
  8245. .block_erase = spi_block_erase_20,
  8246. }, {
  8247. .eraseblocks = { {64 * 1024, 32} },
  8248. .block_erase = spi_block_erase_d8,
  8249. }, {
  8250. .eraseblocks = { {2 * 1024 * 1024, 1} },
  8251. .block_erase = spi_block_erase_c7,
  8252. }
  8253. },
  8254. .unlock = spi_disable_blockprotect,
  8255. .write = spi_chip_write_256,
  8256. .read = spi_chip_read,
  8257. },
  8258. {
  8259. .vendor = "ST",
  8260. .name = "M25PX32",
  8261. .bustype = BUS_SPI,
  8262. .manufacture_id = ST_ID,
  8263. .model_id = ST_M25PX32,
  8264. .total_size = 4096,
  8265. .page_size = 256,
  8266. .feature_bits = FEATURE_UNBOUND_READ,
  8267. .tested = TEST_OK_PREU,
  8268. .probe = probe_spi_rdid,
  8269. .probe_timing = TIMING_ZERO,
  8270. .block_erasers =
  8271. {
  8272. {
  8273. .eraseblocks = { { 4 * 1024, 1024 } },
  8274. .block_erase = spi_block_erase_20,
  8275. }, {
  8276. .eraseblocks = { {64 * 1024, 64} },
  8277. .block_erase = spi_block_erase_d8,
  8278. }, {
  8279. .eraseblocks = { {4 * 1024 * 1024, 1} },
  8280. .block_erase = spi_block_erase_c7,
  8281. }
  8282. },
  8283. .unlock = spi_disable_blockprotect,
  8284. .write = spi_chip_write_256,
  8285. .read = spi_chip_read,
  8286. .voltage = {2700, 3600},
  8287. },
  8288. {
  8289. .vendor = "ST",
  8290. .name = "M25PX64",
  8291. .bustype = BUS_SPI,
  8292. .manufacture_id = ST_ID,
  8293. .model_id = ST_M25PX64,
  8294. .total_size = 8192,
  8295. .page_size = 256,
  8296. .feature_bits = FEATURE_UNBOUND_READ,
  8297. .tested = TEST_OK_PREU,
  8298. .probe = probe_spi_rdid,
  8299. .probe_timing = TIMING_ZERO,
  8300. .block_erasers =
  8301. {
  8302. {
  8303. .eraseblocks = { { 4 * 1024, 2048 } },
  8304. .block_erase = spi_block_erase_20,
  8305. }, {
  8306. .eraseblocks = { {64 * 1024, 128} },
  8307. .block_erase = spi_block_erase_d8,
  8308. }, {
  8309. .eraseblocks = { {8 * 1024 * 1024, 1} },
  8310. .block_erase = spi_block_erase_c7,
  8311. }
  8312. },
  8313. .unlock = spi_disable_blockprotect,
  8314. .write = spi_chip_write_256,
  8315. .read = spi_chip_read,
  8316. },
  8317. {
  8318. .vendor = "ST",
  8319. .name = "M25PX32",
  8320. .bustype = BUS_SPI,
  8321. .manufacture_id = ST_ID,
  8322. .model_id = ST_M25PX32,
  8323. .total_size = 4096,
  8324. .page_size = 256,
  8325. .feature_bits = FEATURE_UNBOUND_READ,
  8326. .tested = TEST_OK_PREU,
  8327. .probe = probe_spi_rdid,
  8328. .probe_timing = TIMING_ZERO,
  8329. .block_erasers =
  8330. {
  8331. {
  8332. .eraseblocks = { { 4 * 1024, 1024 } },
  8333. .block_erase = spi_block_erase_20,
  8334. }, {
  8335. .eraseblocks = { {64 * 1024, 64} },
  8336. .block_erase = spi_block_erase_d8,
  8337. }, {
  8338. .eraseblocks = { {4 * 1024 * 1024, 1} },
  8339. .block_erase = spi_block_erase_c7,
  8340. }
  8341. },
  8342. .unlock = spi_disable_blockprotect,
  8343. .write = spi_chip_write_256,
  8344. .read = spi_chip_read,
  8345. },
  8346. {
  8347. .vendor = "ST",
  8348. .name = "M25PX64",
  8349. .bustype = BUS_SPI,
  8350. .manufacture_id = ST_ID,
  8351. .model_id = ST_M25PX64,
  8352. .total_size = 8192,
  8353. .page_size = 256,
  8354. .feature_bits = FEATURE_UNBOUND_READ,
  8355. .tested = TEST_OK_PREU,
  8356. .probe = probe_spi_rdid,
  8357. .probe_timing = TIMING_ZERO,
  8358. .block_erasers =
  8359. {
  8360. {
  8361. .eraseblocks = { { 4 * 1024, 2048 } },
  8362. .block_erase = spi_block_erase_20,
  8363. }, {
  8364. .eraseblocks = { {64 * 1024, 128} },
  8365. .block_erase = spi_block_erase_d8,
  8366. }, {
  8367. .eraseblocks = { {8 * 1024 * 1024, 1} },
  8368. .block_erase = spi_block_erase_c7,
  8369. }
  8370. },
  8371. .unlock = spi_disable_blockprotect,
  8372. .write = spi_chip_write_256,
  8373. .read = spi_chip_read,
  8374. },
  8375. {
  8376. .vendor = "ST",
  8377. .name = "M29F002B",
  8378. .bustype = BUS_PARALLEL,
  8379. .manufacture_id = ST_ID,
  8380. .model_id = ST_M29F002B,
  8381. .total_size = 256,
  8382. .page_size = 64 * 1024,
  8383. .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
  8384. .tested = TEST_UNTESTED,
  8385. .probe = probe_jedec,
  8386. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  8387. .block_erasers =
  8388. {
  8389. {
  8390. .eraseblocks = {
  8391. {16 * 1024, 1},
  8392. {8 * 1024, 2},
  8393. {32 * 1024, 1},
  8394. {64 * 1024, 3},
  8395. },
  8396. .block_erase = erase_sector_jedec,
  8397. }, {
  8398. .eraseblocks = { {256 * 1024, 1} },
  8399. .block_erase = erase_chip_block_jedec,
  8400. }
  8401. },
  8402. .write = write_jedec_1,
  8403. .read = read_memmapped,
  8404. .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
  8405. },
  8406. {
  8407. .vendor = "ST",
  8408. .name = "M29F002T/NT",
  8409. .bustype = BUS_PARALLEL,
  8410. .manufacture_id = ST_ID,
  8411. .model_id = ST_M29F002T,
  8412. .total_size = 256,
  8413. .page_size = 64 * 1024,
  8414. .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
  8415. .tested = TEST_UNTESTED,
  8416. .probe = probe_jedec,
  8417. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  8418. .block_erasers =
  8419. {
  8420. {
  8421. .eraseblocks = {
  8422. {64 * 1024, 3},
  8423. {32 * 1024, 1},
  8424. {8 * 1024, 2},
  8425. {16 * 1024, 1},
  8426. },
  8427. .block_erase = erase_sector_jedec,
  8428. }, {
  8429. .eraseblocks = { {256 * 1024, 1} },
  8430. .block_erase = erase_chip_block_jedec,
  8431. }
  8432. },
  8433. .write = write_jedec_1,
  8434. .read = read_memmapped,
  8435. .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
  8436. },
  8437. {
  8438. .vendor = "ST",
  8439. .name = "M29F040B",
  8440. .bustype = BUS_PARALLEL,
  8441. .manufacture_id = ST_ID,
  8442. .model_id = ST_M29F040B,
  8443. .total_size = 512,
  8444. .page_size = 64 * 1024,
  8445. .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
  8446. .tested = TEST_UNTESTED,
  8447. .probe = probe_jedec,
  8448. .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
  8449. .block_erasers =
  8450. {
  8451. {
  8452. .eraseblocks = { {64 * 1024, 8}, },
  8453. .block_erase = erase_sector_jedec,
  8454. }, {
  8455. .eraseblocks = { {512 * 1024, 1} },
  8456. .block_erase = erase_chip_block_jedec,
  8457. }
  8458. },
  8459. .write = write_jedec_1,
  8460. .read = read_memmapped,
  8461. .voltage = {4500, 5500},
  8462. },
  8463. {
  8464. /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
  8465. .vendor = "ST",
  8466. .name = "M29F400BB",
  8467. .bustype = BUS_PARALLEL,
  8468. .manufacture_id = ST_ID,
  8469. .model_id = ST_M29F400BB,
  8470. .total_size = 512,
  8471. .page_size = 64 * 1024,
  8472. .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
  8473. .tested = TEST_UNTESTED,
  8474. .probe = probe_m29f400bt,
  8475. .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
  8476. .block_erasers =
  8477. {
  8478. {
  8479. .eraseblocks = {
  8480. {16 * 1024, 1},
  8481. {8 * 1024, 2},
  8482. {32 * 1024, 1},
  8483. {64 * 1024, 7},
  8484. },
  8485. .block_erase = block_erase_m29f400bt,
  8486. }, {
  8487. .eraseblocks = { {512 * 1024, 1} },
  8488. .block_erase = block_erase_chip_m29f400bt,
  8489. }
  8490. },
  8491. .write = write_m29f400bt,
  8492. .read = read_memmapped,
  8493. .voltage = {4500, 5500},
  8494. },
  8495. {
  8496. /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
  8497. .vendor = "ST",
  8498. .name = "M29F400BT",
  8499. .bustype = BUS_PARALLEL,
  8500. .manufacture_id = ST_ID,
  8501. .model_id = ST_M29F400BT,
  8502. .total_size = 512,
  8503. .page_size = 64 * 1024,
  8504. .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
  8505. .tested = TEST_UNTESTED,
  8506. .probe = probe_m29f400bt,
  8507. .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
  8508. .block_erasers =
  8509. {
  8510. {
  8511. .eraseblocks = {
  8512. {64 * 1024, 7},
  8513. {32 * 1024, 1},
  8514. {8 * 1024, 2},
  8515. {16 * 1024, 1},
  8516. },
  8517. .block_erase = block_erase_m29f400bt,
  8518. }, {
  8519. .eraseblocks = { {512 * 1024, 1} },
  8520. .block_erase = block_erase_chip_m29f400bt,
  8521. }
  8522. },
  8523. .write = write_m29f400bt,
  8524. .read = read_memmapped,
  8525. .voltage = {4500, 5500},
  8526. },
  8527. {
  8528. .vendor = "ST",
  8529. .name = "M29W010B",
  8530. .bustype = BUS_PARALLEL,
  8531. .manufacture_id = ST_ID,
  8532. .model_id = ST_M29W010B,
  8533. .total_size = 128,
  8534. .page_size = 16 * 1024,
  8535. .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
  8536. .tested = TEST_UNTESTED,
  8537. .probe = probe_jedec,
  8538. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  8539. .block_erasers =
  8540. {
  8541. {
  8542. .eraseblocks = { {16 * 1024, 8}, },
  8543. .block_erase = erase_sector_jedec,
  8544. }, {
  8545. .eraseblocks = { {128 * 1024, 1} },
  8546. .block_erase = erase_chip_block_jedec,
  8547. }
  8548. },
  8549. .write = write_jedec_1,
  8550. .read = read_memmapped,
  8551. .voltage = {2700, 3600},
  8552. },
  8553. {
  8554. .vendor = "ST",
  8555. .name = "M29W040B",
  8556. .bustype = BUS_PARALLEL,
  8557. .manufacture_id = ST_ID,
  8558. .model_id = ST_M29W040B,
  8559. .total_size = 512,
  8560. .page_size = 64 * 1024,
  8561. .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
  8562. .tested = TEST_UNTESTED,
  8563. .probe = probe_jedec,
  8564. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  8565. .block_erasers =
  8566. {
  8567. {
  8568. .eraseblocks = { {64 * 1024, 8}, },
  8569. .block_erase = erase_sector_jedec,
  8570. }, {
  8571. .eraseblocks = { {512 * 1024, 1} },
  8572. .block_erase = erase_chip_block_jedec,
  8573. }
  8574. },
  8575. .write = write_jedec_1,
  8576. .read = read_memmapped,
  8577. .voltage = {2700, 3600},
  8578. },
  8579. {
  8580. .vendor = "ST",
  8581. .name = "M29W512B",
  8582. .bustype = BUS_PARALLEL,
  8583. .manufacture_id = ST_ID,
  8584. .model_id = ST_M29W512B,
  8585. .total_size = 64,
  8586. .page_size = 64 * 1024,
  8587. .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
  8588. .tested = TEST_OK_PRE,
  8589. .probe = probe_jedec,
  8590. .probe_timing = TIMING_ZERO,
  8591. .block_erasers =
  8592. {
  8593. {
  8594. .eraseblocks = { {64 * 1024, 1} },
  8595. .block_erase = erase_chip_block_jedec,
  8596. }
  8597. },
  8598. .write = write_jedec_1,
  8599. .read = read_memmapped,
  8600. .voltage = {2700, 3600},
  8601. },
  8602. {
  8603. .vendor = "ST",
  8604. .name = "M50FLW040A",
  8605. .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
  8606. .manufacture_id = ST_ID,
  8607. .model_id = ST_M50FLW040A,
  8608. .total_size = 512,
  8609. .page_size = 64 * 1024,
  8610. .feature_bits = FEATURE_REGISTERMAP,
  8611. .tested = TEST_UNTESTED,
  8612. .probe = probe_82802ab,
  8613. .probe_timing = TIMING_FIXME,
  8614. .block_erasers =
  8615. {
  8616. {
  8617. .eraseblocks = {
  8618. {4 * 1024, 16}, /* sector */
  8619. {64 * 1024, 5}, /* block */
  8620. {4 * 1024, 16}, /* sector */
  8621. {4 * 1024, 16}, /* sector */
  8622. },
  8623. .block_erase = NULL,
  8624. }, {
  8625. .eraseblocks = { {64 * 1024, 8}, },
  8626. .block_erase = erase_block_82802ab,
  8627. }
  8628. },
  8629. .unlock = unlock_stm50flw0x0x,
  8630. .write = write_82802ab,
  8631. .read = read_memmapped,
  8632. .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
  8633. },
  8634. {
  8635. .vendor = "ST",
  8636. .name = "M50FLW040B",
  8637. .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
  8638. .manufacture_id = ST_ID,
  8639. .model_id = ST_M50FLW040B,
  8640. .total_size = 512,
  8641. .page_size = 64 * 1024,
  8642. .feature_bits = FEATURE_REGISTERMAP,
  8643. .tested = TEST_UNTESTED,
  8644. .probe = probe_82802ab,
  8645. .probe_timing = TIMING_FIXME,
  8646. .block_erasers =
  8647. {
  8648. {
  8649. .eraseblocks = {
  8650. {4 * 1024, 16}, /* sector */
  8651. {4 * 1024, 16}, /* sector */
  8652. {64 * 1024, 5}, /* block */
  8653. {4 * 1024, 16}, /* sector */
  8654. },
  8655. .block_erase = NULL,
  8656. }, {
  8657. .eraseblocks = { {64 * 1024, 8}, },
  8658. .block_erase = erase_block_82802ab,
  8659. }
  8660. },
  8661. .unlock = unlock_stm50flw0x0x,
  8662. .write = write_82802ab,
  8663. .read = read_memmapped,
  8664. .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
  8665. },
  8666. {
  8667. .vendor = "ST",
  8668. .name = "M50FLW080A",
  8669. .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
  8670. .manufacture_id = ST_ID,
  8671. .model_id = ST_M50FLW080A,
  8672. .total_size = 1024,
  8673. .page_size = 64 * 1024,
  8674. .feature_bits = FEATURE_REGISTERMAP,
  8675. .tested = TEST_OK_PRE,
  8676. .probe = probe_82802ab,
  8677. .probe_timing = TIMING_FIXME,
  8678. .block_erasers =
  8679. {
  8680. {
  8681. .eraseblocks = {
  8682. {4 * 1024, 16}, /* sector */
  8683. {64 * 1024, 13}, /* block */
  8684. {4 * 1024, 16}, /* sector */
  8685. {4 * 1024, 16}, /* sector */
  8686. },
  8687. .block_erase = NULL,
  8688. }, {
  8689. .eraseblocks = { {64 * 1024, 16}, },
  8690. .block_erase = erase_block_82802ab,
  8691. }
  8692. },
  8693. .unlock = unlock_stm50flw0x0x,
  8694. .write = write_82802ab,
  8695. .read = read_memmapped,
  8696. .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
  8697. },
  8698. {
  8699. .vendor = "ST",
  8700. .name = "M50FLW080B",
  8701. .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
  8702. .manufacture_id = ST_ID,
  8703. .model_id = ST_M50FLW080B,
  8704. .total_size = 1024,
  8705. .page_size = 64 * 1024,
  8706. .feature_bits = FEATURE_REGISTERMAP,
  8707. .tested = TEST_UNTESTED,
  8708. .probe = probe_82802ab,
  8709. .probe_timing = TIMING_FIXME,
  8710. .block_erasers =
  8711. {
  8712. {
  8713. .eraseblocks = {
  8714. {4 * 1024, 16}, /* sector */
  8715. {4 * 1024, 16}, /* sector */
  8716. {64 * 1024, 13}, /* block */
  8717. {4 * 1024, 16}, /* sector */
  8718. },
  8719. .block_erase = NULL,
  8720. }, {
  8721. .eraseblocks = { {64 * 1024, 16}, },
  8722. .block_erase = erase_block_82802ab,
  8723. }
  8724. },
  8725. .unlock = unlock_stm50flw0x0x,
  8726. .write = write_82802ab,
  8727. .read = read_memmapped,
  8728. .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
  8729. },
  8730. {
  8731. .vendor = "ST",
  8732. .name = "M50FW002",
  8733. .bustype = BUS_FWH, /* A/A Mux */
  8734. .manufacture_id = ST_ID,
  8735. .model_id = ST_M50FW002,
  8736. .total_size = 256,
  8737. .page_size = 64 * 1024,
  8738. .feature_bits = FEATURE_REGISTERMAP,
  8739. .tested = TEST_UNTESTED,
  8740. .probe = probe_82802ab,
  8741. .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
  8742. .block_erasers =
  8743. {
  8744. {
  8745. .eraseblocks = {
  8746. {64 * 1024, 3},
  8747. {32 * 1024, 1},
  8748. {8 * 1024, 2},
  8749. {16 * 1024, 1},
  8750. },
  8751. .block_erase = erase_block_82802ab,
  8752. }
  8753. },
  8754. .unlock = unlock_stm50flw0x0x,
  8755. .write = write_82802ab,
  8756. .read = read_memmapped,
  8757. .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
  8758. },
  8759. {
  8760. .vendor = "ST",
  8761. .name = "M50FW016",
  8762. .bustype = BUS_FWH, /* A/A Mux */
  8763. .manufacture_id = ST_ID,
  8764. .model_id = ST_M50FW016,
  8765. .total_size = 2048,
  8766. .page_size = 64 * 1024,
  8767. .feature_bits = FEATURE_REGISTERMAP,
  8768. .tested = TEST_UNTESTED,
  8769. .probe = probe_82802ab,
  8770. .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
  8771. .block_erasers =
  8772. {
  8773. {
  8774. .eraseblocks = { {64 * 1024, 32}, },
  8775. .block_erase = erase_block_82802ab,
  8776. }
  8777. },
  8778. .unlock = unlock_stm50flw0x0x,
  8779. .write = write_82802ab,
  8780. .read = read_memmapped,
  8781. .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
  8782. },
  8783. {
  8784. .vendor = "ST",
  8785. .name = "M50FW040",
  8786. .bustype = BUS_FWH, /* A/A Mux */
  8787. .manufacture_id = ST_ID,
  8788. .model_id = ST_M50FW040,
  8789. .total_size = 512,
  8790. .page_size = 64 * 1024,
  8791. .feature_bits = FEATURE_REGISTERMAP,
  8792. .tested = TEST_OK_PR,
  8793. .probe = probe_82802ab,
  8794. .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
  8795. .block_erasers =
  8796. {
  8797. {
  8798. .eraseblocks = { {64 * 1024, 8}, },
  8799. .block_erase = erase_block_82802ab,
  8800. }
  8801. },
  8802. .unlock = unlock_stm50flw0x0x,
  8803. .write = write_82802ab,
  8804. .read = read_memmapped,
  8805. .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
  8806. },
  8807. {
  8808. .vendor = "ST",
  8809. .name = "M50FW080",
  8810. .bustype = BUS_FWH, /* A/A Mux */
  8811. .manufacture_id = ST_ID,
  8812. .model_id = ST_M50FW080,
  8813. .total_size = 1024,
  8814. .page_size = 64 * 1024,
  8815. .feature_bits = FEATURE_REGISTERMAP,
  8816. .tested = TEST_OK_PREW,
  8817. .probe = probe_82802ab,
  8818. .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
  8819. .block_erasers =
  8820. {
  8821. {
  8822. .eraseblocks = { {64 * 1024, 16}, },
  8823. .block_erase = erase_block_82802ab,
  8824. }
  8825. },
  8826. .unlock = unlock_stm50flw0x0x,
  8827. .write = write_82802ab,
  8828. .read = read_memmapped,
  8829. .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
  8830. },
  8831. {
  8832. .vendor = "ST",
  8833. .name = "M50LPW116",
  8834. .bustype = BUS_LPC, /* A/A Mux */
  8835. .manufacture_id = ST_ID,
  8836. .model_id = ST_M50LPW116,
  8837. .total_size = 2048,
  8838. .page_size = 64 * 1024,
  8839. .feature_bits = FEATURE_REGISTERMAP,
  8840. .tested = TEST_UNTESTED,
  8841. .probe = probe_82802ab,
  8842. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  8843. .block_erasers =
  8844. {
  8845. {
  8846. .eraseblocks = {
  8847. {4 * 1024, 16},
  8848. {64 * 1024, 30},
  8849. {32 * 1024, 1},
  8850. {8 * 1024, 2},
  8851. {16 * 1024, 1},
  8852. },
  8853. .block_erase = erase_block_82802ab,
  8854. }
  8855. },
  8856. .unlock = unlock_stm50flw0x0x,
  8857. .write = write_82802ab,
  8858. .read = read_memmapped,
  8859. .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
  8860. },
  8861. {
  8862. .vendor = "SyncMOS/MoselVitelic",
  8863. .name = "{F,S,V}29C51001B",
  8864. .bustype = BUS_PARALLEL,
  8865. .manufacture_id = SYNCMOS_MVC_ID,
  8866. .model_id = SM_MVC_29C51001B,
  8867. .total_size = 128,
  8868. .page_size = 512,
  8869. .feature_bits = FEATURE_EITHER_RESET,
  8870. .tested = TEST_UNTESTED,
  8871. .probe = probe_jedec,
  8872. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  8873. .block_erasers =
  8874. {
  8875. {
  8876. .eraseblocks = { {512, 256} },
  8877. .block_erase = erase_sector_jedec,
  8878. }, {
  8879. .eraseblocks = { {128 * 1024, 1} },
  8880. .block_erase = erase_chip_block_jedec,
  8881. },
  8882. },
  8883. .write = write_jedec_1,
  8884. .read = read_memmapped,
  8885. .voltage = {4500, 5500},
  8886. },
  8887. {
  8888. .vendor = "SyncMOS/MoselVitelic",
  8889. .name = "{F,S,V}29C51001T",
  8890. .bustype = BUS_PARALLEL,
  8891. .manufacture_id = SYNCMOS_MVC_ID,
  8892. .model_id = SM_MVC_29C51001T,
  8893. .total_size = 128,
  8894. .page_size = 512,
  8895. .feature_bits = FEATURE_EITHER_RESET,
  8896. .tested = TEST_UNTESTED,
  8897. .probe = probe_jedec,
  8898. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  8899. .block_erasers =
  8900. {
  8901. {
  8902. .eraseblocks = { {512, 256} },
  8903. .block_erase = erase_sector_jedec,
  8904. }, {
  8905. .eraseblocks = { {128 * 1024, 1} },
  8906. .block_erase = erase_chip_block_jedec,
  8907. },
  8908. },
  8909. .write = write_jedec_1,
  8910. .read = read_memmapped,
  8911. .voltage = {4500, 5500},
  8912. },
  8913. {
  8914. .vendor = "SyncMOS/MoselVitelic",
  8915. .name = "{F,S,V}29C51002B",
  8916. .bustype = BUS_PARALLEL,
  8917. .manufacture_id = SYNCMOS_MVC_ID,
  8918. .model_id = SM_MVC_29C51002B,
  8919. .total_size = 256,
  8920. .page_size = 512,
  8921. .feature_bits = FEATURE_EITHER_RESET,
  8922. .tested = TEST_UNTESTED,
  8923. .probe = probe_jedec,
  8924. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  8925. .block_erasers =
  8926. {
  8927. {
  8928. .eraseblocks = { {512, 512} },
  8929. .block_erase = erase_sector_jedec,
  8930. }, {
  8931. .eraseblocks = { {256 * 1024, 1} },
  8932. .block_erase = erase_chip_block_jedec,
  8933. },
  8934. },
  8935. .write = write_jedec_1,
  8936. .read = read_memmapped,
  8937. },
  8938. {
  8939. .vendor = "SyncMOS/MoselVitelic",
  8940. .name = "{F,S,V}29C51002T",
  8941. .bustype = BUS_PARALLEL,
  8942. .manufacture_id = SYNCMOS_MVC_ID,
  8943. .model_id = SM_MVC_29C51002T,
  8944. .total_size = 256,
  8945. .page_size = 512,
  8946. .feature_bits = FEATURE_EITHER_RESET,
  8947. .tested = TEST_OK_PREW,
  8948. .probe = probe_jedec,
  8949. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  8950. .block_erasers =
  8951. {
  8952. {
  8953. .eraseblocks = { {512, 512} },
  8954. .block_erase = erase_sector_jedec,
  8955. }, {
  8956. .eraseblocks = { {256 * 1024, 1} },
  8957. .block_erase = erase_chip_block_jedec,
  8958. },
  8959. },
  8960. .write = write_jedec_1,
  8961. .read = read_memmapped,
  8962. },
  8963. {
  8964. .vendor = "SyncMOS/MoselVitelic",
  8965. .name = "{F,S,V}29C51004B",
  8966. .bustype = BUS_PARALLEL,
  8967. .manufacture_id = SYNCMOS_MVC_ID,
  8968. .model_id = SM_MVC_29C51004B,
  8969. .total_size = 512,
  8970. .page_size = 1024,
  8971. .feature_bits = FEATURE_EITHER_RESET,
  8972. .tested = TEST_UNTESTED,
  8973. .probe = probe_jedec,
  8974. .probe_timing = TIMING_ZERO,
  8975. .block_erasers =
  8976. {
  8977. {
  8978. .eraseblocks = { {1024, 512} },
  8979. .block_erase = erase_sector_jedec,
  8980. }, {
  8981. .eraseblocks = { {512 * 1024, 1} },
  8982. .block_erase = erase_chip_block_jedec,
  8983. },
  8984. },
  8985. .write = write_jedec_1,
  8986. .read = read_memmapped,
  8987. .voltage = {4500, 5500},
  8988. },
  8989. {
  8990. .vendor = "SyncMOS/MoselVitelic",
  8991. .name = "{F,S,V}29C51004T",
  8992. .bustype = BUS_PARALLEL,
  8993. .manufacture_id = SYNCMOS_MVC_ID,
  8994. .model_id = SM_MVC_29C51004T,
  8995. .total_size = 512,
  8996. .page_size = 1024,
  8997. .feature_bits = FEATURE_EITHER_RESET,
  8998. .tested = TEST_UNTESTED,
  8999. .probe = probe_jedec,
  9000. .probe_timing = TIMING_ZERO,
  9001. .block_erasers =
  9002. {
  9003. {
  9004. .eraseblocks = { {1024, 512} },
  9005. .block_erase = erase_sector_jedec,
  9006. }, {
  9007. .eraseblocks = { {512 * 1024, 1} },
  9008. .block_erase = erase_chip_block_jedec,
  9009. },
  9010. },
  9011. .write = write_jedec_1,
  9012. .read = read_memmapped,
  9013. .voltage = {4500, 5500},
  9014. },
  9015. {
  9016. .vendor = "SyncMOS/MoselVitelic",
  9017. .name = "{S,V}29C31004B",
  9018. .bustype = BUS_PARALLEL,
  9019. .manufacture_id = SYNCMOS_MVC_ID,
  9020. .model_id = SM_MVC_29C31004B,
  9021. .total_size = 512,
  9022. .page_size = 1024,
  9023. .feature_bits = FEATURE_EITHER_RESET,
  9024. .tested = TEST_UNTESTED,
  9025. .probe = probe_jedec,
  9026. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  9027. .block_erasers =
  9028. {
  9029. {
  9030. .eraseblocks = { {1024, 512} },
  9031. .block_erase = erase_sector_jedec,
  9032. }, {
  9033. .eraseblocks = { {512 * 1024, 1} },
  9034. .block_erase = erase_chip_block_jedec,
  9035. },
  9036. },
  9037. .write = write_jedec_1,
  9038. .read = read_memmapped,
  9039. .voltage = {3000, 3600},
  9040. },
  9041. {
  9042. .vendor = "SyncMOS/MoselVitelic",
  9043. .name = "{S,V}29C31004T",
  9044. .bustype = BUS_PARALLEL,
  9045. .manufacture_id = SYNCMOS_MVC_ID,
  9046. .model_id = SM_MVC_29C31004T,
  9047. .total_size = 512,
  9048. .page_size = 1024,
  9049. .feature_bits = FEATURE_EITHER_RESET,
  9050. .tested = TEST_UNTESTED,
  9051. .probe = probe_jedec,
  9052. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  9053. .block_erasers =
  9054. {
  9055. {
  9056. .eraseblocks = { {1024, 512} },
  9057. .block_erase = erase_sector_jedec,
  9058. }, {
  9059. .eraseblocks = { {512 * 1024, 1} },
  9060. .block_erase = erase_chip_block_jedec,
  9061. },
  9062. },
  9063. .write = write_jedec_1,
  9064. .read = read_memmapped,
  9065. .voltage = {3000, 3600},
  9066. },
  9067. {
  9068. .vendor = "TI",
  9069. .name = "TMS29F002RB",
  9070. .bustype = BUS_PARALLEL,
  9071. .manufacture_id = TI_OLD_ID,
  9072. .model_id = TI_TMS29F002RB,
  9073. .total_size = 256,
  9074. .page_size = 16384, /* Non-uniform sectors */
  9075. .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
  9076. .tested = TEST_UNTESTED,
  9077. .probe = probe_jedec,
  9078. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  9079. .block_erasers =
  9080. {
  9081. {
  9082. .eraseblocks = {
  9083. {16 * 1024, 1},
  9084. {8 * 1024, 2},
  9085. {32 * 1024, 1},
  9086. {64 * 1024, 3},
  9087. },
  9088. .block_erase = erase_sector_jedec,
  9089. }, {
  9090. .eraseblocks = { {256 * 1024, 1} },
  9091. .block_erase = erase_chip_block_jedec,
  9092. },
  9093. },
  9094. .write = write_jedec_1,
  9095. .read = read_memmapped,
  9096. .voltage = {4500, 5500},
  9097. },
  9098. {
  9099. .vendor = "TI",
  9100. .name = "TMS29F002RT",
  9101. .bustype = BUS_PARALLEL,
  9102. .manufacture_id = TI_OLD_ID,
  9103. .model_id = TI_TMS29F002RT,
  9104. .total_size = 256,
  9105. .page_size = 16384, /* Non-uniform sectors */
  9106. .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
  9107. .tested = TEST_UNTESTED,
  9108. .probe = probe_jedec,
  9109. .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
  9110. .block_erasers =
  9111. {
  9112. {
  9113. .eraseblocks = {
  9114. {64 * 1024, 3},
  9115. {32 * 1024, 1},
  9116. {8 * 1024, 2},
  9117. {16 * 1024, 1},
  9118. },
  9119. .block_erase = erase_sector_jedec,
  9120. }, {
  9121. .eraseblocks = { {256 * 1024, 1} },
  9122. .block_erase = erase_chip_block_jedec,
  9123. },
  9124. },
  9125. .write = write_jedec_1,
  9126. .read = read_memmapped,
  9127. .voltage = {4500, 5500},
  9128. },
  9129. {
  9130. .vendor = "Winbond",
  9131. .name = "W25Q40EW",
  9132. .bustype = BUS_SPI,
  9133. .manufacture_id = WINBOND_NEX_ID,
  9134. .model_id = WINBOND_NEX_W25Q40EW,
  9135. .total_size = 512,
  9136. .page_size = 256,
  9137. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  9138. .tested = TEST_OK_PREWU,
  9139. .probe = probe_spi_rdid,
  9140. .probe_timing = TIMING_ZERO,
  9141. .block_erasers =
  9142. {
  9143. {
  9144. .eraseblocks = { {4 * 1024, 128} },
  9145. .block_erase = spi_block_erase_20,
  9146. }, {
  9147. .eraseblocks = { {32 * 1024, 16} },
  9148. .block_erase = spi_block_erase_52,
  9149. }, {
  9150. .eraseblocks = { {64 * 1024, 8} },
  9151. .block_erase = spi_block_erase_d8,
  9152. }, {
  9153. .eraseblocks = { {1024 * 512, 1} },
  9154. .block_erase = spi_block_erase_60,
  9155. }, {
  9156. .eraseblocks = { {1024 * 512, 1} },
  9157. .block_erase = spi_block_erase_c7,
  9158. }
  9159. },
  9160. .unlock = spi_disable_blockprotect,
  9161. .write = spi_chip_write_256,
  9162. .read = spi_chip_read,
  9163. .voltage = {1650, 1950},
  9164. /* FIXME(dhendrix): Add write-protection support */
  9165. },
  9166. {
  9167. .vendor = "Winbond",
  9168. .name = "W25Q80",
  9169. .bustype = BUS_SPI,
  9170. .manufacture_id = WINBOND_NEX_ID,
  9171. .model_id = WINBOND_NEX_W25Q80,
  9172. .total_size = 1024,
  9173. .page_size = 256,
  9174. /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
  9175. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  9176. .tested = TEST_OK_PREWU,
  9177. .probe = probe_spi_rdid,
  9178. .probe_timing = TIMING_ZERO,
  9179. .block_erasers =
  9180. {
  9181. {
  9182. .eraseblocks = { {4 * 1024, 256} },
  9183. .block_erase = spi_block_erase_20,
  9184. }, {
  9185. .eraseblocks = { {32 * 1024, 32} },
  9186. .block_erase = spi_block_erase_52,
  9187. }, {
  9188. .eraseblocks = { {64 * 1024, 16} },
  9189. .block_erase = spi_block_erase_d8,
  9190. }, {
  9191. .eraseblocks = { {1024 * 1024, 1} },
  9192. .block_erase = spi_block_erase_60,
  9193. }, {
  9194. .eraseblocks = { {1024 * 1024, 1} },
  9195. .block_erase = spi_block_erase_c7,
  9196. }
  9197. },
  9198. .unlock = spi_disable_blockprotect,
  9199. .write = spi_chip_write_256,
  9200. .read = spi_chip_read,
  9201. .voltage = {2700, 3600},
  9202. .wp = &wp_w25q,
  9203. },
  9204. {
  9205. .vendor = "Winbond",
  9206. .name = "W25Q16",
  9207. .bustype = BUS_SPI,
  9208. .manufacture_id = WINBOND_NEX_ID,
  9209. .model_id = WINBOND_NEX_W25Q16,
  9210. .total_size = 2048,
  9211. .page_size = 256,
  9212. /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
  9213. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  9214. .tested = TEST_OK_PREWU,
  9215. .probe = probe_spi_rdid,
  9216. .probe_timing = TIMING_ZERO,
  9217. .block_erasers =
  9218. {
  9219. {
  9220. .eraseblocks = { {4 * 1024, 512} },
  9221. .block_erase = spi_block_erase_20,
  9222. }, {
  9223. .eraseblocks = { {32 * 1024, 64} },
  9224. .block_erase = spi_block_erase_52,
  9225. }, {
  9226. .eraseblocks = { {64 * 1024, 32} },
  9227. .block_erase = spi_block_erase_d8,
  9228. }, {
  9229. .eraseblocks = { {2 * 1024 * 1024, 1} },
  9230. .block_erase = spi_block_erase_60,
  9231. }, {
  9232. .eraseblocks = { {2 * 1024 * 1024, 1} },
  9233. .block_erase = spi_block_erase_c7,
  9234. }
  9235. },
  9236. .unlock = spi_disable_blockprotect,
  9237. .write = spi_chip_write_256,
  9238. .read = spi_chip_read,
  9239. .voltage = {2700, 3600},
  9240. .wp = &wp_w25q,
  9241. },
  9242. {
  9243. .vendor = "Winbond",
  9244. .name = "W25Q32",
  9245. .bustype = BUS_SPI,
  9246. .manufacture_id = WINBOND_NEX_ID,
  9247. .model_id = WINBOND_NEX_W25Q32,
  9248. .total_size = 4096,
  9249. .page_size = 256,
  9250. /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
  9251. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  9252. .tested = TEST_OK_PREWU,
  9253. .probe = probe_spi_rdid,
  9254. .probe_timing = TIMING_ZERO,
  9255. .block_erasers =
  9256. {
  9257. {
  9258. .eraseblocks = { {4 * 1024, 1024} },
  9259. .block_erase = spi_block_erase_20,
  9260. }, {
  9261. .eraseblocks = { {32 * 1024, 128} },
  9262. .block_erase = spi_block_erase_52,
  9263. }, {
  9264. .eraseblocks = { {64 * 1024, 64} },
  9265. .block_erase = spi_block_erase_d8,
  9266. }, {
  9267. .eraseblocks = { {4 * 1024 * 1024, 1} },
  9268. .block_erase = spi_block_erase_60,
  9269. }, {
  9270. .eraseblocks = { {4 * 1024 * 1024, 1} },
  9271. .block_erase = spi_block_erase_c7,
  9272. }
  9273. },
  9274. .unlock = spi_disable_blockprotect,
  9275. .write = spi_chip_write_256,
  9276. .read = spi_chip_read,
  9277. .voltage = {2700, 3600},
  9278. .wp = &wp_w25q,
  9279. },
  9280. {
  9281. .vendor = "Winbond",
  9282. .name = "W25Q32DW",
  9283. .bustype = BUS_SPI,
  9284. .manufacture_id = WINBOND_NEX_ID,
  9285. .model_id = WINBOND_NEX_W25Q32DW,
  9286. .total_size = 4096,
  9287. .page_size = 256,
  9288. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  9289. .tested = TEST_OK_PREWU,
  9290. .probe = probe_spi_rdid,
  9291. .probe_timing = TIMING_ZERO,
  9292. .block_erasers =
  9293. {
  9294. {
  9295. .eraseblocks = { {4 * 1024, 1024} },
  9296. .block_erase = spi_block_erase_20,
  9297. }, {
  9298. .eraseblocks = { {32 * 1024, 128} },
  9299. .block_erase = spi_block_erase_52,
  9300. }, {
  9301. .eraseblocks = { {64 * 1024, 64} },
  9302. .block_erase = spi_block_erase_d8,
  9303. }, {
  9304. .eraseblocks = { {4 * 1024 * 1024, 1} },
  9305. .block_erase = spi_block_erase_60,
  9306. }, {
  9307. .eraseblocks = { {4 * 1024 * 1024, 1} },
  9308. .block_erase = spi_block_erase_c7,
  9309. }
  9310. },
  9311. .unlock = spi_disable_blockprotect,
  9312. .write = spi_chip_write_256,
  9313. .read = spi_chip_read,
  9314. .voltage = {1700, 1950},
  9315. .wp = &wp_w25q,
  9316. },
  9317. {
  9318. .vendor = "Winbond",
  9319. .name = "W25Q64",
  9320. .bustype = BUS_SPI,
  9321. .manufacture_id = WINBOND_NEX_ID,
  9322. .model_id = WINBOND_NEX_W25Q64,
  9323. .total_size = 8192,
  9324. .page_size = 256,
  9325. /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
  9326. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  9327. .tested = TEST_OK_PREWU,
  9328. .probe = probe_spi_rdid,
  9329. .probe_timing = TIMING_ZERO,
  9330. .block_erasers =
  9331. {
  9332. {
  9333. .eraseblocks = { {4 * 1024, 2048} },
  9334. .block_erase = spi_block_erase_20,
  9335. }, {
  9336. .eraseblocks = { {32 * 1024, 256} },
  9337. .block_erase = spi_block_erase_52,
  9338. }, {
  9339. .eraseblocks = { {64 * 1024, 128} },
  9340. .block_erase = spi_block_erase_d8,
  9341. }, {
  9342. .eraseblocks = { {8 * 1024 * 1024, 1} },
  9343. .block_erase = spi_block_erase_60,
  9344. }, {
  9345. .eraseblocks = { {8 * 1024 * 1024, 1} },
  9346. .block_erase = spi_block_erase_c7,
  9347. }
  9348. },
  9349. .unlock = spi_disable_blockprotect,
  9350. .write = spi_chip_write_256,
  9351. .read = spi_chip_read,
  9352. .voltage = {2700, 3600},
  9353. .wp = &wp_w25q,
  9354. },
  9355. {
  9356. .vendor = "Winbond",
  9357. .name = "W25Q64DW",
  9358. .bustype = BUS_SPI,
  9359. .manufacture_id = WINBOND_NEX_ID,
  9360. .model_id = WINBOND_NEX_W25Q64DW,
  9361. .total_size = 8192,
  9362. .page_size = 256,
  9363. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  9364. .tested = TEST_OK_PREWU,
  9365. .probe = probe_spi_rdid,
  9366. .probe_timing = TIMING_ZERO,
  9367. .block_erasers =
  9368. {
  9369. {
  9370. .eraseblocks = { {4 * 1024, 2048} },
  9371. .block_erase = spi_block_erase_20,
  9372. }, {
  9373. .eraseblocks = { {32 * 1024, 256} },
  9374. .block_erase = spi_block_erase_52,
  9375. }, {
  9376. .eraseblocks = { {64 * 1024, 128} },
  9377. .block_erase = spi_block_erase_d8,
  9378. }, {
  9379. .eraseblocks = { {8 * 1024 * 1024, 1} },
  9380. .block_erase = spi_block_erase_60,
  9381. }, {
  9382. .eraseblocks = { {8 * 1024 * 1024, 1} },
  9383. .block_erase = spi_block_erase_c7,
  9384. }
  9385. },
  9386. .unlock = spi_disable_blockprotect,
  9387. .write = spi_chip_write_256,
  9388. .read = spi_chip_read,
  9389. .voltage = {1700, 1950},
  9390. .wp = &wp_w25q,
  9391. },
  9392. {
  9393. .vendor = "Winbond",
  9394. .name = "W25Q128",
  9395. .bustype = BUS_SPI,
  9396. .manufacture_id = WINBOND_NEX_ID,
  9397. .model_id = WINBOND_NEX_W25Q128,
  9398. .total_size = 16384,
  9399. .page_size = 256,
  9400. /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
  9401. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
  9402. .tested = TEST_OK_PREWU,
  9403. .probe = probe_spi_rdid,
  9404. .probe_timing = TIMING_ZERO,
  9405. .block_erasers =
  9406. {
  9407. {
  9408. .eraseblocks = { {4 * 1024, 4096} },
  9409. .block_erase = spi_block_erase_20,
  9410. }, {
  9411. .eraseblocks = { {32 * 1024, 512} },
  9412. .block_erase = spi_block_erase_52,
  9413. }, {
  9414. .eraseblocks = { {64 * 1024, 256} },
  9415. .block_erase = spi_block_erase_d8,
  9416. }, {
  9417. .eraseblocks = { {16 * 1024 * 1024, 1} },
  9418. .block_erase = spi_block_erase_60,
  9419. }, {
  9420. .eraseblocks = { {16 * 1024 * 1024, 1} },
  9421. .block_erase = spi_block_erase_c7,
  9422. }
  9423. },
  9424. .unlock = spi_disable_blockprotect,
  9425. .write = spi_chip_write_256,
  9426. .read = spi_chip_read,
  9427. .wp = &wp_w25q,
  9428. },
  9429. {
  9430. .vendor = "Winbond",
  9431. .name = "W25Q128FW",
  9432. .bustype = BUS_SPI,
  9433. .manufacture_id = WINBOND_NEX_ID,
  9434. .model_id = WINBOND_NEX_W25Q128FW,
  9435. .total_size = 16384,
  9436. .page_size = 256,
  9437. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  9438. .tested = TEST_OK_PREWU,
  9439. .probe = probe_spi_rdid,
  9440. .probe_timing = TIMING_ZERO,
  9441. .block_erasers =
  9442. {
  9443. {
  9444. .eraseblocks = { {4 * 1024, 4096} },
  9445. .block_erase = spi_block_erase_20,
  9446. }, {
  9447. .eraseblocks = { {32 * 1024, 512} },
  9448. .block_erase = spi_block_erase_52,
  9449. }, {
  9450. .eraseblocks = { {64 * 1024, 256} },
  9451. .block_erase = spi_block_erase_d8,
  9452. }, {
  9453. .eraseblocks = { {16 * 1024 * 1024, 1} },
  9454. .block_erase = spi_block_erase_60,
  9455. }, {
  9456. .eraseblocks = { {16 * 1024 * 1024, 1} },
  9457. .block_erase = spi_block_erase_c7,
  9458. }
  9459. },
  9460. .unlock = spi_disable_blockprotect,
  9461. .write = spi_chip_write_256,
  9462. .read = spi_chip_read,
  9463. .wp = &wp_w25q,
  9464. },
  9465. {
  9466. .vendor = "Winbond",
  9467. .name = "W25X10",
  9468. .bustype = BUS_SPI,
  9469. .manufacture_id = WINBOND_NEX_ID,
  9470. .model_id = WINBOND_NEX_W25X10,
  9471. .total_size = 128,
  9472. .page_size = 256,
  9473. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  9474. .tested = TEST_OK_PREWU,
  9475. .probe = probe_spi_rdid,
  9476. .probe_timing = TIMING_ZERO,
  9477. .block_erasers =
  9478. {
  9479. {
  9480. .eraseblocks = { {4 * 1024, 32} },
  9481. .block_erase = spi_block_erase_20,
  9482. }, {
  9483. .eraseblocks = { {64 * 1024, 2} },
  9484. .block_erase = spi_block_erase_d8,
  9485. }, {
  9486. .eraseblocks = { {128 * 1024, 1} },
  9487. .block_erase = spi_block_erase_c7,
  9488. }
  9489. },
  9490. .unlock = spi_disable_blockprotect,
  9491. .write = spi_chip_write_256,
  9492. .read = spi_chip_read,
  9493. .voltage = {2700, 3600},
  9494. .wp = &wp_w25,
  9495. },
  9496. {
  9497. .vendor = "Winbond",
  9498. .name = "W25X20",
  9499. .bustype = BUS_SPI,
  9500. .manufacture_id = WINBOND_NEX_ID,
  9501. .model_id = WINBOND_NEX_W25X20,
  9502. .total_size = 256,
  9503. .page_size = 256,
  9504. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  9505. .tested = TEST_UNTESTED,
  9506. .probe = probe_spi_rdid,
  9507. .probe_timing = TIMING_ZERO,
  9508. .block_erasers =
  9509. {
  9510. {
  9511. .eraseblocks = { {4 * 1024, 64} },
  9512. .block_erase = spi_block_erase_20,
  9513. }, {
  9514. .eraseblocks = { {64 * 1024, 4} },
  9515. .block_erase = spi_block_erase_d8,
  9516. }, {
  9517. .eraseblocks = { {256 * 1024, 1} },
  9518. .block_erase = spi_block_erase_c7,
  9519. }
  9520. },
  9521. .unlock = spi_disable_blockprotect,
  9522. .write = spi_chip_write_256,
  9523. .read = spi_chip_read,
  9524. .voltage = {2700, 3600},
  9525. .wp = &wp_w25,
  9526. },
  9527. {
  9528. .vendor = "Winbond",
  9529. .name = "W25X40",
  9530. .bustype = BUS_SPI,
  9531. .manufacture_id = WINBOND_NEX_ID,
  9532. .model_id = WINBOND_NEX_W25X40,
  9533. .total_size = 512,
  9534. .page_size = 256,
  9535. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  9536. .tested = TEST_OK_PREWU,
  9537. .probe = probe_spi_rdid,
  9538. .probe_timing = TIMING_ZERO,
  9539. .block_erasers =
  9540. {
  9541. {
  9542. .eraseblocks = { {4 * 1024, 128} },
  9543. .block_erase = spi_block_erase_20,
  9544. }, {
  9545. .eraseblocks = { {64 * 1024, 8} },
  9546. .block_erase = spi_block_erase_d8,
  9547. }, {
  9548. .eraseblocks = { {512 * 1024, 1} },
  9549. .block_erase = spi_block_erase_c7,
  9550. }
  9551. },
  9552. .unlock = spi_disable_blockprotect,
  9553. .write = spi_chip_write_256,
  9554. .read = spi_chip_read,
  9555. .voltage = {2700, 3600},
  9556. .wp = &wp_w25,
  9557. },
  9558. {
  9559. .vendor = "Winbond",
  9560. .name = "W25X80",
  9561. .bustype = BUS_SPI,
  9562. .manufacture_id = WINBOND_NEX_ID,
  9563. .model_id = WINBOND_NEX_W25X80,
  9564. .total_size = 1024,
  9565. .page_size = 256,
  9566. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  9567. .tested = TEST_OK_PREWU,
  9568. .probe = probe_spi_rdid,
  9569. .probe_timing = TIMING_ZERO,
  9570. .block_erasers =
  9571. {
  9572. {
  9573. .eraseblocks = { {4 * 1024, 256} },
  9574. .block_erase = spi_block_erase_20,
  9575. }, {
  9576. .eraseblocks = { {64 * 1024, 16} },
  9577. .block_erase = spi_block_erase_d8,
  9578. }, {
  9579. .eraseblocks = { {1024 * 1024, 1} },
  9580. .block_erase = spi_block_erase_c7,
  9581. }
  9582. },
  9583. .unlock = spi_disable_blockprotect,
  9584. .write = spi_chip_write_256,
  9585. .read = spi_chip_read,
  9586. .voltage = {2700, 3600},
  9587. .wp = &wp_w25,
  9588. },
  9589. {
  9590. .vendor = "Winbond",
  9591. .name = "W25X16",
  9592. .bustype = BUS_SPI,
  9593. .manufacture_id = WINBOND_NEX_ID,
  9594. .model_id = WINBOND_NEX_W25X16,
  9595. .total_size = 2048,
  9596. .page_size = 256,
  9597. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  9598. .tested = TEST_OK_PREWU,
  9599. .probe = probe_spi_rdid,
  9600. .probe_timing = TIMING_ZERO,
  9601. .block_erasers =
  9602. {
  9603. {
  9604. .eraseblocks = { {4 * 1024, 512} },
  9605. .block_erase = spi_block_erase_20,
  9606. }, {
  9607. .eraseblocks = { {32 * 1024, 64} },
  9608. .block_erase = spi_block_erase_52,
  9609. }, {
  9610. .eraseblocks = { {64 * 1024, 32} },
  9611. .block_erase = spi_block_erase_d8,
  9612. }, {
  9613. .eraseblocks = { {2 * 1024 * 1024, 1} },
  9614. .block_erase = spi_block_erase_60,
  9615. }, {
  9616. .eraseblocks = { {2 * 1024 * 1024, 1} },
  9617. .block_erase = spi_block_erase_c7,
  9618. }
  9619. },
  9620. .unlock = spi_disable_blockprotect,
  9621. .write = spi_chip_write_256,
  9622. .read = spi_chip_read,
  9623. .voltage = {2700, 3600},
  9624. },
  9625. {
  9626. .vendor = "Winbond",
  9627. .name = "W25X32",
  9628. .bustype = BUS_SPI,
  9629. .manufacture_id = WINBOND_NEX_ID,
  9630. .model_id = WINBOND_NEX_W25X32,
  9631. .total_size = 4096,
  9632. .page_size = 256,
  9633. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  9634. .tested = TEST_OK_PROBE,
  9635. .probe = probe_spi_rdid,
  9636. .probe_timing = TIMING_ZERO,
  9637. .block_erasers =
  9638. {
  9639. {
  9640. .eraseblocks = { {4 * 1024, 1024} },
  9641. .block_erase = spi_block_erase_20,
  9642. }, {
  9643. .eraseblocks = { {32 * 1024, 128} },
  9644. .block_erase = spi_block_erase_52,
  9645. }, {
  9646. .eraseblocks = { {64 * 1024, 64} },
  9647. .block_erase = spi_block_erase_d8,
  9648. }, {
  9649. .eraseblocks = { {4 * 1024 * 1024, 1} },
  9650. .block_erase = spi_block_erase_60,
  9651. }, {
  9652. .eraseblocks = { {4 * 1024 * 1024, 1} },
  9653. .block_erase = spi_block_erase_c7,
  9654. }
  9655. },
  9656. .unlock = spi_disable_blockprotect,
  9657. .write = spi_chip_write_256,
  9658. .read = spi_chip_read,
  9659. .voltage = {2700, 3600},
  9660. },
  9661. {
  9662. .vendor = "Winbond",
  9663. .name = "W25X64",
  9664. .bustype = BUS_SPI,
  9665. .manufacture_id = WINBOND_NEX_ID,
  9666. .model_id = WINBOND_NEX_W25X64,
  9667. .total_size = 8192,
  9668. .page_size = 256,
  9669. .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
  9670. .tested = TEST_OK_PROBE,
  9671. .probe = probe_spi_rdid,
  9672. .probe_timing = TIMING_ZERO,
  9673. .block_erasers =
  9674. {
  9675. {
  9676. .eraseblocks = { {4 * 1024, 2048} },
  9677. .block_erase = spi_block_erase_20,
  9678. }, {
  9679. .eraseblocks = { {32 * 1024, 256} },
  9680. .block_erase = spi_block_erase_52,
  9681. }, {
  9682. .eraseblocks = { {64 * 1024, 128} },
  9683. .block_erase = spi_block_erase_d8,
  9684. }, {
  9685. .eraseblocks = { {8 * 1024 * 1024, 1} },
  9686. .block_erase = spi_block_erase_60,
  9687. }, {
  9688. .eraseblocks = { {8 * 1024 * 1024, 1} },
  9689. .block_erase = spi_block_erase_c7,
  9690. }
  9691. },
  9692. .unlock = spi_disable_blockprotect,
  9693. .write = spi_chip_write_256,
  9694. .read = spi_chip_read,
  9695. .voltage = {2700, 3600},
  9696. },
  9697. {
  9698. .vendor = "Winbond",
  9699. .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
  9700. .bustype = BUS_PARALLEL,
  9701. .manufacture_id = WINBOND_ID,
  9702. .model_id = WINBOND_W29C010,
  9703. .total_size = 128,
  9704. .page_size = 128,
  9705. .feature_bits = FEATURE_LONG_RESET,
  9706. .tested = TEST_OK_PRE,
  9707. .probe = probe_w29ee011,
  9708. .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
  9709. .block_erasers =
  9710. {
  9711. {
  9712. .eraseblocks = { {128 * 1024, 1} },
  9713. .block_erase = erase_chip_block_jedec,
  9714. }
  9715. },
  9716. .write = write_jedec,
  9717. .read = read_memmapped,
  9718. },
  9719. {/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
  9720. .vendor = "Winbond",
  9721. .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
  9722. .bustype = BUS_PARALLEL,
  9723. .manufacture_id = WINBOND_ID,
  9724. .model_id = WINBOND_W29C010,
  9725. .total_size = 128,
  9726. .page_size = 128,
  9727. .feature_bits = FEATURE_LONG_RESET,
  9728. .tested = TEST_OK_PREW,
  9729. .probe = probe_jedec,
  9730. .probe_timing = 10, /* used datasheet for the W29C011A */
  9731. .block_erasers =
  9732. {
  9733. {
  9734. .eraseblocks = { {128 * 1024, 1} },
  9735. .block_erase = erase_chip_block_jedec,
  9736. }
  9737. },
  9738. .write = write_jedec,
  9739. .read = read_memmapped,
  9740. },
  9741. {
  9742. .vendor = "Winbond",
  9743. .name = "W29C020(C)/W29C022",
  9744. .bustype = BUS_PARALLEL,
  9745. .manufacture_id = WINBOND_ID,
  9746. .model_id = WINBOND_W29C020,
  9747. .total_size = 256,
  9748. .page_size = 128,
  9749. .feature_bits = FEATURE_LONG_RESET,
  9750. .tested = TEST_OK_PRE,
  9751. .probe = probe_jedec,
  9752. .probe_timing = 10,
  9753. .block_erasers =
  9754. {
  9755. {
  9756. .eraseblocks = { {256 * 1024, 1} },
  9757. .block_erase = erase_chip_block_jedec,
  9758. }
  9759. },
  9760. .write = write_jedec,
  9761. .read = read_memmapped,
  9762. .voltage = {4500, 5500},
  9763. },
  9764. {
  9765. .vendor = "Winbond",
  9766. .name = "W29C040/P",
  9767. .bustype = BUS_PARALLEL,
  9768. .manufacture_id = WINBOND_ID,
  9769. .model_id = WINBOND_W29C040,
  9770. .total_size = 512,
  9771. .page_size = 256,
  9772. .feature_bits = FEATURE_LONG_RESET,
  9773. .tested = TEST_UNTESTED,
  9774. .probe = probe_jedec,
  9775. .probe_timing = 10,
  9776. .block_erasers =
  9777. {
  9778. {
  9779. .eraseblocks = { {512 * 1024, 1} },
  9780. .block_erase = erase_chip_block_jedec,
  9781. }
  9782. },
  9783. .write = write_jedec,
  9784. .read = read_memmapped,
  9785. .voltage = {4500, 5500},
  9786. },
  9787. {
  9788. .vendor = "Winbond",
  9789. .name = "W39L040",
  9790. .bustype = BUS_PARALLEL,
  9791. .manufacture_id = WINBOND_ID,
  9792. .model_id = WINBOND_W39L040,
  9793. .total_size = 512,
  9794. .page_size = 64 * 1024,
  9795. .feature_bits = FEATURE_EITHER_RESET,
  9796. .tested = TEST_OK_PR,
  9797. .probe = probe_jedec,
  9798. .probe_timing = 10,
  9799. .block_erasers =
  9800. {
  9801. {
  9802. .eraseblocks = { {4 * 1024, 128} },
  9803. .block_erase = erase_block_jedec,
  9804. }, {
  9805. .eraseblocks = { {64 * 1024, 8} },
  9806. .block_erase = erase_sector_jedec,
  9807. }, {
  9808. .eraseblocks = { {512 * 1024, 1} },
  9809. .block_erase = erase_chip_block_jedec,
  9810. }
  9811. },
  9812. .printlock = printlock_w39l040,
  9813. .write = write_jedec_1,
  9814. .read = read_memmapped,
  9815. .voltage = {3000, 3600},
  9816. },
  9817. {
  9818. .vendor = "Winbond",
  9819. .name = "W39V040A",
  9820. .bustype = BUS_LPC,
  9821. .manufacture_id = WINBOND_ID,
  9822. .model_id = WINBOND_W39V040A,
  9823. .total_size = 512,
  9824. .page_size = 64 * 1024,
  9825. .feature_bits = FEATURE_EITHER_RESET,
  9826. .tested = TEST_OK_PREW,
  9827. .probe = probe_jedec,
  9828. .probe_timing = 10,
  9829. .block_erasers =
  9830. {
  9831. {
  9832. .eraseblocks = { {64 * 1024, 8} },
  9833. .block_erase = erase_sector_jedec,
  9834. }, {
  9835. .eraseblocks = { {512 * 1024, 1} },
  9836. .block_erase = erase_chip_block_jedec,
  9837. }
  9838. },
  9839. .printlock = printlock_w39v040a,
  9840. .write = write_jedec_1,
  9841. .read = read_memmapped,
  9842. .voltage = {3000, 3600},
  9843. },
  9844. {
  9845. .vendor = "Winbond",
  9846. .name = "W39V040B",
  9847. .bustype = BUS_LPC,
  9848. .manufacture_id = WINBOND_ID,
  9849. .model_id = WINBOND_W39V040B,
  9850. .total_size = 512,
  9851. .page_size = 64 * 1024,
  9852. .feature_bits = FEATURE_EITHER_RESET,
  9853. .tested = TEST_OK_PREW,
  9854. .probe = probe_jedec,
  9855. .probe_timing = 10,
  9856. .block_erasers =
  9857. {
  9858. {
  9859. .eraseblocks = { {64 * 1024, 8} },
  9860. .block_erase = erase_sector_jedec,
  9861. }, {
  9862. .eraseblocks = { {512 * 1024, 1} },
  9863. .block_erase = erase_chip_block_jedec,
  9864. }
  9865. },
  9866. .printlock = printlock_w39v040b,
  9867. .write = write_jedec_1,
  9868. .read = read_memmapped,
  9869. .voltage = {3000, 3600},
  9870. },
  9871. {
  9872. .vendor = "Winbond",
  9873. .name = "W39V040C",
  9874. .bustype = BUS_LPC,
  9875. .manufacture_id = WINBOND_ID,
  9876. .model_id = WINBOND_W39V040C,
  9877. .total_size = 512,
  9878. .page_size = 64 * 1024,
  9879. .feature_bits = FEATURE_EITHER_RESET,
  9880. .tested = TEST_OK_PREW,
  9881. .probe = probe_jedec,
  9882. .probe_timing = 10,
  9883. .block_erasers =
  9884. {
  9885. {
  9886. .eraseblocks = { {64 * 1024, 8} },
  9887. .block_erase = erase_sector_jedec,
  9888. }, {
  9889. .eraseblocks = { {512 * 1024, 1} },
  9890. .block_erase = erase_chip_block_jedec,
  9891. }
  9892. },
  9893. .printlock = printlock_w39v040c,
  9894. .write = write_jedec_1,
  9895. .read = read_memmapped,
  9896. .voltage = {3000, 3600},
  9897. },
  9898. {
  9899. .vendor = "Winbond",
  9900. .name = "W39V040FA",
  9901. .bustype = BUS_FWH,
  9902. .manufacture_id = WINBOND_ID,
  9903. .model_id = WINBOND_W39V040FA,
  9904. .total_size = 512,
  9905. .page_size = 64 * 1024,
  9906. .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
  9907. .tested = TEST_OK_PRE,
  9908. .probe = probe_jedec,
  9909. .probe_timing = 10,
  9910. .block_erasers =
  9911. {
  9912. {
  9913. .eraseblocks = { {4 * 1024, 128} },
  9914. .block_erase = erase_block_jedec,
  9915. }, {
  9916. .eraseblocks = { {64 * 1024, 8} },
  9917. .block_erase = erase_sector_jedec,
  9918. }, {
  9919. .eraseblocks = { {512 * 1024, 1} },
  9920. .block_erase = erase_chip_block_jedec,
  9921. }
  9922. },
  9923. .printlock = printlock_w39v040fa,
  9924. .unlock = unlock_sst_fwhub,
  9925. .write = write_jedec_1,
  9926. .read = read_memmapped,
  9927. .voltage = {3000, 3600},
  9928. },
  9929. {
  9930. .vendor = "Winbond",
  9931. .name = "W39V040FB",
  9932. .bustype = BUS_FWH,
  9933. .manufacture_id = WINBOND_ID,
  9934. .model_id = WINBOND_W39V040B,
  9935. .total_size = 512,
  9936. .page_size = 64 * 1024,
  9937. .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
  9938. .tested = TEST_OK_PREW,
  9939. .probe = probe_jedec,
  9940. .probe_timing = 10,
  9941. .block_erasers =
  9942. {
  9943. {
  9944. .eraseblocks = { {64 * 1024, 8} },
  9945. .block_erase = erase_sector_jedec,
  9946. }, {
  9947. .eraseblocks = { {512 * 1024, 1} },
  9948. .block_erase = erase_chip_block_jedec,
  9949. }
  9950. },
  9951. .printlock = printlock_w39v040fb,
  9952. .unlock = unlock_w39v040fb,
  9953. .write = write_jedec_1,
  9954. .read = read_memmapped,
  9955. .voltage = {3000, 3600}, /* Also has 12V fast program */
  9956. },
  9957. {
  9958. .vendor = "Winbond",
  9959. .name = "W39V040FC",
  9960. .bustype = BUS_FWH,
  9961. .manufacture_id = WINBOND_ID,
  9962. .model_id = WINBOND_W39V040C,
  9963. .total_size = 512,
  9964. .page_size = 64 * 1024,
  9965. .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
  9966. .tested = TEST_OK_PREW,
  9967. .probe = probe_jedec,
  9968. .probe_timing = 10,
  9969. .block_erasers =
  9970. {
  9971. {
  9972. .eraseblocks = { {64 * 1024, 8} },
  9973. .block_erase = erase_sector_jedec,
  9974. }, {
  9975. .eraseblocks = { {512 * 1024, 1} },
  9976. .block_erase = erase_chip_block_jedec,
  9977. }
  9978. },
  9979. .printlock = printlock_w39v040fc,
  9980. .write = write_jedec_1,
  9981. .read = read_memmapped,
  9982. .voltage = {3000, 3600}, /* Also has 12V fast program */
  9983. },
  9984. {
  9985. .vendor = "Winbond",
  9986. .name = "W39V040FB",
  9987. .bustype = BUS_FWH,
  9988. .manufacture_id = WINBOND_ID,
  9989. .model_id = WINBOND_W39V040B,
  9990. .total_size = 512,
  9991. .page_size = 64 * 1024,
  9992. .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
  9993. .tested = TEST_OK_PRE,
  9994. .probe = probe_jedec,
  9995. .probe_timing = 10,
  9996. .block_erasers =
  9997. {
  9998. {
  9999. .eraseblocks = { {64 * 1024, 8} },
  10000. .block_erase = erase_sector_jedec,
  10001. }, {
  10002. .eraseblocks = { {512 * 1024, 1} },
  10003. .block_erase = erase_chip_block_jedec,
  10004. }
  10005. },
  10006. .printlock = printlock_w39v040fb,
  10007. .unlock = unlock_w39v040fb,
  10008. .write = write_jedec_1,
  10009. .read = read_memmapped,
  10010. },
  10011. {
  10012. .vendor = "Winbond",
  10013. .name = "W39V040FC",
  10014. .bustype = BUS_FWH,
  10015. .manufacture_id = WINBOND_ID,
  10016. .model_id = WINBOND_W39V040C,
  10017. .total_size = 512,
  10018. .page_size = 64 * 1024,
  10019. .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
  10020. .tested = TEST_UNTESTED,
  10021. .probe = probe_jedec,
  10022. .probe_timing = 10,
  10023. .block_erasers =
  10024. {
  10025. {
  10026. .eraseblocks = { {64 * 1024, 8} },
  10027. .block_erase = erase_sector_jedec,
  10028. }, {
  10029. .eraseblocks = { {512 * 1024, 1} },
  10030. .block_erase = erase_chip_block_jedec,
  10031. }
  10032. },
  10033. .printlock = printlock_w39v040fc,
  10034. .write = write_jedec_1,
  10035. .read = read_memmapped,
  10036. },
  10037. {
  10038. .vendor = "Winbond",
  10039. .name = "W39V080A",
  10040. .bustype = BUS_LPC,
  10041. .manufacture_id = WINBOND_ID,
  10042. .model_id = WINBOND_W39V080A,
  10043. .total_size = 1024,
  10044. .page_size = 64 * 1024,
  10045. .feature_bits = FEATURE_EITHER_RESET,
  10046. .tested = TEST_OK_PREW,
  10047. .probe = probe_jedec,
  10048. .probe_timing = 10,
  10049. .block_erasers =
  10050. {
  10051. {
  10052. .eraseblocks = { {64 * 1024, 16} },
  10053. .block_erase = erase_sector_jedec,
  10054. }, {
  10055. .eraseblocks = { {1024 * 1024, 1} },
  10056. .block_erase = erase_chip_block_jedec,
  10057. }
  10058. },
  10059. .printlock = printlock_w39v080a,
  10060. .write = write_jedec_1,
  10061. .read = read_memmapped,
  10062. .voltage = {3000, 3600},
  10063. },
  10064. {
  10065. .vendor = "Winbond",
  10066. .name = "W49F002U/N",
  10067. .bustype = BUS_PARALLEL,
  10068. .manufacture_id = WINBOND_ID,
  10069. .model_id = WINBOND_W49F002U,
  10070. .total_size = 256,
  10071. .page_size = 128,
  10072. .feature_bits = FEATURE_EITHER_RESET,
  10073. .tested = TEST_OK_PREW,
  10074. .probe = probe_jedec,
  10075. .probe_timing = 10,
  10076. .block_erasers =
  10077. {
  10078. {
  10079. .eraseblocks = {
  10080. {128 * 1024, 1},
  10081. {96 * 1024, 1},
  10082. {8 * 1024, 2},
  10083. {16 * 1024, 1},
  10084. },
  10085. .block_erase = erase_sector_jedec,
  10086. }, {
  10087. .eraseblocks = { {256 * 1024, 1} },
  10088. .block_erase = erase_chip_block_jedec,
  10089. }
  10090. },
  10091. .write = write_jedec_1,
  10092. .read = read_memmapped,
  10093. .voltage = {4500, 5500},
  10094. },
  10095. {
  10096. .vendor = "Winbond",
  10097. .name = "W49F020",
  10098. .bustype = BUS_PARALLEL,
  10099. .manufacture_id = WINBOND_ID,
  10100. .model_id = WINBOND_W49F020,
  10101. .total_size = 256,
  10102. .page_size = 128,
  10103. .feature_bits = FEATURE_EITHER_RESET,
  10104. .tested = TEST_OK_PROBE,
  10105. .probe = probe_jedec,
  10106. .probe_timing = 10,
  10107. .block_erasers =
  10108. {
  10109. {
  10110. .eraseblocks = { {256 * 1024, 1} },
  10111. .block_erase = erase_chip_block_jedec,
  10112. }
  10113. },
  10114. .write = write_jedec_1,
  10115. .read = read_memmapped,
  10116. .voltage = {4500, 5500},
  10117. },
  10118. {
  10119. .vendor = "Winbond",
  10120. .name = "W49V002A",
  10121. .bustype = BUS_LPC,
  10122. .manufacture_id = WINBOND_ID,
  10123. .model_id = WINBOND_W49V002A,
  10124. .total_size = 256,
  10125. .page_size = 128,
  10126. .feature_bits = FEATURE_EITHER_RESET,
  10127. .tested = TEST_OK_PRE,
  10128. .probe = probe_jedec,
  10129. .probe_timing = 10,
  10130. .block_erasers =
  10131. {
  10132. {
  10133. .eraseblocks = {
  10134. {64 * 1024, 3},
  10135. {32 * 1024, 1},
  10136. {8 * 1024, 2},
  10137. {16 * 1024, 1},
  10138. },
  10139. .block_erase = erase_sector_jedec,
  10140. }, {
  10141. .eraseblocks = { {256 * 1024, 1} },
  10142. .block_erase = erase_chip_block_jedec,
  10143. }
  10144. },
  10145. .write = write_jedec_1,
  10146. .read = read_memmapped,
  10147. .voltage = {3000, 3600},
  10148. },
  10149. {
  10150. .vendor = "Winbond",
  10151. .name = "W49V002FA",
  10152. .bustype = BUS_FWH,
  10153. .manufacture_id = WINBOND_ID,
  10154. .model_id = WINBOND_W49V002FA,
  10155. .total_size = 256,
  10156. .page_size = 128,
  10157. .feature_bits = FEATURE_EITHER_RESET,
  10158. .tested = TEST_OK_PR,
  10159. .probe = probe_jedec,
  10160. .probe_timing = 10,
  10161. .block_erasers =
  10162. {
  10163. {
  10164. .eraseblocks = {
  10165. {64 * 1024, 3},
  10166. {32 * 1024, 1},
  10167. {8 * 1024, 2},
  10168. {16 * 1024, 1},
  10169. },
  10170. .block_erase = erase_sector_jedec,
  10171. }, {
  10172. .eraseblocks = { {256 * 1024, 1} },
  10173. .block_erase = erase_chip_block_jedec,
  10174. }
  10175. },
  10176. .write = write_jedec_1,
  10177. .read = read_memmapped,
  10178. .voltage = {3000, 3600},
  10179. },
  10180. {
  10181. .vendor = "Winbond",
  10182. .name = "W39V080FA",
  10183. .bustype = BUS_FWH,
  10184. .manufacture_id = WINBOND_ID,
  10185. .model_id = WINBOND_W39V080FA,
  10186. .total_size = 1024,
  10187. .page_size = 64 * 1024,
  10188. .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
  10189. .tested = TEST_OK_PREW,
  10190. .probe = probe_jedec,
  10191. .probe_timing = 10,
  10192. .block_erasers =
  10193. {
  10194. {
  10195. .eraseblocks = { {64 * 1024, 16}, },
  10196. .block_erase = erase_sector_jedec,
  10197. }, {
  10198. .eraseblocks = { {1024 * 1024, 1} },
  10199. .block_erase = erase_chip_block_jedec,
  10200. }
  10201. },
  10202. .printlock = printlock_w39v080fa,
  10203. .unlock = unlock_w39v080fa,
  10204. .write = write_jedec_1,
  10205. .read = read_memmapped,
  10206. .voltage = {3000, 3600}, /* Also has 12V fast program */
  10207. },
  10208. {
  10209. .vendor = "Winbond",
  10210. .name = "W39V080FA (dual mode)",
  10211. .bustype = BUS_FWH,
  10212. .manufacture_id = WINBOND_ID,
  10213. .model_id = WINBOND_W39V080FA_DM,
  10214. .total_size = 512,
  10215. .page_size = 64 * 1024,
  10216. .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
  10217. .tested = TEST_UNTESTED,
  10218. .probe = probe_jedec,
  10219. .probe_timing = 10,
  10220. .block_erasers =
  10221. {
  10222. {
  10223. .eraseblocks = { {64 * 1024, 8}, },
  10224. .block_erase = erase_sector_jedec,
  10225. }, {
  10226. .eraseblocks = { {512 * 1024, 1} },
  10227. .block_erase = erase_chip_block_jedec,
  10228. }
  10229. },
  10230. .printlock = printlock_w39v080fa_dual,
  10231. .write = write_jedec_1,
  10232. .read = read_memmapped,
  10233. .voltage = {3000, 3600}, /* Also has 12V fast program */
  10234. },
  10235. {
  10236. .vendor = "Programmer",
  10237. .name = "Opaque flash chip",
  10238. .bustype = BUS_PROG,
  10239. .manufacture_id = PROGMANUF_ID,
  10240. .model_id = PROGDEV_ID,
  10241. .total_size = 0,
  10242. .page_size = 256,
  10243. /* probe is assumed to work, rest will be filled in by probe */
  10244. .tested = TEST_OK_PROBE,
  10245. .probe = probe_opaque,
  10246. /* eraseblock sizes will be set by the probing function */
  10247. .block_erasers =
  10248. {
  10249. {
  10250. .block_erase = erase_opaque,
  10251. }
  10252. },
  10253. .write = write_opaque,
  10254. .read = read_opaque,
  10255. },
  10256. {
  10257. .vendor = "AMIC",
  10258. .name = "unknown AMIC SPI chip",
  10259. .bustype = BUS_SPI,
  10260. .manufacture_id = AMIC_ID,
  10261. .model_id = GENERIC_DEVICE_ID,
  10262. .total_size = 0,
  10263. .page_size = 256,
  10264. .tested = TEST_BAD_PREW,
  10265. .probe = probe_spi_rdid4,
  10266. .probe_timing = TIMING_ZERO,
  10267. .write = NULL,
  10268. .read = NULL,
  10269. },
  10270. {
  10271. .vendor = "Atmel",
  10272. .name = "unknown Atmel SPI chip",
  10273. .bustype = BUS_SPI,
  10274. .manufacture_id = ATMEL_ID,
  10275. .model_id = GENERIC_DEVICE_ID,
  10276. .total_size = 0,
  10277. .page_size = 256,
  10278. .tested = TEST_BAD_PREW,
  10279. .probe = probe_spi_rdid,
  10280. .probe_timing = TIMING_ZERO,
  10281. .write = NULL,
  10282. .read = NULL,
  10283. },
  10284. {
  10285. .vendor = "Eon",
  10286. .name = "unknown Eon SPI chip",
  10287. .bustype = BUS_SPI,
  10288. .manufacture_id = EON_ID_NOPREFIX,
  10289. .model_id = GENERIC_DEVICE_ID,
  10290. .total_size = 0,
  10291. .page_size = 256,
  10292. .tested = TEST_BAD_PREW,
  10293. .probe = probe_spi_rdid,
  10294. .probe_timing = TIMING_ZERO,
  10295. .write = NULL,
  10296. .read = NULL,
  10297. },
  10298. {
  10299. .vendor = "Macronix",
  10300. .name = "unknown Macronix SPI chip",
  10301. .bustype = BUS_SPI,
  10302. .manufacture_id = MACRONIX_ID,
  10303. .model_id = GENERIC_DEVICE_ID,
  10304. .total_size = 0,
  10305. .page_size = 256,
  10306. .tested = TEST_BAD_PREW,
  10307. .probe = probe_spi_rdid,
  10308. .probe_timing = TIMING_ZERO,
  10309. .write = NULL,
  10310. .read = NULL,
  10311. },
  10312. {
  10313. .vendor = "PMC",
  10314. .name = "unknown PMC SPI chip",
  10315. .bustype = BUS_SPI,
  10316. .manufacture_id = PMC_ID,
  10317. .model_id = GENERIC_DEVICE_ID,
  10318. .total_size = 0,
  10319. .page_size = 256,
  10320. .tested = TEST_BAD_PREW,
  10321. .probe = probe_spi_rdid,
  10322. .probe_timing = TIMING_ZERO,
  10323. .write = NULL,
  10324. .read = NULL,
  10325. },
  10326. {
  10327. .vendor = "SST",
  10328. .name = "unknown SST SPI chip",
  10329. .bustype = BUS_SPI,
  10330. .manufacture_id = SST_ID,
  10331. .model_id = GENERIC_DEVICE_ID,
  10332. .total_size = 0,
  10333. .page_size = 256,
  10334. .tested = TEST_BAD_PREW,
  10335. .probe = probe_spi_rdid,
  10336. .probe_timing = TIMING_ZERO,
  10337. .write = NULL,
  10338. .read = NULL,
  10339. },
  10340. {
  10341. .vendor = "ST",
  10342. .name = "unknown ST SPI chip",
  10343. .bustype = BUS_SPI,
  10344. .manufacture_id = ST_ID,
  10345. .model_id = GENERIC_DEVICE_ID,
  10346. .total_size = 0,
  10347. .page_size = 256,
  10348. .tested = TEST_BAD_PREW,
  10349. .probe = probe_spi_rdid,
  10350. .probe_timing = TIMING_ZERO,
  10351. .write = NULL,
  10352. .read = NULL,
  10353. },
  10354. {
  10355. .vendor = "Sanyo",
  10356. .name = "unknown Sanyo SPI chip",
  10357. .bustype = BUS_SPI,
  10358. .manufacture_id = SANYO_ID,
  10359. .model_id = GENERIC_DEVICE_ID,
  10360. .total_size = 0,
  10361. .page_size = 256,
  10362. .tested = TEST_BAD_PREW,
  10363. .probe = probe_spi_rdid,
  10364. .probe_timing = TIMING_ZERO,
  10365. .write = NULL,
  10366. .read = NULL,
  10367. },
  10368. {
  10369. .vendor = "Generic",
  10370. .name = "Variable Size SPI chip",
  10371. .bustype = BUS_SPI,
  10372. .manufacture_id = VARIABLE_SIZE_MANUF_ID,
  10373. .model_id = VARIABLE_SIZE_DEVICE_ID,
  10374. .total_size = 64, /* This size is set temporarily */
  10375. .page_size = 256,
  10376. .tested = TEST_OK_PREW,
  10377. .probe = probe_variable_size,
  10378. .block_erasers =
  10379. {
  10380. {
  10381. .eraseblocks = { {4 * 1024, 16} },
  10382. .block_erase = spi_block_erase_20,
  10383. }, {
  10384. .eraseblocks = { {64 * 1024, 1} },
  10385. .block_erase = spi_block_erase_d8,
  10386. }
  10387. },
  10388. .write = spi_chip_write_256,
  10389. .read = spi_chip_read,
  10390. },
  10391. {
  10392. .vendor = "Generic",
  10393. .name = "unknown SPI chip (RDID)",
  10394. .bustype = BUS_SPI,
  10395. .manufacture_id = GENERIC_MANUF_ID,
  10396. .model_id = GENERIC_DEVICE_ID,
  10397. .total_size = 0,
  10398. .page_size = 256,
  10399. .tested = TEST_BAD_PREW,
  10400. .probe = probe_spi_rdid,
  10401. .write = NULL,
  10402. },
  10403. {
  10404. .vendor = "Generic",
  10405. .name = "unknown SPI chip (REMS)",
  10406. .bustype = BUS_SPI,
  10407. .manufacture_id = GENERIC_MANUF_ID,
  10408. .model_id = GENERIC_DEVICE_ID,
  10409. .total_size = 0,
  10410. .page_size = 256,
  10411. .tested = TEST_BAD_PREW,
  10412. .probe = probe_spi_rems,
  10413. .write = NULL,
  10414. },
  10415. { NULL }
  10416. };
  10417. /* List of all flashchips on platforms
  10418. * that use HWSEQ host controller interface
  10419. */
  10420. const struct flashchip flashchips_hwseq[] = {
  10421. {
  10422. .vendor = "Winbond",
  10423. .name = "W25Q128.V",
  10424. .bustype = BUS_PROG,
  10425. .manufacture_id = WINBOND_NEX_ID,
  10426. .model_id = WINBOND_NEX_W25Q128_V,
  10427. .total_size = 0,
  10428. .page_size = 256,
  10429. /* probe is assumed to work, rest will be filled in by probe */
  10430. .tested = TEST_OK_PREWU,
  10431. .probe = probe_opaque,
  10432. /* eraseblock sizes will be set by the probing function */
  10433. .block_erasers =
  10434. {
  10435. {
  10436. .block_erase = erase_opaque,
  10437. }
  10438. },
  10439. .write = write_opaque,
  10440. .read = read_opaque,
  10441. .read_status = read_status_opaque,
  10442. .write_status = write_status_opaque,
  10443. .wp = &wp_w25,
  10444. },
  10445. {NULL}
  10446. };
  10447. int flash_erase_value(struct flashctx *flash)
  10448. {
  10449. return flash->feature_bits & FEATURE_ERASE_TO_ZERO ? 0 : 0xff;
  10450. }
  10451. int flash_unerased_value(struct flashctx *flash)
  10452. {
  10453. return flash->feature_bits & FEATURE_ERASE_TO_ZERO ? 0xff : 0;
  10454. }
  10455. struct voltage_range voltage_ranges[NUM_VOLTAGE_RANGES];
  10456. static int compar(const void *_x, const void *_y)
  10457. {
  10458. const struct voltage_range *x = _x;
  10459. const struct voltage_range *y = _y;
  10460. /*
  10461. * qsort() places entries in ascending order. We will sort by minimum
  10462. * voltage primarily and max voltage secondarily, and move empty sets
  10463. * to the end of array.
  10464. */
  10465. if (x->min == 0)
  10466. return 1;
  10467. if (y->min == 0)
  10468. return -1;
  10469. if (x->min < y->min)
  10470. return -1;
  10471. if (x->min > y->min)
  10472. return 1;
  10473. if (x->min == y->min) {
  10474. if (x->max < y->max)
  10475. return -1;
  10476. if (x->max > y->max)
  10477. return 1;
  10478. }
  10479. return 0;
  10480. }
  10481. int flash_supported_voltage_ranges(enum chipbustype bus)
  10482. {
  10483. int i;
  10484. int unique_ranges = 0;
  10485. /* clear array in case user calls this function multiple times */
  10486. memset(voltage_ranges, 0, sizeof(voltage_ranges));
  10487. for (i = 0; i < ARRAY_SIZE(flashchips); i++) {
  10488. int j;
  10489. int match_found = 0;
  10490. if (unique_ranges >= NUM_VOLTAGE_RANGES) {
  10491. msg_cerr("Increase NUM_VOLTAGE_RANGES.\n");
  10492. return -1;
  10493. }
  10494. if (!(flashchips[i].bustype & bus))
  10495. continue;
  10496. for (j = 0; j < NUM_VOLTAGE_RANGES; j++) {
  10497. if ((flashchips[i].voltage.min == voltage_ranges[j].min) &&
  10498. (flashchips[i].voltage.max == voltage_ranges[j].max))
  10499. match_found |= 1;
  10500. if (!voltage_ranges[j].min && !voltage_ranges[j].max)
  10501. break;
  10502. }
  10503. if (!match_found) {
  10504. voltage_ranges[j] = flashchips[i].voltage;
  10505. unique_ranges++;
  10506. }
  10507. }
  10508. qsort(&voltage_ranges[0], NUM_VOLTAGE_RANGES,
  10509. sizeof(voltage_ranges[0]), compar);
  10510. for (i = 0; i < NUM_VOLTAGE_RANGES; i++) {
  10511. msg_cspew("%s: voltage_range[%d]: { %u, %u }\n",
  10512. __func__, i, voltage_ranges[i].min, voltage_ranges[i].max);
  10513. }
  10514. return unique_ranges;
  10515. }