嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
7 F; L4 K+ N$ v1 t
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 @. w3 q5 y. j) ?8 h" X$ [( Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, ?9 j0 v: g- J$ B1 j; {
/ \/ W3 M% l' p
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- J* B5 m8 ]/ K b+ h/ U4 M0 a# k
# N, e( j; }* i+ {& L
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: P# t8 X; g( W9 \% @
/*
9 w3 g" \# ` ^& B6 P
* Check memory range for valid RAM. A simple memory test determines
7 {4 a3 D O7 j' I" W( n
* the actually available RAM size between addresses `base' and
" m1 P8 a/ }6 S6 b
* `base + maxsize'.
: G) t) o' c5 s9 _
*/
. E' T8 [& p8 E" ?' W
long get_ram_size(long *base, long maxsize)
* d U; @; J1 b0 f) r8 X
{
3 z6 J4 |2 Y _: m+ z9 X4 O
volatile long *addr;
8 v; u/ H7 L& F1 e
long save[32];
# d6 l' F( s6 ]4 k* L! k, v: `
long cnt;
. s6 v; l2 R* ]
long val;
4 F0 _4 L& X3 ^$ ?: o; m) U
long size;
' W0 G( I5 B- Y9 g. A( Q Q0 c
int i = 0;
8 C1 u0 I" J: ^$ a Q1 ?
0 x b% ?! F, W- _, \
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" m* m; Q; v, f) N/ e( v
addr = base + cnt; /* pointer arith! */
9 @! C/ t4 d2 e
sync ();
4 V; q8 }4 g* ~4 {, U. |8 M" g
save[i++] = *addr;
$ _; o0 |6 Q d& g( t" J" q4 ~" l- s
sync ();
/ o$ m5 B) ?& }; S0 _
*addr = ~cnt;
' |& z; S$ Q% D& f& u8 F# @2 N4 ^
}
. X% F: B7 ]2 g- ~; V: d- {7 j
' i; G r! x5 [3 e. }
addr = base;
; M1 H: |) E" @ |7 G3 v9 _! H
sync ();
" f6 S X9 _ O# g9 c
save
= *addr;
: @9 S: K9 u; _# R. Z4 h( z
sync ();
+ n( b% H. T7 g6 T
*addr = 0;
" \- |" i! F. i: \; Q/ D# y; O
! l2 b9 s/ a# v) _. U
sync ();
) C4 i& ^$ B# w4 Q
if ((val = *addr) != 0) {
" t v) W6 b8 F+ n
/* Restore the original data before leaving the function.
/ i% ]* c8 e$ G5 H2 i
*/
- ]( q2 o: w0 }5 k! Z6 v
sync ();
3 {6 Z0 H& M2 R. E4 }
*addr = save
;
% |( C" F% y5 \; I1 h
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& m8 [! g7 m. c2 p, ^
addr = base + cnt;
0 d! q' V5 c" u/ l, [ n" `
sync ();
) k, d, h2 J! I" i6 i0 J3 `* C
*addr = save[--i];
) h3 h0 ` u6 P5 O
}
4 |- `+ V+ S m3 M
return (0);
0 p1 }- t! ^$ s; {
}
1 l. X! j7 H( W ^: R9 i
) g8 I; @9 \! h' U# a3 M- j/ ?* a
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& ^( _/ {' a2 h/ ^0 F. c
addr = base + cnt; /* pointer arith! */
6 D) M7 d0 t' k9 Q
val = *addr;
: I' L! y7 p9 c+ d$ N. Q
*addr = save[--i];
6 }' H D. P% m" U" a6 g7 x1 m+ r3 U
if (val != ~cnt) {
6 A: [4 ]' f+ n! y& x8 e
size = cnt * sizeof (long);
! P8 z) m* S9 u, d% W
/* Restore the original data before leaving the function.
4 V1 f% @- }' g) K, V! `1 C$ C
*/
2 K. ^$ _, w2 H
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ [+ C# `! i h6 M j
addr = base + cnt;
; z3 P7 y; g2 z: y, q
*addr = save[--i];
0 j6 W* o- p& D: v
}
' t* Z% o G3 L) w# m+ {. u) l' m
return (size);
# y6 x- D2 R o
}
" g. ~; Y1 E! D2 F! U: d2 @
}
3 n$ z( w" c- S
2 _/ G2 _# y! u9 M
return (maxsize);
. o2 H5 z7 J1 r4 L5 O/ K
}
0 C0 ~. J2 F! p; J1 I
int dram_init(void)
) j$ h, z7 _) C! {- N& o% i
{
- ^7 F: D0 K5 l2 C! p/ A+ c* O5 M4 l
/* dram_init must store complete ramsize in gd->ram_size */
. I' |% K v4 o+ R* _! J Y
gd->ram_size = get_ram_size(
$ Q+ w5 S2 P5 @. p
(void *)CONFIG_SYS_SDRAM_BASE,
& i" b$ B3 ?/ {( B* ~; j8 Q
CONFIG_MAX_RAM_BANK_SIZE);
/ u" a y6 v* T3 q8 ]$ ^- q/ Y
return 0;
) ]3 O* t- X& F5 j: _5 b v: s& z
}
8 ]1 Q o! i7 Q& a( t2 J
8 D7 {3 J( _( h0 e3 Q; W L
% q, N* S) g; D3 V( I& m( C) k
* T# C, r0 d3 T' G& [( P
; z, s$ x0 ]5 ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 T# {/ C/ |# W% a, ~% K w& ~$ E9 W8 z
, ?8 U& t* L3 H/ ?8 O
7 W! {2 S, }, n7 N3 Y6 G' h( _
" P) `6 B- O* E. z8 B/ `: F
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4