嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
; Q: D: X, j0 |1 ~: C
核心板2:DDR2 256M Byte NAND FLASH 8G bit
* b; U2 N5 A! Y, s3 J
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
b6 O; k! m h: l* ]
, h1 ^5 X7 s- L2 N1 c
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! D( I) s) e2 e X8 j
" L( O. w7 m. I& W6 b9 q
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ ?2 G6 h1 ?7 m$ B# ?
/*
% O7 J1 }1 c* {% T; N; K
* Check memory range for valid RAM. A simple memory test determines
: @* ~- i- Z" M+ A+ y* t
* the actually available RAM size between addresses `base' and
; U" |" K. L" H
* `base + maxsize'.
4 s c- b& d' p# D8 q% j% ]: R
*/
1 s3 k* a* s( `7 J" c( C
long get_ram_size(long *base, long maxsize)
) E7 s. m) ~9 R2 q
{
{% t8 l- V% ?! s, u
volatile long *addr;
: P: V0 y9 q* K1 {. o2 |
long save[32];
* `' o w. H( n$ Q* [5 F
long cnt;
% C+ }9 r2 C8 s9 J
long val;
" n/ i) x1 Y0 G% E' V* d" \
long size;
; D- c/ {, {3 {4 M1 }' {
int i = 0;
" V2 D% }0 Q! Y/ G
: [# H+ X& M5 b% E4 V- f5 w5 ]4 r' c
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, o; ?9 {# F% X! ~- h$ H
addr = base + cnt; /* pointer arith! */
" U% c+ F9 U$ X4 x1 K, q2 l1 T
sync ();
! d4 n$ [" \# x3 M& u3 x8 ` N# k
save[i++] = *addr;
' v# P: D B5 s: g: w
sync ();
" o/ r6 Z9 }- {! `
*addr = ~cnt;
5 h0 R# B' `! {* e0 H
}
: a9 |( f2 Z H) c1 y, \: D; q
9 n X5 ]0 l+ Y6 U$ N3 H! ]; J5 R
addr = base;
- o s3 t) y- n7 U1 ^2 @, `
sync ();
; n: ?# @% b/ ~/ F, v, @
save
= *addr;
& t4 t5 h6 ?. ~ f2 Y2 O
sync ();
2 r. C" Q4 Z3 A' }
*addr = 0;
+ q w' W0 C3 x0 m# `4 p- o0 E' g$ U3 y
; e1 n; N; {2 d; |, s
sync ();
2 f. @# L4 s- ], p; z$ T/ s! }* w
if ((val = *addr) != 0) {
, k; F1 P$ z6 e4 [' n
/* Restore the original data before leaving the function.
; m6 K, v5 v( E, Q! u: ]. V
*/
! s- Q! `! s1 R2 y
sync ();
" ~2 ]& k, g/ Y) @: e L9 O
*addr = save
;
1 J' U- d+ G, q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 p1 M$ u' L8 M6 ?) x
addr = base + cnt;
- K7 h! y0 L+ ?+ m" e0 I6 t& e0 i
sync ();
; U4 \7 ], h3 X+ {6 M! b+ B" [
*addr = save[--i];
) T9 i7 q! P! j6 J- b; m1 }& M
}
6 l) ?( C$ L! ]# R+ x8 `( a% H
return (0);
* _4 ?* x1 q: t% F) [8 F
}
! Q4 V5 a/ ^2 {7 u1 X J' q# M
- |/ \; Q; U2 Q p
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 p$ w; Y. b! q+ l2 D. s% ^
addr = base + cnt; /* pointer arith! */
+ o$ Q) f4 G3 a2 t7 n
val = *addr;
$ l' j4 ]. `$ A6 K# z$ m$ s) ]
*addr = save[--i];
0 m$ b! Y/ A0 X+ W g" \
if (val != ~cnt) {
+ S) c2 _% I/ n% ~5 o9 _8 x
size = cnt * sizeof (long);
7 T7 }1 {$ t; R1 x6 V4 B5 T
/* Restore the original data before leaving the function.
# k& A q9 c# ?; q a; u
*/
- N# r' b+ h4 K
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' U& m; X& m( W
addr = base + cnt;
+ p1 t% h5 e ^9 ? o
*addr = save[--i];
6 ^; y2 {$ `% p* U/ J$ r5 H; g* Y- E
}
9 i2 G {, r* @0 |4 M5 a, A
return (size);
, G* l5 g7 R. P& f3 m
}
, s; M' D* U$ D7 Z1 W. S) e
}
, \1 y1 g. v1 k r2 M- z
, X G+ r `% e/ h+ u, `* o
return (maxsize);
6 x/ Y+ _' X; L* Z0 ^" ~
}
1 o, r: w E- F: m4 [$ O
int dram_init(void)
2 L5 J8 U6 I' W( w
{
( H) C9 \9 r" @
/* dram_init must store complete ramsize in gd->ram_size */
( p; L- P$ K# a; G* b" O
gd->ram_size = get_ram_size(
7 f p( I1 ?7 \8 G
(void *)CONFIG_SYS_SDRAM_BASE,
: s% t+ C4 L" w1 W" r r! u7 F
CONFIG_MAX_RAM_BANK_SIZE);
0 R$ q# P/ k% r/ C
return 0;
% Z' N" }2 D8 E: z! F1 N5 u( }
}
. V) T% t6 O: V9 r1 ]9 A
& }0 K/ ]6 F! Q( t0 t
U) k5 }+ S$ P( d" J- P
5 {) D# M- E/ [2 m6 i
8 J, d& S) {+ a; X+ O" j
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# E" z. F, q6 U! l7 k
( [( _. x+ m, N8 L1 w# h0 Q& w8 A
$ _1 Y0 h: e6 r- A$ O$ Z q
! h% K5 b& ~" k7 B' B
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4