嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- ^9 H K) F; q* B/ N9 n: s8 C. f
核心板2:DDR2 256M Byte NAND FLASH 8G bit
6 Z& \' U' B+ v- o- Q; ]) k
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ f; {" l: q+ Q7 E# g" {! t {
# [2 q& z# o% f) P" j9 X8 n
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 x( a7 w p: [" {
+ B; D# `! q) U8 N: t8 k
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ C: \& n! ?, ~2 v. _5 R$ T; d
/*
* P3 d \! G3 F: C3 q# M+ H0 V
* Check memory range for valid RAM. A simple memory test determines
" B' t1 Y8 i2 _& y
* the actually available RAM size between addresses `base' and
6 S, @ g# N0 }$ w& F' B4 s
* `base + maxsize'.
; s7 K( P3 p }8 b4 ]( ^
*/
- V+ N i* {1 F6 Y! L v! L3 g
long get_ram_size(long *base, long maxsize)
4 x# X+ r/ |+ c' d' `3 ]
{
2 X# W2 z/ g# z9 e# R) u7 m! \) j
volatile long *addr;
7 l% P+ I/ {( W3 X- y+ Q6 m
long save[32];
5 t% v. ?) e3 P! @+ ]! }- j* l
long cnt;
( {( V5 I& q2 d
long val;
; y! c; C3 m1 w5 m8 z5 e3 W" w
long size;
9 J8 U7 y6 b/ q* R. {' j) p
int i = 0;
$ K. ~: @2 t# c1 U( V7 Y2 e i; f
4 q# F1 J' u3 M% T
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 R: ?; P! B% h5 G/ x0 Q" G
addr = base + cnt; /* pointer arith! */
# w9 y2 L# O& I% c9 }7 K+ N; ?
sync ();
! W7 `3 d$ O8 ~; |+ R% n
save[i++] = *addr;
8 \, j* d5 H T% ]4 @
sync ();
% I2 @2 y+ \ e* z% E, ^- W/ K8 ^' }
*addr = ~cnt;
; f' Z# C2 W* c
}
X: E1 X7 s: w( V* Q. `2 ~
' X+ B+ @8 s. u: S, f# S
addr = base;
- D5 G/ p- p4 s3 I0 m+ F
sync ();
$ R; G, I; x W
save
= *addr;
' r4 _9 N; n* ^, S' w: F9 w( D
sync ();
! ^* a; ^; l) ~, f6 E q
*addr = 0;
4 p- f2 n4 Z4 A7 i; o
" C+ b+ ]$ P' u
sync ();
% D1 R8 j9 v9 O/ J2 w
if ((val = *addr) != 0) {
! p" r: b' O5 j! n& B
/* Restore the original data before leaving the function.
8 @% |( h9 Q) v. g
*/
. P# d* t4 ?' {& @2 J" m) V
sync ();
: [+ f6 X/ G- X3 c+ p% a
*addr = save
;
, X, S( A! C( I
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& C: ~% k( d$ p+ {' k' `
addr = base + cnt;
$ Q) @2 T/ I: g+ e$ Z6 k
sync ();
( D4 L; t+ p1 `) M& E
*addr = save[--i];
# X# @7 M9 M' F% q. z
}
2 e( g. l7 l4 w. E, _9 A2 O
return (0);
6 q3 y, I% x% N# F j7 a" ~
}
8 p% Y- Y9 E( g' E
. I" i$ n A' b$ B. t1 F* j
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 r, S3 f. {' I+ C4 G) Z
addr = base + cnt; /* pointer arith! */
2 q/ ]# w4 l( H1 M; }6 |
val = *addr;
6 a$ G& q9 {" H9 {( j0 V; v
*addr = save[--i];
& C2 R4 e/ a8 T6 D
if (val != ~cnt) {
5 c# v ^1 |. \9 B; M
size = cnt * sizeof (long);
( e9 I# J" [( c: ?. f& O
/* Restore the original data before leaving the function.
( J1 W! k* R* t0 l9 ^ Z' j2 K
*/
+ H# ], I& ^' x5 w# x$ i G
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 s% d+ A2 [4 D7 K0 S
addr = base + cnt;
$ B3 G0 C: n: H& p2 y( K
*addr = save[--i];
" F. r I, [+ k q/ [4 @
}
l, G& J0 t+ s
return (size);
" v; f3 k" u* s; h+ I# q( H7 k
}
{' g5 E! r1 N' a8 |
}
9 {& I) ]; X4 V* h
" o {/ p, ]6 s( n- ?4 P- H# b: [
return (maxsize);
& a: Q& K/ s0 p3 ^ {+ }. e
}
, j3 t4 A$ O4 d) Y/ e) J
int dram_init(void)
) S9 l2 g/ I4 @2 \# A$ c8 Z
{
9 M5 d9 F: t2 I; p
/* dram_init must store complete ramsize in gd->ram_size */
N3 ^ X; ?5 _ d
gd->ram_size = get_ram_size(
' E& C g9 z- C: D& v8 u
(void *)CONFIG_SYS_SDRAM_BASE,
& q: W$ |. Q! u
CONFIG_MAX_RAM_BANK_SIZE);
. L3 ?" M6 c) S4 q
return 0;
7 J8 B+ q0 a D% G$ o) M
}
0 [% o2 z6 r7 w A& r: C8 A9 C
: @! U! f8 x0 t D
3 P r7 y; i T3 Z. @/ `
! T/ m1 [6 m5 P$ A
& ^' J) c# x2 M2 k. b5 |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) g, Y3 a; c, n% ~% _
7 a! D$ p: O3 @* X$ ~/ J
# f) u. b! o" h% ^: B: O$ o; O
& Z# L r7 x- ^# s: T [
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4