嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
& j8 J" a6 R7 I0 K
核心板2:DDR2 256M Byte NAND FLASH 8G bit
8 @9 K- T4 f) x) H% Z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- M/ t$ e+ n8 r N2 i
) u" N' ~+ a6 b$ l4 V# B" w
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; F! F# }( Y) }: ?8 S
; e: C3 L3 Z, U: F) m/ z7 P4 q; A, c
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: O5 u0 O" u' d3 b; _+ K( l+ w
/*
0 u5 j3 ]5 [& }# V$ g2 q! V' h& @ {! e5 a
* Check memory range for valid RAM. A simple memory test determines
1 q% y& e' k3 k" Z
* the actually available RAM size between addresses `base' and
8 M L! {, G7 `! c) Y2 N* N u! }
* `base + maxsize'.
& H6 m! Q N# D) ~. B4 E
*/
& E& z8 V4 D7 G4 W/ L# O' e; Q" v2 Y3 }
long get_ram_size(long *base, long maxsize)
, V! q5 i5 j9 A- s6 g2 b
{
8 X, g5 T% Q6 w9 v# w
volatile long *addr;
0 x. ]& n" H z7 O, f
long save[32];
" {- c$ l! y1 u: W
long cnt;
4 B0 e; ]1 {! W) x5 ]! K* p, g6 `
long val;
" |; |5 t! E) }2 @8 V* g
long size;
/ }; u5 E* N& W' A( c
int i = 0;
9 V: m9 Y5 B7 F0 t$ `8 M
# Z0 y' i; a/ X- k' Y, Q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- p; ?5 M1 ]3 [8 }: d# z3 L6 T
addr = base + cnt; /* pointer arith! */
, P/ B0 q8 h5 M+ |7 w: L: b3 l
sync ();
7 T: l8 _" r- C7 r/ |
save[i++] = *addr;
, Z7 L3 D; A4 e6 S% Z* x
sync ();
5 D* V1 V3 g6 b, l
*addr = ~cnt;
" ~/ t" x" ?. m; q
}
0 ^4 w6 C; o# W) Q
# q" V; o5 k' b; a6 c
addr = base;
4 a6 i; h+ C: m D2 `
sync ();
7 }- {$ e0 V/ @: m0 t
save
= *addr;
9 E4 G3 `: u# N% o
sync ();
a! H0 D: a3 y$ m0 m/ V9 I) ^
*addr = 0;
# E6 ?- s C8 w( X" |5 w- {7 @3 d
9 c% m; d% R3 r% a/ b
sync ();
0 ~: ^* p+ R! o$ }# ]
if ((val = *addr) != 0) {
7 b8 Y- ~& r' @: L& _- Y
/* Restore the original data before leaving the function.
% t2 ` R; k7 r B
*/
" v) |5 ^5 t& I) G- w* V% k
sync ();
' n$ F# A' G, v7 Y, x
*addr = save
;
5 l1 r- ] k* c1 c
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% X R1 Z# ^3 ^, O7 Z* S; F
addr = base + cnt;
1 ?9 {2 L5 O' A1 {8 t6 X
sync ();
7 J. r6 G# f+ j5 H+ M+ X0 _! N
*addr = save[--i];
! j1 k5 `- i7 m
}
3 @' C) {/ }, X
return (0);
/ R" ?) D# s+ A6 L1 {
}
8 f% [$ l5 o% I; a3 ?6 p) Q7 a) I
, a. |) i# l4 a. o8 s4 H
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 c9 U- i; t, F8 r3 d6 o5 d
addr = base + cnt; /* pointer arith! */
) |/ }7 x' N! \4 B
val = *addr;
, {' ?3 N: v. L0 G7 Y) @
*addr = save[--i];
2 J( f5 p) K+ [
if (val != ~cnt) {
, o3 Z) H4 F# o$ y
size = cnt * sizeof (long);
/ {' ^' S/ |; B
/* Restore the original data before leaving the function.
6 K% U5 h% c# f: R6 ?1 F6 ?- O m6 ~
*/
+ |# H4 r" u/ W& ~8 P
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* W9 u& C2 v6 ^1 a" J" f
addr = base + cnt;
2 W0 q4 j: E, j4 ^" W
*addr = save[--i];
3 t9 s$ z' X( h( c8 M
}
/ h5 [1 n0 [9 P4 Q2 o
return (size);
t% b4 _4 `8 R+ y
}
5 T; E' g# @) _ `4 ~+ z
}
/ S6 Y+ S% o& ?6 X6 u! E
3 b5 E: u& X; P3 H7 A8 n5 k
return (maxsize);
- y& w2 E5 S# A8 s& R. F) M
}
( k6 H* R6 }3 a& z# s3 P; O& B. v
int dram_init(void)
$ P* R, e e! N2 f/ U
{
7 i7 b3 |$ ]/ H% j8 ]' Z
/* dram_init must store complete ramsize in gd->ram_size */
# ?. t! ~' N) @ w0 F9 u
gd->ram_size = get_ram_size(
T9 s7 I8 q! l7 z
(void *)CONFIG_SYS_SDRAM_BASE,
# F. Z" u; |4 ]+ }$ Y4 e2 v1 ^% I; i! w
CONFIG_MAX_RAM_BANK_SIZE);
: \& w8 b; H1 M9 q8 Y5 n
return 0;
6 P3 K( Q! _* ]; ~, ^
}
9 V1 ~: N9 O* a& }0 b; k2 g/ A
# I6 h7 q4 r& K
4 i0 `9 E! T s% j" x. V
, C7 E& Z& w3 G
2 |/ I' D' a2 ^# g* Y8 D
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* H' i+ k; `) Z5 Z8 }0 e; _* \
0 V4 s8 x6 w. C7 b1 z5 P
- m7 ~4 K1 @1 {* v
9 M1 h. _1 Z% d1 V, {5 `/ y
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4