嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
7 G. u- y& O% P) N& m9 W) k8 C
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ j: u6 b& S3 C& x8 D$ F
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
! }9 q* K+ p7 i. O( {1 t& \
2 }+ L* a3 @1 J8 j4 K0 W4 M
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, L& o" p; W' s/ H3 d" ~
8 ?7 y3 l( [0 T# x; a0 y' g
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: v! N8 |8 ~1 @6 e+ s5 N
/*
! r; a4 c( l( R, T( q% R
* Check memory range for valid RAM. A simple memory test determines
- q s1 G+ G0 u) V1 H, X( j. h
* the actually available RAM size between addresses `base' and
8 a- y! [6 C+ {4 t5 r! h
* `base + maxsize'.
& t* m2 p' @5 D" o+ s, A
*/
" j! @1 y% s" A6 h6 n! y( F" @
long get_ram_size(long *base, long maxsize)
" F: Y) ?1 U* q1 [2 a8 y
{
; @+ m$ n/ [2 k% m5 A5 N S
volatile long *addr;
" v B5 `7 E8 s$ |. S6 }/ n z# w
long save[32];
8 E4 U& N. x( h# L1 _! l. L
long cnt;
' S' P' @! Y: g" ^" w
long val;
/ M! A* v0 s9 ?2 H
long size;
5 M, W! x2 Y3 T8 @1 ?0 B
int i = 0;
% N# m8 b- C9 k9 s! Z; K8 {$ v
# L0 u, s3 F+ h5 [, d$ t
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) t- d& p$ U( t! {4 [
addr = base + cnt; /* pointer arith! */
# L. R& `, t* ~4 _ H
sync ();
& C; j4 P) `- {5 j) u
save[i++] = *addr;
$ w- F3 Y( I8 z$ p- l+ g' j2 U
sync ();
4 c/ k" i3 c0 C& h7 F5 g% d
*addr = ~cnt;
/ b n1 r, y& {2 E
}
% h1 \, Z9 N% x' k" H) ?
+ m+ k4 E' u1 a
addr = base;
7 U3 Q0 F% V0 s
sync ();
5 l& E/ b* F! E8 O
save
= *addr;
" x: v% ?7 i5 C6 v& E% M
sync ();
. w4 E9 R1 |/ W. Y
*addr = 0;
8 [* }. K: d4 x% i6 r
! O0 W- x( P: \' V2 ] m
sync ();
% w4 E" e5 ?3 O' m
if ((val = *addr) != 0) {
9 D" F$ v& f7 ]
/* Restore the original data before leaving the function.
5 l- c8 I0 D! K" @& X: k
*/
8 e' Q+ O" d4 [: y, E
sync ();
% o* L2 @1 R2 b
*addr = save
;
" o# H# y# U" i7 r T
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 W6 J6 `! M/ `& s
addr = base + cnt;
+ y$ F: w7 D, p- G3 I
sync ();
" c0 ?; `$ e9 V
*addr = save[--i];
# d+ ^6 p( y, B. A3 ]
}
4 {8 v7 c D6 M, E- m
return (0);
5 I- ~3 B, X" [. _+ U, _* j4 ]
}
5 x: @8 ]& H( ]; X9 e! ^
5 Q% W/ p4 ?" |/ f) E% ^ R
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ V7 e5 w# B4 {2 n/ l5 P
addr = base + cnt; /* pointer arith! */
0 R' Q9 ]. f0 _6 z/ `8 H+ R
val = *addr;
# `% |) l! d1 x( B+ N$ V
*addr = save[--i];
/ H' Y* \4 P, g' k1 Q' A
if (val != ~cnt) {
8 \" x! L8 ?& P N9 O
size = cnt * sizeof (long);
: l0 O1 g7 V6 i- g" a
/* Restore the original data before leaving the function.
3 L* h" v) [/ Z6 c$ |. K; M" J3 Q( _
*/
% D% u+ z- q- Y8 J6 O9 L) D
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 [/ `0 x; C# S# j4 M% z
addr = base + cnt;
- H% F. J& H2 |( |
*addr = save[--i];
5 @% z7 a! ? M) @5 n8 q
}
. [1 `/ b% t/ w: U' A3 |/ I/ T& P Q/ h
return (size);
6 L5 ~+ e6 d7 p$ ]
}
- h2 c) Z# J3 {& j" W; ]) x6 a% A
}
7 O& t( }" b: k7 y+ v0 \
' C, o- m$ f* C" A
return (maxsize);
% }6 w0 X# _! x( Q0 j k/ c( A G
}
, `4 b: y' ~. i( R
int dram_init(void)
( t) J/ F7 @0 i0 w
{
3 Y* h& \ n' r9 ?) Q$ C
/* dram_init must store complete ramsize in gd->ram_size */
+ g3 O9 W( q( X7 m$ J& W, \7 |
gd->ram_size = get_ram_size(
" R: s) i( X3 t- z1 f" P: j
(void *)CONFIG_SYS_SDRAM_BASE,
7 `3 L7 s; O3 l% z* d
CONFIG_MAX_RAM_BANK_SIZE);
; q& p9 f) U1 \0 k: ^
return 0;
( T" S' Q5 G Y1 f
}
! [0 z' |4 Z" N( \0 w3 R! u1 M
( A% L: h. r6 P) H% q
0 K* h; ^4 {3 g- d4 \- S
; M% r2 Q1 d3 O7 X
; e4 F) y( g) s6 W8 s
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ m0 ^* M. l1 L8 ?4 ?4 T
1 J: b5 }* {! r
- \+ E8 o3 S# [, U
& J' ]& J9 D: W( s) r
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4