嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
2 e6 e2 s3 i! K; K
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, V8 P2 ^; Y# i" `$ _$ o3 J; S' g9 `
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, w( m: H9 ^7 `9 B, B
+ t% j" Y. y( I) q* \3 Z' r0 i0 e( V
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: n L% w4 N% b) d0 b9 c, Q
# Z" A( v3 l* X/ v( x
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; [/ q3 E- V& R' T) L
/*
; p; R ]: M9 X3 j! }" C" \3 P
* Check memory range for valid RAM. A simple memory test determines
?. |- N9 J0 P, V
* the actually available RAM size between addresses `base' and
+ a; W, U" Q' X% U& _
* `base + maxsize'.
, n$ t0 v# H4 D9 ?
*/
2 F8 |& Y3 n u. r% K+ U/ } w
long get_ram_size(long *base, long maxsize)
& D: U% c$ w, z, _
{
5 Y) d! ? s0 w
volatile long *addr;
+ ` T5 Z T! S W% k3 v
long save[32];
" F! I( \ }9 e8 X) y
long cnt;
3 N* N0 `4 l3 C: Y; y
long val;
* N% @6 L9 [) U8 r/ f- g: ]
long size;
2 m1 ~' T6 a% H( W$ g' v' C) Z% N. v
int i = 0;
% h3 y: X: A; J, q
& a! d) r! R* h/ G8 T: F
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 Y! @* w6 R2 ]+ ~% J3 h
addr = base + cnt; /* pointer arith! */
$ t8 F- a( _2 I7 R+ o
sync ();
3 y$ k8 h7 d& x+ k
save[i++] = *addr;
) n- D; W* k. L! s( K
sync ();
7 J! L( c' N6 e
*addr = ~cnt;
" ]: @# t; t. M; k2 F0 O
}
1 R6 q ~2 U% K( c1 r! n) f/ O
+ M& |! V5 ^7 \5 w& [$ b
addr = base;
. j% ~) w3 T$ T" g" \4 ~
sync ();
* y; Q7 x% E) m6 H6 ~, q
save
= *addr;
: l" H5 M2 f9 N. a; [ D
sync ();
2 j* V Q$ u+ q' ~8 Q; K
*addr = 0;
9 ]# z4 N; O* Q9 @- S# @
6 ?0 `4 b$ ~5 Y. P6 z1 t& p
sync ();
& N- P" U4 {* t7 D# t) Z& j' l6 z
if ((val = *addr) != 0) {
0 ]: G3 N# M3 s& l6 b
/* Restore the original data before leaving the function.
! I+ R" E" O3 a! p5 C
*/
2 Z4 U8 z4 A" f' L- F" L+ B! C
sync ();
4 ~: n/ C$ w5 F$ y; N! e
*addr = save
;
6 W; f9 G- Y; k
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 s r% U+ H/ _2 f' g- D! a
addr = base + cnt;
: U6 O9 G. d9 k, X7 ?2 Q
sync ();
4 ? \! e. I) F
*addr = save[--i];
: V- x+ i. t& P3 n
}
, g$ j& t) E4 i5 R$ p
return (0);
/ Y! s0 n( _7 B
}
" h m, W) b2 O! c3 W C
+ Z3 s) Q' q; z6 p, ?$ U
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 d# ]0 K( {; l4 G( H+ ~: q
addr = base + cnt; /* pointer arith! */
8 F# W7 R, y+ S1 f5 ?
val = *addr;
8 k: {" j" `. y6 _1 T5 m8 z* R1 E
*addr = save[--i];
! E! l$ |3 M) V$ g$ Y
if (val != ~cnt) {
1 g( X8 n, Q2 G8 v8 W% z
size = cnt * sizeof (long);
( R. a7 P) l! z$ K2 w
/* Restore the original data before leaving the function.
2 l. _ `) [; l) s: z3 b
*/
: B$ c) A5 y% n- k* M
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: n {5 D8 T5 C% w7 H5 C
addr = base + cnt;
" t6 B7 n" ?) y9 H* Z/ r. @% U+ `7 _
*addr = save[--i];
* k$ t5 _+ m2 y9 h) N
}
% n8 c: [2 T- Q' v- v
return (size);
; ~+ b, ~3 k( d' C* R+ J0 @+ d, k9 g# v
}
3 D6 `' A: \' ]' Y4 a
}
' T/ M& m4 Z6 K0 O6 s1 B( B5 J ^
/ O; e3 k3 F! ?9 M
return (maxsize);
6 x4 O+ H; X7 \( n8 G
}
" ^' m% e, {, f# {
int dram_init(void)
& `" @2 K K0 m% m5 p# f! l7 M
{
* Z @4 g) k! x* s" C, ?" u9 H
/* dram_init must store complete ramsize in gd->ram_size */
; N+ i* A9 P- _
gd->ram_size = get_ram_size(
/ s8 ^1 O- @, E% O
(void *)CONFIG_SYS_SDRAM_BASE,
2 p; A! Y8 \4 B7 X( |
CONFIG_MAX_RAM_BANK_SIZE);
x! |; ^$ O. s
return 0;
* `# Q+ t- N1 z5 r
}
, N w! x- }# H4 c0 U, O7 s/ X
* P, W9 Q3 u, g/ z
& r' ]4 @- f4 ]+ @
6 f3 u) b, ?% |4 \" ^
6 V. E- H: e, x0 f4 u2 |/ U% o, c3 ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 t7 C- G2 P' {- i- a
t6 T& W8 x3 X3 n) H8 j; R* ]+ t1 Q) X
5 M" @: \7 N! c$ l2 ~
% G% @0 ^, f0 \" y2 U* ?
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4