Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Evan Lojewski
ast2050-flashrom
Commits
5e8dfff2
Commit
5e8dfff2
authored
23 years ago
by
Ronald G. Minnich
Browse files
Options
Download
Email Patches
Plain Diff
sst39sf020 support
Corresponding to coreboot v1 svn r524.
parent
c831647b
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
163 additions
and
0 deletions
+163
-0
sst39sf020.c
sst39sf020.c
+163
-0
No files found.
sst39sf020.c
0 → 100644
View file @
5e8dfff2
/*
* sst39sf020.c: driver for SST28SF040C flash models.
*
*
* Copyright 2000 Silicon Integrated System Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*
* Reference:
* 4 MEgabit (512K x 8) SuperFlash EEPROM, SST28SF040 data sheet
*
* $Id$
*/
#include "flash.h"
#include "jedec.h"
#define AUTO_PG_ERASE1 0x20
#define AUTO_PG_ERASE2 0xD0
#define AUTO_PGRM 0x10
#define CHIP_ERASE 0x30
#define RESET 0xFF
#define READ_ID 0x90
static
__inline__
void
protect_39sf020
(
volatile
char
*
bios
)
{
/* ask compiler not to optimize this */
volatile
unsigned
char
tmp
;
tmp
=
*
(
volatile
unsigned
char
*
)
(
bios
+
0x1823
);
tmp
=
*
(
volatile
unsigned
char
*
)
(
bios
+
0x1820
);
tmp
=
*
(
volatile
unsigned
char
*
)
(
bios
+
0x1822
);
tmp
=
*
(
volatile
unsigned
char
*
)
(
bios
+
0x0418
);
tmp
=
*
(
volatile
unsigned
char
*
)
(
bios
+
0x041B
);
tmp
=
*
(
volatile
unsigned
char
*
)
(
bios
+
0x0419
);
tmp
=
*
(
volatile
unsigned
char
*
)
(
bios
+
0x040A
);
}
static
__inline__
void
unprotect_39sf020
(
volatile
char
*
bios
)
{
/* ask compiler not to optimize this */
volatile
unsigned
char
tmp
;
tmp
=
*
(
volatile
unsigned
char
*
)
(
bios
+
0x1823
);
tmp
=
*
(
volatile
unsigned
char
*
)
(
bios
+
0x1820
);
tmp
=
*
(
volatile
unsigned
char
*
)
(
bios
+
0x1822
);
tmp
=
*
(
volatile
unsigned
char
*
)
(
bios
+
0x0418
);
tmp
=
*
(
volatile
unsigned
char
*
)
(
bios
+
0x041B
);
tmp
=
*
(
volatile
unsigned
char
*
)
(
bios
+
0x0419
);
tmp
=
*
(
volatile
unsigned
char
*
)
(
bios
+
0x041A
);
}
static
__inline__
erase_sector_39sf020
(
volatile
char
*
bios
,
unsigned
long
address
)
{
*
bios
=
AUTO_PG_ERASE1
;
*
(
bios
+
address
)
=
AUTO_PG_ERASE2
;
/* wait for Toggle bit ready */
toggle_ready_jedec
(
bios
);
}
static
__inline__
write_sector_39sf020
(
volatile
char
*
bios
,
unsigned
char
*
src
,
volatile
unsigned
char
*
dst
,
unsigned
int
page_size
)
{
int
i
;
volatile
char
*
Temp
;
for
(
i
=
0
;
i
<
page_size
;
i
++
)
{
/* transfer data from source to destination */
if
(
*
src
==
0xFF
)
{
dst
++
,
src
++
;
/* If the data is 0xFF, don't program it */
continue
;
}
Temp
=
(
bios
+
0x5555
);
*
Temp
=
0xAA
;
Temp
=
bios
+
0x2AAA
;
*
Temp
=
0x55
;
Temp
=
bios
+
0x5555
;
*
Temp
=
0xA0
;
*
dst
++
=
*
src
++
;
toggle_ready_jedec
(
bios
);
}
}
int
probe_39sf020
(
struct
flashchip
*
flash
)
{
volatile
char
*
bios
=
flash
->
virt_addr
;
unsigned
char
id1
,
id2
;
*
(
volatile
char
*
)
(
bios
+
0x5555
)
=
0xAA
;
myusec_delay
(
10
);
*
(
volatile
char
*
)
(
bios
+
0x2AAA
)
=
0x55
;
myusec_delay
(
10
);
*
(
volatile
char
*
)
(
bios
+
0x5555
)
=
0x90
;
myusec_delay
(
10
);
id1
=
*
(
volatile
unsigned
char
*
)
bios
;
id2
=
*
(
volatile
unsigned
char
*
)
(
bios
+
0x01
);
*
(
volatile
char
*
)
(
bios
+
0x5555
)
=
0xAA
;
*
(
volatile
char
*
)
(
bios
+
0x2AAA
)
=
0x55
;
*
(
volatile
char
*
)
(
bios
+
0x5555
)
=
0xF0
;
myusec_delay
(
10
);
printf
(
__FUNCTION__
"id1 %d, id2 %d
\n
"
,
id1
,
id2
);
if
(
id1
==
flash
->
manufacture_id
&&
id2
==
flash
->
model_id
)
return
1
;
return
0
;
}
int
erase_39sf020
(
struct
flashchip
*
flash
)
{
volatile
char
*
bios
=
flash
->
virt_addr
;
unprotect_39sf020
(
bios
);
*
bios
=
CHIP_ERASE
;
*
bios
=
CHIP_ERASE
;
protect_39sf020
(
bios
);
myusec_delay
(
10
);
toggle_ready_jedec
(
bios
);
}
int
write_39sf020
(
struct
flashchip
*
flash
,
char
*
buf
)
{
int
i
;
int
total_size
=
flash
->
total_size
*
1024
,
page_size
=
flash
->
page_size
;
volatile
char
*
bios
=
flash
->
virt_addr
;
// unprotect_39sf020 (bios);
printf
(
"Programming Page: "
);
for
(
i
=
0
;
i
<
total_size
/
page_size
;
i
++
)
{
/* erase the page before programming */
//erase_sector_39sf020(bios, i * page_size);
/* write to the sector */
printf
(
"%04d at address: 0x%08x"
,
i
,
i
*
page_size
);
write_sector_39sf020
(
bios
,
buf
+
i
*
page_size
,
bios
+
i
*
page_size
,
page_size
);
printf
(
"
\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b
"
);
}
printf
(
"
\n
"
);
// protect_39sf020 (bios);
}
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment