嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 b& a9 ?. g& Q# a- J# s' W
核心板2:DDR2 256M Byte NAND FLASH 8G bit
# F, C. V5 ~& N E. T2 j
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 U ]' q j# O& a" T8 r( s
# j7 s& p5 i% c
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 ^0 }7 g9 r# ]* Y7 D$ S; K
- d) ~7 }% S) C7 W
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: v* ]% {2 d7 Z9 ?. `
/*
; ?' U1 w- |( _: L/ {9 ?) X& J
* Check memory range for valid RAM. A simple memory test determines
% J; @# \( y' d2 z! O. g
* the actually available RAM size between addresses `base' and
1 b' ^! ?2 N* R/ C# }
* `base + maxsize'.
6 ^+ D( e5 l2 [$ f
*/
V7 c# {0 k5 f! @3 J
long get_ram_size(long *base, long maxsize)
! j7 V# A% o. K2 a8 T \7 p
{
- X+ e1 Y, P9 X4 z3 y
volatile long *addr;
# \6 F5 r. x: |2 A) B
long save[32];
5 c' f: R# x h1 Q
long cnt;
4 D, C2 a2 h: w. e7 V4 U% J1 y* p
long val;
6 c% T5 N4 J, G) B
long size;
" N% i4 W+ J& Z
int i = 0;
6 @) W9 g+ y3 j! G3 G
( ]- ]2 O a7 H8 n/ F4 h* |0 E
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* d* K5 e4 _* T
addr = base + cnt; /* pointer arith! */
9 `7 ~2 I& U/ M; v5 |
sync ();
{- M) S# F: T/ k7 r/ `% y2 P
save[i++] = *addr;
7 \1 J9 |& L; ^$ ]$ e ~
sync ();
; k0 a& ?9 S/ u4 O% d) F) V7 H
*addr = ~cnt;
, H& W0 S ]9 ?5 x$ @- ^+ g; y$ O
}
! Y: b9 ]7 V8 a Y3 `
3 T; b* |9 ?$ f3 O4 C) e) b
addr = base;
( c% J( D3 E& \0 r) \
sync ();
7 `0 d# ~( { |" u
save
= *addr;
* Y9 c8 S1 M$ Q- q: o
sync ();
8 F- x* F5 z7 l: h( F
*addr = 0;
) {/ Y. B" ?* o% O
$ ~ w$ p. m4 O- H. y
sync ();
5 A0 W: [" k( G. i9 U" Q
if ((val = *addr) != 0) {
% t$ x3 X$ E- y M8 N/ T6 L
/* Restore the original data before leaving the function.
$ U/ m6 y2 j$ e
*/
6 p7 W- k8 M) p9 J! l
sync ();
; T: Y; r; j4 [/ t2 \! e
*addr = save
;
7 R7 i! a7 X& i: r, h5 j: U
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) ?% s) J3 v% Q2 H
addr = base + cnt;
: W0 t3 f- V+ n
sync ();
' m. t$ k6 L& d7 D
*addr = save[--i];
# A9 g. H5 L& w1 n8 `# S8 T
}
9 p% R# C( x/ h& l7 @- P
return (0);
$ E7 _/ H3 D' K' w- ^6 n1 {! e& X
}
. [# q. N# W/ z4 z6 T! C
3 |, L4 o8 }8 K' j
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( g( C5 M: n4 w) l* d3 c$ ]/ ^
addr = base + cnt; /* pointer arith! */
) f: {( c. W d3 ]% o5 K
val = *addr;
% @: G- ~- x) B R' t+ a u) `
*addr = save[--i];
" ~+ H3 t+ W/ X- J
if (val != ~cnt) {
0 [/ u2 M# h2 O
size = cnt * sizeof (long);
- r7 G5 f$ G% ]5 }2 n+ |% s
/* Restore the original data before leaving the function.
# R( {9 L0 P- B/ p$ g8 I9 c0 ?4 }
*/
' }+ ]8 K2 d5 }- j9 _. q# h
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( q7 X/ F- ], U% n8 ~ ]0 ~6 a8 `
addr = base + cnt;
9 w* [5 E1 b5 a$ x' h
*addr = save[--i];
Z4 B) g% x# B, F, F
}
/ F/ L- @+ ~; f) a7 i) {" Z' C1 l
return (size);
! @; @' y- g2 B/ v+ }; f1 D
}
/ y/ l! c0 U- x. |# p B8 S+ S: J
}
; c4 @4 o3 v1 m3 y8 z$ K" ]
" r1 I+ x+ N) c8 B% U, H) A
return (maxsize);
6 c3 \) E6 i c+ \, ^
}
* x+ J4 x! O- A$ V/ Q0 K( B
int dram_init(void)
; J1 a7 |' A* `! I4 \( b
{
5 v) [8 k! x: E t7 Z% i
/* dram_init must store complete ramsize in gd->ram_size */
6 J. k/ S- C8 V6 r; f' P, C0 R
gd->ram_size = get_ram_size(
- Y. B# ?) [8 W% |8 M- w
(void *)CONFIG_SYS_SDRAM_BASE,
# O" B3 @3 g: L, X$ w
CONFIG_MAX_RAM_BANK_SIZE);
5 U& H6 o# u; Z, {/ K6 Z$ |
return 0;
* t. o5 [, M+ s' l4 N$ S: A/ X
}
+ S/ @: b2 C7 G: |3 E& O% h
- o+ H- h1 j# D' m. q l% H
1 p' C/ z+ A, v3 s# x3 M( Q2 i
6 ? J/ B" j- M
4 U3 }5 p5 x! a: R, V
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 Z6 x4 K ^0 ?
4 y6 m& ^8 ~8 Y" f- z9 U: w7 O
* r+ F# _* H' b
4 c" v7 K' S/ P% Z
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4