Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Librem5
uboot-imx
Commits
71f7bd30
Commit
71f7bd30
authored
Mar 25, 2009
by
Ladislav Michl
Committed by
Jean-Christophe PLAGNIOL-VILLARD
Mar 29, 2009
Browse files
NetStar: use generic flash driver
Signed-off-by:
Ladislav Michl
<
ladis@linux-mips.org
>
parent
3f464b0f
Changes
4
Hide whitespace changes
Inline
Side-by-side
board/netstar/Makefile
View file @
71f7bd30
...
...
@@ -28,7 +28,7 @@ include $(TOPDIR)/config.mk
LIB
=
$(obj)
lib
$(BOARD)
.a
COBJS
:=
netstar.o
flash.o
nand.o
COBJS
:=
netstar.o nand.o
SOBJS
:=
setup.o crcek.o
SRCS
:=
$(SOBJS:.o=.S)
$(COBJS:.o=.c)
eeprom.c
\
...
...
board/netstar/flash.c
deleted
100644 → 0
View file @
3f464b0f
/*
* (C) Copyright 2002
* Sysgo Real-Time Solutions, GmbH <www.elinos.com>
* Alex Zuepke <azu@sysgo.de>
*
* (C) Copyright 2005
* 2N Telekomunikace, a.s. <www.2n.cz>
* Ladislav Michl <michl@2n.cz>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include
<common.h>
/*#if 0 */
#if (PHYS_SDRAM_1_SIZE != SZ_32M)
#include
"crcek.h"
#if (CONFIG_SYS_MAX_FLASH_BANKS > 1)
#error There is always only _one_ flash chip
#endif
flash_info_t
flash_info
[
CONFIG_SYS_MAX_FLASH_BANKS
];
#define CMD_READ_ARRAY 0x000000f0
#define CMD_UNLOCK1 0x000000aa
#define CMD_UNLOCK2 0x00000055
#define CMD_ERASE_SETUP 0x00000080
#define CMD_ERASE_CONFIRM 0x00000030
#define CMD_PROGRAM 0x000000a0
#define CMD_UNLOCK_BYPASS 0x00000020
#define MEM_FLASH_ADDR1 (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x00000555 << 1)))
#define MEM_FLASH_ADDR2 (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x000002aa << 1)))
#define BIT_ERASE_DONE 0x00000080
#define BIT_RDY_MASK 0x00000080
#define BIT_PROGRAM_ERROR 0x00000020
#define BIT_TIMEOUT 0x80000000
/* our flag */
/*-----------------------------------------------------------------------
*/
ulong
flash_init
(
void
)
{
int
i
;
flash_info
[
0
].
flash_id
=
(
AMD_MANUFACT
&
FLASH_VENDMASK
)
|
(
AMD_ID_LV800B
&
FLASH_TYPEMASK
);
flash_info
[
0
].
size
=
PHYS_FLASH_1_SIZE
;
flash_info
[
0
].
sector_count
=
CONFIG_SYS_MAX_FLASH_SECT
;
memset
(
flash_info
[
0
].
protect
,
0
,
CONFIG_SYS_MAX_FLASH_SECT
);
for
(
i
=
0
;
i
<
flash_info
[
0
].
sector_count
;
i
++
)
{
switch
(
i
)
{
case
0
:
/* 16kB */
flash_info
[
0
].
start
[
0
]
=
CONFIG_SYS_FLASH_BASE
;
break
;
case
1
:
/* 8kB */
flash_info
[
0
].
start
[
1
]
=
CONFIG_SYS_FLASH_BASE
+
0x4000
;
break
;
case
2
:
/* 8kB */
flash_info
[
0
].
start
[
2
]
=
CONFIG_SYS_FLASH_BASE
+
0x4000
+
0x2000
;
break
;
case
3
:
/* 32 KB */
flash_info
[
0
].
start
[
3
]
=
CONFIG_SYS_FLASH_BASE
+
0x4000
+
2
*
0x2000
;
break
;
case
4
:
flash_info
[
0
].
start
[
4
]
=
CONFIG_SYS_FLASH_BASE
+
0x4000
+
2
*
0x2000
+
0x8000
;
break
;
default:
/* 64kB */
flash_info
[
0
].
start
[
i
]
=
flash_info
[
0
].
start
[
i
-
1
]
+
0x10000
;
break
;
}
}
/* U-Boot */
flash_protect
(
FLAG_PROTECT_SET
,
LOADER1_OFFSET
,
LOADER1_OFFSET
+
LOADER_SIZE
-
1
,
flash_info
);
/* Protect crcek, env and r_env as well */
flash_protect
(
FLAG_PROTECT_SET
,
0
,
0x8000
-
1
,
flash_info
);
return
flash_info
[
0
].
size
;
}
/*-----------------------------------------------------------------------
*/
void
flash_print_info
(
flash_info_t
*
info
)
{
int
i
;
switch
(
info
->
flash_id
&
FLASH_VENDMASK
)
{
case
(
AMD_MANUFACT
&
FLASH_VENDMASK
):
puts
(
"AMD: "
);
break
;
default:
puts
(
"Unknown vendor "
);
break
;
}
switch
(
info
->
flash_id
&
FLASH_TYPEMASK
)
{
case
(
AMD_ID_LV800B
&
FLASH_TYPEMASK
):
puts
(
"AM29LV800BB (8Mb)
\n
"
);
break
;
default:
puts
(
"Unknown chip type
\n
"
);
return
;
}
printf
(
" Size: %ld MB in %d sectors
\n
"
,
info
->
size
>>
20
,
info
->
sector_count
);
puts
(
" Sector start addresses:"
);
for
(
i
=
0
;
i
<
info
->
sector_count
;
i
++
)
{
if
((
i
%
5
)
==
0
)
puts
(
"
\n
"
);
printf
(
" %08lX%s"
,
info
->
start
[
i
],
info
->
protect
[
i
]
?
" (RO)"
:
" "
);
}
puts
(
"
\n
"
);
}
/*-----------------------------------------------------------------------
*/
int
flash_erase
(
flash_info_t
*
info
,
int
s_first
,
int
s_last
)
{
ushort
result
;
int
prot
,
sect
;
int
rc
=
ERR_OK
;
/* first look for protection bits */
if
(
info
->
flash_id
==
FLASH_UNKNOWN
)
return
ERR_UNKNOWN_FLASH_TYPE
;
if
((
s_first
<
0
)
||
(
s_first
>
s_last
))
return
ERR_INVAL
;
if
((
info
->
flash_id
&
FLASH_VENDMASK
)
!=
(
AMD_MANUFACT
&
FLASH_VENDMASK
))
return
ERR_UNKNOWN_FLASH_VENDOR
;
prot
=
0
;
for
(
sect
=
s_first
;
sect
<=
s_last
;
++
sect
)
if
(
info
->
protect
[
sect
])
prot
++
;
if
(
prot
)
printf
(
"- Warning: %d protected sectors will not be erased!
\n
"
,
prot
);
else
putc
(
'\n'
);
/* Start erase on unprotected sectors */
for
(
sect
=
s_first
;
sect
<=
s_last
&&
!
ctrlc
();
sect
++
)
{
if
(
info
->
protect
[
sect
]
==
0
)
{
/* not protected */
vu_short
*
addr
=
(
vu_short
*
)
(
info
->
start
[
sect
]);
/* arm simple, non interrupt dependent timer */
reset_timer_masked
();
MEM_FLASH_ADDR1
=
CMD_UNLOCK1
;
MEM_FLASH_ADDR2
=
CMD_UNLOCK2
;
MEM_FLASH_ADDR1
=
CMD_ERASE_SETUP
;
MEM_FLASH_ADDR1
=
CMD_UNLOCK1
;
MEM_FLASH_ADDR2
=
CMD_UNLOCK2
;
*
addr
=
CMD_ERASE_CONFIRM
;
/* wait until flash is ready */
while
(
1
)
{
result
=
*
addr
;
/* check timeout */
if
(
get_timer_masked
()
>
CONFIG_SYS_FLASH_ERASE_TOUT
)
{
MEM_FLASH_ADDR1
=
CMD_READ_ARRAY
;
rc
=
ERR_TIMOUT
;
break
;
}
if
((
result
&
0xfff
)
&
BIT_ERASE_DONE
)
break
;
if
((
result
&
0xffff
)
&
BIT_PROGRAM_ERROR
)
{
rc
=
ERR_PROG_ERROR
;
break
;
}
}
MEM_FLASH_ADDR1
=
CMD_READ_ARRAY
;
if
(
rc
!=
ERR_OK
)
goto
out
;
putc
(
'.'
);
}
}
out:
/* allow flash to settle - wait 10 ms */
udelay_masked
(
10000
);
return
rc
;
}
/*-----------------------------------------------------------------------
* Copy memory to flash
*/
static
int
write_hword
(
flash_info_t
*
info
,
ulong
dest
,
ushort
data
)
{
vu_short
*
addr
=
(
vu_short
*
)
dest
;
ushort
result
;
int
rc
=
ERR_OK
;
/* check if flash is (sufficiently) erased */
result
=
*
addr
;
if
((
result
&
data
)
!=
data
)
return
ERR_NOT_ERASED
;
MEM_FLASH_ADDR1
=
CMD_UNLOCK1
;
MEM_FLASH_ADDR2
=
CMD_UNLOCK2
;
MEM_FLASH_ADDR1
=
CMD_PROGRAM
;
*
addr
=
data
;
/* arm simple, non interrupt dependent timer */
reset_timer_masked
();
/* wait until flash is ready */
while
(
1
)
{
result
=
*
addr
;
/* check timeout */
if
(
get_timer_masked
()
>
CONFIG_SYS_FLASH_ERASE_TOUT
)
{
rc
=
ERR_TIMOUT
;
break
;
}
if
((
result
&
0x80
)
==
(
data
&
0x80
))
break
;
if
((
result
&
0xffff
)
&
BIT_PROGRAM_ERROR
)
{
result
=
*
addr
;
if
((
result
&
0x80
)
!=
(
data
&
0x80
))
rc
=
ERR_PROG_ERROR
;
}
}
*
addr
=
CMD_READ_ARRAY
;
if
(
*
addr
!=
data
)
rc
=
ERR_PROG_ERROR
;
return
rc
;
}
/*-----------------------------------------------------------------------
* Copy memory to flash.
*/
int
write_buff
(
flash_info_t
*
info
,
uchar
*
src
,
ulong
addr
,
ulong
cnt
)
{
ulong
cp
,
wp
;
int
l
;
int
i
,
rc
;
ushort
data
;
wp
=
(
addr
&
~
1
);
/* get lower word aligned address */
/*
* handle unaligned start bytes
*/
if
((
l
=
addr
-
wp
)
!=
0
)
{
data
=
0
;
for
(
i
=
0
,
cp
=
wp
;
i
<
l
;
++
i
,
++
cp
)
data
=
(
data
>>
8
)
|
(
*
(
uchar
*
)
cp
<<
8
);
for
(;
i
<
2
&&
cnt
>
0
;
++
i
)
{
data
=
(
data
>>
8
)
|
(
*
src
++
<<
8
);
--
cnt
;
++
cp
;
}
for
(;
cnt
==
0
&&
i
<
2
;
++
i
,
++
cp
)
data
=
(
data
>>
8
)
|
(
*
(
uchar
*
)
cp
<<
8
);
if
((
rc
=
write_hword
(
info
,
wp
,
data
))
!=
0
)
return
(
rc
);
wp
+=
2
;
}
/*
* handle word aligned part
*/
while
(
cnt
>=
2
)
{
data
=
*
((
vu_short
*
)
src
);
if
((
rc
=
write_hword
(
info
,
wp
,
data
))
!=
0
)
return
(
rc
);
src
+=
2
;
wp
+=
2
;
cnt
-=
2
;
}
if
(
cnt
==
0
)
return
ERR_OK
;
/*
* handle unaligned tail bytes
*/
data
=
0
;
for
(
i
=
0
,
cp
=
wp
;
i
<
2
&&
cnt
>
0
;
++
i
,
++
cp
)
{
data
=
(
data
>>
8
)
|
(
*
src
++
<<
8
);
--
cnt
;
}
for
(;
i
<
2
;
++
i
,
++
cp
)
data
=
(
data
>>
8
)
|
(
*
(
uchar
*
)
cp
<<
8
);
return
write_hword
(
info
,
wp
,
data
);
}
#endif
board/netstar/netstar.c
View file @
71f7bd30
...
...
@@ -21,6 +21,7 @@
*/
#include
<common.h>
#include
<flash.h>
DECLARE_GLOBAL_DATA_PTR
;
...
...
@@ -59,3 +60,17 @@ int board_late_init(void)
{
return
0
;
}
#if defined(CONFIG_CMD_FLASH)
ulong
board_flash_get_legacy
(
ulong
base
,
int
banknum
,
flash_info_t
*
info
)
{
if
(
banknum
==
0
)
{
/* AM29LV800 boot flash */
info
->
portwidth
=
FLASH_CFI_16BIT
;
info
->
chipwidth
=
FLASH_CFI_BY16
;
info
->
interface
=
FLASH_CFI_X16
;
return
1
;
}
return
0
;
}
#endif
include/configs/netstar.h
View file @
71f7bd30
...
...
@@ -59,16 +59,6 @@
#define PHYS_SDRAM_1_SIZE (64 * 1024 * 1024)
#define PHYS_FLASH_1 0x00000000
/* Flash Bank #1 */
/*
* FLASH organization
*/
#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
#define CONFIG_SYS_MAX_FLASH_BANKS 1
#define PHYS_FLASH_1_SIZE (1 * 1024 * 1024)
#define CONFIG_SYS_MAX_FLASH_SECT 19
#define CONFIG_SYS_FLASH_ERASE_TOUT (5*CONFIG_SYS_HZ)
/* in ticks */
#define CONFIG_SYS_FLASH_WRITE_TOUT (5*CONFIG_SYS_HZ)
#define CONFIG_SYS_MONITOR_BASE PHYS_FLASH_1
#define CONFIG_SYS_MONITOR_LEN (256 * 1024)
...
...
@@ -106,6 +96,16 @@
#define CONFIG_DRIVER_SMC91111
#define CONFIG_SMC91111_BASE 0x04000300
#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
#define CONFIG_SYS_MAX_FLASH_BANKS 1
#define CONFIG_SYS_MAX_FLASH_SECT 19
#define CONFIG_SYS_FLASH_CFI
#define CONFIG_FLASH_CFI_DRIVER
#define CONFIG_SYS_FLASH_CFI_WIDTH FLASH_CFI_16BIT
#define CONFIG_FLASH_CFI_LEGACY
#define CONFIG_SYS_FLASH_LEGACY_512Kx16
#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE 0x04000000 + (2 << 23)
#define NAND_ALLOW_ERASE_ALL 1
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new 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