嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. z& d; S" G) `9 \9 }
核心板2:DDR2 256M Byte NAND FLASH 8G bit
6 ]& N p: q5 r( Z+ I5 g
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
5 Z4 q6 p% ^; N
2 {) k/ p- i* \( Q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 C! [- _: v4 [. h
6 P, N5 |7 q" s; |. i
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 N* S7 a' B0 m! O0 H
/*
- f' X* k& x- i% J
* Check memory range for valid RAM. A simple memory test determines
" n9 ?8 e3 Y! r8 T6 M" s- ]
* the actually available RAM size between addresses `base' and
8 x( M3 {, @( o- C1 a
* `base + maxsize'.
( Y5 P# n1 ~0 o C9 R9 J
*/
0 y5 x% l/ ?% K, J3 @
long get_ram_size(long *base, long maxsize)
4 U [8 {+ o5 D2 q+ g, A: T
{
5 ?& }1 d7 E% [8 h+ L
volatile long *addr;
' F4 k5 V; H+ V
long save[32];
# b8 a6 U+ A: n p
long cnt;
6 J/ i& g" a' E: Y7 X
long val;
( R/ D# h5 h. z/ H+ p( t, w1 j
long size;
1 }; ?( s3 u% I; p
int i = 0;
5 o5 ?: ~4 g% m0 X( X$ J0 Z" g
- V9 |$ R) d) R
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 N _$ x$ x% Y
addr = base + cnt; /* pointer arith! */
z5 b" b# X3 t
sync ();
4 }4 H( a3 D2 p: L/ F9 m
save[i++] = *addr;
: f- f5 R" Y7 F4 D- ?' g
sync ();
& m) l( ^ `8 K. a; I; b) Q
*addr = ~cnt;
" g" h) T: w' t3 M! N$ }
}
: K* r* x+ M) _0 h' n
# a2 g. J/ z7 J9 m" Z, B# T
addr = base;
1 E) z" F9 h7 j4 {% c9 Y
sync ();
2 j, `- e( }3 N# y5 o1 R" v3 k
save
= *addr;
3 R$ c# r B/ C9 [; k) R8 o `
sync ();
2 ?7 o. o6 i( ]9 L9 |% y
*addr = 0;
' ~) v |! V4 c) U9 f
. r3 N1 {3 E; P
sync ();
" i- S. c0 v* P( M5 E+ _
if ((val = *addr) != 0) {
! D. V: E3 E& G# a
/* Restore the original data before leaving the function.
4 M5 f! O: P/ F l' M, R9 `% O
*/
3 J# ]4 P% r: L! o
sync ();
7 L0 L& @* G6 ?3 a- k
*addr = save
;
4 M7 g% c. t2 M
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 ?: c7 k" ]5 I0 ]5 G$ r3 f/ l
addr = base + cnt;
2 d+ O3 V% T* Z
sync ();
% i( M5 @9 h2 B6 o( |( Q6 D
*addr = save[--i];
! L2 ~0 U. v! c( s" T1 p( M9 |* Y
}
- U& o' c& ^+ x T a
return (0);
& u. B$ y* G- E2 j! H6 b
}
; s$ |* t5 `# o
" k {4 y: z' |" ]" i0 n
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 R, q5 S' t2 k3 q; x/ }
addr = base + cnt; /* pointer arith! */
8 p% F* K2 C1 K L$ Y0 e& @# L% `; X
val = *addr;
/ a3 h% w) O7 o* S! o \& z
*addr = save[--i];
H. p7 u# K# G' f& V: _1 O
if (val != ~cnt) {
# I+ M) t8 h* {
size = cnt * sizeof (long);
4 L/ j7 B- l2 v6 a/ s, G3 P
/* Restore the original data before leaving the function.
% v, L% }% t" m4 j
*/
9 ?3 @) V+ A0 L6 C; U
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! Y' O0 C: O v8 n
addr = base + cnt;
! b2 w @4 x$ I% k& e. I* K$ }
*addr = save[--i];
- ^/ E8 ]4 Z* j5 G2 k
}
& Z( z- S1 f1 N; W' d
return (size);
) t, r8 j3 z& D- r$ J/ d' E* a6 w
}
: |0 F! d# t6 D3 M; d
}
. ?0 E. n2 C I f) x9 h
9 V- I7 \7 b1 H" G& `, Z
return (maxsize);
4 P$ k7 n5 d* t' E# v/ a
}
1 T8 ~8 o$ J [% s7 x
int dram_init(void)
9 B. n6 M2 e9 d( n. S0 w
{
, p- U$ ?+ t! [- k
/* dram_init must store complete ramsize in gd->ram_size */
$ |( i- |; Z9 M
gd->ram_size = get_ram_size(
' W9 {/ y6 M9 }3 p
(void *)CONFIG_SYS_SDRAM_BASE,
8 X4 w' K# B% K9 Z8 h* t2 M
CONFIG_MAX_RAM_BANK_SIZE);
- d; j; n- A/ B
return 0;
: m6 [8 ]2 e7 h
}
% a3 E- U: U* I1 E# g3 d! s
' [; c8 [7 G& d1 ]2 C- q7 J% g- V
7 m" E' F/ C/ v0 L8 c0 R4 C
4 y& {* Y5 H. q
; {* m& |. j# p1 o! M
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# w% G$ }& y5 G4 B/ \1 `
/ y6 q# P8 F. y5 R" w; @; [
% K" l' @* h: M! w" [ J# u. a( B
$ A7 G3 i Q' }7 r2 ?+ T! S
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4