嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
4 |/ ^5 I/ |( `% ]1 ^- s3 p6 ^
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. ^- `! g0 {5 c- h. v4 A
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 @* l: q7 `1 g2 o' L6 i* @" p
% l5 j" Q. {. _: F7 T6 [2 t3 S
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 r0 b6 s Z: G# c
% x4 T5 y& g) ?- g5 a& _4 y' G" n" m
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 z! k+ y. E' K J! j; g0 E
/*
* f. S' O4 r! E- c3 ]
* Check memory range for valid RAM. A simple memory test determines
* \, Z9 k: O' A! h0 K% e# `
* the actually available RAM size between addresses `base' and
/ }* t, x1 X* C/ l5 f) m/ x
* `base + maxsize'.
8 y& s2 K" \% A
*/
" @" g$ g+ U0 d! v
long get_ram_size(long *base, long maxsize)
, J. D! u# z% d+ O! s5 m
{
) K3 h7 P, ~3 A
volatile long *addr;
$ M% p# ~* f) c* ~
long save[32];
6 D( v% p. G/ b: ~& A
long cnt;
/ i* }3 ?3 t$ r+ F! u9 V* ?4 E
long val;
B/ }( \4 A/ m# W0 J- M4 d
long size;
: i" J# c( f$ e" u* |! g
int i = 0;
& U! {1 a3 ?* q" C5 @# A
7 V4 z$ Y$ k( T2 X; F6 @' f& b9 J
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: d2 b- H. {% j; R
addr = base + cnt; /* pointer arith! */
! h" @) t+ u3 v
sync ();
9 k3 e' ~$ ]& `% @1 ?
save[i++] = *addr;
* y/ a: _/ e1 [: j
sync ();
$ N% ?" l! U0 E- {
*addr = ~cnt;
7 i' D1 e# T2 _5 ?* L5 B7 Q; L" j
}
& A0 k' o- b3 y- W2 w- j1 @
9 ], R8 M9 |7 L- r" c5 u, \
addr = base;
$ z) Z% ^. @5 z1 z
sync ();
8 \9 F5 P9 W5 r# u
save
= *addr;
: r, T( i6 G- G; G. i
sync ();
# H: D' z. q' F6 Y2 d, O7 T, W8 ~
*addr = 0;
^5 `5 \) f. M4 o- d( n
- i( s2 F7 `0 H: g* v/ o
sync ();
/ H F+ }; D5 c+ U4 b/ v7 R
if ((val = *addr) != 0) {
5 V/ a/ e! I7 _0 V* G0 E" y2 q# z
/* Restore the original data before leaving the function.
, r7 e! v G8 B" n+ C
*/
) ?( O) Z* `& G) \4 c) H; S1 h
sync ();
% X0 a0 u5 M0 W& R9 b8 j8 E Z' R
*addr = save
;
0 f3 |. F, `0 o g& o
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: A. K6 S) E& R/ v" _8 z0 U
addr = base + cnt;
3 @$ T( r: x* z0 ]9 h
sync ();
+ m1 b6 A. n( p2 K- T/ s9 E0 j
*addr = save[--i];
* p; D1 M4 a* T( C
}
" [- g3 K" {& P0 h/ f0 d
return (0);
+ y4 B( X: A5 k; q6 _' e0 G
}
% n" l: a- K7 z, b0 L; l3 Y
8 h! Q) l2 h* X3 ?
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) _6 U: w" u. I* E
addr = base + cnt; /* pointer arith! */
( K4 Q+ c/ D/ ?5 P6 w1 t8 ]2 d
val = *addr;
- l ^+ X$ g# F) l
*addr = save[--i];
. ^& E7 h& m6 G8 H
if (val != ~cnt) {
2 w9 v- l" e+ K) v3 B2 O
size = cnt * sizeof (long);
0 B( X0 a) R; W3 D8 O
/* Restore the original data before leaving the function.
6 q, ]& o* M- e" b0 }
*/
1 ^, R( Y+ F A. _$ H2 C* x+ o
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& Q; }1 h, N3 ^# v- ^
addr = base + cnt;
; Q8 m' }9 g( y+ v Z) M
*addr = save[--i];
' ~8 T) M) {# G. e) X3 V+ p/ j
}
$ f2 R2 T, m1 H" D0 h
return (size);
3 X8 C4 z$ r& G) I, h8 l( R6 t
}
0 |$ j! ^- g/ Z: ~
}
2 l& g: ]9 m2 H# l: r/ z
$ F3 k; h3 j ^& g1 l2 T w' _
return (maxsize);
" w( V. \ b: d* e, k
}
* i6 |9 X/ f; g f! K, g
int dram_init(void)
$ I0 ]) F% v, h N% A' I9 i- g
{
& X/ [1 F5 @4 ^
/* dram_init must store complete ramsize in gd->ram_size */
6 s8 K" m9 B" Z. d+ b" t4 V! B
gd->ram_size = get_ram_size(
X- M4 G2 r( Q: `( y- }& x+ e
(void *)CONFIG_SYS_SDRAM_BASE,
4 F% Y* C+ ~1 W- u6 t" A
CONFIG_MAX_RAM_BANK_SIZE);
y* ~4 s, d! d1 J6 q# D
return 0;
7 ]: M; k9 \7 Y# \: I8 X
}
+ S& w' f, n D3 q1 u: G
2 b5 }* b0 O. F& `0 Q
8 ^/ u( v+ h" Y+ Z+ Z& u4 h% [, m
+ Y2 r( L# V' d; b: i
8 M+ Y8 }; p1 G- }& E# E, K
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 l5 _ m3 N5 O7 q; u# r
# o4 X- @! i- B2 u' ~
9 K: J7 |& P" Y F
1 J, ?9 y5 h4 z4 {, n. Y& r9 x
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4