嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
; s; h: E" N j
核心板2:DDR2 256M Byte NAND FLASH 8G bit
! t/ l) C1 z+ p( c
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" h$ |5 M) I# ]% g3 d
* X3 @( ?4 S+ a0 _% C f3 Y! o+ R
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; y. V2 E' P( A; Z* d: g
8 i7 T P9 k2 ?0 g* |& a
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* M: b; i! Y7 y4 r" n; o# n9 [" y- g
/*
( G; x% h1 X9 R( V( u1 u
* Check memory range for valid RAM. A simple memory test determines
1 C) n) `+ y. Z/ t, g1 ~
* the actually available RAM size between addresses `base' and
5 \* ?. q2 K4 s2 o
* `base + maxsize'.
. u7 p2 c2 R% |7 }1 N' B
*/
/ d& G, t/ a& b# t3 T
long get_ram_size(long *base, long maxsize)
( L+ b4 W! b, Y' O6 Y- v1 w
{
4 {$ E6 P, e1 Y2 P, }
volatile long *addr;
( D9 C6 Y. q4 {3 W, D8 @# l% [
long save[32];
4 y) k/ d# ` ~
long cnt;
$ w# \* \/ t1 Y
long val;
+ t8 ^5 [, K& d0 n
long size;
* J) b" x+ _& l6 K1 w3 V2 a
int i = 0;
8 q, R, u" W) K
3 K; X7 u5 ?! n6 D' g
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" U1 f7 V1 f5 L5 B
addr = base + cnt; /* pointer arith! */
' ]+ u% t3 ^! o) F
sync ();
+ z1 l5 ]$ a/ {% Q2 O( K
save[i++] = *addr;
9 ?8 y6 `3 g! e) t
sync ();
2 d6 `6 h5 c0 s4 n; T& m
*addr = ~cnt;
# b' y+ h/ N, z' d
}
7 M+ s5 g! A' _
1 k5 g4 X0 A, A8 ^: G6 p
addr = base;
# @: H) E1 G! d$ B
sync ();
% o9 g( K; `6 |: N
save
= *addr;
* Q+ G* T8 a; D& U
sync ();
) e9 Y4 U' K! D' |" p z
*addr = 0;
# |5 [" v" d4 ?$ C) S: ?. M
U1 C) g& I0 F6 p# z
sync ();
' ?8 ?0 g1 n9 d
if ((val = *addr) != 0) {
" x1 o0 E. Z, I. e
/* Restore the original data before leaving the function.
1 D u6 C$ X5 p
*/
0 J& D- a0 M4 \ v" Q7 x* J; C
sync ();
& S- w- P' h8 f+ `6 L
*addr = save
;
0 B3 f. G1 L; L$ N q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- z) L% v1 _5 b5 t4 [! D
addr = base + cnt;
* O. } ? f+ q, `# T
sync ();
7 j* o! L* v6 d7 A' F
*addr = save[--i];
% l' C* r; ^ |7 o
}
; e/ p8 U9 z$ @0 o9 N: K* T' e) U( V
return (0);
! P# j6 x) _7 h! \3 m: Z5 g
}
0 r* U5 d% I2 Y, {# W4 Y
$ Z& Z: D7 x- g: j, ^& K' p/ `
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- I; v$ t4 \/ C: E) R
addr = base + cnt; /* pointer arith! */
9 T+ v# K8 m& O' r! }; I: |0 L+ P
val = *addr;
+ N/ I# s( L6 k. p# q
*addr = save[--i];
Q" o; N9 h7 N( C( Z
if (val != ~cnt) {
5 a! X% o8 {& b' v
size = cnt * sizeof (long);
2 W8 h6 g Z& c8 Z9 H9 y
/* Restore the original data before leaving the function.
( T$ h, S/ W0 g$ C4 g
*/
) }9 b" |7 s/ }9 T% V- p, q7 |. }
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, A4 M$ c5 z7 P% H2 H: @
addr = base + cnt;
8 a, f: @* p2 v( _" O
*addr = save[--i];
a! h* d* O# M, G( i
}
+ o" F) q* r/ B: T5 G. ?
return (size);
) G3 Y8 p) k$ `7 t, }* {
}
, _0 T' t# b+ r
}
& k6 w1 h# d( A# ~
" m) V/ K. m( E, ^7 \3 J4 u, l
return (maxsize);
( g$ p% B6 } r) n7 E4 }% P' n4 Z+ D
}
- N- ?3 D: F, J1 x& x+ V; C3 P
int dram_init(void)
T# C' ]+ v" @4 T. D0 M1 @
{
% T' l T, o8 R: w0 c/ W
/* dram_init must store complete ramsize in gd->ram_size */
2 I u) d+ \- i! L0 ?
gd->ram_size = get_ram_size(
1 g- W- d8 H. Q& @7 g7 r
(void *)CONFIG_SYS_SDRAM_BASE,
' ]9 w* {7 [" j# W' M
CONFIG_MAX_RAM_BANK_SIZE);
# P" i" P. J J8 ]" z
return 0;
x, V, T D: _( e& n, J7 |1 K
}
- _+ G. e1 r( t# }
* E; m: s" }, O' i" w2 C
5 y4 N% O) w$ B9 P6 ?
, r2 H# B5 k( u. o
7 D; H! |, v7 P) ?9 m
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% A: t f7 J* r3 r4 \# r
: D+ m1 D, c& P* m0 U% k
# k# g. S T; g+ m' |! O
& R9 ^7 o3 Z! c/ V* N1 n9 s0 ~
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4