嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
$ k! `6 v5 B0 w$ K) P
核心板2:DDR2 256M Byte NAND FLASH 8G bit
! S0 @; Z% U! r2 b" a
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- j0 t5 i/ D" Z/ i1 a. m
7 `3 v% O* \3 b' s( D
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 Y; |, H4 Q5 Y. b
" }8 p7 Z! R8 z4 O" e
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- G; ^; Y" n# p+ Z4 O+ ~( ]+ f I1 j
/*
. ?% `5 f+ Y3 V
* Check memory range for valid RAM. A simple memory test determines
9 m7 D/ ?0 q+ t
* the actually available RAM size between addresses `base' and
$ S: ~* Q, @+ w+ ?9 `1 r
* `base + maxsize'.
0 A2 G' g# x4 p. f. t
*/
+ [# O. t! ^$ }# g2 i2 j3 ^0 B
long get_ram_size(long *base, long maxsize)
$ M6 S/ X1 e" X0 j
{
6 _6 i& c; {9 L1 x) g5 \; X" ~
volatile long *addr;
0 E5 L& l P+ N
long save[32];
6 U9 U7 @7 W% \
long cnt;
, q; J, B5 V/ g5 ^
long val;
* c v$ ^) K3 T7 x' Q u3 j
long size;
; s4 k8 Q& G, |& s. {5 a9 f
int i = 0;
1 T$ Y! l( S Y6 P" c
# _9 b& z* L7 x, z5 F! s0 i
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 [. G, A5 w) a8 S) t8 y% F: T
addr = base + cnt; /* pointer arith! */
0 ~. J1 s2 \8 y
sync ();
% h* X+ l4 k$ a S1 D4 A5 ^% K
save[i++] = *addr;
' | Z& ^6 S4 }; Y: \3 j. {- n
sync ();
) J: `1 o& ?# P+ j0 T8 W
*addr = ~cnt;
! ^1 ?& I& p$ v( q
}
: W6 e A7 A4 V8 P: S
; X6 y( s$ x* M; J! F
addr = base;
) m# \; _$ _; x
sync ();
3 n3 d. o* u1 u1 U4 F( n
save
= *addr;
+ ~- c9 ]5 d- v5 Y
sync ();
5 x. [) E O* P& W
*addr = 0;
6 g$ i; |; t) Q1 r2 n4 T1 H
' E, n$ i! i& o a" S, E
sync ();
* [1 P/ i+ Y1 Y' R
if ((val = *addr) != 0) {
B9 ^% o7 T; e/ d
/* Restore the original data before leaving the function.
- O# S' K/ c) }4 U$ d2 u
*/
4 U, P" n, I8 G/ S! p
sync ();
6 l2 u7 A3 N7 C5 X, B
*addr = save
;
7 n" t; c* a+ F8 j/ o
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# Y& n# ]: \: N
addr = base + cnt;
4 n. J7 l2 ^; g7 H) L
sync ();
/ I8 ^( l8 }4 m* f; k, M
*addr = save[--i];
0 R7 @5 R+ D' r. o5 o
}
e0 o2 v+ H, T- ?0 C, ]
return (0);
7 J& U6 \ o) H3 x, A8 O" _+ I' A6 Y
}
2 q. P9 g2 S. u! v5 n( ~ k3 u
1 f* ^; q7 D+ _* ?) Q
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 j/ q6 j& l, s2 {0 G
addr = base + cnt; /* pointer arith! */
% p/ Y, t: Z1 }
val = *addr;
7 e. K K* ^( G7 A6 t
*addr = save[--i];
1 Y7 E9 l& D2 m$ S/ Y
if (val != ~cnt) {
- K: F+ }3 H& R
size = cnt * sizeof (long);
4 w5 }. i3 Q6 l9 [, R
/* Restore the original data before leaving the function.
3 J! }) T! Q/ Z: j
*/
5 ?) b" ~7 }) E. P& R
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- J ?" V1 @0 m( H9 ~% ]* x4 C
addr = base + cnt;
0 K) J; r* [- O
*addr = save[--i];
( D; I9 i7 \* @+ s- x
}
$ g* R# ]$ ]& Q- {- s' V1 K* e
return (size);
/ k; Q. A* Q6 o# v! x- |
}
8 f' E1 x$ `7 M
}
$ _/ |" V; g% r: T: e
* a3 [& h8 ?% w! F" T
return (maxsize);
0 B3 L0 @4 y8 T' c+ T8 D
}
) y2 h1 c5 H N3 C% D$ \
int dram_init(void)
& A3 I0 J6 J$ S) v' P
{
( } q4 \9 w' K! L8 ]6 Y
/* dram_init must store complete ramsize in gd->ram_size */
/ R. a( y y B
gd->ram_size = get_ram_size(
1 d" Y2 r: C* J7 {/ p, t7 L: [
(void *)CONFIG_SYS_SDRAM_BASE,
2 e' g2 U% C% a6 V- K- ]( D5 X
CONFIG_MAX_RAM_BANK_SIZE);
6 I" V1 X. `4 w5 E2 N# M* v
return 0;
+ _! S7 }. L I% C) _6 G# \
}
/ O' Z" W3 |% D3 `+ T
" O% P: Y" q# `& a% U) d
" x3 T: W9 [( _0 L
4 L& D' W! A; T" C* n6 p6 i
1 t8 {% r2 _$ g9 j5 t6 K0 _
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- h. b) ?/ q/ v) q
0 F8 F4 Y0 b/ _ _2 x
* d/ K2 I5 g2 z; E
' M; Q S* ^! | p ]
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4