嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
4 m* I: k( T0 M; R! N7 p" \# T
核心板2:DDR2 256M Byte NAND FLASH 8G bit
6 r# s1 F2 v# z% m
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
p- ~( f# M& j- @. ?
' t* L* d0 U0 I" A+ P) H8 W
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: F9 i) x! J( o$ c0 z
, b7 P. G& v0 }1 k8 [) q
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& B% Q! O! i; w9 F7 D
/*
9 M" t! Z6 a8 _! {- W$ J& b
* Check memory range for valid RAM. A simple memory test determines
$ q# t4 H3 d% P4 D, L8 O5 f
* the actually available RAM size between addresses `base' and
8 K+ q0 n/ J. n5 N. s) Y7 \
* `base + maxsize'.
2 q9 M9 V! p) V0 s+ U
*/
3 Z! n; b" A1 x: u1 p
long get_ram_size(long *base, long maxsize)
7 j* z+ G6 T0 X( ~* G$ I% P
{
6 I# x# B7 |* U; h/ k0 E, y
volatile long *addr;
4 N6 O( E2 G/ g
long save[32];
1 u8 a( a5 G, A) l% x; e! G
long cnt;
- E7 Z. p7 e- i" l
long val;
2 W1 q- E8 P' J: b- T
long size;
4 y6 I+ o3 Y$ [. q- `+ ^' s
int i = 0;
% N1 d8 ]0 [6 K. t8 t
' W; T& U5 K* M0 Q6 ]
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ h, `) C+ ^0 h% m9 z+ n" H. {7 c! U
addr = base + cnt; /* pointer arith! */
9 S! n. m, m) \
sync ();
; V+ o! x6 g. i: i9 e
save[i++] = *addr;
% l9 n, c. O0 f+ Y# Y! r
sync ();
3 @9 a; ]+ p+ G* j e5 j. n
*addr = ~cnt;
2 R! s; k9 V9 W9 E
}
, t5 P" `4 U5 z# s. O" o
% p) k, H/ I- C) a
addr = base;
" U+ C1 t8 q8 N% w9 s
sync ();
' k6 H% D, B0 i3 M$ Y$ Q, `
save
= *addr;
1 j4 z2 V J P3 T5 ~$ G
sync ();
5 E' X( c( I1 d' N
*addr = 0;
& k6 T3 j& ]# C0 y; ?6 ]
" q/ q8 o2 V! A, X) j
sync ();
3 }9 P, h: V( Q' }4 f+ @9 g! K/ U
if ((val = *addr) != 0) {
3 z, a4 |3 Z5 [, o; \/ s
/* Restore the original data before leaving the function.
( [( `( z( R5 Y, a+ x O% x
*/
. [. l* n4 \4 d* @
sync ();
% C9 \& H" o, E+ v0 I6 Q
*addr = save
;
* n: h1 W I6 s- p D( j6 z
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 ^# @2 ?( f9 r: g- o. ^5 c
addr = base + cnt;
* e4 k$ F1 `" |) P9 t- t- f w
sync ();
0 l1 m+ S5 P" U) \/ x3 P J
*addr = save[--i];
# u" P/ [0 v! {5 u( R5 l
}
2 f2 m; p1 q. A+ {% J
return (0);
! u3 t' f( I s4 [2 k. G
}
9 w4 \ j3 R' H3 Z. }8 j. ^
6 \3 k9 L3 U2 Z% E7 d/ T
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! m! Y; h( B1 H( F& E# e
addr = base + cnt; /* pointer arith! */
8 _- u7 {/ ~" ]. r! k% B
val = *addr;
( h4 h# e) D# I1 _% s, @+ ^- Z, N
*addr = save[--i];
" X* b9 J4 G9 Q4 p" c5 O& D( m8 c
if (val != ~cnt) {
4 ?0 Z% |) N, ~* f6 \- x
size = cnt * sizeof (long);
( n2 ]" z1 ~! d$ \# A/ s K2 L
/* Restore the original data before leaving the function.
4 |: R2 m' \, b% B8 R
*/
% @+ T" {, x6 A1 E/ M+ w
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 F( T4 J8 v1 h
addr = base + cnt;
4 V: T# H2 a& t, E# X- j
*addr = save[--i];
1 G+ B6 R/ ` b5 o, w |
}
+ T! F% \ l' N4 J7 l K
return (size);
; b/ N( u, M) h
}
3 u' d7 u; C7 t8 f' A2 \
}
0 i+ ^2 ?' C3 t T
$ M4 C" f2 ?: Y
return (maxsize);
4 \9 @9 N$ I4 v9 `2 g+ i
}
# ^' w4 l# c0 \" Y! l# }
int dram_init(void)
e/ B! P# U2 m+ @+ Z/ `
{
5 k0 Z% R* a; Q1 ~6 v9 D
/* dram_init must store complete ramsize in gd->ram_size */
" S0 t; y* J& h0 }3 C
gd->ram_size = get_ram_size(
u1 P2 w* }$ W" y
(void *)CONFIG_SYS_SDRAM_BASE,
7 l H3 P; q3 w8 K {% v6 @
CONFIG_MAX_RAM_BANK_SIZE);
9 u/ @, r& \) V
return 0;
) N; w. {& F6 T z% q
}
' J+ z; B3 ~# \" p/ {4 g7 |/ m
, Y+ t2 ~( }. J
! E* E2 c3 a, k d2 R- j
* [% A9 T, e8 @9 ^3 b1 d
1 `4 P3 g0 i! P& C0 y. W
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 W$ h/ i+ D( [
3 b: D0 n( W* I
# v- { i: U4 W# S$ E
! e0 i5 ]0 C0 ?% E9 b
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4