嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 B7 W/ ] N( G k9 x2 e; B4 Z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
3 [8 a: a! {. o2 W- ~6 k( N/ y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 h1 r6 ?( [: [" @& I$ y# S0 V. X
' c5 ^9 d/ y% M2 U
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' c, @9 I7 A ?! j9 q
* g' k. c7 J3 T# U i+ R- N
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; H0 I5 R( q! Z( N, E
/*
4 u, f* l. G( C+ p" T5 v4 c1 K+ F
* Check memory range for valid RAM. A simple memory test determines
* t7 I( m/ d% ]
* the actually available RAM size between addresses `base' and
7 Q0 U5 P7 J: |7 y) v2 D
* `base + maxsize'.
- _! C% V: f/ p. C& ^% a& ?
*/
5 ?1 o+ E$ z" f1 v
long get_ram_size(long *base, long maxsize)
& @' Z# }- H7 V' U! Z5 L
{
. |/ f) ?4 ~- ]. a! K
volatile long *addr;
7 k4 Z. V, u, d* l# ^. I# ?8 e/ j9 R
long save[32];
# C1 v& R( t! J1 u- g9 V5 S# ^: |. u
long cnt;
4 n+ s- }+ F- D
long val;
9 X1 A# c5 i& S' n C6 j
long size;
- O. |1 c9 _1 _
int i = 0;
7 s0 y: T j6 |& p. p# R
) @7 I$ f6 l- G$ h& X# D2 M' Y( i
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& A( K/ h8 U% \9 p7 O4 q0 i( d1 h
addr = base + cnt; /* pointer arith! */
$ Y* O% d* v5 ~8 G; f9 S
sync ();
9 d9 ?+ I7 d G( n2 v" r
save[i++] = *addr;
5 X2 K# G9 _5 k6 @6 M$ X* }
sync ();
/ A+ ~" m9 c* L( C" Y; x" b
*addr = ~cnt;
k+ v8 K5 ^0 a" U8 s6 Q7 N$ _
}
& {( E& p0 U6 p( R/ ]
1 t! k; }: o2 w. H
addr = base;
7 u5 w( u: X; g. G
sync ();
; T: s! M( Y h7 |' P% @, H
save
= *addr;
3 i$ v, U; `* y8 E; a
sync ();
4 x' U8 J ?: I, U. e
*addr = 0;
1 u! I3 \; y4 Y4 w7 W% m% N
# I, [5 j( Q3 \- O# W- X J" W# |6 F
sync ();
5 O- h# H8 _2 U: G1 j5 C0 e
if ((val = *addr) != 0) {
& z9 c& |9 q- n( L+ ~- {. J
/* Restore the original data before leaving the function.
. q4 u! j1 G2 C" ^
*/
- r" `4 L ~' W, C$ B1 T
sync ();
- V8 X5 E, e; e5 ]. L0 R% P8 R
*addr = save
;
/ T! ], c- Q& Y% F* v
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* _* s; |" }2 @9 s; F
addr = base + cnt;
9 S# m9 f8 D7 V" s2 i4 g
sync ();
* A1 n! d$ \, H$ t+ F h H# `
*addr = save[--i];
) H3 n( T5 P! A. i8 ?4 }" p7 R) v' v
}
: K* W8 `0 f& s5 \' G* \
return (0);
, p' k% T0 E O
}
) }) d% X3 Q6 K9 }7 \
3 k2 w1 d/ g" R0 w3 ]
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 l- M1 w( a- f" \, K
addr = base + cnt; /* pointer arith! */
3 s/ j1 i5 W8 B" f7 ^
val = *addr;
0 c8 ^& r) r; M
*addr = save[--i];
: ~ A a0 F2 ?
if (val != ~cnt) {
$ p' M. S3 L7 M3 X" _. Z: L( ~- {
size = cnt * sizeof (long);
, L2 H3 U) f# T) K6 U, c9 V; F
/* Restore the original data before leaving the function.
8 r! D8 E4 v: w S. i" j
*/
1 G) f0 R: P9 m$ N/ h
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* C* h5 I% ^8 D/ O# Z
addr = base + cnt;
2 w1 I% w! d0 ~2 d
*addr = save[--i];
( Y. q3 d& O. Z z" F/ G6 e
}
+ L# Y. `5 } h/ t! E, q, w( D( Q
return (size);
" m; A) }8 z7 k; T, Y
}
k; l, A; [4 k( h0 o
}
8 L9 A; V. ?; T! t8 R5 Y6 @
) s2 u' q* ]+ D5 b
return (maxsize);
& |, N# j0 a. }2 x$ `
}
5 x& i. E5 l# S2 N* x' v
int dram_init(void)
- L$ O* P6 N p) X& ^
{
. G* C$ B) a! ?5 B( ]
/* dram_init must store complete ramsize in gd->ram_size */
7 }. ]/ V& t) m: S
gd->ram_size = get_ram_size(
0 g) C, b6 {8 q/ x& ^
(void *)CONFIG_SYS_SDRAM_BASE,
d {6 ~" q0 x+ p3 Z
CONFIG_MAX_RAM_BANK_SIZE);
& G7 d2 h% @; a7 X
return 0;
/ J5 ?& b j0 o
}
/ `+ ?. s% b1 M0 l
& e6 X( n' n# L# y1 Y k( z
$ }2 R" W1 D- ]2 q' K5 O
0 m" q5 O9 V; }
' ]% f C, k! A2 |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ h+ V* D! @5 m4 O
, k3 z' d, B' O, U: \, g& y
w N/ V3 q: B5 t+ e
# ^& D8 W5 k5 d3 |# B
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4