嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 p3 s$ F; p8 u1 B* x/ q
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, x& U, @1 H' t6 E+ i8 U
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 f; T& U2 B: x! C5 j
& } B. M5 r* a* @* ^
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 y( y6 \$ l' _2 u8 E
$ v2 {3 M0 g0 P3 W
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( @1 B5 D6 G9 T/ @/ v* X
/*
& M" _ b3 s4 t4 R
* Check memory range for valid RAM. A simple memory test determines
, G! y f4 ?4 l# K5 e3 F
* the actually available RAM size between addresses `base' and
: d8 ^$ d* B8 l* i' e! P q" o/ Q
* `base + maxsize'.
- }+ ~ u$ O" ]( |/ U; C* C
*/
" I" u! B' D4 ?/ @* S* ]
long get_ram_size(long *base, long maxsize)
6 i$ k1 I0 ]( n; a, }, R
{
( I* d6 }6 o% `2 U. }: E% U
volatile long *addr;
$ I. I& d o' ?
long save[32];
" p( p: O) m# p
long cnt;
4 C) l P% A: I. z$ O) u. D! |, N; n
long val;
2 @: T9 H/ }4 S7 E0 J: p
long size;
) l: u5 [. [8 j* Z
int i = 0;
# \" b$ C7 W% [& n9 z# h4 F. Q
8 z' _+ b( U9 ?" ^
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ E) [, J# q6 _8 b
addr = base + cnt; /* pointer arith! */
/ X/ f/ |4 E( O; o+ e( j
sync ();
- @: r* L. _9 a6 l
save[i++] = *addr;
0 {; N/ o1 o3 ?- R6 _3 w0 a
sync ();
9 N' x W9 U$ \! G1 W$ J
*addr = ~cnt;
( i, d1 E( Z- m2 k
}
3 x) j# `" c1 ~! y& R
! e: H7 e0 @8 r& ^
addr = base;
# @ `9 d; ^, E& x& y
sync ();
% `8 h; Q6 H4 X3 D# A; ]" }
save
= *addr;
* s j- Z! ?+ f
sync ();
/ _- s8 N- W. |5 K9 l4 `) }+ L* J' C
*addr = 0;
, a! x0 J1 o- u G. B/ R: u8 y
# l* o% n/ g T# N3 a- \' A
sync ();
4 Z5 K/ p7 Y, N$ i1 e$ k
if ((val = *addr) != 0) {
; {7 A7 K( A( u8 ^7 p. t7 E
/* Restore the original data before leaving the function.
6 {3 D# O" ~) n( S' Y$ ~
*/
9 R) s0 }6 T8 j" r" i
sync ();
+ ~. s0 D/ o) ?) h: W# Y# @% i
*addr = save
;
* p( ]' C- `7 f/ h- K; ?- p' |4 _
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ y% E. [$ e+ s# y" N: d
addr = base + cnt;
m z7 W( |8 M: i: T
sync ();
, P" u- u# E* F. n/ q6 a
*addr = save[--i];
Q) [9 j, n* M* p( w: H) K& c
}
+ i. z J6 K7 b/ K( c
return (0);
2 g+ m) _: {/ I
}
/ u' F' O0 G$ Y1 ~& [
. W' T' U* V8 z( q9 Z9 E1 F" w" s
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 j' `9 Z+ z; p+ D" O6 c* X* `' N
addr = base + cnt; /* pointer arith! */
+ b$ J, h+ p0 u1 K1 E) e! F
val = *addr;
! n" R! H8 J8 w9 C1 ~
*addr = save[--i];
: z2 v( t, y3 F5 Y: \6 s- m' `7 ^
if (val != ~cnt) {
4 N7 A) A1 ~- Y( R' @- }3 a+ [8 O) Y* R
size = cnt * sizeof (long);
5 i2 A( M# q9 M- d: r
/* Restore the original data before leaving the function.
4 A7 h' C; J3 n8 d. u
*/
3 C7 Y4 t& @3 o9 s4 U
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 }3 o( ]' D2 C2 Z& _3 \
addr = base + cnt;
9 O, W0 e* `3 B
*addr = save[--i];
4 ]" z* s5 r* n+ `
}
! p4 S+ }7 ?& {( y7 q
return (size);
! Z! G9 K. J$ F* D" [
}
6 h4 {0 \4 v: x$ S
}
, `- |: |% O( ~6 l. b
4 ?0 E( O/ G5 I( V9 r, s' k0 p
return (maxsize);
* i7 W9 N+ L) P# Z+ E
}
p$ f% V- H9 r* k
int dram_init(void)
. n% ?1 a' x9 v, m$ t' |
{
q: p" ?5 R% Q" ~5 W' `' a
/* dram_init must store complete ramsize in gd->ram_size */
9 Z$ `1 t9 q- E9 P3 U( r
gd->ram_size = get_ram_size(
5 m$ x7 U, f# I* t4 y5 G% M
(void *)CONFIG_SYS_SDRAM_BASE,
5 `: n6 i- b" R% B
CONFIG_MAX_RAM_BANK_SIZE);
8 _# L; K6 l- f, r1 M: V
return 0;
9 R# T, h, G" j! H, [
}
! c$ B, x4 L3 ]% t4 i" _: G
. W1 F3 m3 e9 r4 t
9 f* X. ^5 o$ P4 ~# P- z
' i+ F" ]- J0 @- \
% h% U" @8 Y, o# J
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" m) e. q5 Y! F* Y6 |5 B5 e6 f
' R- I+ s+ u/ C& s& y5 E) q E
* Y) n" {6 M% H+ c+ n7 | O& L+ B
- L( [$ H7 Z% _- f
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4