嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 E8 ~* q, m% u# B- r) {! y/ A
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 |% P. {: L5 _5 S* T' h! N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ c) _# s: j& K/ ]
" @: |1 e( r7 E) B: k: U! \: K* s+ q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& a5 d2 E3 Q! U) O
( P7 g) c0 _* ?+ X9 T n
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& H. z+ G: T4 r% n! N# w! A- v. b
/*
+ o7 E$ b/ |% L
* Check memory range for valid RAM. A simple memory test determines
4 [: x. P& n" w9 w; ~
* the actually available RAM size between addresses `base' and
" t2 W- A* s* w6 M6 @, a
* `base + maxsize'.
' J$ p+ K; b8 m' l
*/
2 X; Y% K2 p/ C$ r- m
long get_ram_size(long *base, long maxsize)
) P" O$ i2 b2 {
{
! v3 A, C2 {; \1 a
volatile long *addr;
4 R) ~6 P- i' I
long save[32];
1 t& S4 K, d4 {8 C& b/ m- Z2 N5 ]
long cnt;
# y8 f3 S. G" j: u
long val;
0 Q6 X: J: [1 Z( H2 N. B1 d
long size;
" O. G1 M5 F5 g1 [7 P- V7 z
int i = 0;
9 S0 N5 o7 N- ~7 b6 P
! `6 D+ k j; g; V8 _8 X
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 k/ d* Y8 a: |) s2 x& t$ F" A
addr = base + cnt; /* pointer arith! */
' i- Z2 V, y9 d# b7 T+ R R! w# E& v
sync ();
8 a4 N/ o) r/ o9 b$ R" b% v9 s& g
save[i++] = *addr;
6 j: g' a$ _$ Z9 ~ K* H0 T
sync ();
! O" `0 Z/ ~$ i( J
*addr = ~cnt;
8 c! C# `& M3 y8 Q+ t! Y+ e
}
' U! }, y5 j4 E9 X
' p& ]; u# }% L: @1 E4 F
addr = base;
7 J5 e4 G4 y" G& J3 p2 N
sync ();
+ b8 v6 a$ I3 a3 G# j$ B% c# Y
save
= *addr;
/ f7 d6 d* O9 E8 }7 A9 f/ N' D
sync ();
" `7 c/ D4 D8 {" `! h, z2 {6 A& @, x6 W
*addr = 0;
3 S" A% b, K' P7 B p& l
% q B6 S, ], B3 y; Y
sync ();
8 r$ I2 }' F; L; k* W' Y
if ((val = *addr) != 0) {
; D, F3 U9 ~/ L6 y( |9 A/ ~( B# ~
/* Restore the original data before leaving the function.
* q8 u+ G5 L% t* h/ g: K& e
*/
3 x* _/ y( P2 m5 ~) P* G$ ^/ ?
sync ();
0 o2 A6 d: _" {& }
*addr = save
;
X8 i5 _ Y, t/ E( H+ x% @9 e
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* i, I/ v9 y' b. z& N. o
addr = base + cnt;
& }8 E% w* F; F& V2 s0 n
sync ();
* z( ?; a8 T7 R$ b, W* k
*addr = save[--i];
. s) l0 l$ m; I4 U! o
}
4 P2 I% w9 A% S7 U2 _6 g+ Q4 B
return (0);
0 l4 ?3 m' h3 F! l% v/ ]$ A; r' \
}
$ _1 b4 {$ t. j3 a+ `
8 D" ]7 r4 p+ U3 \& O4 l
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( ~1 K$ v- L' o7 Z5 w+ v
addr = base + cnt; /* pointer arith! */
7 r2 \, \" `: S" K
val = *addr;
6 _* Y0 k! _) ]* Z, M+ i% }! {
*addr = save[--i];
0 S$ V, U8 _! W; k% v8 }
if (val != ~cnt) {
- c% @8 P! j; n u, O
size = cnt * sizeof (long);
4 m% K" [$ o) {5 D" a+ u) q- Z
/* Restore the original data before leaving the function.
6 a) O4 @% j, s7 V2 h6 o
*/
) S4 ^7 q5 `" P" Q) ]
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ s/ l6 a$ o2 l; ^2 j
addr = base + cnt;
5 h* @5 ~2 F/ H3 |' `6 z- _" G
*addr = save[--i];
$ p% n _! F. v: t4 F
}
1 F7 E2 ~9 E. i8 P R
return (size);
" a6 I9 m( ?; O2 D( p
}
$ k- L3 b6 e) p% X( |# L" _) }
}
- A; I6 Q5 S5 ^% N8 |
& U( R/ O2 Q, K: S# ~7 j& |. Q
return (maxsize);
4 n' s& p$ e# U2 A8 p! d- Q2 ^
}
9 I/ m4 P0 D j' d7 Y) R, W6 m5 M: r
int dram_init(void)
+ x& `9 U8 H9 U8 T, i) D
{
% u7 F* d$ o% v5 q- y2 B" Q. d! i
/* dram_init must store complete ramsize in gd->ram_size */
: ?' l- d; {4 r1 ~1 P, S3 O
gd->ram_size = get_ram_size(
4 u0 R2 b% Q8 l2 P ~% `7 u2 A
(void *)CONFIG_SYS_SDRAM_BASE,
% D ]# \( M' d1 a. T Y* L$ M5 N
CONFIG_MAX_RAM_BANK_SIZE);
" z6 |) N& F! O& f* [
return 0;
* l2 ?; M5 ]" T" h4 n8 T8 f9 d
}
. L* m l$ P0 K% n( G ~2 X- C
/ [# M' u4 P6 h0 d% p- I" b1 v
# ~2 Y& u- h: G; `' W" |$ z8 G
- |5 B, i% r) t4 i7 F
* F5 p% O" A9 X* ~" _# j3 ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 m9 D9 k: C& e
5 t& }& C! h- _5 U
/ S1 l/ l! j6 I* l0 |, j
& L) t4 ^% {) P4 z( g
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4