嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 w/ e7 R' S4 y
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 u/ Y, T+ r9 I/ c( a
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" X2 O+ c/ U8 k
+ D7 k) e9 J3 Z8 l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' I5 W9 O& w4 o6 m* ~
: l8 ~7 Y* [( ^4 {
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, G! ?5 P" J5 K2 d4 c6 g
/*
+ b; {* G- r; U `# @3 d
* Check memory range for valid RAM. A simple memory test determines
2 T5 j" `+ l& I- |# a
* the actually available RAM size between addresses `base' and
8 A/ E7 j) b9 V) g$ a$ j. ^
* `base + maxsize'.
% M% a- R* u/ @% Z0 B7 `' A
*/
( g, x; q" W6 J' r
long get_ram_size(long *base, long maxsize)
% ~7 T# `' ?; r' P
{
! `+ |8 Q4 h# C
volatile long *addr;
5 U1 q4 t# S% o* P6 D
long save[32];
& B; G7 f( d0 M. w7 }
long cnt;
4 \8 n- Z" N0 a9 c! a& g, a& ?
long val;
* {! E$ E/ v/ [
long size;
8 k- S( I0 N" F! M0 \
int i = 0;
- ?% z9 j8 N! Y @4 c* |3 ?, h
. L \, I* {+ h" l' d- D9 x; g
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 ]* d+ H% D: a9 U; B; l" L2 [! Y- U, U
addr = base + cnt; /* pointer arith! */
! O& x( @1 ?7 B b$ `4 N
sync ();
$ G4 {: F% ]" J; N: a7 d& ^
save[i++] = *addr;
& a$ _ y" [4 H
sync ();
$ x. @7 k% @& P& J; c
*addr = ~cnt;
6 W i$ P$ c- v) D& A
}
; f2 P! S w5 {7 U4 i$ u
# E. z3 u" u2 n* J0 r! j, u
addr = base;
: b% J: T: w0 p. H8 @, }
sync ();
$ e9 W5 q" k* g- |; G
save
= *addr;
9 z5 G4 \$ }& C5 C' M$ i
sync ();
; ?% [! o' }' D# Y1 l- L
*addr = 0;
: N2 |% y7 C" L* h/ [' i/ C- q
. p2 F+ V( B: M; I) G- g, B4 f& |+ e
sync ();
0 Z2 {4 U, y5 u0 f# Y
if ((val = *addr) != 0) {
r- b% ?( @& c7 x" N! q) N$ Q& A
/* Restore the original data before leaving the function.
, o% n! x2 J, I1 T5 `8 D
*/
% b& @5 h' ^. F( p2 k5 t; Q
sync ();
, o J- L. P: h& h3 x# B- Y
*addr = save
;
; X' }" P& ~7 E
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ T) z$ s8 L0 _/ ]' _5 q1 t9 I
addr = base + cnt;
+ }$ q. R2 I; H+ r5 S
sync ();
5 Y6 k( k) b5 U$ |( V& e2 c5 [- B, C
*addr = save[--i];
0 E- h1 e3 Z% I8 t
}
; V: o: {, G" }% B& ?% j6 \* u8 H
return (0);
, K4 `5 N% q7 F
}
4 a2 r2 [1 Q* o* M
- _3 Q3 ]8 D7 ]1 K
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ z( r8 M. d# v) r8 a
addr = base + cnt; /* pointer arith! */
! k& A2 M$ g& q: C3 ]& U
val = *addr;
" ~3 r X8 |& c* L
*addr = save[--i];
z) c9 @- F1 r
if (val != ~cnt) {
; L8 \) ^. c/ n1 F$ c* x
size = cnt * sizeof (long);
7 \& |* O5 {( l u z0 G
/* Restore the original data before leaving the function.
2 X! n$ x% \3 c3 r1 d
*/
6 {* o$ a0 ^0 ^+ e5 Q
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) k7 }1 r. z* U
addr = base + cnt;
) I6 d; P# V2 l3 B4 T( `3 d
*addr = save[--i];
e8 i7 f# F" b# n2 s5 p
}
8 n) K' F: R- L+ i
return (size);
9 O$ z6 M) q6 b. b
}
+ B4 M( ]4 S1 K# ~2 B( V
}
" V2 i' M% `9 @5 I4 e: E ]
6 {0 \& L- D `# I
return (maxsize);
/ y0 h) y- g, s! ?
}
% S) U; ~4 P% y% `! a
int dram_init(void)
) U5 I$ Y- |4 [# B- k
{
, l9 ~% M3 w/ C- {; U! t+ p
/* dram_init must store complete ramsize in gd->ram_size */
8 V* J8 r% {7 d/ w
gd->ram_size = get_ram_size(
: v' |1 w, u6 a8 t6 L2 @
(void *)CONFIG_SYS_SDRAM_BASE,
6 D# p" b9 E3 G" O
CONFIG_MAX_RAM_BANK_SIZE);
- b; u, f% a$ ]( T* B: a+ `4 F5 c6 x$ R
return 0;
3 a$ E. |5 a' a. y
}
& e R9 Y# ~4 i I! x
+ c' u3 k7 K- S: \
. ~3 u! \/ t+ v0 a
; A8 W9 _ u; k7 y- ?! O
/ ]$ q+ k2 v- Q6 ]( Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( y. h! T; C3 C# H: [% t9 M
% O! o5 L0 k {+ p4 g0 C6 |
, U& t+ j4 _3 J. T# _; U" j
& F f; v0 G- Z( D
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4