嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
; [- b9 X( R9 H. ~
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. D# B3 ^: ~! p4 y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% A8 d% C1 u+ \' C% O" r _
5 c* S9 h: v c# H7 ^3 H. E6 F
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 f0 W# k2 v3 }! j7 U
- S7 [9 }2 W# A* l9 T! _
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. N' c1 t3 \' W8 u B
/*
( l3 S) y. r% G- b3 M6 Z9 Q
* Check memory range for valid RAM. A simple memory test determines
# k) v+ S6 o/ i7 q( D1 A
* the actually available RAM size between addresses `base' and
/ L9 l$ s8 `5 Y4 Z+ Y' ]
* `base + maxsize'.
( R1 U" L& r6 b; ~- i$ k H
*/
7 `' m) R. p" G, l, Y3 L7 `
long get_ram_size(long *base, long maxsize)
' x# q7 ~" z$ v9 F1 G9 d$ q
{
$ j! r1 ~7 c+ k9 @- g1 L. ^# Z
volatile long *addr;
' O# ]( e1 A5 q
long save[32];
1 M- j- D+ ~8 Q: _( y* I
long cnt;
5 R* m2 @( A( a& o2 O2 j
long val;
( ?4 m- h T U. f5 U( A; w
long size;
, X( ?# u, b1 L
int i = 0;
( P% e2 k! A' P& q1 A& c" A
0 ~. g. ]' h) _! [% I
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) \# K( t0 L: \! s( k
addr = base + cnt; /* pointer arith! */
( ]! B" G( ~( q2 W% X3 S/ Z
sync ();
! ?. E8 s- ?: k: t
save[i++] = *addr;
& Q7 { J4 K1 Y. }+ Z" l/ \8 V
sync ();
3 ~1 G& v% G9 h% b, W
*addr = ~cnt;
9 a3 p! b3 W' f( B5 }& [( l
}
; }+ J3 Q q9 r, r
4 Z8 a, v2 z; {7 p# |" f2 t" H
addr = base;
% N T+ d. S/ n
sync ();
$ G( o# e, o2 U' w1 i9 w. Z0 @5 O
save
= *addr;
7 K9 q( L' Z& D, i6 t; X j
sync ();
+ I% C1 t; @! S
*addr = 0;
t: ^' ?: t0 O
! l" V( ?) n5 e, L8 b+ Q; V
sync ();
) w% O1 B; x/ w8 h, d! u8 |
if ((val = *addr) != 0) {
& [( u6 x( d7 ~/ l q
/* Restore the original data before leaving the function.
0 ^0 _( N3 e; w- B& x
*/
: r8 m+ A* M9 R1 z. i) y
sync ();
9 f7 j% c! c, T" k3 v8 B) O
*addr = save
;
+ G* Q; ?; i0 c" W
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 @$ b( O: ^0 g; H% g7 V
addr = base + cnt;
# I3 q1 o9 R6 P3 X
sync ();
7 |; }- B' \9 U9 j# v- z& M
*addr = save[--i];
3 u; P& Z) h1 O- Z$ J @1 z
}
* P9 y* ~* Z8 r3 i" W) t/ T
return (0);
$ L: ^- M7 R- }$ a4 \0 \
}
' I$ p8 O9 R! N3 d }: J
. w- t) |4 i5 I; e8 U, i
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 z8 G! i; I7 ]$ L, ?# |' \
addr = base + cnt; /* pointer arith! */
" }$ M, e) k+ | d: N/ P; e' Q
val = *addr;
2 d% S+ r/ k7 j0 o& Y* z
*addr = save[--i];
$ Z/ r7 j! g8 b4 | B7 a) D# z
if (val != ~cnt) {
/ N& [# Z! A k
size = cnt * sizeof (long);
/ }' P; C1 S1 H
/* Restore the original data before leaving the function.
5 S3 t4 `$ _+ C2 G! ]; z; w- g$ c
*/
) \7 ?+ X* ]" p1 l/ R
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, D8 K s+ K0 [- X2 w$ M n. H
addr = base + cnt;
" ^; L" m& w9 k6 \
*addr = save[--i];
( s+ `: o; h9 q/ _, f% i0 e
}
* E1 Y0 V( Q0 d7 z) s8 V
return (size);
) C/ M" j1 m) F: \: j
}
+ K5 O. `) l) K9 s: \4 d/ b: |
}
8 m; y3 U6 o" e/ N4 g
- f- N K+ v6 d
return (maxsize);
" x1 b" ^! k' \
}
0 q' g8 a- z6 `, H( c, [4 m+ _4 e
int dram_init(void)
5 m; T( l& ~! g8 I( R
{
+ o# ?" b J$ F( O" q
/* dram_init must store complete ramsize in gd->ram_size */
! r* j8 u) J3 n& l
gd->ram_size = get_ram_size(
- l$ a1 l8 O, ]; U9 Z
(void *)CONFIG_SYS_SDRAM_BASE,
0 `$ D* T7 w$ Y
CONFIG_MAX_RAM_BANK_SIZE);
2 F- f9 q$ l: v+ U
return 0;
' n# B3 T! k' S; l& t0 K% l
}
* s+ W* \; T% e4 Z# f
# X& C8 J/ K; }( W8 h' U* B* M2 M
; f( Q* v" Q: P$ L5 d
7 y6 P& r* P& x( M8 U* H; s
; y/ S) T# K' ~1 d! C4 Q# c8 n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 `. c+ F/ i: X- o
$ c: t+ c! F: k* ]
! l* t- ~. V* K
' S3 X# d+ {( [; v4 z9 |
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4