嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
" ?" Y6 x U! E7 O4 ?
核心板2:DDR2 256M Byte NAND FLASH 8G bit
! A; |9 t* P+ {, U- c1 A( Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. e' e* h+ Y M1 a+ h
9 B* U. v2 q; e
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 K7 F# c: y/ {% A
8 ~7 F- I' c% `5 @1 P: \9 b
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 {0 W" ]% j! e4 v
/*
& D& ^, }6 i1 G5 ]* q' b' S* }
* Check memory range for valid RAM. A simple memory test determines
; s+ r( C6 [! B8 C$ }7 S
* the actually available RAM size between addresses `base' and
2 b- E( H* o; Q0 @
* `base + maxsize'.
; \- F: E. I! m- ]& u
*/
+ e- Z9 P7 ^4 w
long get_ram_size(long *base, long maxsize)
0 C7 m, ] b, W" z2 u
{
5 J' ]& M. @0 ?: x2 o' r6 ]
volatile long *addr;
/ K8 S6 z/ ]6 k+ E
long save[32];
8 ?( y! W/ ]8 b
long cnt;
5 S0 b8 R' [ l9 X4 K+ Y9 J
long val;
3 q- S" ^0 |9 B# w
long size;
' K5 U) l \& W* {
int i = 0;
7 T6 E3 k( E" B: N2 n: @* D9 }* M+ e
. M, o/ c9 S% }1 A
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& U* O. S% \& U7 m. P9 s8 B& L) z
addr = base + cnt; /* pointer arith! */
; b- P- j/ u+ m2 U% B% i3 Y
sync ();
( k* ^0 m7 A M {
save[i++] = *addr;
0 B" o0 F! U* x4 Q( N H
sync ();
2 l. g8 B8 ^8 I% ~9 X
*addr = ~cnt;
1 m' J, P+ a4 g7 M
}
2 D! K. e, K+ x
2 J% \: X- A+ ~* l
addr = base;
: P' n4 D0 k/ J3 }1 m: Z
sync ();
5 W- u$ g+ l) [* }- S" n
save
= *addr;
$ x4 e; b( v1 y4 C$ s$ s9 P
sync ();
8 i' [0 d7 j2 x; J% i7 N, U# N" P, ]* F
*addr = 0;
; q' t5 P% x' ?7 J8 r( w ^
6 v8 F4 q. |$ d+ Z/ ?
sync ();
" N: r( R' J( y" M y
if ((val = *addr) != 0) {
; ^2 v, p3 S& ~: Q9 q$ ]
/* Restore the original data before leaving the function.
# U# E( ?5 x2 q2 E% w _1 y
*/
, ^" t6 m7 L7 s7 I% ^
sync ();
& ]7 _' U; @( w9 W
*addr = save
;
1 l5 W# |; P3 s1 O3 G' h6 ~' O
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 N/ l h) W3 p' t! q
addr = base + cnt;
& K- G w1 O( g: |' N
sync ();
) a. G# L: h) T0 N$ u
*addr = save[--i];
: f7 b9 C: h- e' v' r
}
0 v% `" h$ }' [3 {1 S3 z
return (0);
, w* n d& y. p. ?3 U }
}
6 F+ _% X* X/ `4 _5 \0 N
: f. L# e- T4 [& P( M
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! _ ~( o$ _! W% u& C
addr = base + cnt; /* pointer arith! */
: Z+ s0 x5 G) C$ W7 v3 m+ z* A
val = *addr;
' K& q4 u' N) a
*addr = save[--i];
2 Z& C& }' d! a" d, V) c0 ^; k/ X9 z
if (val != ~cnt) {
8 i& L1 G9 M0 l- ~9 E
size = cnt * sizeof (long);
; K4 S! G, y- e! E8 Y! I7 J' U
/* Restore the original data before leaving the function.
6 k2 |& j: Q0 V9 @& I" x7 D* X3 @
*/
2 O, [, V4 q4 o2 g
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 C9 m$ d; p, P5 S8 s' |" ]
addr = base + cnt;
6 C2 V4 Q$ D) a" v8 [
*addr = save[--i];
: Y4 y5 `. j3 R1 K" ?2 v7 O0 ^
}
8 q) G* E8 Y; M: ^
return (size);
9 T/ ~4 P# f$ k( q2 G/ Q
}
8 U; r8 U& ~+ t* _' W
}
% A: v4 Q3 H. Z8 K2 n: `7 a9 m" v) B9 V
* @1 n3 G+ W( m: T
return (maxsize);
8 W0 N9 ~& N5 A! w2 L
}
3 s9 H$ ^! m8 c+ I, W# e& w
int dram_init(void)
4 @/ r- s5 W1 ?5 J( [: Z& k
{
$ w; o# N8 h$ w, n
/* dram_init must store complete ramsize in gd->ram_size */
4 Y- G$ K8 p5 S0 N) G
gd->ram_size = get_ram_size(
8 y T9 l1 X1 |% B( G& r& `0 P
(void *)CONFIG_SYS_SDRAM_BASE,
7 t* x$ x& ]* ^
CONFIG_MAX_RAM_BANK_SIZE);
9 \+ S0 ` r+ T0 u$ m3 M# K$ l( k1 c" M
return 0;
& b' r2 T. e. H
}
6 E. ?) K& O2 c6 |3 S0 |
Q% o6 Y* l3 \! y( a) ^/ w
, o) ^' L6 m2 ?
: F0 `) y$ V1 |
5 K% S+ {$ d( F- C, a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 d: o( ?9 m9 a( ^3 o' [
% u8 P4 w+ s" w& ^
' _& C6 ^* I8 a, |$ i: R p
4 O% }' a& j4 E
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4