嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
8 g. v, C+ `% ?* K
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, n. Z+ D( O+ Z8 D0 h# u
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 {# i) L$ a0 O; s
' F$ U' H7 s9 _' C2 V) l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& p( g, m7 _+ V, V; e
) t: E7 [& k0 E
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
' q+ a/ a% ]! e/ y
/*
% ]+ E; a. J ]1 p; J, g
* Check memory range for valid RAM. A simple memory test determines
- l. @ z. V0 [ J8 f, v4 l
* the actually available RAM size between addresses `base' and
$ Z7 D/ h0 ?! c, g
* `base + maxsize'.
/ x4 I" a* c0 F: l0 z
*/
8 R+ m2 B# @% B& h% Y3 J8 E
long get_ram_size(long *base, long maxsize)
) j; c8 x! t. G* r, ]
{
& p/ {! |" u3 l' _
volatile long *addr;
7 n) m1 M9 u. y6 v- x& z' e: o
long save[32];
z' ]- N. f( `1 K
long cnt;
4 x+ E3 c4 \2 m; i% `
long val;
1 Z% w5 F% y% T& P, s1 V- X
long size;
5 f" w2 P. _9 ^1 y# K2 x/ o
int i = 0;
6 d* k Y5 Z( N: H ] [
, L+ A" S3 X; l
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% r- \ w9 [0 ]: m
addr = base + cnt; /* pointer arith! */
! f5 ]3 M# t; u8 |6 a
sync ();
/ _0 V8 ^ m8 X0 R0 h v( o7 |" ]
save[i++] = *addr;
" e1 b5 U7 Y* U, [+ u. l
sync ();
, b1 H5 c$ ?7 v1 w
*addr = ~cnt;
; a' H$ E1 l$ N7 K
}
" K4 y5 O" i* k- P3 `
* b) {( g ~1 I- W
addr = base;
+ }, ?" v7 g1 N) U [
sync ();
* S v- |+ P4 y: L% f
save
= *addr;
3 \) G0 ]& s2 e; _
sync ();
% s& Y% G( {5 V0 b! x
*addr = 0;
& g$ K6 ^, M" V, u" g! C1 w
" U9 m; L" Q& y
sync ();
\+ f5 p$ B4 p# X& z( B
if ((val = *addr) != 0) {
) z' Q* `' j9 Y& F
/* Restore the original data before leaving the function.
* R7 S/ R: g1 q& a% b
*/
- x: o5 K5 a/ }
sync ();
- N- ~! L5 X: s& e, r7 `
*addr = save
;
9 L9 q6 N `. R: @& O* ~$ N$ c
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 w! t. C' _' y% w9 s
addr = base + cnt;
1 }8 W& m4 c7 a* T# `
sync ();
3 D; l% m- e- `- b A: E* i& }
*addr = save[--i];
4 ~; r' N2 T% i9 a# H
}
* f4 d- b# [$ }% h4 |6 }
return (0);
5 L- B, Z) D6 J' Q
}
# `, p+ {+ P0 {4 o0 D5 f0 s; l7 |$ y
: @- h! d) A) {) ~! T
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 V: n+ n8 l j& m5 O$ s6 j: N
addr = base + cnt; /* pointer arith! */
9 o: X6 l2 @5 i
val = *addr;
& x8 n, O4 ?( n. A4 Y2 C& ~# Z
*addr = save[--i];
6 f h8 `" h* P# p
if (val != ~cnt) {
, G. I, X5 @& M! D. I
size = cnt * sizeof (long);
2 P; r: p9 f$ r' J' d5 }4 i+ `) m
/* Restore the original data before leaving the function.
! R6 w4 x: \; r* p d
*/
4 _$ z& l% B3 e C0 h6 f" L
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- i9 Z$ M8 d, {
addr = base + cnt;
2 p9 N7 \$ a0 w. s" a" r/ H
*addr = save[--i];
6 C1 A5 R+ T K* s. [
}
* A. B% }+ A$ v' S
return (size);
B9 y* A& q7 s
}
h% K6 a; Q* v% ]# N
}
$ s3 {9 Z7 F; J' z7 @) R1 h! k
. v) l7 `/ T% g- m/ k, i+ Q; O% Y5 {
return (maxsize);
- _+ c$ c/ r$ j. d, a* l0 N' r
}
3 R6 ?* ~* z2 e s: f
int dram_init(void)
7 u, K( o4 L4 h- U' p
{
* p5 [% g+ E1 f7 D& u2 D/ E; r
/* dram_init must store complete ramsize in gd->ram_size */
, A' {1 L- `' D4 a. _* v
gd->ram_size = get_ram_size(
4 e U8 z+ d3 s9 A: y
(void *)CONFIG_SYS_SDRAM_BASE,
) w$ H9 K' {! x2 O' [; Y5 y' S9 p
CONFIG_MAX_RAM_BANK_SIZE);
+ n, G+ Z% k3 Z2 X% X
return 0;
$ y0 f: ~6 T: _; W5 [$ A
}
0 c7 {, n0 L2 }3 a' F$ d
F0 }0 {5 y! {
# w. h7 S+ Z$ l3 ~7 `
# j' p1 y; [7 x! R0 K/ H: T, I4 _
' Q4 y8 o+ K7 u# J9 w
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; L5 ^, a, h5 k5 P
9 U" l9 @0 O" b. J
6 y) a" T1 g+ P7 _% i
: p4 Y2 ]2 |. c6 h+ P
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4