嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
+ I/ I) R& \& M7 h0 m; [( r
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( K1 a6 z3 T1 s" H
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. [1 \+ G v: h
2 q1 Q7 Y k( a# M; n9 l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% b! A) Z* m# _3 Q8 ~
5 M7 y: M7 }2 ~! C
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: v5 ^5 a9 }/ ?9 n
/*
3 }; P: @" c7 O" _
* Check memory range for valid RAM. A simple memory test determines
* S/ X8 |6 e+ F% l
* the actually available RAM size between addresses `base' and
7 M& X; u3 N( z# u/ f# X) x' N
* `base + maxsize'.
& r7 j/ z& J7 r" B5 b
*/
% z0 x5 z) C2 m$ Z) Z
long get_ram_size(long *base, long maxsize)
. [7 p! @. ?2 d4 e+ K+ Q8 ^- A
{
, ?* l- @ l# X1 B5 H
volatile long *addr;
2 \+ f5 E) m+ t% \1 M" G D
long save[32];
6 G5 P, s8 \) F4 g4 d2 b
long cnt;
R$ _9 `; r% B; A& @
long val;
/ n, {1 H3 ]/ F0 `) Z1 D* D
long size;
$ a- O6 y0 n) K. {- c
int i = 0;
8 ^3 T& F) P7 y2 T! ^' i) P+ `
# u, i8 I4 b1 B
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 s# {) F/ v/ n# v% \
addr = base + cnt; /* pointer arith! */
& H4 _' o& |5 y( F% w4 R
sync ();
" G; Q- R+ q; v8 B- f
save[i++] = *addr;
) e! ] G0 H" i' i/ i: m
sync ();
( {/ ~* g' K* P0 a0 F
*addr = ~cnt;
9 K1 H8 D) |2 u" g
}
4 ~' Z4 j( E' A# b. P( K
, d7 E$ A7 {9 _3 q C) r' ^
addr = base;
' @) W! c" \1 m7 g, {$ O
sync ();
+ ^! ?' |0 v, I6 `2 N% ]' E" f
save
= *addr;
$ V. z1 ] ]8 m' M
sync ();
1 Y I& e3 u1 A3 |4 i
*addr = 0;
* L2 s* \" h, \/ C" D" L) a5 d1 @
6 O3 c3 [9 n9 a" n8 w3 ]" r- ^
sync ();
& C4 a7 w) W8 g1 ]: q* K
if ((val = *addr) != 0) {
. x% Z" F n: L: o9 U! n
/* Restore the original data before leaving the function.
; b" B) R* ], ]
*/
/ o, j. y1 N) j
sync ();
9 l/ m( D9 {9 M. q/ }. K
*addr = save
;
3 ~/ t# S: X- v# W
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 h9 `4 ?' \, Y- ~* f* g! d0 L& `
addr = base + cnt;
9 |/ S5 B7 w# T6 \" ]
sync ();
3 S2 S4 E6 d/ @% D- _' i9 B9 C
*addr = save[--i];
2 z8 {# o8 z! M& d9 v0 O5 X2 n. H
}
1 o4 d' g2 T, s' [+ [
return (0);
4 m; Y4 k5 j5 N& A
}
7 I* G$ G0 t: [+ g
) {) e8 W# {* l, ~' L
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
Q Q3 ~# _( m* \
addr = base + cnt; /* pointer arith! */
5 E" t4 J6 d7 ], _4 X) x
val = *addr;
& p* H' c8 D4 n3 O" j7 w
*addr = save[--i];
+ f+ [/ ?$ [: P% ?5 R& C
if (val != ~cnt) {
* K, f1 B) |, z
size = cnt * sizeof (long);
# x/ h3 l f5 c& B. y
/* Restore the original data before leaving the function.
, ^# W2 ?$ j; W$ R7 K$ {
*/
5 Z4 J6 ?) [* |) J6 q t
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) Q9 E* P7 }. Q
addr = base + cnt;
0 k4 N2 `8 I$ {4 O4 j# [
*addr = save[--i];
6 L( X `8 F i0 \2 ~
}
, f, @, Y& X! g* J
return (size);
' u* w$ o [5 i" R) D. E# s
}
& p7 r+ `# B: X! u, w
}
6 ^/ w- N- T+ l+ ?
2 d# @7 b' t. N/ H8 r
return (maxsize);
9 B( @- ^* s: M+ J
}
( w. z5 W% `( R X$ j& E3 t
int dram_init(void)
; p4 V2 {- c: q+ w
{
9 I n7 \8 h( R4 z/ |3 C- ^
/* dram_init must store complete ramsize in gd->ram_size */
( G: ^- R% t$ d& B
gd->ram_size = get_ram_size(
/ b1 W* Q& [! M
(void *)CONFIG_SYS_SDRAM_BASE,
. J9 w* k( n8 R& [, Z
CONFIG_MAX_RAM_BANK_SIZE);
}, D# ]2 c2 _, [: i
return 0;
9 q9 y! h) s5 l' n
}
3 G ~. q- s6 s7 |- E
2 j V& o, z( ]
4 G- Y" Q" I" K1 b5 O. y% I0 i# o
0 `- U3 O9 \! J4 }
. I" N9 c/ O. Z% `
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% Q( }7 \' v6 l
; o$ l# [$ V; T0 N$ _
" Q* T( o% X1 E3 f* ^" P* Y
' @& Y1 G9 T0 _. V+ a7 y1 W' u% O
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4