嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
8 n; z1 \6 P* s9 i& l- I8 E
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 v0 \6 M* |8 [
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ p7 Y. G! F( l, o7 W# ^
# S3 u4 z* Z, k6 s5 \
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ Q: G% S' k9 d; K9 [3 |2 N3 i# k& S
( S! N$ S3 g4 Y# t4 u5 e, C
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 |6 c# c. |5 x. u) K% l4 u6 T
/*
3 l4 f& }/ ]3 M, A r
* Check memory range for valid RAM. A simple memory test determines
% a: o$ P2 z! }/ x& R' h1 H: G! P
* the actually available RAM size between addresses `base' and
2 G+ _/ [+ n$ O- u
* `base + maxsize'.
0 A4 S1 N' Y, ^3 N* ~2 p- C+ `
*/
+ R, q! i. V `
long get_ram_size(long *base, long maxsize)
Y z* \- z7 n- d0 b' }# w2 E
{
2 @- t/ w6 x% W+ j
volatile long *addr;
7 g y- a5 s5 V' X
long save[32];
8 ? y1 V# g. L F( K/ y
long cnt;
- y; {, i2 L& o
long val;
$ g6 q0 I" U/ S4 v$ L1 l* |# x6 g
long size;
* M: G+ I: w+ O6 ?8 J
int i = 0;
5 W. }% b- y! Y1 m: n: ]6 H
& g1 t! Y' N: Q* |9 n
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" ^6 m* e! F7 S U
addr = base + cnt; /* pointer arith! */
2 {5 z1 _: N6 ^0 G2 M
sync ();
! ^$ s2 `) H$ D) I* t/ o. X. t6 x& R
save[i++] = *addr;
7 g2 t+ V- i1 S6 }
sync ();
' f( y/ \5 ?9 N: m9 z! X/ \1 |% X
*addr = ~cnt;
" u7 e+ D+ Z# q/ n4 X9 @, A/ _4 j
}
3 ~& ^2 u5 }1 ?/ E
) d& C( ^. h/ K
addr = base;
1 d+ {- [) G5 v
sync ();
# \4 N- Y+ m/ L& Y9 n% i6 K
save
= *addr;
" K& p) Z, f2 }% C3 c2 D( {
sync ();
0 g# k* Q0 N9 K8 w6 P' j* p
*addr = 0;
j$ L, _$ P1 }4 y: j4 [2 j: A
! F: k% r: |" S$ P& Z# z4 I# I% r
sync ();
% D- ^6 ^& q" j6 m6 e
if ((val = *addr) != 0) {
3 F$ v% [# f% \9 N) Q
/* Restore the original data before leaving the function.
) s" o5 d4 p! F( k6 K4 e
*/
' Z; k0 `- n+ _% M
sync ();
$ z2 z& u6 J6 n. J; c% w# _7 Y) u
*addr = save
;
+ x: ]7 m# v* ?1 \# v0 h
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, _- ]# C+ y k
addr = base + cnt;
2 t% P. Z6 h5 K; u
sync ();
$ u7 y$ L: b9 s, _! ]
*addr = save[--i];
" P' i0 S' ~! B# V0 `
}
0 u! c' c$ Y7 k( x6 S) B' z0 \# U
return (0);
4 ~; f+ m7 a% p
}
8 r* m j( V' |, B ~/ C
& e, F7 ?7 N* ^8 a2 B
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& L( ?1 ^4 L9 p- i+ `8 L
addr = base + cnt; /* pointer arith! */
/ B0 o# g( M0 f9 h% K! k
val = *addr;
! n8 k5 v n0 ~1 O/ c: @
*addr = save[--i];
/ {4 U0 [* ~1 F0 v7 D) Z
if (val != ~cnt) {
9 h: D. ~3 W6 a, w
size = cnt * sizeof (long);
! t9 u/ `2 h: T3 ^ k/ h2 T( z8 ^
/* Restore the original data before leaving the function.
1 S- q' g+ \& [7 |) o6 R
*/
& O# K! ^0 X' }8 J& t
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ q" Z! F! Y* X4 Z: [- ~
addr = base + cnt;
* s6 e, k/ @$ H( I+ ~( r
*addr = save[--i];
5 M# K/ {% X* [7 Z
}
/ y; Q ]& ~3 S4 O. n( ^' b
return (size);
; K+ a9 ^% E- J8 f7 t$ G% F
}
1 }+ f, V, l2 Z
}
* F# Q, J% h- Q1 R" y) x
. H5 x! y3 o* o9 A
return (maxsize);
+ r" X8 M& M' Z4 Y2 z
}
/ N+ Z" ^3 @+ j$ }
int dram_init(void)
1 ]6 N4 J5 b) m2 w8 K4 c9 G+ d
{
9 ?: m% K% s6 c) ~/ J4 y Z, b3 t
/* dram_init must store complete ramsize in gd->ram_size */
$ b8 ~9 l# v4 ~8 Y5 S
gd->ram_size = get_ram_size(
( o4 G) s e4 @6 D+ K5 s% t, }. P
(void *)CONFIG_SYS_SDRAM_BASE,
5 X- n5 y1 ~/ g2 p, Q2 S
CONFIG_MAX_RAM_BANK_SIZE);
3 `& H! e. b6 }1 _- J u p
return 0;
* b) r, \& V7 T8 Y% T
}
1 C2 z# b/ d- N$ W
2 J6 Z+ _* ]* r. U" d1 P/ @
( T" g N) s1 ?0 l, c
# i& `4 A. `3 b4 o! M, C+ T" N
' a- \6 z- G) s
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 W$ D/ }2 Q4 V1 c$ {
; t I/ K% T1 G8 Y/ W$ Q& q& q
! b8 h. B u) z
& D, s5 j& q/ s' C+ G# ~
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4