嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 |4 _ S8 d# H
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ J" Q u" u h. |/ Y5 H
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 o5 c, e8 g. H$ i6 p; K
2 j/ O' R6 Q) z# L0 A
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 O9 R$ a' l) \, N6 {/ U
: D* F/ `8 a( ]/ A
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 k6 a# S" c4 J3 p4 Q S7 C
/*
/ z! n a4 W( H/ g |
* Check memory range for valid RAM. A simple memory test determines
* e H% _* A$ f% G! n" l+ r
* the actually available RAM size between addresses `base' and
/ s( t0 G7 I7 N; D8 A, Y! P; l# p
* `base + maxsize'.
6 P9 ~# o, U' U$ P' U" ~' @
*/
% ^5 X% n1 X( x# X R! `' j
long get_ram_size(long *base, long maxsize)
9 r7 `) I2 {0 P: o0 ^
{
: }3 S/ `4 ^" ~2 P
volatile long *addr;
5 K0 I: ~9 k+ s* \' U
long save[32];
0 {' P: i) I2 C
long cnt;
: q1 a# n; _( O9 G i/ N
long val;
( H+ `4 u$ f" g1 p$ O. x" K1 b6 J
long size;
' z" `6 D$ J2 n+ _6 r2 M
int i = 0;
) C. H' N% T3 S% M5 I
9 Z( n m$ D3 r# b
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 y2 c% x3 @% ]: m) C6 y, d
addr = base + cnt; /* pointer arith! */
3 Z, w) q7 G9 _0 a% l
sync ();
; e1 |$ u! m3 K& e3 ~6 r% q
save[i++] = *addr;
* o; m# _; f6 C" j2 v2 K u1 Y
sync ();
5 E) U0 l& d8 r. f9 |
*addr = ~cnt;
; w9 J7 E8 m$ ? K, p# U- U' ^
}
1 {4 p, K" r1 U
1 h3 N5 {, V( l( ~
addr = base;
' e9 [; \. O) Z% O( U: o
sync ();
& s, J% Q+ |& r4 q% h
save
= *addr;
1 u' C& n/ J+ c; t
sync ();
: {' `3 `) B; \" u2 M5 h' ?0 }
*addr = 0;
& ?6 y( k. i' O6 `- V* \) o7 ]
) |# M6 X, Q1 O( A9 C, K! v
sync ();
& G& s! H. H/ J8 k+ n
if ((val = *addr) != 0) {
3 \5 ^+ z! @8 C2 N) _5 ]$ u! Q* T
/* Restore the original data before leaving the function.
5 j$ a9 u4 }- o, `5 ?* m8 Q v
*/
/ X6 y+ ]! J* `" l) a- q
sync ();
! z; @' t" T# b2 W
*addr = save
;
/ N) b2 H0 n; x
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 ]1 ~& d4 D8 `% b6 M9 g* k
addr = base + cnt;
/ o9 c$ m" n, W- q5 F
sync ();
" [* W5 n9 J; a% r, d" L
*addr = save[--i];
) k/ Y4 `7 P0 T4 K$ X& d
}
: W- ^! v N% v8 M9 p
return (0);
- H! l# e, |$ N
}
6 ~1 t- {7 L3 ^
; y) i- r: t C9 N; Q
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ t" B5 M0 e0 `: d$ ~2 U
addr = base + cnt; /* pointer arith! */
7 n# `% r; m1 P# N7 K
val = *addr;
' w9 S% E9 a+ L! q' Z9 v( ?
*addr = save[--i];
5 y) ]' K: b6 B/ G* v4 x
if (val != ~cnt) {
; D. Y. j4 H9 k# Q+ W% J6 O9 U& z7 y
size = cnt * sizeof (long);
3 z7 D3 Q1 ?! U Q
/* Restore the original data before leaving the function.
( h' L( ~3 R( |, n( Q$ j1 n
*/
9 L0 z' o0 F! x- I; |
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ _, T5 k. C1 F4 c( O
addr = base + cnt;
8 G' M& G) O1 C: @8 e+ p
*addr = save[--i];
0 x( _0 P, q/ G& q* p- S0 ~
}
' J, g4 f$ J, p2 K
return (size);
0 k3 B* m8 ?( m- A) l1 ~2 Y8 Z
}
) Y4 `- p5 ]5 M2 S3 V; b- ~+ ?! r
}
& p1 B' \2 }2 k% M
0 H0 @6 @6 k F* P! }
return (maxsize);
3 ~! q: Q# Y9 I
}
5 t2 u4 W" K- n& R
int dram_init(void)
4 ^& `( w( p% ?" J1 {
{
( j: U, y+ R6 ^- C$ \
/* dram_init must store complete ramsize in gd->ram_size */
/ w0 Q4 Z& a; J' b: a0 r- t8 o
gd->ram_size = get_ram_size(
4 Q4 F' i% a, N2 _/ M4 ]4 b8 {7 j
(void *)CONFIG_SYS_SDRAM_BASE,
3 ?: [7 O- B) |8 [7 h6 \% _) ^
CONFIG_MAX_RAM_BANK_SIZE);
( E; `7 }8 y. F u
return 0;
; F" ]- l! G: D( b
}
6 q, ~: r2 H/ R7 a$ T3 f8 |% c
& G' p [0 i! v9 ~1 E0 |" w
, d- j o) X6 K( I( O
+ L/ r4 X I) L/ r- M/ E* q j
! g8 J( o5 E6 L% Z7 w2 H. n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- F: C2 a3 I1 Z2 l: Y
* G) q! y8 \0 R
) P! q, E& a9 ]- r. \' ]4 T c5 x
+ c- `. e1 f0 e
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4