嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 t+ W6 P5 l g1 K8 Q7 ~' y
核心板2:DDR2 256M Byte NAND FLASH 8G bit
" T5 E, x! N% g |7 G
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- M* C+ [" _& E, ?6 B: e
2 r2 g% t/ I+ P
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ C- b5 r3 D2 |) N: E3 i
. E6 n. l) d) C
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 i0 J0 o: X! s
/*
2 ]7 G/ ^0 T+ D# y
* Check memory range for valid RAM. A simple memory test determines
6 h$ w d4 P$ e+ m- H+ W" i; o: f
* the actually available RAM size between addresses `base' and
; T& j/ p" \8 ^; x1 @! l: N
* `base + maxsize'.
% x; c7 |/ ] y, P M
*/
. [# G2 p- q. H( H% I
long get_ram_size(long *base, long maxsize)
. i; w( {- w4 w* \8 U
{
) V& [# N" A1 ]) q( O9 R
volatile long *addr;
, Y9 I* S" A; I1 T$ d
long save[32];
& L7 [3 u8 [ w$ w2 X% H
long cnt;
" x6 F* n1 N1 W6 J+ j
long val;
0 n! r) c3 S3 T
long size;
- |# B3 a+ |: n9 p; J- b
int i = 0;
9 B& }; `+ Y- B) c4 n/ s- n
% A! _: E# m7 H' l- M5 u2 E& e
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! m1 g6 x& u9 ~5 O* L' R) j' t
addr = base + cnt; /* pointer arith! */
! C$ M" H3 p" W% u
sync ();
, O! j/ j( C- Q+ L) v7 D
save[i++] = *addr;
2 r. {8 K# `4 ~; _2 g2 P
sync ();
. B! P% H% j. i) M1 g* r, _6 O
*addr = ~cnt;
8 \ K, P, t$ L( @8 ]; F
}
; D, h7 c" x' Q1 h
" {( e. i- R( B5 T$ @7 f( f1 I
addr = base;
+ u( j3 j+ w7 j- R! j
sync ();
& }/ ^) h/ m+ m: T
save
= *addr;
5 R4 E2 G; A' ?& h% r
sync ();
4 k, }, r4 `6 a% K2 j7 |
*addr = 0;
) S2 g! g* C# y9 M4 h' e
. [ ~$ C+ c' M7 p, Z4 t N5 {% n) c
sync ();
8 Y& }4 c( `+ L2 h! d- u4 `
if ((val = *addr) != 0) {
" j6 x# m$ W* b
/* Restore the original data before leaving the function.
0 |- p% _2 z3 c# m. ?
*/
l; k" U2 Q% R. Y. @! _0 w/ |
sync ();
$ g0 a5 V- N" ~* ~
*addr = save
;
k6 |- o' E, C1 K1 I2 N+ D; `
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 m6 A; S# W1 j2 j$ N2 K1 z
addr = base + cnt;
# b. w' ^, X e' O4 \- P
sync ();
; r4 x9 m% Z1 k: b% R
*addr = save[--i];
- ]9 z2 {$ e3 ?& H, f
}
; l; @ g' ]3 b5 A. t2 E' n5 F( i
return (0);
- X3 t/ Q8 ^, [
}
, V8 q+ K) I% S3 u" I1 A7 g
. y$ e9 {1 _. l/ K& d+ a8 N* T
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) }" w) _( Z* Y$ f) U! _8 N
addr = base + cnt; /* pointer arith! */
7 A6 N6 H, u3 b6 Z
val = *addr;
9 T9 F. s& ~& Q6 _8 s5 Q0 x6 O; N
*addr = save[--i];
: l* [: K$ W+ y- }- x/ e* g
if (val != ~cnt) {
; M A: A8 S- Y- K) r5 }
size = cnt * sizeof (long);
8 G- v% y- u u$ ?6 U6 U
/* Restore the original data before leaving the function.
1 Z( T/ p! M/ v8 R
*/
$ D0 @; i- z( \. e3 _% `! d e8 b6 K
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( y) g( G% e3 F6 F& ~1 o
addr = base + cnt;
* x; S+ a( m" L3 o* t# O& X9 h' g
*addr = save[--i];
# z5 K1 S+ l' o! |6 ^1 V6 L+ l( u$ t
}
6 r% D/ b, `2 Z* ~
return (size);
5 ?- u# Q* e1 z( t# |! n
}
$ ~3 w. t' e/ u0 `; O% f
}
6 E+ A, w! V( S9 _3 [: p8 O
# M8 }# v" R& c
return (maxsize);
$ @. L2 E% g: c2 z* i
}
) p- Z N( r( s( k; \4 T
int dram_init(void)
0 a7 l+ M6 L7 s! y& ^
{
+ Z& @2 w& F# X3 L- q5 w
/* dram_init must store complete ramsize in gd->ram_size */
" E. K+ Z) P4 c2 t6 u
gd->ram_size = get_ram_size(
; r r* Q8 [; _# ^4 _
(void *)CONFIG_SYS_SDRAM_BASE,
8 v* E5 A" p! g9 G
CONFIG_MAX_RAM_BANK_SIZE);
- Y1 {5 D7 W0 V2 W; O( u/ ~
return 0;
2 Y0 @" q* O4 H3 ]6 J9 k9 ~& C+ T
}
1 J. l% g. X* N4 c
) r+ M( ?3 n8 S8 P/ Y9 V
5 C' b. {& S2 X; h) y
/ s0 P+ h- r& G0 x
$ I' ]! g1 J$ p( o8 M1 }; u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# ~3 X" ^% J6 F0 l/ v4 i$ n* f& q
5 {# T* I9 \/ I
. Z% F F+ Y! s4 s8 g' k# K
# k5 i5 _. H& w5 _4 f% ~1 ~
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4