嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* t0 z1 w4 }. I) ?: k) ^" n+ _
核心板2:DDR2 256M Byte NAND FLASH 8G bit
) G: R+ A* ] V9 a+ z: R
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; b* ]2 O# @( z) ~# K0 ^
6 h% S! R: k' S" ~8 X u. m$ P( a: |
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: j% ?5 m) n( a7 a8 t
! k( @) W% d' P! o1 }
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 {* C" S& P2 b/ b# _
/*
~) q+ m0 g: X9 K F9 J
* Check memory range for valid RAM. A simple memory test determines
; z; j. ^2 N$ A* [* ^: l
* the actually available RAM size between addresses `base' and
, Q/ \7 O" F* N/ G% W. T
* `base + maxsize'.
3 C2 }8 y6 v. I) `: N
*/
0 y0 r1 r9 M- b* q' H$ S0 i
long get_ram_size(long *base, long maxsize)
( k- B0 a5 S- ~/ y
{
, ~0 ^, b/ }( D
volatile long *addr;
7 ]3 [0 d' d) U& x" X ?( J) q
long save[32];
( g- J3 z T+ t- ?
long cnt;
$ G7 r7 K+ `# }; k8 L& Y
long val;
/ s; S6 @. |: V; ?8 V2 H# [" U# h
long size;
% D, ?* l0 w: G
int i = 0;
+ p9 b, g" Y1 W N% D
4 q: P2 b: b* R5 g+ Q# E) |1 O
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' K$ X/ s$ J& ~* U
addr = base + cnt; /* pointer arith! */
; d, W5 z; s; O4 q2 m
sync ();
7 \5 o1 H( R9 ~& T1 }' g9 \ b
save[i++] = *addr;
. G2 ]9 r4 ^: O
sync ();
A( E4 y$ G: y
*addr = ~cnt;
0 [) f4 H' V ?1 ]/ \" `& V1 `$ U5 u0 T
}
1 {, Y, k5 N: t5 ]
$ ~1 e9 H2 u& `- ]- b6 ?. S
addr = base;
5 |2 m: U6 h6 }( q7 M1 E6 d$ V% n
sync ();
" X# r3 G& p2 h' r
save
= *addr;
2 g6 {2 s* q, r7 ^7 v* w) t
sync ();
& I- _) n/ z4 v3 E# @
*addr = 0;
; Q/ g. h/ E& a5 i/ b$ s+ P1 h
6 P% }; A7 [* O7 _
sync ();
- P, l- l) i9 J9 L! E, a+ Y+ f, }
if ((val = *addr) != 0) {
$ V+ E1 f1 M3 q
/* Restore the original data before leaving the function.
1 Z+ w1 h0 m/ b0 _8 |' q6 w3 v
*/
9 t+ H( }$ N f3 Z
sync ();
, _7 t0 ]+ a1 M
*addr = save
;
. k) |6 v' e% m% a+ l
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 p* D: i" [; B1 Y0 J$ ~
addr = base + cnt;
9 S& F- w% j! w7 O7 G
sync ();
# ^ ]6 F O5 J" e- @% P: R
*addr = save[--i];
0 _/ Q0 ^/ Z# L" ^7 K
}
" c: o1 M" P& t# s; x* t( C
return (0);
/ K. g# h* P& J( v8 r- k* z( M
}
/ b; ^: ^& p/ y1 ?+ M6 [
$ y' V! j; r& g F/ V8 I& j2 z/ @
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 K% @* w) ?* q- M# n2 j, M2 K
addr = base + cnt; /* pointer arith! */
9 S1 W$ i/ Z# N
val = *addr;
* u; p! L; R. W4 ~
*addr = save[--i];
7 Z# f' n) V( d C
if (val != ~cnt) {
# V8 K( U, j& z8 v- Z. v6 ]' d" w
size = cnt * sizeof (long);
$ t) ~$ D5 l/ y* q4 o
/* Restore the original data before leaving the function.
& m* `( {" Y3 f+ `0 {
*/
; I9 @' O* x J& m; X* _
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; n& g y4 R8 C1 o: x' ~
addr = base + cnt;
7 b, B$ J* w3 M. v d, m* K6 |7 R
*addr = save[--i];
7 r+ {- X% Q) k7 ~, H
}
5 h" p- T& t4 [
return (size);
) l# J& [$ ^/ t' a! w7 z5 g F& N
}
& S1 _+ k5 d1 q
}
6 o" u1 c# a- R1 J* `
) n8 f( v0 ^ u/ I [
return (maxsize);
3 E/ D* b% l4 L2 R8 n* K; K% ]; C. Q
}
' ?# H: h% ~) T4 B4 w6 `8 W4 @
int dram_init(void)
{2 ~/ E5 i# T' U6 s) B, U
{
5 ` z+ P% {' L' [) m% ~1 a
/* dram_init must store complete ramsize in gd->ram_size */
% j2 r7 i8 M% [
gd->ram_size = get_ram_size(
4 H0 S9 ?: c7 u @4 o
(void *)CONFIG_SYS_SDRAM_BASE,
+ K k$ L2 p% o7 H7 s8 Z0 ^
CONFIG_MAX_RAM_BANK_SIZE);
% J$ N$ I% |" `8 U6 ~
return 0;
' H6 ^) S4 d$ V2 X/ _/ @
}
6 K8 Y- r* ]# |% h! x4 o( s
% t2 L2 F6 H5 U6 ~1 k6 ]
; L X$ E2 x; a* F1 W3 o% l
1 t2 {3 S( j, e8 j5 e% y
* I; b, X! \/ R8 d
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( ?6 l0 e4 ?& Z' S2 F9 x
% `' Y" s; J" n. a$ N! A' p
* J3 g+ [( U4 b" l$ x$ E( {
" W7 b' E' H# d9 W: Q K9 s3 i* ?
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4