嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
3 ~/ p1 @- t9 b) Z0 _# |( e
核心板2:DDR2 256M Byte NAND FLASH 8G bit
" P! W3 M' O! d0 ]- A
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ ^: s. r4 h6 @, b1 x$ X/ c4 ]" |! k
4 {( Z+ C7 P% _: _' y' o, v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 w5 }6 |. j G% h* u
/ v' D9 m7 w! }" L( l
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 {# I! [" @1 e* `/ V( _ G
/*
$ d7 X9 _! @8 m& y9 z' C5 ~- }
* Check memory range for valid RAM. A simple memory test determines
8 ]$ D1 ~8 E( t5 ~0 p; q8 q
* the actually available RAM size between addresses `base' and
' q/ S9 C6 |8 t9 p& I
* `base + maxsize'.
2 W& b( X1 N6 p: W; d5 ` q
*/
+ y% `$ A& a; R
long get_ram_size(long *base, long maxsize)
% M3 k" e! U! C8 W
{
q8 J- F" y* f! }7 q5 k
volatile long *addr;
* X- [7 d) m1 ~1 R1 F/ | ?8 n" C
long save[32];
9 S5 Q& @% H+ k/ y) d! F
long cnt;
5 F$ d: A( W* ^" k# u
long val;
+ v0 Y- Q' i0 P
long size;
( f- K( \- H# o) w' J# M$ f
int i = 0;
9 i+ y4 e5 I* p% C& F# ?
! j# c3 D3 J. p6 i) q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, d" ?/ r( K* x+ D" }4 h7 P
addr = base + cnt; /* pointer arith! */
( T2 _) h! _7 h
sync ();
: E( H+ z/ h( B* F
save[i++] = *addr;
( w6 W$ X/ D0 m8 v0 d
sync ();
0 |! l0 Y$ z$ o$ ~6 p* O+ d
*addr = ~cnt;
; J# k: Q- G5 w" |% e
}
9 |; T0 Y8 S' d1 E9 Y0 M" [) H
' [$ W, W6 R" g* ]7 w
addr = base;
! J. [2 ?1 X3 }1 |
sync ();
: h! W( O/ a# X' F: r- y6 g" D. f
save
= *addr;
! G, }/ G8 K8 e4 u! {0 s
sync ();
5 M# v( ?; y: @
*addr = 0;
6 e1 [, X. s/ h4 D9 O8 q W
2 I. h/ |) S5 g% q5 _8 c4 \) y
sync ();
0 D3 Y# u& }; r H h' n
if ((val = *addr) != 0) {
4 }* {: |3 W7 R ]2 I7 Z* i# @
/* Restore the original data before leaving the function.
; R2 y' ]8 U& [4 C3 a% \
*/
, f. }/ }$ k+ [1 _/ i. s
sync ();
" S E+ z1 v' M* d% }
*addr = save
;
& R& ]0 l# q$ W" s* l( t$ \7 {$ f
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* U9 i; I) v k7 \, {# m8 f: T
addr = base + cnt;
9 s" e! x& n$ p3 T& K
sync ();
3 m1 a& A/ X5 |( F+ c" d
*addr = save[--i];
7 S7 |$ Q$ I3 y6 g. V
}
* S6 T/ H5 U7 P* C* p/ u- V( W
return (0);
3 v+ m( s! Y% t3 t0 z; x% `
}
; I0 b# S8 ~ [; c! u3 n* ]. D
0 Q4 i* p" L- l) y v- S7 ?5 \
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' a3 d" ], q. R+ L( {
addr = base + cnt; /* pointer arith! */
& b B) E, D% s' o
val = *addr;
~8 C# y0 P/ ^' M5 M7 g5 k8 ?
*addr = save[--i];
$ N5 N3 }; q R' w* j
if (val != ~cnt) {
) i3 |+ y) X6 D. I2 h: D! V
size = cnt * sizeof (long);
( M4 t0 T( l3 z8 Z% G& o1 G
/* Restore the original data before leaving the function.
; O/ ~2 N" }. U; t5 P
*/
, ^1 k0 z" g$ O# v* D) T
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 `" L6 q6 g, Z" @/ p
addr = base + cnt;
) v# y& d" [; a; x1 v9 q
*addr = save[--i];
: D$ y# q, m; ]! J: T. a$ A1 f
}
7 k1 _- j9 Y1 N" A* P& P/ ^8 ?
return (size);
4 G4 Z) P. |5 l+ d" Y& D
}
1 O }* C" k. w1 }
}
9 w# Y. [% ] t8 j* q
% z k0 P4 E1 }* p
return (maxsize);
# a5 a& X2 n `8 i7 ^+ H
}
; `" Y2 ~4 c5 H/ H5 q; I
int dram_init(void)
" f5 z6 x6 R5 t3 k
{
" w% N% i2 @; \. w2 \
/* dram_init must store complete ramsize in gd->ram_size */
3 J& Q' d# t- ?7 N, ]
gd->ram_size = get_ram_size(
: t' E3 Y5 f. ~+ X+ W6 ?- d
(void *)CONFIG_SYS_SDRAM_BASE,
( v- T, C" F8 o
CONFIG_MAX_RAM_BANK_SIZE);
S' T9 u0 C; G6 f6 ^# B
return 0;
3 i% X( s8 L- C, J* A. y
}
9 J* p+ [% p. H0 F9 n
# @) e7 R% J3 F! u9 o
" u: G* C1 X* p3 D) h
+ A4 d* w4 f& x# w) T
2 @( Z1 I- |$ v. p- @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; v. a% Y0 Q3 ^. s! c
; a6 b4 k' H( c8 [0 U; C
6 x# o; I3 {( ?3 @
# B5 w5 e) K7 Q9 o: C9 E
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4