嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
( ]: w7 o$ e! A d2 h& k5 l' K
核心板2:DDR2 256M Byte NAND FLASH 8G bit
5 m9 H; P. y2 s8 k [2 ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 y. H4 o( S& u1 _2 j
7 w$ g q3 @( p& t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# K% w2 F: \+ S/ b
! a6 J. T7 @1 K' ^6 X8 U0 c/ F
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& f( Y5 i) b0 ]7 z8 M
/*
9 o/ y! [+ P; Q
* Check memory range for valid RAM. A simple memory test determines
" w! s" E: Q' R% Q! `* H
* the actually available RAM size between addresses `base' and
) E; }6 z$ u1 b* |3 R
* `base + maxsize'.
& \; S1 S& }* J7 _
*/
2 H7 A4 [4 L1 v! |) }0 U
long get_ram_size(long *base, long maxsize)
" f5 k: F, C% z6 E" K) j1 b
{
' ~2 X7 U* m' O0 E3 ~
volatile long *addr;
% T& I9 k3 D* X9 x' o2 E
long save[32];
0 L8 V) V9 v, Z2 h& p/ F" _
long cnt;
( b5 C: C! ?3 b, `
long val;
: S5 t3 J& X$ J6 ^9 V
long size;
9 n7 |9 n0 c' p9 w. r- R+ g6 u; I
int i = 0;
4 S, _/ p& U; v2 p
; R$ m( h0 k8 p8 a
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. g& d4 e: Z1 O
addr = base + cnt; /* pointer arith! */
% |$ \9 v) `5 X: B- c
sync ();
& r& \" X8 o3 ]4 C
save[i++] = *addr;
( ?. T9 S2 D8 B* r
sync ();
; l( q. w, x- p2 ~
*addr = ~cnt;
+ K& \8 ^( _, S# L) _1 j5 j. V
}
: n9 ^" U1 V, c1 G# D! W2 R& C5 c
0 y3 E" R( ^+ p3 G
addr = base;
5 e' i% X, L, ^% \
sync ();
/ X2 o9 M8 b! u, |/ E3 l( o
save
= *addr;
4 x z- G7 L7 p9 j+ A. O
sync ();
( |5 m5 o' I6 I+ P" Y( D& ] @
*addr = 0;
' e/ \ Z ^- s5 h1 g
7 w7 m$ c, c1 b2 S% H. C: `2 O
sync ();
5 u( P& C# ^% ]
if ((val = *addr) != 0) {
3 G2 m# W: ]7 h! g' u: j5 `
/* Restore the original data before leaving the function.
* o3 L" p# }" B/ F# [( h1 `# f2 x5 g6 X
*/
. r: f: r/ T: s; G* \
sync ();
5 v$ n' T. k* `) E
*addr = save
;
8 }( o5 w. q- @5 ~8 f) a
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ `6 G$ Z# d0 A) R- |1 l
addr = base + cnt;
0 L, P$ ?7 e: A" O4 f0 }" O+ G' `
sync ();
2 O# Q* I# Q! v# w
*addr = save[--i];
: ~- S. K/ @3 ?6 i- i1 l5 v
}
; E; C6 z0 _( z8 X E% I
return (0);
I4 o8 Z) d! _
}
" h, {. M, E8 l' `: C, P
, E2 u; G: h' I1 [5 `7 G7 w
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& F s# S8 z% T. e% E3 V
addr = base + cnt; /* pointer arith! */
- F; Q+ C. |9 @3 P) k
val = *addr;
; G" E! M+ t1 l
*addr = save[--i];
; B# O1 q+ b$ S! d
if (val != ~cnt) {
( c: G3 d G' Q9 b9 P* w5 O
size = cnt * sizeof (long);
/ U, {* ?; s8 H/ u
/* Restore the original data before leaving the function.
1 w9 v' |4 Q6 G7 p$ w
*/
( |, Z" p/ o! f0 {# |) S4 b: b
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ r2 J8 n3 [- ]
addr = base + cnt;
. Y( H2 ^) C) P3 j8 ?& {3 H9 `
*addr = save[--i];
$ `7 P8 c. S1 i. J2 {- i* d7 b
}
- e: u9 I/ k m6 n" S! M3 @
return (size);
* N: b6 u# Y, r9 k( C
}
/ r# s' g: O/ d2 w2 [+ T: ?
}
* P: u5 @% `- f3 J. {
$ s# {& U" |4 r
return (maxsize);
5 B$ X+ l( N- W* v
}
" B2 h& F% {0 d c$ c0 |8 M
int dram_init(void)
, R5 J) v, G$ b, M) c: [3 I; ^3 z2 k
{
! u5 N* \% v; T* {
/* dram_init must store complete ramsize in gd->ram_size */
' I" f' X: n3 D) s
gd->ram_size = get_ram_size(
! n) z9 h* ^4 Y1 O) _5 s
(void *)CONFIG_SYS_SDRAM_BASE,
: F" i9 c$ f0 G) O
CONFIG_MAX_RAM_BANK_SIZE);
: W" {8 v# L& y8 X6 p. ?6 F4 y
return 0;
5 X& i t) }0 q! ?; J l, e. B
}
4 {; N. W3 h0 c2 q7 j
7 O5 f0 x& I7 K2 P" \% e
' |6 u/ \& N9 ]' l- l3 H. w/ N- U. q
8 s6 }: K/ z3 z, w' j8 e; V0 O2 w3 E5 U' @
' R9 R' R9 a- L! G" {( K; V+ c$ a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: _3 X5 L8 i9 v! `9 `0 D
: B: |0 n7 t$ o" B8 V3 Q% T% r6 z+ h
% W" F9 _3 l5 H2 t# D% N$ m2 B
7 j7 {$ I% Z: ]& H/ v5 `
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4