嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
+ u- X$ Q" Q' `* k5 q$ {. l" y7 x
核心板2:DDR2 256M Byte NAND FLASH 8G bit
% ~9 M4 R4 m, c- I4 Y0 I- Q8 O6 \
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
u: V& P1 l! n' ^# u& C6 m, e
; T h) k# O9 K& @2 K- z" c: P
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 U$ V/ _1 C9 l
" R) h V; L$ j7 R0 q
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* W1 O& U8 v, b: L
/*
6 B/ J2 G' n* A
* Check memory range for valid RAM. A simple memory test determines
: I3 @9 b, F* X5 b( G9 X( R, p9 @
* the actually available RAM size between addresses `base' and
3 X' x+ q1 B' i! d2 }* @
* `base + maxsize'.
, z: W, D5 M" g4 v
*/
6 a/ P& A1 r3 j3 B [1 S2 H4 z
long get_ram_size(long *base, long maxsize)
* ?. g; \3 |) `& w
{
1 ] N" L4 C; y& H' B# M& }
volatile long *addr;
5 v3 y8 l/ B: D" S+ F
long save[32];
, I% v4 l. Y3 ~, R9 `8 R' Y
long cnt;
6 D, r2 z S( l5 u, G
long val;
! b* F0 y2 h0 [7 c: N1 n& H# K
long size;
: [6 G- ]9 ^2 `9 c$ w
int i = 0;
4 E* u, R! p* {* e
. y3 _" Z0 z0 d, m/ k3 d
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 j+ v8 _' h8 S, j& j' e
addr = base + cnt; /* pointer arith! */
$ E! Q, q J" m) D# x- ~( p
sync ();
7 ~9 G4 _7 c$ A7 V( p: w
save[i++] = *addr;
: t- f/ b5 L- _% v0 I9 o2 o
sync ();
0 j, d& V$ d: n" p* S: l4 t8 U
*addr = ~cnt;
0 ?9 z: R3 c& G5 d s( o- f" X6 F
}
( g9 }0 R8 e9 x# H
9 R, v5 o% E3 ~; C4 c
addr = base;
/ A( v7 g3 V& J* I
sync ();
* d2 H9 r/ u+ ~4 i5 `) F, `
save
= *addr;
- d% ]9 Q1 @, v- V. ?8 U8 f
sync ();
3 t) N2 t$ S* v1 b8 Z. _) w( A2 Q/ F/ D C
*addr = 0;
! Y4 D& ?3 \% g$ J
; P3 I8 q8 Z7 R. |; e9 G& X5 Z3 z
sync ();
9 [4 K+ z k' R6 d2 Y
if ((val = *addr) != 0) {
8 K4 _- Z( t' c* d
/* Restore the original data before leaving the function.
6 t7 b: f6 T- L; R9 l/ L
*/
6 v% q; B% U* g Z. |/ L& N+ T( c
sync ();
7 }0 j+ P5 ~+ R& u& S5 Y
*addr = save
;
( B$ R( V5 a+ G! Z$ c2 g
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 ?6 @: n" U, ?* |& s$ {4 J; o9 i( o
addr = base + cnt;
) o1 x, S2 l, X) [* A, V! e% o
sync ();
# ~% X& o# S& Q7 `+ b8 a
*addr = save[--i];
. S7 P& b; v' G4 f# V+ }# A
}
* H- e* G& @, p7 T, m; U0 P
return (0);
, f4 u, A) i. ^+ \3 g7 u. o
}
3 A5 b5 n( B$ |# B" ^' ]
+ j' D. R/ i5 F; K1 h+ W
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" y9 Z6 k; C. w' p3 b2 Y$ l6 h1 J4 \3 y
addr = base + cnt; /* pointer arith! */
4 [. @/ c9 x) Q! V; y. J* K
val = *addr;
7 ? x9 U2 w9 n' E+ e0 U
*addr = save[--i];
8 `# O I' Z1 R6 I% Q8 m
if (val != ~cnt) {
' ~; M' l5 F9 f. Y8 _! z& ^
size = cnt * sizeof (long);
/ S- U" d8 m d- E9 J6 @& K
/* Restore the original data before leaving the function.
6 T R% i; F2 I0 b7 F& P _
*/
6 {4 _9 G1 ]6 g+ Z* O: v' M
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" Z+ c# G( }' s" H- f" u- s
addr = base + cnt;
# Y b2 ~# S0 I Y% p
*addr = save[--i];
# [3 J7 u1 E: I- c4 O9 h9 m- s
}
9 q* D' c8 ~) o: b/ e- u. O: ^7 z
return (size);
4 E2 v( ]% [! r
}
" M7 T2 P: z6 [& h
}
, n: u5 m0 g4 @- g$ o7 _
' R, N( X* j4 L: z3 C
return (maxsize);
! I; T3 P6 i4 ^2 O+ X# z- j
}
/ h: e4 r5 m2 R+ M4 N
int dram_init(void)
8 d5 x, g' A7 s' [
{
F* G9 ~% v; m$ u" J
/* dram_init must store complete ramsize in gd->ram_size */
( y5 E4 H0 K# z( E% @! I
gd->ram_size = get_ram_size(
7 U: c4 @4 `" b9 N5 X; Y/ ~; N
(void *)CONFIG_SYS_SDRAM_BASE,
& G6 P2 Q5 `4 \5 `) M) M
CONFIG_MAX_RAM_BANK_SIZE);
7 ]; f1 j, J1 a9 |' M
return 0;
; V' \( Q8 w6 G ?4 R A* z
}
2 s: {" l0 i, l" ~2 G/ r& m
g! U. W9 t4 I8 O6 u
$ M o; s3 m* r: N0 Y
. H6 [4 ~0 m7 O! n
9 ^. s" }7 c- B. t, h3 B
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( p8 j/ ?: K8 ^8 b* Y0 g
, L: T" r" l% O6 c$ p
0 d3 v% A; G y z& }
, t) Z9 Q- y% a! l+ ]) E
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4