嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. Q6 D6 O+ q! F# W9 r: A( F
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. C3 Z) |% n; p+ p# V
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 V6 |7 n4 @3 L# S
, k& J* [. V( p7 Q2 t- Z0 ~1 A
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 {& s7 h3 ?* \- N( h
' P0 J6 a: G% C9 W* \
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 y$ e) E4 t t/ P- X ]( [. @
/*
. f1 _/ ^( v+ T/ S! ^
* Check memory range for valid RAM. A simple memory test determines
) E2 C' b' W2 q
* the actually available RAM size between addresses `base' and
7 U7 H; }" m1 r$ |
* `base + maxsize'.
& B l% l- J, Q; D N2 f
*/
% W+ G2 R( R \+ ~$ J
long get_ram_size(long *base, long maxsize)
; q! }! r! h( W4 ^. p5 {- Y
{
* Y' K& F& k7 z
volatile long *addr;
% K+ C) S$ @+ p
long save[32];
2 y" l/ @8 d& x) g# r& M/ R
long cnt;
" t' D/ H* F9 H4 X' U" {
long val;
' Q0 j: S% B; {5 X5 l5 i
long size;
W4 w+ z% C, }) X8 [
int i = 0;
8 ` j4 T! ]. Y+ [% e
. ?! w. v @" o3 ]0 D, z: n- P
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! e: _9 G4 n, O, g. M {- F
addr = base + cnt; /* pointer arith! */
" W% I: }9 A! {) W0 P
sync ();
$ E* p) Y. M6 p/ ?3 b
save[i++] = *addr;
$ {+ C$ T! x3 I8 l# {+ K1 S; U
sync ();
' V5 Z, v+ L* o& U0 X1 L, V
*addr = ~cnt;
- U; E/ `& D6 F/ c1 `2 w2 ^; d
}
* W5 O, v P: v* o
; `! @: y$ E3 E* U1 ~) V
addr = base;
, I0 G1 O; u( }! b! n
sync ();
3 m8 [( E, o0 s( R. I
save
= *addr;
6 b" t) Q9 s8 a; F m' P( V( ]1 V
sync ();
1 c8 L% h7 D0 x! j. u8 k
*addr = 0;
, f+ O. M, ?. F
* _& r, v9 D+ i9 L
sync ();
( @; P+ Q1 t8 r" @
if ((val = *addr) != 0) {
5 F6 r; o9 I" T/ `
/* Restore the original data before leaving the function.
$ T2 U! k1 E# N# y" ]# F. o
*/
. G7 [) J! n8 Z: x' }6 d$ I1 D( d
sync ();
' ~0 n8 @* P5 D. {& i) r$ l n
*addr = save
;
% d+ ^/ H. {+ a7 v* A. R
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 U1 K' P8 Q& @" b- M- Y- n
addr = base + cnt;
8 q7 A0 b+ m: A$ b( c$ _8 v
sync ();
* U8 K r% ]: ?; M# R
*addr = save[--i];
, ^+ R+ W# H2 c# v
}
8 U& `1 D$ R1 y7 s( U
return (0);
2 H! G" v7 Q1 K) {! ^
}
( b8 M+ q& F' T- S
5 S. z# u, W# _2 ]( a. G
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# C4 c& ]- L+ {$ `) g7 V6 @
addr = base + cnt; /* pointer arith! */
' w7 i7 I ^! ]# s1 t; C
val = *addr;
" f. J- d E' v/ A1 Y& I
*addr = save[--i];
: G: f. X$ m. j3 K1 R$ ^
if (val != ~cnt) {
5 p! h4 K/ C3 U' }( r
size = cnt * sizeof (long);
* V' Y. `% _' v( ^0 ?
/* Restore the original data before leaving the function.
. c; ]" Z# t, V4 e4 k- Y5 @2 f. D
*/
$ Z y. g7 q) }7 i/ c) V" [: _, B7 E- u
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' w4 F7 a3 ~) m# m5 a
addr = base + cnt;
' z# r2 X6 W8 e% B9 F- Z
*addr = save[--i];
- \8 j6 p, u3 L0 ~; ^
}
9 \# N0 B* G; O
return (size);
( z. \/ ~' ?& \* t3 q
}
+ j- {+ s. B; g" t: z- w
}
% H: l; e& w, ^! Z
( ~0 c) C$ ^9 z' n @, }8 V) t
return (maxsize);
4 O9 j4 |& i; J z9 O! ]8 b
}
( r1 E0 E9 I% m7 x& P$ j( \6 d& r
int dram_init(void)
9 \: a, P/ Z$ A b% q
{
& ^6 d! K3 N: k* n: d& J0 ]
/* dram_init must store complete ramsize in gd->ram_size */
7 y W9 S' B& C3 t
gd->ram_size = get_ram_size(
, F- i; M' c! Q q: m
(void *)CONFIG_SYS_SDRAM_BASE,
, D% R) m8 {3 H4 w
CONFIG_MAX_RAM_BANK_SIZE);
' q' N0 H, s6 O/ M3 o4 Y
return 0;
8 P+ u3 U* V/ v* m8 z
}
! c$ T) c( o* q# N- k
/ U3 d2 @+ |3 s# k: }8 t3 ^. U
( D5 m0 y$ |7 U& A" A7 B7 N% o
9 _* P4 P" |! F
- k' e7 Z+ M& S" {) Z) f% s/ C3 X
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, i" x* k7 @1 ^9 ~2 N
$ i0 T V9 _( t) Z
O: Q! x7 T6 {. M$ y. k
6 \3 C* l7 ?6 ~# ]& \+ J
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4