嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
$ m7 }3 P- a/ s6 i2 E
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, N9 p; q% C4 t% v
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% q( Z8 a3 G6 C: c# H' a! {
! l' |" j' o& J+ x- p1 {$ X! C
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" W, B# q6 u1 E7 W8 q E
. l0 @/ v' Z, q, M
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ X3 W4 t0 J' _
/*
* ?/ f6 n* n7 z" p/ s# }. S
* Check memory range for valid RAM. A simple memory test determines
# C+ E% U2 q, e( t- n8 F8 K
* the actually available RAM size between addresses `base' and
/ {' N$ z+ ~; M! p' _' s
* `base + maxsize'.
$ ]1 [$ Y6 d$ L. G, S' C" U' z9 X
*/
' @6 p! |: J( C9 A3 g
long get_ram_size(long *base, long maxsize)
4 {9 x# D# S! G
{
# y7 t1 v6 X5 ?5 M4 S4 f8 |
volatile long *addr;
3 |/ I; ~# j6 ^4 N+ W# j9 O9 X( S
long save[32];
) m [3 n; P) _$ l; p1 m
long cnt;
0 {% @3 m8 \, Y5 W5 L1 ^
long val;
* o$ @9 ?; ]3 k5 f, y1 s5 V" J. W
long size;
1 v7 I7 {; R3 @0 h
int i = 0;
1 f: p/ n- Z. n: c0 k7 N5 O
& G& s$ Q3 @3 |. y5 B
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 ~- t: c* \" z2 c1 Q+ N0 R2 Y5 t1 A
addr = base + cnt; /* pointer arith! */
% w; F f, o6 W/ C) v L( n
sync ();
( m# [( E* }' {1 }" v
save[i++] = *addr;
( ^- e! M, S" H: q6 F% [( r
sync ();
d8 `8 o& C! f+ b7 E( j
*addr = ~cnt;
( l; u4 |0 [, f1 m: h2 R- s
}
% H$ W! k# S0 p4 Z% T
. r# ~0 j$ M$ z6 {3 T7 {
addr = base;
" n$ R; h8 b8 O9 q& n4 u! u0 Q N
sync ();
5 ^9 r# _) w! T6 S' l; Z2 `
save
= *addr;
3 Q% b0 b9 h7 S0 J. d+ B5 }
sync ();
% O1 {9 e6 p0 d
*addr = 0;
- k9 A; t" Q$ R( p
2 w) x$ d1 e0 d8 i2 W( G" {3 r
sync ();
" h" A' g( L% J0 @$ J
if ((val = *addr) != 0) {
2 \( x# g1 z- i& l, @
/* Restore the original data before leaving the function.
& N0 k: J' l a) T* u+ V" L x9 L
*/
1 T+ k6 \5 M! v# h2 }" o
sync ();
2 A; J1 S3 p C. X, _5 k5 P
*addr = save
;
2 I/ j1 A" K/ l8 P7 p. `
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: W9 B6 ^ Q- _
addr = base + cnt;
% i: B2 B3 `# F5 N
sync ();
8 B7 q2 ]2 W: I
*addr = save[--i];
) _3 m1 @( M4 A/ P: M1 T
}
- J' \( T& V x1 v' X% g$ |$ c
return (0);
% z* _9 l5 h7 j
}
: E' V4 Z* _; S$ w$ }" H
3 l N/ G: b0 |! L. o! D* z# `$ |
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, J( p/ {8 W. Q3 x0 T
addr = base + cnt; /* pointer arith! */
. L; m [; e9 M- ~/ H
val = *addr;
& l4 v& q4 z+ K
*addr = save[--i];
% p% j: q$ z5 V
if (val != ~cnt) {
" o* C! t( M+ O. O9 l
size = cnt * sizeof (long);
, D) R9 Y$ k, E- }
/* Restore the original data before leaving the function.
9 S& `9 e9 f6 `( e! @; H
*/
5 @7 R6 Z4 Y/ }# |
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. }; m. Z# d7 h; g- i8 Y
addr = base + cnt;
9 s# B$ A% U& l' r+ d
*addr = save[--i];
$ s" _) c, X4 ]& P4 O# \. L2 e
}
! Y7 u) f0 j3 T" h8 e; G$ a) E
return (size);
9 F0 j, C: o0 H; H& Q ~' y. \. x3 V
}
% H2 ] ? j0 E8 k% r
}
6 o7 v9 F) F; }! T/ H r7 i
4 \1 f: z5 C* R9 H; X% q+ Y
return (maxsize);
1 \# E" {( z* @
}
1 J! n8 { z- p% D
int dram_init(void)
) ?, D: A3 p6 t! `! p6 v0 t6 p
{
}2 q. K0 ~2 o. `* k
/* dram_init must store complete ramsize in gd->ram_size */
z0 H- k' O' D0 k
gd->ram_size = get_ram_size(
( o* A" W. ]" |1 d
(void *)CONFIG_SYS_SDRAM_BASE,
1 S; P/ p& _9 _, ~
CONFIG_MAX_RAM_BANK_SIZE);
" Z' M% v% Y6 `
return 0;
Z) l; ~2 A3 {# U1 y3 ~
}
3 T" B1 K# ^) ?
9 E* A) ^+ m, _ Z$ n
6 z* D: @& t" C( T, f/ z
/ b9 [% t9 x( M& ^8 ]) l
: R2 I$ m4 f, H/ A; H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# I) p0 b+ m- t {
# I/ G5 [0 B6 T& ~) x
$ m1 Y' x# h& }/ B
# a/ P4 Y' h" T }: l: {; Z6 ~
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4