Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OS
U-Boot.Mirror
提交
6d754843
U
U-Boot.Mirror
项目概览
OS
/
U-Boot.Mirror
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
U-Boot.Mirror
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6d754843
编写于
5月 01, 2011
作者:
D
David Müller (ELSOFT AG)
提交者:
Albert ARIBAUD
7月 04, 2011
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
VCMA9: use CFI driver (and remove the old one)
Signed-off-by:
N
David Müller
<
d.mueller@elsoft.ch
>
上级
0bf42fec
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
22 addition
and
452 deletion
+22
-452
board/mpl/vcma9/Makefile
board/mpl/vcma9/Makefile
+1
-1
board/mpl/vcma9/flash.c
board/mpl/vcma9/flash.c
+0
-432
board/mpl/vcma9/vcma9.c
board/mpl/vcma9/vcma9.c
+12
-0
include/configs/VCMA9.h
include/configs/VCMA9.h
+9
-19
未找到文件。
board/mpl/vcma9/Makefile
浏览文件 @
6d754843
...
...
@@ -28,7 +28,7 @@ endif
LIB
=
$(obj)
lib
$(BOARD)
.o
COBJS
:=
vcma9.o
flash.o
cmd_vcma9.o
COBJS
:=
vcma9.o cmd_vcma9.o
COBJS
+=
../common/common_util.o
SOBJS
:=
lowlevel_init.o
...
...
board/mpl/vcma9/flash.c
已删除
100644 → 0
浏览文件 @
0bf42fec
/*
* (C) Copyright 2002
* Sysgo Real-Time Solutions, GmbH <www.elinos.com>
* Alex Zuepke <azu@sysgo.de>
*
* 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>
ulong
myflush
(
void
);
#define FLASH_BANK_SIZE PHYS_FLASH_SIZE
#define MAIN_SECT_SIZE 0x10000
/* 64 KB */
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 */
#define READY 1
#define ERR 2
#define TMO 4
/*-----------------------------------------------------------------------
*/
ulong
flash_init
(
void
)
{
int
i
,
j
;
ulong
size
=
0
;
for
(
i
=
0
;
i
<
CONFIG_SYS_MAX_FLASH_BANKS
;
i
++
)
{
ulong
flashbase
=
0
;
flash_info
[
i
].
flash_id
=
#if defined(CONFIG_AMD_LV400)
(
AMD_MANUFACT
&
FLASH_VENDMASK
)
|
(
AMD_ID_LV400B
&
FLASH_TYPEMASK
);
#elif defined(CONFIG_AMD_LV800)
(
AMD_MANUFACT
&
FLASH_VENDMASK
)
|
(
AMD_ID_LV800B
&
FLASH_TYPEMASK
);
#else
#error "Unknown flash configured"
#endif
flash_info
[
i
].
size
=
FLASH_BANK_SIZE
;
flash_info
[
i
].
sector_count
=
CONFIG_SYS_MAX_FLASH_SECT
;
memset
(
flash_info
[
i
].
protect
,
0
,
CONFIG_SYS_MAX_FLASH_SECT
);
if
(
i
==
0
)
flashbase
=
PHYS_FLASH_1
;
else
panic
(
"configured too many flash banks!
\n
"
);
for
(
j
=
0
;
j
<
flash_info
[
i
].
sector_count
;
j
++
)
{
if
(
j
<=
3
)
{
/* 1st one is 16 KB */
if
(
j
==
0
)
{
flash_info
[
i
].
start
[
j
]
=
flashbase
+
0
;
}
/* 2nd and 3rd are both 8 KB */
if
((
j
==
1
)
||
(
j
==
2
))
{
flash_info
[
i
].
start
[
j
]
=
flashbase
+
0x4000
+
(
j
-
1
)
*
0x2000
;
}
/* 4th 32 KB */
if
(
j
==
3
)
{
flash_info
[
i
].
start
[
j
]
=
flashbase
+
0x8000
;
}
}
else
{
flash_info
[
i
].
start
[
j
]
=
flashbase
+
(
j
-
3
)
*
MAIN_SECT_SIZE
;
}
}
size
+=
flash_info
[
i
].
size
;
}
flash_protect
(
FLAG_PROTECT_SET
,
CONFIG_SYS_FLASH_BASE
,
CONFIG_SYS_FLASH_BASE
+
monitor_flash_len
-
1
,
&
flash_info
[
0
]);
flash_protect
(
FLAG_PROTECT_SET
,
CONFIG_ENV_ADDR
,
CONFIG_ENV_ADDR
+
CONFIG_ENV_SIZE
-
1
,
&
flash_info
[
0
]);
return
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_LV400B
&
FLASH_TYPEMASK
):
puts
(
"1x Amd29LV400BB (4Mbit)
\n
"
);
break
;
case
(
AMD_ID_LV800B
&
FLASH_TYPEMASK
):
puts
(
"1x Amd29LV800BB (8Mbit)
\n
"
);
break
;
default:
puts
(
"Unknown Chip Type
\n
"
);
goto
Done
;
break
;
}
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
"
);
Done:
;
}
/*-----------------------------------------------------------------------
*/
int
flash_erase
(
flash_info_t
*
info
,
int
s_first
,
int
s_last
)
{
ushort
result
;
int
iflag
,
cflag
,
prot
,
sect
;
int
rc
=
ERR_OK
;
int
chip
;
/* 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
)
return
ERR_PROTECTED
;
/*
* Disable interrupts which might cause a timeout
* here. Remember that our exception vectors are
* at address 0 in the flash, and we don't want a
* (ticker) exception to happen while the flash
* chip is in programming mode.
*/
cflag
=
icache_status
();
icache_disable
();
iflag
=
disable_interrupts
();
/* Start erase on unprotected sectors */
for
(
sect
=
s_first
;
sect
<=
s_last
&&
!
ctrlc
();
sect
++
)
{
printf
(
"Erasing sector %2d ... "
,
sect
);
/* arm simple, non interrupt dependent timer */
reset_timer_masked
();
if
(
info
->
protect
[
sect
]
==
0
)
{
/* not protected */
vu_short
*
addr
=
(
vu_short
*
)
(
info
->
start
[
sect
]);
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 */
chip
=
0
;
do
{
result
=
*
addr
;
/* check timeout */
if
(
get_timer_masked
()
>
CONFIG_SYS_FLASH_ERASE_TOUT
)
{
MEM_FLASH_ADDR1
=
CMD_READ_ARRAY
;
chip
=
TMO
;
break
;
}
if
(
!
chip
&&
(
result
&
0xFFFF
)
&
BIT_ERASE_DONE
)
chip
=
READY
;
if
(
!
chip
&&
(
result
&
0xFFFF
)
&
BIT_PROGRAM_ERROR
)
chip
=
ERR
;
}
while
(
!
chip
);
MEM_FLASH_ADDR1
=
CMD_READ_ARRAY
;
if
(
chip
==
ERR
)
{
rc
=
ERR_PROG_ERROR
;
goto
outahere
;
}
if
(
chip
==
TMO
)
{
rc
=
ERR_TIMOUT
;
goto
outahere
;
}
puts
(
"ok.
\n
"
);
}
else
{
/* it was protected */
puts
(
"protected!
\n
"
);
}
}
if
(
ctrlc
())
puts
(
"User Interrupt!
\n
"
);
outahere:
/* allow flash to settle - wait 10 ms */
udelay_masked
(
10000
);
if
(
iflag
)
enable_interrupts
();
if
(
cflag
)
icache_enable
();
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
;
int
cflag
,
iflag
;
int
chip
;
/*
* Check if Flash is (sufficiently) erased
*/
result
=
*
addr
;
if
((
result
&
data
)
!=
data
)
return
ERR_NOT_ERASED
;
/*
* Disable interrupts which might cause a timeout
* here. Remember that our exception vectors are
* at address 0 in the flash, and we don't want a
* (ticker) exception to happen while the flash
* chip is in programming mode.
*/
cflag
=
icache_status
();
icache_disable
();
iflag
=
disable_interrupts
();
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 */
chip
=
0
;
do
{
result
=
*
addr
;
/* check timeout */
if
(
get_timer_masked
()
>
CONFIG_SYS_FLASH_ERASE_TOUT
)
{
chip
=
ERR
|
TMO
;
break
;
}
if
(
!
chip
&&
((
result
&
0x80
)
==
(
data
&
0x80
)))
chip
=
READY
;
if
(
!
chip
&&
((
result
&
0xFFFF
)
&
BIT_PROGRAM_ERROR
))
{
result
=
*
addr
;
if
((
result
&
0x80
)
==
(
data
&
0x80
))
chip
=
READY
;
else
chip
=
ERR
;
}
}
while
(
!
chip
);
*
addr
=
CMD_READ_ARRAY
;
if
(
chip
==
ERR
||
*
addr
!=
data
)
rc
=
ERR_PROG_ERROR
;
if
(
iflag
)
enable_interrupts
();
if
(
cflag
)
icache_enable
();
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
);
}
board/mpl/vcma9/vcma9.c
浏览文件 @
6d754843
...
...
@@ -360,3 +360,15 @@ int board_eth_init(bd_t *bis)
return
rc
;
}
#endif
/*
* Hardcoded flash setup:
* Flash 0 is a non-CFI AMD AM29F400BB flash.
*/
ulong
board_flash_get_legacy
(
ulong
base
,
int
banknum
,
flash_info_t
*
info
)
{
info
->
portwidth
=
FLASH_CFI_16BIT
;
info
->
chipwidth
=
FLASH_CFI_BY16
;
info
->
interface
=
FLASH_CFI_X16
;
return
1
;
}
include/configs/VCMA9.h
浏览文件 @
6d754843
...
...
@@ -105,6 +105,7 @@
/*#define CONFIG_MALLOC_SIZE (CONFIG_ENV_SIZE + 128*1024)*/
#define CONFIG_SYS_MONITOR_LEN (256 * 1024)
#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_FLASH_BASE
#define CONFIG_SYS_MALLOC_LEN (1024 * 1024)
/* BUNZIP2 needs a lot of RAM */
/*
...
...
@@ -217,26 +218,15 @@
* FLASH and environment organization
*/
#define CONFIG_AMD_LV400 1
/* uncomment this if you have a LV400 flash */
#if 0
#define CONFIG_AMD_LV800 1 /* uncomment this if you have a LV800 flash */
#endif
#define CONFIG_SYS_FLASH_CFI
#define CONFIG_FLASH_CFI_DRIVER
#define CONFIG_FLASH_CFI_LEGACY
#define CONFIG_SYS_FLASH_LEGACY_512Kx16
#define CONFIG_FLASH_SHOW_PROGRESS 45
#define CONFIG_SYS_MAX_FLASH_BANKS 1
/* max number of memory banks */
#ifdef CONFIG_AMD_LV800
#define PHYS_FLASH_SIZE 0x00100000
/* 1MB */
#define CONFIG_SYS_MAX_FLASH_SECT (19)
/* max number of sectors on one chip */
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x0F0000)
/* addr of environment */
#endif
#ifdef CONFIG_AMD_LV400
#define PHYS_FLASH_SIZE 0x00080000
/* 512KB */
#define CONFIG_SYS_MAX_FLASH_SECT (11)
/* max number of sectors on one chip */
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000)
/* addr of environment */
#endif
/* timeout values are in ticks */
#define CONFIG_SYS_FLASH_ERASE_TOUT (5*CONFIG_SYS_HZ)
/* Timeout for Flash Erase */
#define CONFIG_SYS_FLASH_WRITE_TOUT (5*CONFIG_SYS_HZ)
/* Timeout for Flash Write */
#define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE }
#define CONFIG_SYS_MAX_FLASH_SECT (19)
#if 0
#define CONFIG_ENV_IS_IN_FLASH 1
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录