嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
) h4 B4 k) r" a: |' N( P% M" L
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; s6 T, z) t I' n! O
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" H. s0 }; V, G0 V) V1 Y
6 c5 x2 ^$ i, U0 f! b% c
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: y7 H4 ~7 v5 _3 t8 i
3 U* ^' E! T1 |
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! d* k/ V& i0 m
/*
$ q) D6 u7 G& {1 F r6 y7 }4 O$ P
* Check memory range for valid RAM. A simple memory test determines
' K2 ^8 _% `7 H: l
* the actually available RAM size between addresses `base' and
b) T: A6 ^5 E3 [' Z
* `base + maxsize'.
5 E# a, `) F) u- J# l7 t
*/
( m' \7 T# M0 t- K6 q
long get_ram_size(long *base, long maxsize)
! E* p/ g! `7 F5 n
{
|4 H7 a* v( t3 y/ o
volatile long *addr;
0 z# T! O8 q3 s3 z# {# W3 R
long save[32];
+ e) w! u# M# }2 M' n" ~. H
long cnt;
5 m$ q' J0 A3 L+ z" D' X
long val;
6 G, n* _8 N: I
long size;
' @5 N! c* S& l: F) i7 c
int i = 0;
+ Y0 V0 S! m0 V5 k0 }) b7 [2 B
/ a8 l6 Q3 G5 L9 e4 P. [
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 R$ {9 V, @0 a
addr = base + cnt; /* pointer arith! */
' D: x4 a9 Z+ f% g8 ?8 |
sync ();
, u3 |. U+ U/ M. D. D+ C s
save[i++] = *addr;
9 t+ l4 ]6 d+ G3 P
sync ();
6 U2 t/ Z; k. Y5 G; d
*addr = ~cnt;
5 E# w" \2 m6 Z
}
# }- O: `3 a& g0 @
2 B: m0 A# D2 E2 E9 F# n, T5 }
addr = base;
+ n, ]# f* N$ D. r( @
sync ();
h. \$ w3 {0 k$ }0 w- ?
save
= *addr;
. M; L0 C1 [4 W
sync ();
. E4 w4 Q# K( c( p
*addr = 0;
3 g |! X. W: x8 ?5 V3 S
0 W9 g! o" h/ O3 [3 J
sync ();
4 V$ O8 L# Z, U# T/ U: h; |# {
if ((val = *addr) != 0) {
1 ^5 C$ h7 _: j) ~) X
/* Restore the original data before leaving the function.
9 q9 q# w# C) `( y$ a( _: K
*/
* c0 c0 K a0 b6 W* j; d
sync ();
. L& z+ @) n/ |$ f' P% b
*addr = save
;
4 S9 Y* V0 X p5 |# t
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" H- a( U5 S# _0 v Y' m
addr = base + cnt;
. f# C$ s; Y: d
sync ();
: U. [# E5 x" L2 c2 g: ?8 S
*addr = save[--i];
" u7 m4 _* C, e
}
9 R0 C- P2 o/ k/ R" R1 { p! a
return (0);
7 l3 N6 f3 k6 s/ Q- X0 i
}
% l- U1 g6 U: _5 w. t
/ P7 r5 o+ r8 L2 L9 |
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; M) ?# t' g# J2 G; }$ u1 U7 L/ _
addr = base + cnt; /* pointer arith! */
+ \) h, f8 D* C/ _! ~. A" _5 h
val = *addr;
' u7 g) V# J* n0 L# P7 E$ w
*addr = save[--i];
* V6 v {8 | G( W7 e) Q8 P
if (val != ~cnt) {
( j- Y! h7 A: y( r, w {
size = cnt * sizeof (long);
" N8 K8 f. J6 n+ R3 s7 J/ h
/* Restore the original data before leaving the function.
5 }; ^7 q! l* l, _9 }
*/
' k6 c: B6 T2 ^' j! u# n* X! t: D3 v
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
`$ g q4 ~4 [7 X$ a6 l- F
addr = base + cnt;
& E; H/ g. B8 n8 }, j3 P4 n$ g
*addr = save[--i];
; j/ s: D' p5 _6 Q5 c
}
7 c) D4 c/ B, N1 U9 f
return (size);
: f" V$ r3 Y( a
}
' x: r) D7 T" a; A
}
) [1 {7 h& @% m2 I, w" K
% ^1 T; D8 {0 t, x
return (maxsize);
% e. Z7 y; I9 c: O' G
}
0 w% Q( s, ^: V- m! W* A8 ]
int dram_init(void)
0 @5 a) t# v' w$ [' s; Z( O) M
{
' b K+ O& B3 O" i" u
/* dram_init must store complete ramsize in gd->ram_size */
/ G0 |, u5 y" l( y
gd->ram_size = get_ram_size(
1 F3 A K# ^' e: q! w
(void *)CONFIG_SYS_SDRAM_BASE,
- z* f5 h! h5 I" [* @
CONFIG_MAX_RAM_BANK_SIZE);
$ l# R! Q% s) r9 x, `% U
return 0;
+ ?- k& W) h, T9 X" g+ U
}
7 p+ J5 q; p8 y5 ^5 n; o- Z
, q' @/ j2 s- k
2 U0 g# L a" {' y' d$ j0 @
0 `: a l. I% e- S* U# \4 N& T3 `
% ~6 {" v( _- T T7 V5 z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 k- r& d- e- q" |& F4 F; I
0 S( j, Y- T. J0 \# v7 m
% b! l, K, i* l+ F* a. [2 k
' F; Q6 W% Q1 x3 k$ Q1 v. ]) @4 p
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4