嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
2 R2 W& f- K+ A" ~& r" e1 W
核心板2:DDR2 256M Byte NAND FLASH 8G bit
# ^+ I- N: n: |+ L' D+ i! B8 d
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ Z2 [0 z' z% @; G* F& M
6 `- j3 a" T3 Y& L! }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# C7 A4 c) ?9 {6 b" n) i8 ~
9 W" R- T6 d* |2 U, o! @5 O; a
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! O' E( B' y' H
/*
" |6 E8 j( F) q, Q) K
* Check memory range for valid RAM. A simple memory test determines
& `; H7 z5 E0 ~5 y/ A
* the actually available RAM size between addresses `base' and
# e. s4 b7 S8 Q, e8 C6 U0 g6 _: J2 B
* `base + maxsize'.
2 L: S! U2 Z4 }
*/
0 }# k8 d6 W' m: j6 ]" F2 P: ~" E$ n
long get_ram_size(long *base, long maxsize)
0 O r9 u* c9 Q% l) R0 A9 T8 k
{
' v& d8 S$ L+ s) h6 l' {4 }
volatile long *addr;
0 e: R# O) h0 T7 m; z9 ]
long save[32];
! s9 {' Y; \7 w8 ~, l
long cnt;
8 }% C/ Z. p# |+ ?% V) o
long val;
3 p6 R% c4 r) ^9 Q+ _
long size;
3 X3 [2 o7 h- J' _+ v% v( j) ]
int i = 0;
9 c8 @% u4 N& i$ \. A& x
5 w \" [5 x1 ]& s- n, C1 p( G
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ Z" j. F8 s1 Y. u2 G7 E! O
addr = base + cnt; /* pointer arith! */
t/ a7 A+ w+ D0 l- Q
sync ();
9 ^: j7 ?, c3 q8 J: M5 d
save[i++] = *addr;
: I; E0 P, T2 a k0 d
sync ();
0 R) ~. M5 r8 {( A9 f) p
*addr = ~cnt;
9 Z; }; r4 U [! L
}
2 w! u5 S; I* {3 v9 {- n
+ Q/ _7 Y& M k, O7 E% N
addr = base;
# o+ f6 P- C" Q2 V- r
sync ();
W! n, s- [6 T& t' N: M
save
= *addr;
% F" A) F! S, _* V% U! p5 ?% V
sync ();
, K- `2 g8 b5 u* s3 f+ s
*addr = 0;
( d$ V, i' G, q3 `) U
4 E( u; O1 b& t; ^7 B
sync ();
6 w; p$ e* d+ d+ Z# q* k
if ((val = *addr) != 0) {
4 Y6 a+ p' W+ F$ o( b
/* Restore the original data before leaving the function.
6 G+ a! u8 |5 U: c- B% W# s
*/
' [; C5 t0 y( \
sync ();
; k7 c2 m( q; T& v2 m! D
*addr = save
;
5 y! T3 ^% c& Z2 r* ]" E. H) C6 v( @
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( i; Q6 l. H6 k; h1 j
addr = base + cnt;
/ U6 z, y3 X! O; j$ h( R
sync ();
1 s+ l1 ^8 F- ^! s* K5 H( \" P
*addr = save[--i];
2 `( o: v7 U& {0 H1 R
}
" c R8 q8 j7 V2 t2 I, S
return (0);
( ]9 |+ a5 _% h* Y3 ?
}
4 B5 z* v+ y, O
! m4 k: z1 I/ j+ H
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 o [2 K8 L5 {) D
addr = base + cnt; /* pointer arith! */
B4 b+ r) ^3 U- Z( n0 a a
val = *addr;
r7 c, y6 M! i! t9 ]* [5 ?1 W; m
*addr = save[--i];
, N1 i/ M- `9 |; l
if (val != ~cnt) {
3 i# c4 {) C) f7 ~- N, t+ }
size = cnt * sizeof (long);
( [# I3 Y9 p: i# C4 ]
/* Restore the original data before leaving the function.
& I3 Y2 i" T* \' d" g" Z& v, B
*/
' \ ?, t; `! w' W+ Z% s, U
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% n2 j( d! o, B+ p
addr = base + cnt;
. p. n6 j* O6 f. J
*addr = save[--i];
4 i7 P. X: E ^! q
}
/ H9 W3 t$ S; D1 E. u
return (size);
( D$ h" |; @6 H, m
}
3 W( ]! c+ G6 C
}
" m9 J2 h+ V) v8 Y2 x
2 l' u* r* O& D: G8 Q$ h1 [
return (maxsize);
& c4 L2 [7 w+ U( _) |. M+ `; ]
}
! i* B* M7 g; D
int dram_init(void)
/ F3 Z5 _ Q9 G! ?
{
4 D* c) O- s. _/ G4 A
/* dram_init must store complete ramsize in gd->ram_size */
+ x# k- g/ x$ N! i2 i
gd->ram_size = get_ram_size(
+ v+ E& _2 F+ H' K
(void *)CONFIG_SYS_SDRAM_BASE,
+ \6 i- X) c0 w; w3 b
CONFIG_MAX_RAM_BANK_SIZE);
+ ?+ U7 O# @0 Z$ w _& b) C/ j
return 0;
5 S+ F: M4 i$ r, i( K, I
}
8 J M) [5 Y4 }. O
3 @% }' b9 y1 I* s) T
! f0 i) w% {$ X" [" P, ]4 m
' M/ K: `8 I$ \1 M7 e! R1 V
b! v, K: K- K( s
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; c' e8 M% G3 w2 u
4 }5 V; [6 v7 f3 l) [7 |! a
4 m2 m# {, O+ {0 g2 J4 z
1 G2 m4 B& a4 M. A. z# Q! e5 Q
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4