嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* O v$ \; }7 n" r0 c, v4 D& @; x
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 K) N% W! }' G/ N. F, r8 _
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 C2 W y* g+ V. k/ q& k! L- n
! k3 z% u2 X$ e, B/ x
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; x# i! X6 z- N# {7 y
2 E& @4 |, z+ b- h, R9 V$ g; ~
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 m* `( L: ~& w) Q8 F# a' H8 @* w3 F
/*
/ E% L7 P; P0 E% I
* Check memory range for valid RAM. A simple memory test determines
, d3 ^" K% W6 `2 U: i1 T& I
* the actually available RAM size between addresses `base' and
/ u/ [5 \- W, O0 n- t K* ^
* `base + maxsize'.
# Q/ I$ [5 w! e/ E) @; u
*/
; j z; S* r" G. a% h
long get_ram_size(long *base, long maxsize)
# ^ W; K X1 V0 [- K! v- B
{
! i) m- D) {, T: o( _- w! O) a' Q
volatile long *addr;
0 n" H! B" z! i5 L1 }
long save[32];
( p/ |5 I9 l8 S4 ]+ q' w
long cnt;
5 V% u/ ]' E8 [. z! ^$ @7 i, l' z+ K
long val;
3 Y* C: n6 l2 q
long size;
+ K" O' J G. j. y
int i = 0;
1 e0 Y+ o+ i: p3 |% ~5 z
: Y9 ~; R3 l2 g. C
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! C+ [9 c9 w' a) J. ^* S
addr = base + cnt; /* pointer arith! */
7 X1 p1 K u& I w
sync ();
- J6 G) F# w; ?% U- N( ~( h# K
save[i++] = *addr;
. r1 Z2 T) s7 [ x! J" K
sync ();
. G2 E: ^8 ^% G
*addr = ~cnt;
6 X! \4 h; b" L0 p" @9 j
}
" L4 q; B$ O1 c; I) W1 ]
# a% g0 ~ g( }9 O0 [- H4 U
addr = base;
, i2 X0 A3 t/ |! G4 \: M6 G
sync ();
* ]. ] W; M7 B a3 h/ L
save
= *addr;
; m% K9 a1 P8 [+ y# N- a+ l4 D
sync ();
' U1 h* Y+ o9 p, f e0 ^& I
*addr = 0;
1 j0 U+ Q- Q' S4 `
2 I" I! D8 q$ ~3 v+ a7 s4 s* W7 z* ~
sync ();
2 p- \$ X7 {- N7 g- Z
if ((val = *addr) != 0) {
+ u4 u( f$ ?6 L% s9 j* Z1 y# `* s! P
/* Restore the original data before leaving the function.
1 G( [# W, d4 d; a/ ]
*/
8 M; e, N7 Y M2 {5 T1 T
sync ();
7 y- g( T/ x, `) q4 s, _3 Q# n
*addr = save
;
# H. C: w9 U, m" F* O/ ?4 G' v
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" n9 p/ t% D# K! e' u
addr = base + cnt;
6 h: z9 H! h- G9 J. }, |; q3 A
sync ();
, p' j$ u- M7 ^. D W) Q
*addr = save[--i];
9 q3 G+ v: U( A. f5 L& Z
}
" Y$ m+ ]: a a h" `& T- j9 ^$ M
return (0);
: ]9 `, C) d ^/ H! Z+ ~4 |) Z
}
( V+ U0 V6 ^; W& ]+ ?3 S8 F
8 y; V# B+ F7 n: ^. y
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 W6 L# R' I* y) ?, e& ^
addr = base + cnt; /* pointer arith! */
; Y3 h6 u# [5 N
val = *addr;
8 g; | w7 T7 n8 t6 g- q0 w8 ?2 k
*addr = save[--i];
: v( o, `! X9 \2 O: b6 o4 A# Z4 A
if (val != ~cnt) {
2 A- j! m% A: T! u! \' C+ Y4 r
size = cnt * sizeof (long);
7 g# W- G3 ` s
/* Restore the original data before leaving the function.
- k" G, r' T g. e
*/
$ j' f% Z) P! b& T, [
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; Y/ L% [& Q3 g( c/ b" t: G
addr = base + cnt;
5 ]. d0 ?' c$ ]0 O4 [
*addr = save[--i];
3 g* l% V( Q$ Y# e( G& f0 F
}
* M( _; I$ C# _; S$ g+ r) r* }
return (size);
" B# I6 H" W3 Z2 x* k
}
5 Q* o6 e9 S# o. a! @; z# }) r8 u
}
1 w1 c: I8 p$ Y# L: w1 ~( e
0 ^8 {3 K1 k1 X. _& Q C* c ?* E
return (maxsize);
, o4 N% n9 K1 Q+ S2 E# }4 G
}
9 H" b0 _( g. X
int dram_init(void)
, x, c1 O8 G9 _ F
{
# W2 ]% l# F$ X& r# c9 n) x( S- n
/* dram_init must store complete ramsize in gd->ram_size */
. ]/ k5 C/ K8 c) W/ p* v; M
gd->ram_size = get_ram_size(
( n: [# d5 _4 Z& E$ Z
(void *)CONFIG_SYS_SDRAM_BASE,
* i$ Z' k% b: U9 u
CONFIG_MAX_RAM_BANK_SIZE);
w4 t( n7 ?4 g1 L# G4 w
return 0;
/ o& B) C) f- M+ ~8 j
}
, d! h3 Z4 n ^; v
) K9 y. G2 P1 x) e/ P7 ~
8 J( K5 X$ Q( E, l
3 e6 ]3 o* j5 \. p$ `
9 N( M( w' b7 Y* d o( B
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 o0 v2 @" u2 N
0 m4 o1 `' S3 v) a$ L7 M: J
( g h* _3 \% z& N6 B
, x |; J- }: W. R3 R5 u& Y0 g$ \
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4