嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- O% E( i$ n# i1 I5 T( \
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ f# X5 D+ _ F5 ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% S8 }4 s0 a- C+ x, Q* |2 U
1 t$ W) q% L2 W8 q* B2 p( O3 L" }1 I
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) H k7 N' r* @5 [- G
/ O. j! K. i$ {$ G1 T/ W
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 d% S% e U% H0 X: C3 Z
/*
9 n2 P$ n4 J5 F% d1 z! W5 @
* Check memory range for valid RAM. A simple memory test determines
( j0 f/ V4 h- T5 v. q
* the actually available RAM size between addresses `base' and
, q' d4 t0 j4 Z$ N$ ~5 d
* `base + maxsize'.
* | `) g# t' P5 v
*/
$ B* k+ M( e& l
long get_ram_size(long *base, long maxsize)
3 b a, b2 r5 x0 U) Q9 i% N1 t- b
{
5 Q7 s; w$ A& T: X/ R; S
volatile long *addr;
* a1 v& z1 y% `
long save[32];
# C* G+ x0 S2 V+ y
long cnt;
- e' L& t8 r! v' u4 c5 b8 v% p
long val;
# F. y8 F* ?2 q. Y
long size;
7 s( X) K& W6 G7 I7 S
int i = 0;
/ i0 {) j5 c4 V0 t2 m) b% U
) b! P& P7 g; {) J6 [
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' t7 @* o/ m- b: `
addr = base + cnt; /* pointer arith! */
" ] `; s7 [$ T9 w$ `
sync ();
! l! f3 z& n! a
save[i++] = *addr;
- v" S3 f1 z/ z
sync ();
) N9 e# D0 D6 i
*addr = ~cnt;
: y/ @$ N/ M( n- D0 R5 z
}
! c4 j- y: J1 z$ o- r
# x8 R& `. I$ N: A
addr = base;
# k6 v3 S! c0 I, W, ]& M7 `! l
sync ();
+ S+ m5 r- A7 Q6 u3 |
save
= *addr;
! `) ~* ` E7 i8 `3 Y
sync ();
4 e4 y0 d2 A) m1 p3 N/ s5 y
*addr = 0;
' y# y, `+ @2 j- @. Y
& C- q5 n; i* P& w
sync ();
8 g4 I" {% T& u4 `9 m
if ((val = *addr) != 0) {
" }& a$ N. g* Q# s+ d
/* Restore the original data before leaving the function.
% s& Z- }, D/ n4 H) g8 e. @ V
*/
% P N. X8 a% s2 U
sync ();
" N; R" _- u5 U9 d3 ?( M: h
*addr = save
;
3 \* u5 u: c1 ^2 c
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ U+ T# m. F- t, G1 t6 u
addr = base + cnt;
# e: e# A0 V; b0 ^' b
sync ();
* b' x3 ?6 U: y7 J3 P" Y+ o" Z
*addr = save[--i];
; u) u) N8 h+ x4 i& U
}
+ x/ j; \& k& Y9 }
return (0);
/ ]7 b s# i# t& i0 j( j5 i7 E
}
0 T& q/ r. i0 j# g* Y8 n/ U
/ e% |( v; l7 F% i
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( N0 ~2 F7 I5 z, O6 Q* W
addr = base + cnt; /* pointer arith! */
$ }4 W" _' l. _0 B7 `' `
val = *addr;
( i! b0 K2 `: F8 ]
*addr = save[--i];
/ W' q$ D4 L8 ^( y
if (val != ~cnt) {
9 b+ R/ Z" X3 i& q
size = cnt * sizeof (long);
0 @+ x1 M* _# k& ~1 _: l; _# K, U/ F R
/* Restore the original data before leaving the function.
; O, A0 r9 _8 a! n- g7 H* k
*/
7 L# h8 M1 @ L" X9 U8 E7 l
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 K5 S% S3 a1 i3 N( U( @8 l
addr = base + cnt;
/ c& W. k9 l# b% I" o
*addr = save[--i];
8 z) u# K- d* v% Y1 [7 I5 Y
}
2 ~: P' h2 d) |- s
return (size);
7 ?2 Q+ _: H( { z% l E4 b4 T w, C
}
/ }- I$ U9 T' \! g& B7 K3 p
}
3 `" l9 e% V1 W6 j+ l! X6 k* o
9 l- F+ J5 q, W4 c- m* }/ s3 U) x
return (maxsize);
, H0 \6 C% w7 Y4 ^
}
, ^) q, o0 S2 E
int dram_init(void)
/ I5 s* i6 R: O$ d7 H% C0 s
{
' K6 u0 y5 E7 a% t& W) E f1 f
/* dram_init must store complete ramsize in gd->ram_size */
/ b* Z5 ^# U* ^$ z4 i
gd->ram_size = get_ram_size(
" x+ _7 t' T" H! s5 Q. `' v
(void *)CONFIG_SYS_SDRAM_BASE,
3 c- _ U# v" P* ]2 h* G% e" x
CONFIG_MAX_RAM_BANK_SIZE);
7 C1 ?0 Z7 ?8 e3 Z0 ^
return 0;
& Q5 \- E" }4 F9 f4 C; R
}
/ J( P, ^6 ?) p4 E
( G( V; F$ F, @# J8 m) h
% `9 ~# V( o, ~/ {) O
6 k. Q" f* t3 C3 o4 [
& E7 e- G4 T: Z4 C' {$ P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& n7 X0 Q* u m) q+ e4 m
% [2 r9 u" Y8 _- ~
& A' \, j P' v5 A2 W0 n2 k( i
- S; W/ Z( v. y+ X+ r' [4 v
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4