嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
$ ~! l0 V4 P& Q) k7 L6 A" t7 J
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. s' X3 h, ?5 e0 U |1 y3 w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 i, `. `: o2 H& L% D* [
$ B" i" d9 O0 s% r
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& g* e( a/ ^! _' m) Q
0 k7 G$ h- ~. |# E" [* T) n
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; R6 ~% Y* b: `) `# Y
/*
$ t: f: B P b6 ^) w7 _+ Q$ r
* Check memory range for valid RAM. A simple memory test determines
- A: X, \+ h6 r! p7 W- b" `; n* X( p
* the actually available RAM size between addresses `base' and
/ a0 q5 R) w( _& d% |4 k
* `base + maxsize'.
/ d# K7 u J Y6 T8 _3 {3 K& H
*/
% o4 A- U2 s+ [
long get_ram_size(long *base, long maxsize)
! I7 c/ ?- s) O* m4 _7 V% e. w
{
) x3 {* y! ?0 T
volatile long *addr;
: F% B2 |( s: @ p
long save[32];
0 n; ^1 u$ T. W: P$ n5 r
long cnt;
5 b. U! L' c0 F3 {, i
long val;
2 m+ Q/ E3 v) h+ I( `5 L7 H7 \
long size;
, e- J3 I; l" i1 f$ B* R. w0 b
int i = 0;
5 x* y2 u& W; J+ B2 K
1 ]0 E$ V5 O: s0 w0 P
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* ?# t9 r: {/ R5 n0 t4 C5 u
addr = base + cnt; /* pointer arith! */
1 W) I1 a6 C4 A) \4 k# ]
sync ();
5 C" R$ _4 _! u7 n% _
save[i++] = *addr;
1 A2 y: A) G4 Z3 j
sync ();
1 Z0 |$ d; T" Z( W5 L
*addr = ~cnt;
) k" e/ q8 \7 S! H% s
}
_+ ?' Q, O* T3 `
. {- \$ _. w v/ v5 H0 q/ w
addr = base;
* {" e+ }% q: F- {2 B7 \( [
sync ();
4 ^7 I4 [/ x' y, o9 Q3 l; p
save
= *addr;
1 i# q3 x+ l+ y( x2 }- ]
sync ();
8 v- ]. Q- `9 }: |. K/ x
*addr = 0;
/ h/ S% |/ Y0 D$ A$ O9 d2 J- s
1 |) \' p" }1 r3 H
sync ();
/ B8 o! o" y& p+ N6 v) J
if ((val = *addr) != 0) {
- w) V) F3 G6 A8 W# s0 m# a
/* Restore the original data before leaving the function.
* G _! v% h' \6 s" B$ t
*/
4 Q( g$ }1 O! J3 E* v2 |, b& T& l
sync ();
! R/ U" _4 D, w- _0 t. [: o
*addr = save
;
0 L3 x0 C& P3 F5 R( ^. t
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. y0 `5 J& |$ D; `9 s
addr = base + cnt;
& h8 z8 P8 ]) }3 z, U3 |
sync ();
$ c% f0 L* ~4 I) }7 P/ H" t
*addr = save[--i];
& q% j1 L' }* W$ D
}
7 \/ K& K# B" K/ n1 w' o) L5 k
return (0);
4 }. j# d) G. ~+ J" x6 x8 t8 T
}
' h7 O* t8 e" {: \( H1 e
" v; {, C0 y7 u. I9 }6 [
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 r# ^ M" w( w! y
addr = base + cnt; /* pointer arith! */
: z, P1 Z) b& m j+ P1 u$ E
val = *addr;
" u' x+ \+ ?# [
*addr = save[--i];
$ W$ X) X: X) X! E) X* N6 W z0 m4 s
if (val != ~cnt) {
" x8 x3 I5 B4 s) _* ~1 s' Q/ |
size = cnt * sizeof (long);
+ m" ]9 l3 W1 A
/* Restore the original data before leaving the function.
0 b, [5 ?0 |0 H- `& L6 ?, T, x/ z
*/
' F5 N; D+ N1 {4 y2 U( }8 `
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, m2 u7 s. p& }' _6 T! E; L; h
addr = base + cnt;
5 A/ D8 E. v7 w. _4 P9 S
*addr = save[--i];
* v0 B1 d: j ?) n' G
}
2 f+ X) \; {/ x- F8 p* J
return (size);
9 S3 G% v2 y$ q
}
5 B$ V9 e' h3 Y
}
$ Y8 S9 j' {9 Z( K1 a
5 u6 ]7 u9 L5 e& \$ `. N7 K7 w
return (maxsize);
& c; X9 A+ v; c; e% }( p
}
9 Y" W# f7 C% P
int dram_init(void)
. C+ k! o6 Y4 y+ E" b
{
0 b; s! @8 {3 y
/* dram_init must store complete ramsize in gd->ram_size */
( z& |9 ]$ F' [1 b3 }
gd->ram_size = get_ram_size(
6 {; y: k) w; ]
(void *)CONFIG_SYS_SDRAM_BASE,
' m5 o# b& P( K! G; e6 R
CONFIG_MAX_RAM_BANK_SIZE);
; g8 g: ^5 i- d# y8 ?3 d8 c6 ?
return 0;
5 j$ V, S* A2 v# _* E
}
( [- a" ^& X8 z/ U- E) _
, y8 ~6 b" S% ]9 U; I, V$ E( \
0 Q5 z+ K5 G' M* r
2 C# y( J& x$ d2 V ^ c$ L s
# ?9 g' [1 _* C) v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* s) u6 ~9 `0 c j# ]% c
+ p" s8 ^8 p; z. Z& h/ ?( m
( n) x. p" A; |1 X" w
5 n6 H; p4 w; X% b9 |! g% s
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4