嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
( A2 F9 M n% Q# c. V
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ I' S* J) e# o& ~/ F
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 ~, }. x0 k2 y7 H% o! F
5 q* q: V' U) Q* {8 G; p; e# \8 v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 k4 z' s% _* I2 D- D
1 l' _, ]% h& N1 @3 |
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 c- `5 D/ n+ T
/*
5 H6 y2 o6 Y* C3 e
* Check memory range for valid RAM. A simple memory test determines
2 [+ X7 s }3 x7 P T5 Z1 R L2 R
* the actually available RAM size between addresses `base' and
8 N9 o# h7 N2 O$ d6 }
* `base + maxsize'.
! {+ {/ e. N9 n. p' F k% v
*/
, V) \( C$ T; X$ h1 ?
long get_ram_size(long *base, long maxsize)
2 L; R3 a7 z% ~/ a% X8 i
{
& _$ ^# w2 c& f$ ? Z! n5 f
volatile long *addr;
1 S7 h3 y# R4 ~
long save[32];
? Q% r; n3 R
long cnt;
' [3 s1 a8 K& ]1 U9 g3 p, g' Z
long val;
/ M1 @" `2 D9 X# Y: Y1 Z
long size;
2 R8 L8 j9 N9 \8 `+ K
int i = 0;
0 y) x# @" H! O% d6 L' k
( w1 r& V9 Z1 t
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 u; I0 ]9 b4 i4 N* H f. X+ s- V; Z
addr = base + cnt; /* pointer arith! */
! Z3 G( L; ?0 @% t( |
sync ();
- ]! T: i% L1 L1 w
save[i++] = *addr;
4 ]! W2 _# P+ g$ u7 Z4 p9 |5 [
sync ();
- ^; Y/ W/ B5 x; q& s0 j* ]
*addr = ~cnt;
$ o9 H: ?! f) u. b! S
}
; d" X; [' R7 i( P9 N0 s
# z' V5 p$ `+ T2 L. ?. t2 L0 N
addr = base;
, d8 g# V) }7 Y" ^/ k
sync ();
5 p8 v2 I6 D0 m5 L+ u
save
= *addr;
7 k6 ^9 r/ C+ ]8 S& ^ B" B
sync ();
& A: e/ S( F" I( Q# h* T
*addr = 0;
9 t% P! m. H# X3 n5 d" v+ q/ d
" Y: B) R* x7 b o0 i/ m
sync ();
' k9 Y1 {" e, X6 }
if ((val = *addr) != 0) {
9 m3 O% k- t; [6 ~3 P4 \- u; ]
/* Restore the original data before leaving the function.
2 a% g) U$ X! f6 O, o
*/
! Z+ {0 ~$ W8 [7 s4 Q
sync ();
0 m8 |4 N% N! J' q5 @
*addr = save
;
- h3 U" s0 l' S& B3 W4 G
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; ~6 A# Q# A8 h1 m; @0 i' Y
addr = base + cnt;
! V h% ~5 a$ \
sync ();
% ]6 j: f* O" ^- o
*addr = save[--i];
1 ?4 {: I* Y* F, D; {, H
}
" F0 R" _) i' V. ]) Z) g' j
return (0);
) G: v1 K" T1 J8 o" I4 ~
}
+ B- x5 g& |8 i, @) Q; C6 E
2 u1 b1 M4 P$ M3 P3 Z9 m
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 R7 l, O) U( n6 [
addr = base + cnt; /* pointer arith! */
& h" y, J' ]0 ^9 O8 G4 b5 Y# n
val = *addr;
2 y1 R6 ?; e: d! ] c
*addr = save[--i];
+ M) Q) U# {5 K5 g$ z" ] V
if (val != ~cnt) {
9 q" [/ T r9 s2 M$ j+ ~ N) ^
size = cnt * sizeof (long);
+ y9 ?% ^& m* Q3 M6 y
/* Restore the original data before leaving the function.
4 H+ o* D4 M( [# Q. m2 I
*/
6 h0 Q4 V }' b" q
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' g2 e" H, x3 z. d1 V# X1 R# L
addr = base + cnt;
) v! m; B! B$ E5 j
*addr = save[--i];
, I7 [/ v/ g# o" ?8 I+ i5 g# h
}
i4 q% B) M5 B" F+ B
return (size);
- T h* Y- w, a _( y
}
5 P% }7 n7 ?$ S! \ o
}
: e3 @ m/ H2 m1 ~1 ~* a0 I, H
4 W- C0 w, F; X9 O2 r
return (maxsize);
! M' i; d$ F( f0 Z
}
9 Q+ J" w' G& j$ k
int dram_init(void)
4 X+ v& f5 b$ B e9 E0 u
{
- b; h7 H) y2 {+ V9 s
/* dram_init must store complete ramsize in gd->ram_size */
3 D z2 N8 R5 V( m, g; ]; X
gd->ram_size = get_ram_size(
5 T: Y g1 ~# b/ ^
(void *)CONFIG_SYS_SDRAM_BASE,
p0 R6 m/ K/ d" G: r& e
CONFIG_MAX_RAM_BANK_SIZE);
- f2 ]( t$ H+ k" y1 ]! L
return 0;
( t8 u9 i% E7 y. m; f
}
* a5 B" f8 v& c$ E9 S( X, K! v, L: O9 [
, r! f# |( _. q
0 x3 q& X [& ]" C0 J9 M
0 l5 m% n1 i: F
0 b2 I# U: X$ j
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 z* C! P# Q0 X2 v! a7 E
( F D, ~; f; H3 }% e
& ^/ e! m: i3 t' b) G }! C
D4 h9 s# H2 C% F8 y F# i
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4