11#include "acflash_internal.h"
13static flash_probe_t probes_22[2] = {&flash_probe_i28f640f5, &flash_probe_mbm29f033c};
18 if ( Flashc.status == 2 )
20 if ( Flashc.status != 1 )
24 *((
volatile acUint16 *)0xB2416006) = 0;
37 if ( Flashc.status == 1 )
39 if ( Flashc.status != 2 )
44 bsize = Flashc.ops->fo_bsize;
45 blocks = Flashc.ops->fo_blocks - 1;
56 *((
volatile acUint16 *)0xB2416004) = 0;
60int acFlashErase(acFlashAddr addr)
62 if ( Flashc.status == 1 )
64 if ( Flashc.status != 2 )
68 if ( addr >= (acUint32)Flashc.size )
70 return Flashc.ops->fo_erase(addr + 0xB0000000);
73int acFlashProgram(acFlashAddr addr,
void *buf,
int count)
75 if ( Flashc.status == 1 )
77 if ( Flashc.status != 2 )
81 if ( (addr & 1) != 0 )
85 if ( addr >= (acUint32)Flashc.size )
87 return Flashc.ops->fo_program(addr + 0xB0000000, (flash_data_t *)buf,
count);
90int acFlashRead(acFlashAddr addr,
void *buf,
int count)
99 if ( Flashc.status == 0 )
103 if ( (addr & 1) != 0 )
107 if ( addr +
count >= (acUint32)Flashc.size )
111 v6 = (flash_addr_t)(addr + 0xB0000000);
112 if ( Flashc.status >= 2 )
114 Flashc.ops->fo_reset(v6);
118 v8 = (
unsigned int)
count >> 1;
119 for ( flashc = (
struct flash_softc *)v6; v8 > 0; buf = (
char *)buf + 2 )
122 *(acUint16 *)buf = flashc->status;
123 flashc = (
struct flash_softc *)((
char *)flashc + 2);
125 return size - 2 * v8;
128int acFlashVerify(acFlashAddr addr,
void *buf,
int count)
137 if ( Flashc.status == 0 )
141 if ( (addr & 1) != 0 )
145 if ( addr +
count >= (acUint32)Flashc.size )
149 v6 = (flash_addr_t)(addr + 0xB0000000);
150 if ( Flashc.status >= 2 )
152 Flashc.ops->fo_reset(v6);
156 v8 = (
unsigned int)
count >> 1;
157 for ( flashc = (
struct flash_softc *)v6; v8 > 0; --v8 )
162 status_low = flashc->status & 0xFFFF;
163 flashc = (
struct flash_softc *)((
char *)flashc + 2);
164 v11 = *(acUint16 *)buf;
165 buf = (
char *)buf + 2;
166 if ( v11 != status_low )
169 return size - 2 * v8;
172int acFlashStatus(acFlashAddr addr)
174 if ( Flashc.status == 1 )
176 if ( Flashc.status == 2 )
178 if ( addr >= (acUint32)Flashc.size )
180 return Flashc.ops->fo_status(addr + 0xB0000000);
194 if ( Flashc.status == 0 )
199 info->fi_blocks = Flashc.ops->fo_blocks;
201 info->fi_bsize = (acUint32)flashc;
205int acFlashModuleStatus()
207 return Flashc.status;
210int acFlashModuleStart(
int argc,
char **argv)
219 if ( acFlashModuleStatus() != 0 )
223 *((
volatile acUint16 *)0xB2416006) = 0;
226 while ( (
unsigned int)index < 2 )
228 if ( *(probes_22[index]) )
230 v9 = (probes_22[index])(0xB0000000);
234 v4 = v9->fo_bsize * v9->fo_blocks;
243 if ( (
unsigned int)index >= 2 )
245 printf(
"acflash: no flash\n");
248 *((
volatile acUint16 *)0xB2416004) = 0;
252int acFlashModuleStop()
254 if ( acFlashModuleStatus() != 0 )
261int acFlashModuleRestart(
int argc,
char **argv)
u32 count
start sector of fragmented bd/file