嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
, U) Y/ ?8 O2 s9 Z1 }# P( [+ W
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( H% i1 ]! q" N6 H0 {2 t1 {. Y2 x* |
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* _/ k+ \8 a K% l5 Q0 a
# m# Y' j) U0 i: V# V; L& q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 v/ h# F/ R& t
4 _3 l3 i9 |# ~$ r t6 [8 U0 C
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 L* P* t+ Y9 g; {9 D. c. Y( M2 u$ l
/*
9 ~" k& h2 g! q4 c+ [" a
* Check memory range for valid RAM. A simple memory test determines
0 W% ]1 i6 y3 w. Y$ g# c3 p
* the actually available RAM size between addresses `base' and
9 V, p5 }! J+ S4 r
* `base + maxsize'.
& u, l+ b' \) Y3 c1 _! l9 m" A$ { i
*/
1 R: R+ O; V+ a! I
long get_ram_size(long *base, long maxsize)
6 _) m @# K/ L! R/ |- I7 s5 w
{
% L/ `. _6 y8 ^' s4 x, v% r
volatile long *addr;
/ M6 d( n2 w( L: N% f8 A" r1 z
long save[32];
) ]( P: y" d# B9 x Z
long cnt;
2 F1 s; Z5 e! y1 X
long val;
/ N& S: g+ O# l' E
long size;
6 f. Y' ^7 n8 _
int i = 0;
, {/ k- v. L8 O) U$ I0 J
% ~. G9 w2 u. W0 I- a( R# q4 T: Y: e
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! Y( B T& n% u. t/ \) x& a$ K
addr = base + cnt; /* pointer arith! */
" Q% p: e/ g1 g- R1 U
sync ();
( |; y5 F! E4 s' I& j
save[i++] = *addr;
3 F0 h4 j% ?; {
sync ();
4 e- M/ A/ z1 t& y7 L7 K3 \$ K& M- b2 k
*addr = ~cnt;
a9 @$ k+ f. B0 `0 ?
}
5 P2 B6 B1 i; w6 I: Y! }+ V
. I& P( P/ Z8 m9 s
addr = base;
: Y4 q3 m6 g+ X& C+ Z
sync ();
# X/ c1 A$ w/ k4 j) | q X
save
= *addr;
+ d. h7 v0 F# ~" A( x3 @
sync ();
: U+ }: F `( l) q! p/ m
*addr = 0;
' t! n) d# P( a$ D8 k
" r: i" V. Q u2 L6 @+ c& [" c
sync ();
; a, s$ ?3 T/ E9 i. Y; I8 v# o0 o
if ((val = *addr) != 0) {
N* J! m) A8 R4 ]! q
/* Restore the original data before leaving the function.
% ^! \$ i# J9 E; r) d
*/
1 r3 S" \2 {* o: H$ j
sync ();
, x4 q; m& ?0 t) s3 M, ^ p6 t4 t
*addr = save
;
" h7 |9 Z" v3 R a1 f _
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 G% C8 x2 }1 ?8 C0 n' n
addr = base + cnt;
7 y8 B& E Z; C/ u
sync ();
3 D3 R; K8 y Q0 W4 p5 L- ]0 Y
*addr = save[--i];
. G) B/ E6 a* F8 @ M! j/ p
}
/ w9 p) I& y$ t% z7 m
return (0);
2 Z7 M6 U* m4 O1 L0 i- T& |
}
B7 b* }# A4 Y
* _7 t& l8 I, U u3 ]
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# K& c! }1 p& v. i
addr = base + cnt; /* pointer arith! */
O% }3 a$ f3 L! Y+ H0 J" J
val = *addr;
( e: }/ S/ c$ S4 z$ z, f
*addr = save[--i];
& g$ ~1 J5 S/ L- N
if (val != ~cnt) {
8 G8 |/ W: A1 G& e$ U
size = cnt * sizeof (long);
2 V' U6 Q+ P: I! d; u
/* Restore the original data before leaving the function.
4 x& W& G/ B4 B" E
*/
; P: E( S+ B. {
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* U* [# z7 [* R( C# a0 U
addr = base + cnt;
( G. j( u" {+ r [0 x; P* t% V+ w) ^
*addr = save[--i];
% v& g2 F/ F; x6 e
}
, V! H; D3 S6 _9 r/ F. F
return (size);
2 C6 k A9 T0 ?
}
4 v* I& h; X7 M5 i4 H
}
, a+ ~% L9 A+ w" P L
3 c& r% o( M6 b* @& n) j
return (maxsize);
i; N0 ^( Q |( U
}
8 W0 F$ [$ @+ J: f/ D' L
int dram_init(void)
0 g* A8 ~- y( b+ A8 a
{
' B- w: z. [- n8 A
/* dram_init must store complete ramsize in gd->ram_size */
% h! |( f! r3 |6 R# g
gd->ram_size = get_ram_size(
1 L% n# \# P/ g. N) Y
(void *)CONFIG_SYS_SDRAM_BASE,
" u Y% a5 D8 O
CONFIG_MAX_RAM_BANK_SIZE);
! u0 N! e0 Q2 T2 G
return 0;
1 j0 W' W: v. V
}
4 n' E! S0 p- Q7 x
; z' S. _3 |3 Q0 D
/ g, \* e: I7 Z3 g6 k; D# I0 P
" @( g& c) C, B6 `/ J: a- I! |
, o w" c: C# V0 R$ K
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; X5 Y' ^8 l* L5 ^, h* {
1 A( r' t/ |% o# m
% m v9 N# W8 ?( O+ t6 ~
* r( b# K( K& ]' h2 Q* p3 }& s2 S
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4