嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
4 Q! _. `$ x. {7 T& r
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ J4 J- [2 ?2 ~& `$ u: ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 I w2 o I" D2 R3 U" G( q
, i. f9 R' }9 m2 [! F; k$ j
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ m+ D; o6 n% S8 L% f, Y7 A" Z" [* {' F
3 y+ T3 }$ v- j v1 `
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 ^# D1 y3 C$ E* {9 p
/*
" l( b9 P6 q9 }& v, |& N D
* Check memory range for valid RAM. A simple memory test determines
5 p( y, }$ v% Y7 {/ z# ]0 J0 [
* the actually available RAM size between addresses `base' and
2 `7 N3 g, E; k
* `base + maxsize'.
2 u+ R2 ]$ }. g) S$ m9 y5 }& }
*/
6 V* `9 D) `) ~9 e
long get_ram_size(long *base, long maxsize)
* H+ W% x; _8 i* Z! h
{
- y* v8 U- V( h: l1 Y0 T) c
volatile long *addr;
) E8 l# \( \! V/ x. X
long save[32];
/ M) [) M, r2 ]/ G& C$ w6 ?
long cnt;
5 _4 e4 L9 b7 M" e2 o* ?3 b5 S
long val;
! A( x- x- K4 u* w4 F( @& b
long size;
0 ^+ f: p2 r5 [; K$ `5 \; G: L+ l
int i = 0;
+ o3 R9 c* k, X
]2 I/ ` T5 E- T9 H. ~1 d9 h
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 H% g2 h/ E7 C& Q ]
addr = base + cnt; /* pointer arith! */
: Q" q6 T0 X0 Q3 W3 L6 ^# D
sync ();
* I7 o. @# G: N
save[i++] = *addr;
+ a: \0 ^0 ^' I5 {7 K, V
sync ();
7 X0 {% H2 v o# r4 r4 {9 D5 k
*addr = ~cnt;
, f* ?5 v6 B! i8 M- f" Y3 r
}
5 g4 ^& }" g1 t
& A9 N6 W8 }2 g" A
addr = base;
+ y5 b/ x3 V# u& ]; p1 a$ m
sync ();
7 M1 Q8 g, ~' {9 o! Z6 r
save
= *addr;
; S6 t3 Y% a _0 |) y$ u7 ~
sync ();
2 L% ?& f1 r9 V$ q
*addr = 0;
+ S; f4 n! A: s
! Q. M7 N' {, c9 i; J* Q
sync ();
1 {. g8 _% d8 D H
if ((val = *addr) != 0) {
0 ]7 a. B# F! W" y; d
/* Restore the original data before leaving the function.
7 f- z* c+ e% N( e) I0 o5 D( N+ ?& ]
*/
# C4 L# G) n. m( B, \
sync ();
- y8 |0 S) Q- Z" N
*addr = save
;
8 @; _. b$ W) H& W2 o3 u
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( a# H% {' U# f( r1 m! j
addr = base + cnt;
; l* `. [1 M; @* u; u% G/ [8 T
sync ();
8 O3 F! k& L1 n' Z4 q5 L1 g
*addr = save[--i];
0 `, U' D x! K' c, _
}
+ ~( H3 G% X$ ~) W9 J5 e5 M
return (0);
+ P, _; m }- ?4 L7 n, ?7 b
}
2 K+ ~, G0 w) o+ [7 ]% l# a
/ b$ t( e# K5 J: e
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) i$ y/ A5 m& P
addr = base + cnt; /* pointer arith! */
' f) U3 q, s. W+ |. ^5 O! d
val = *addr;
# O9 H' k9 Q0 w
*addr = save[--i];
6 [* n6 V& c5 H2 S! ^# ^
if (val != ~cnt) {
7 g* r. i( Y2 ~0 X, d
size = cnt * sizeof (long);
- S4 d$ U* C2 q$ U' {: O
/* Restore the original data before leaving the function.
, `& R( X) `; p4 K/ x* n0 s# z* ~
*/
& b+ s7 D" s" D, K& O! R
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 k" X* R: D1 _4 N
addr = base + cnt;
# \! q" p) y/ ~# a# _
*addr = save[--i];
8 P& A) _+ j/ Z7 c& u! N1 {
}
3 o) H& u+ D: I3 N1 G/ p
return (size);
1 G' q, v" E& w; P5 J! ]
}
1 p+ A- e( l4 K0 j
}
5 { E- ]9 p! Z$ F
0 Z; t* w5 T; A+ b7 i& G' e0 }
return (maxsize);
7 q) E% L/ f6 r' t- x4 A/ V
}
# X/ k0 \& m: Q. s( Z, ^
int dram_init(void)
/ ]. h& d I& x7 T% e7 k
{
" m8 Y& S& u% U1 I# B
/* dram_init must store complete ramsize in gd->ram_size */
2 c1 j5 E+ E! ]; |
gd->ram_size = get_ram_size(
6 b8 W4 X D$ @+ r$ M, n; }
(void *)CONFIG_SYS_SDRAM_BASE,
7 ~1 ^$ d+ l5 G- N- R6 q. A
CONFIG_MAX_RAM_BANK_SIZE);
6 m: E0 O0 | U
return 0;
' Y# U( y/ X9 T- T3 W" U
}
) Z+ t& v) v- o
3 |4 w ]# N1 `* p
$ Q4 _2 \! G5 W [4 N1 ^! ?* m
1 s& ^$ Z/ \( }( h& A9 O
3 X& Y* W: N4 p: |3 p9 _
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! r7 Q: r6 A7 a9 i5 W5 ]
# f$ x3 K& b9 d& U
, z" d- w4 g: E( n* t$ K) C
& _0 k& |4 X, R
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4