Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OS
U-Boot.Mirror
提交
b202816c
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,发现更多精彩内容 >>
提交
b202816c
编写于
10月 21, 2008
作者:
T
TsiChung Liew
提交者:
John Rigby
11月 03, 2008
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ColdFire: Use CFI driver for M5272C3
Signed-off-by:
N
TsiChung Liew
<
Tsi-Chung.Liew@freescale.com
>
上级
f3962d3f
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
11 addition
and
383 deletion
+11
-383
board/freescale/m5272c3/Makefile
board/freescale/m5272c3/Makefile
+1
-1
board/freescale/m5272c3/flash.c
board/freescale/m5272c3/flash.c
+0
-378
include/configs/M5272C3.h
include/configs/M5272C3.h
+10
-4
未找到文件。
board/freescale/m5272c3/Makefile
浏览文件 @
b202816c
...
...
@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
LIB
=
$(obj)
lib
$(BOARD)
.a
COBJS
=
$(BOARD)
.o
flash.o
COBJS
=
$(BOARD)
.o
SRCS
:=
$(SOBJS:.o=.S)
$(COBJS:.o=.c)
OBJS
:=
$(
addprefix
$(obj)
,
$(COBJS)
)
...
...
board/freescale/m5272c3/flash.c
已删除
100644 → 0
浏览文件 @
f3962d3f
/*
* (C) Copyright 2000-2003
* Wolfgang Denk, DENX Software Engineering, wd@denx.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>
#define PHYS_FLASH_1 CONFIG_SYS_FLASH_BASE
#define FLASH_BANK_SIZE 0x200000
flash_info_t
flash_info
[
CONFIG_SYS_MAX_FLASH_BANKS
];
void
flash_print_info
(
flash_info_t
*
info
)
{
int
i
;
switch
(
info
->
flash_id
&
FLASH_VENDMASK
)
{
case
(
AMD_MANUFACT
&
FLASH_VENDMASK
):
printf
(
"AMD: "
);
break
;
default:
printf
(
"Unknown Vendor "
);
break
;
}
switch
(
info
->
flash_id
&
FLASH_TYPEMASK
)
{
case
(
AMD_ID_PL160CB
&
FLASH_TYPEMASK
):
printf
(
"AM29PL160CB (16Mbit)
\n
"
);
break
;
default:
printf
(
"Unknown Chip Type
\n
"
);
goto
Done
;
break
;
}
printf
(
" Size: %ld MB in %d Sectors
\n
"
,
info
->
size
>>
20
,
info
->
sector_count
);
printf
(
" Sector Start Addresses:"
);
for
(
i
=
0
;
i
<
info
->
sector_count
;
i
++
)
{
if
((
i
%
5
)
==
0
)
{
printf
(
"
\n
"
);
}
printf
(
" %08lX%s"
,
info
->
start
[
i
],
info
->
protect
[
i
]
?
" (RO)"
:
" "
);
}
printf
(
"
\n
"
);
Done:
return
;
}
unsigned
long
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
=
(
AMD_MANUFACT
&
FLASH_VENDMASK
)
|
(
AMD_ID_PL160CB
&
FLASH_TYPEMASK
);
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 to many flash banks!
\n
"
);
for
(
j
=
0
;
j
<
flash_info
[
i
].
sector_count
;
j
++
)
{
if
(
j
==
0
)
{
/* 1st is 16 KiB */
flash_info
[
i
].
start
[
j
]
=
flashbase
;
}
if
((
j
>=
1
)
&&
(
j
<=
2
))
{
/* 2nd and 3rd are 8 KiB */
flash_info
[
i
].
start
[
j
]
=
flashbase
+
0x4000
+
0x2000
*
(
j
-
1
);
}
if
(
j
==
3
)
{
/* 4th is 224 KiB */
flash_info
[
i
].
start
[
j
]
=
flashbase
+
0x8000
;
}
if
((
j
>=
4
)
&&
(
j
<=
10
))
{
/* rest is 256 KiB */
flash_info
[
i
].
start
[
j
]
=
flashbase
+
0x40000
+
0x40000
*
(
j
-
4
);
}
}
size
+=
flash_info
[
i
].
size
;
}
flash_protect
(
FLAG_PROTECT_SET
,
CONFIG_SYS_FLASH_BASE
,
CONFIG_SYS_FLASH_BASE
+
0x3ffff
,
&
flash_info
[
0
]);
return
size
;
}
#define CMD_READ_ARRAY 0x00F0
#define CMD_UNLOCK1 0x00AA
#define CMD_UNLOCK2 0x0055
#define CMD_ERASE_SETUP 0x0080
#define CMD_ERASE_CONFIRM 0x0030
#define CMD_PROGRAM 0x00A0
#define CMD_UNLOCK_BYPASS 0x0020
#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 0x0080
#define BIT_RDY_MASK 0x0080
#define BIT_PROGRAM_ERROR 0x0020
#define BIT_TIMEOUT 0x80000000
/* our flag */
#define READY 1
#define ERR 2
#define TMO 4
int
flash_erase
(
flash_info_t
*
info
,
int
s_first
,
int
s_last
)
{
ulong
result
;
int
iflag
,
cflag
,
prot
,
sect
;
int
rc
=
ERR_OK
;
int
chip1
;
/* 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
();
printf
(
"
\n
"
);
/* 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 */
set_timer
(
0
);
if
(
info
->
protect
[
sect
]
==
0
)
{
/* not protected */
volatile
u16
*
addr
=
(
volatile
u16
*
)
(
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 */
chip1
=
0
;
do
{
result
=
*
addr
;
/* check timeout */
if
(
get_timer
(
0
)
>
CONFIG_SYS_FLASH_ERASE_TOUT
)
{
MEM_FLASH_ADDR1
=
CMD_READ_ARRAY
;
chip1
=
TMO
;
break
;
}
if
(
!
chip1
&&
(
result
&
0xFFFF
)
&
BIT_ERASE_DONE
)
chip1
=
READY
;
}
while
(
!
chip1
);
MEM_FLASH_ADDR1
=
CMD_READ_ARRAY
;
if
(
chip1
==
ERR
)
{
rc
=
ERR_PROG_ERROR
;
goto
outahere
;
}
if
(
chip1
==
TMO
)
{
rc
=
ERR_TIMOUT
;
goto
outahere
;
}
printf
(
"ok.
\n
"
);
}
else
{
/* it was protected */
printf
(
"protected!
\n
"
);
}
}
if
(
ctrlc
())
printf
(
"User Interrupt!
\n
"
);
outahere:
/* allow flash to settle - wait 10 ms */
udelay
(
10000
);
if
(
iflag
)
enable_interrupts
();
if
(
cflag
)
icache_enable
();
return
rc
;
}
static
int
write_word
(
flash_info_t
*
info
,
ulong
dest
,
ulong
data
)
{
volatile
u16
*
addr
=
(
volatile
u16
*
)
dest
;
ulong
result
;
int
rc
=
ERR_OK
;
int
cflag
,
iflag
;
int
chip1
;
/*
* 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 */
set_timer
(
0
);
/* wait until flash is ready */
chip1
=
0
;
do
{
result
=
*
addr
;
/* check timeout */
if
(
get_timer
(
0
)
>
CONFIG_SYS_FLASH_ERASE_TOUT
)
{
chip1
=
ERR
|
TMO
;
break
;
}
if
(
!
chip1
&&
((
result
&
0x80
)
==
(
data
&
0x80
)))
chip1
=
READY
;
}
while
(
!
chip1
);
*
addr
=
CMD_READ_ARRAY
;
if
(
chip1
==
ERR
||
*
addr
!=
data
)
rc
=
ERR_PROG_ERROR
;
if
(
iflag
)
enable_interrupts
();
if
(
cflag
)
icache_enable
();
return
rc
;
}
int
write_buff
(
flash_info_t
*
info
,
uchar
*
src
,
ulong
addr
,
ulong
cnt
)
{
ulong
wp
,
data
;
int
rc
;
if
(
addr
&
1
)
{
printf
(
"unaligned destination not supported
\n
"
);
return
ERR_ALIGN
;
}
#if 0
if (cnt & 1) {
printf ("odd transfer sizes not supported\n");
return ERR_ALIGN;
}
#endif
wp
=
addr
;
if
(
addr
&
1
)
{
data
=
(
*
((
volatile
u8
*
)
addr
)
<<
8
)
|
*
((
volatile
u8
*
)
src
);
if
((
rc
=
write_word
(
info
,
wp
-
1
,
data
))
!=
0
)
{
return
(
rc
);
}
src
+=
1
;
wp
+=
1
;
cnt
-=
1
;
}
while
(
cnt
>=
2
)
{
data
=
*
((
volatile
u16
*
)
src
);
if
((
rc
=
write_word
(
info
,
wp
,
data
))
!=
0
)
{
return
(
rc
);
}
src
+=
2
;
wp
+=
2
;
cnt
-=
2
;
}
if
(
cnt
==
1
)
{
data
=
(
*
((
volatile
u8
*
)
src
)
<<
8
)
|
*
((
volatile
u8
*
)
(
wp
+
1
));
if
((
rc
=
write_word
(
info
,
wp
,
data
))
!=
0
)
{
return
(
rc
);
}
src
+=
1
;
wp
+=
1
;
cnt
-=
1
;
}
return
ERR_OK
;
}
include/configs/M5272C3.h
浏览文件 @
b202816c
...
...
@@ -194,12 +194,18 @@
*/
#define CONFIG_SYS_BOOTMAPSZ (CONFIG_SYS_SDRAM_BASE + (CONFIG_SYS_SDRAM_SIZE << 20))
/*
-----------------------------------------------------------------------
/*
* FLASH organization
*/
#define CONFIG_SYS_MAX_FLASH_BANKS 1
/* max number of memory banks */
#define CONFIG_SYS_MAX_FLASH_SECT 11
/* max number of sectors on one chip */
#define CONFIG_SYS_FLASH_ERASE_TOUT 1000
#define CONFIG_SYS_FLASH_CFI
#ifdef CONFIG_SYS_FLASH_CFI
# define CONFIG_FLASH_CFI_DRIVER 1
# define CONFIG_SYS_FLASH_SIZE 0x800000
/* Max size that the board might have */
# define CONFIG_SYS_FLASH_CFI_WIDTH FLASH_CFI_16BIT
# define CONFIG_SYS_MAX_FLASH_BANKS 1
/* max number of memory banks */
# define CONFIG_SYS_MAX_FLASH_SECT 137
/* max number of sectors on one chip */
# define CONFIG_SYS_FLASH_PROTECTION
/* "Real" (hardware) sectors protection */
#endif
/*-----------------------------------------------------------------------
* Cache Configuration
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录