嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
% N9 U' E; ^' d7 T
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 T+ e; f6 g9 `; C+ J) Q$ X5 F; F
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 K9 }! h9 }+ `& m/ X( y) u# X* {: o6 f. K
2 Y9 \* @/ M5 H# X3 L9 y" V
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 d7 @0 V3 V: s. x4 {& z& C
. X/ }7 L$ I4 {' `+ G# Q' q
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 O$ }: K% h3 ^, v3 a: A& n7 S6 D
/*
$ e$ |3 p) h1 z
* Check memory range for valid RAM. A simple memory test determines
! D! i+ u6 u( [
* the actually available RAM size between addresses `base' and
1 X/ K5 T" {- W H3 S- ^% H7 e
* `base + maxsize'.
6 o( r7 o4 B4 |/ J& Y* W& g; M
*/
$ k6 h, l" K5 B; a, \8 A
long get_ram_size(long *base, long maxsize)
: j* I* c% {$ X# u- G' S3 x7 X
{
4 T- K4 [! ?- m$ W/ M4 s/ {6 A7 q
volatile long *addr;
# N5 N. }* V+ D/ H* z4 d8 R
long save[32];
, N" q3 \9 f5 `" E, B
long cnt;
K: p. S* J3 O D: Y
long val;
& h2 i- o9 T* }% U; h
long size;
; @ o, p; n, F) z; ^! F, d$ s
int i = 0;
0 f' a# P1 E) J a$ X& e! m
2 w* H2 S% n* U' X2 _9 t1 v; W5 Y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 G p5 `$ o( p! i5 ]2 j
addr = base + cnt; /* pointer arith! */
8 c) ~( u# {# }0 A) a7 H
sync ();
0 h4 G) _! P6 |" Z& N- ~* s+ n
save[i++] = *addr;
) O! s4 E/ U# z9 n( [+ Z
sync ();
# |& }2 I X4 X' j O" e1 H
*addr = ~cnt;
9 b9 k2 X& W1 s& L+ W
}
! x4 d+ }( {% {& k3 ~9 I6 K
. ?3 q- I$ |- Y7 N) J- P8 D; w
addr = base;
9 f. l7 V5 o! q9 I# k" W
sync ();
+ [' C* W2 x H* z
save
= *addr;
3 ?4 F6 G9 n6 ^( g r. f
sync ();
+ e* u1 d1 F# K( j
*addr = 0;
" W2 G' E" u5 q* p) d
8 [1 X( l9 \7 L) q: X) o) k8 G+ l/ Q
sync ();
# T7 S1 n/ B# k6 A6 d |0 w7 p. G
if ((val = *addr) != 0) {
" F1 Y+ k& j0 z8 }! n5 d* @
/* Restore the original data before leaving the function.
8 x0 M5 W: K4 V% \: m$ e
*/
) ]& x* j! ?& J8 R+ l1 ]
sync ();
8 }* k( S2 M9 U0 P
*addr = save
;
0 n5 S7 K8 L+ u. d
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
K1 j) ?5 p! ]' [3 l$ ^$ d
addr = base + cnt;
4 m l' Z2 X- M& B
sync ();
# o/ y0 M9 D6 H' G# f8 D0 T6 w0 G
*addr = save[--i];
|- z: E, Z. @2 J) E6 ?
}
; S/ e0 M1 G8 f( j
return (0);
& v% |5 R! A: w0 ~- a6 N2 a
}
" l8 C& }: n# H- I9 m8 z2 T9 E
$ M9 p" a3 P& t. X, @' z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; d* e0 z1 j5 y# z
addr = base + cnt; /* pointer arith! */
# p! a2 f6 ~5 [. o6 {8 S
val = *addr;
# }4 M( w0 c8 A3 u' r
*addr = save[--i];
0 U& w2 a' ? ^0 L( V. a+ {( c
if (val != ~cnt) {
3 i6 p2 k/ n; a0 g) m. D
size = cnt * sizeof (long);
3 ~$ V c& s+ \3 @ i
/* Restore the original data before leaving the function.
7 L: u& i% C9 Y8 H0 W2 d+ g" h5 l
*/
3 h: ^2 l/ X2 d j5 B
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" x; S9 Q. b a/ d
addr = base + cnt;
, C9 p9 v: [4 p
*addr = save[--i];
! q* M. Z2 ~; i. d
}
9 l" g- W$ y6 s6 G! D3 D' ?1 }/ r
return (size);
8 L2 c7 u3 ]! _7 N
}
5 b8 E a0 z3 S% j
}
5 N3 b2 i! q. f) k+ p4 Q
- y" q1 D1 A0 B: W. b
return (maxsize);
8 J6 T8 y2 u& w( {1 R$ u$ c- i
}
- ~$ m8 P) H6 {2 v( C2 ?/ _
int dram_init(void)
) v* N/ I5 x9 M1 k
{
4 Y, s# ]% e; Y3 K7 _1 r9 N
/* dram_init must store complete ramsize in gd->ram_size */
1 _# _8 Y% Z9 o4 [- [5 [
gd->ram_size = get_ram_size(
& S5 J! Z: t- N( Y2 w2 {
(void *)CONFIG_SYS_SDRAM_BASE,
% ~- j$ a# y* z; h$ s# B3 ]
CONFIG_MAX_RAM_BANK_SIZE);
' C/ i+ T. x! |8 c U# A
return 0;
- l0 P8 ^3 t; q4 d( t' S; B: Y
}
- z5 y( P" F# B8 R n6 O
2 \, {. F8 v( F# c; {9 V& X
) c( D/ F4 P* a5 ]5 Y! D, L: q
7 W- l$ L$ X4 j( T" V. Z5 n' I
2 ?# n$ }$ G( e5 I8 I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 [# j& z$ u: Y# _
8 i# n3 z5 v: J: Q
$ f! J6 k# X5 [" f
4 @, E* A2 p2 I
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4