嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
) L Q. _2 @ }
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ r# i; V1 K- s" ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ Z. k+ ?8 s( T9 o$ `) H5 t) [
/ S1 c2 y: I8 W4 M: C
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; r! R. w9 ?; A* {3 R
) r( n$ \) u: [7 v2 n: `4 M
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ i) B( P: O( J9 s
/*
) `5 O7 y9 k# s- t2 c8 F
* Check memory range for valid RAM. A simple memory test determines
8 m" M9 R4 t6 Q. q
* the actually available RAM size between addresses `base' and
1 Z6 q/ d! ^+ N, S: i
* `base + maxsize'.
/ E, Y* _5 L: M3 c$ v: X9 E
*/
5 R. }" K4 z7 W7 f, m4 n# H7 M
long get_ram_size(long *base, long maxsize)
% F9 a7 R; m! A* [- [
{
! x( ~& q5 }" B- C6 v" ]
volatile long *addr;
* X8 m8 H/ _: S
long save[32];
6 k& _4 Q8 E6 L* g# P- B
long cnt;
6 U# x! R3 W- w0 `2 }( ~7 I$ Q
long val;
! N% s3 a8 P! Y& Y! r' }% ^
long size;
6 n8 O( z. E* r
int i = 0;
1 X! s# h/ ~+ t- B. ^5 C' X5 D
$ E3 e1 N+ ^4 G& s
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: E" Q: R" O! T+ O# o# E2 O
addr = base + cnt; /* pointer arith! */
- x$ g' U5 N# ~( [9 ]
sync ();
) @3 q$ `) [% r2 ]& Y
save[i++] = *addr;
. V; v2 b) `* |: X! w Z
sync ();
) U! v X+ J+ M: \) X! k6 ?
*addr = ~cnt;
. I! ~0 }1 v5 ?- U; H- U
}
. c z5 Y# B$ q
7 C5 @; j& n. C" @
addr = base;
( H0 V' x- \2 ^- {2 V" }0 z
sync ();
a' H* t1 o' t9 g5 @$ Q& Z7 H
save
= *addr;
0 q. V. n# f2 z/ `4 P# ]! e
sync ();
3 d* K' u; z: J ^
*addr = 0;
W! u+ P- z* y5 j* U
( t- z0 ?& H7 w3 D$ M
sync ();
, A5 G' X4 d% k6 V4 p/ S* f5 `
if ((val = *addr) != 0) {
. [; U: m; }4 L% C( }
/* Restore the original data before leaving the function.
. V i7 V% o6 q# K
*/
5 y' F. j0 q5 P# N/ O [. p
sync ();
, a+ ?! @) i; z/ ?0 x, X6 G( \! b4 [
*addr = save
;
+ u) L- U, R/ a5 y' A7 y! M' f
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! o; H3 D3 l! k
addr = base + cnt;
+ y" r0 ?* h7 j' l4 p2 U
sync ();
6 R6 t2 w+ ]: I% Q8 Z
*addr = save[--i];
( Y* W7 h( c, C4 x2 {0 M
}
6 Q* w" L0 B7 }9 E, m
return (0);
/ D/ X4 g% i+ {! G
}
; s6 A! K8 G% S
" `, O1 ^, O2 W* g4 k
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 g* c9 \5 }8 x2 d& h
addr = base + cnt; /* pointer arith! */
' n- x$ S% m2 ^) e1 f
val = *addr;
" q( h# L/ g' m: a4 H! `
*addr = save[--i];
( w& x" x# M, D& v3 b
if (val != ~cnt) {
) d2 s: o% R- S& o
size = cnt * sizeof (long);
/ p/ o0 u( R: @" Z
/* Restore the original data before leaving the function.
0 a- ]4 a8 ]5 G! |
*/
h0 Z5 D+ g- Z9 [
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 Q1 W1 l- s' j
addr = base + cnt;
8 R! Q" e: r# F$ B/ z8 C/ |) x
*addr = save[--i];
3 H0 ]' ~1 D1 p+ a# v; N* |5 [
}
; r6 [ m/ m) I) h
return (size);
: P, |/ v; D2 J) ~4 r
}
9 a- A( n; B# b% }& t2 ]
}
X! Y, E, N" A7 [
4 Q1 }0 t$ D' Y' }3 M' t3 a( w
return (maxsize);
8 O/ o1 Y$ c4 e9 ]( ?' B8 W
}
5 a; A! ^3 Q5 r
int dram_init(void)
5 [4 {4 [1 m0 U9 O
{
+ x4 q7 v% J. j" a
/* dram_init must store complete ramsize in gd->ram_size */
8 K5 r- T q$ c% g8 T z: n
gd->ram_size = get_ram_size(
# r: v! j2 N( ?5 R. `
(void *)CONFIG_SYS_SDRAM_BASE,
; }4 s- C5 _$ c- ?" D$ W; F7 c i3 [. }
CONFIG_MAX_RAM_BANK_SIZE);
1 _! |0 p- t8 c! z) Z
return 0;
9 q! Z e' B' p8 {5 ]
}
* k8 s+ c4 k) q! n. k6 i2 Q! k4 Q9 I
_2 T* q9 Q" I& a2 t
- j! e; g* Y9 z
$ R; Y6 S1 j. e
) R: \' Y6 x. q2 P$ S
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' n3 v) s- U% |+ F5 _
. O$ b+ D! ^7 e* d8 z* ^
n& N7 f2 O% w7 u% d: R6 G# H
9 P& P$ x$ K. s; \; i0 a& n
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4