嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
$ ?# n6 s' L) H
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 X& r+ X6 c3 c2 d+ l* j3 d
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
w% U: H5 m0 c9 S2 S' ^
5 t/ ~* g$ H8 d( r$ v, g7 Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! }; K0 u" Z4 _5 |# @2 ^
0 U' g* ^( i% @, [- \7 v3 B
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" c1 C$ U/ I! o) [+ ~/ j
/*
4 u0 c9 M8 {; K9 N8 W+ y1 s1 |
* Check memory range for valid RAM. A simple memory test determines
+ ~% |% t* ~* H
* the actually available RAM size between addresses `base' and
$ b \" ^) x w# b$ y+ S! {/ [
* `base + maxsize'.
3 G+ K0 I' V: \: K4 \7 U
*/
- O4 x5 S# ?& M) H) e
long get_ram_size(long *base, long maxsize)
0 W/ z" o$ I8 o- j# N, [4 `5 x
{
" _8 y- k* Q2 a' e' ~+ t- j
volatile long *addr;
+ A+ ]$ q* Y- Z/ w+ e( l$ f
long save[32];
k3 a1 ?# }" u+ y d
long cnt;
5 G' c* @, t& o# X& h0 e
long val;
$ `( t: `% {: v' N4 w( r
long size;
) L. N, U+ y2 V, [
int i = 0;
$ S2 q# M9 h* x# M* ^
+ O, }% g; Z- g. S+ F5 R/ a) T
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. K7 v% \8 S" ?; E" K- p$ l
addr = base + cnt; /* pointer arith! */
* O) w# f( @* E3 J/ t7 o3 G6 d; m' o
sync ();
8 r$ k# s. `7 @$ l
save[i++] = *addr;
% ~* [+ H, ?- t5 @" @, r
sync ();
' v0 p* p. `9 z$ q9 a' Z
*addr = ~cnt;
; X: h4 X) q. w1 }/ ^; @5 I, s
}
1 B: W6 u" g/ W6 ?1 v
1 d$ @0 P1 W5 }7 l9 k: h' n
addr = base;
6 K. k4 d* Y( P: M @$ S
sync ();
- `) _* F* l) m$ R
save
= *addr;
, t9 ]1 a0 ~$ E: r5 Y4 V
sync ();
; _- e1 V j% {0 h2 n# E
*addr = 0;
) [3 d( f, _1 w" L5 N) _5 e! S! @
; c/ o; O$ L Y7 V% E
sync ();
- Y8 M) y% @& s
if ((val = *addr) != 0) {
& ^. M6 G1 w0 v; S1 W$ Z
/* Restore the original data before leaving the function.
( g( P3 `: x$ K" w% _
*/
! V2 K3 f* ^3 W% w% v3 s# _
sync ();
# z" ]$ S' ?- ~/ S9 Y
*addr = save
;
: w- H; r, J2 F! \% D
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 ?3 A6 W3 V( Z8 o2 L1 ]3 K* m# E
addr = base + cnt;
2 w! k M+ y( W1 O# j0 n
sync ();
8 ?8 z- J- {& y4 U1 h# m4 C8 e0 B! |& [; W, o
*addr = save[--i];
; e+ M" m* e- {# d# f+ Q
}
6 F7 w% W; S9 V9 H6 N: @9 D
return (0);
5 z# N* W: M1 P R+ y. B
}
5 A X8 \! J' v9 X' |- D' @ |
4 B, e! A0 }2 U" x9 [& ^
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 C3 N8 Z ^; W
addr = base + cnt; /* pointer arith! */
0 V* t* E! w$ Q
val = *addr;
$ {: W" a% L; e9 O) e
*addr = save[--i];
7 r7 z! A4 f% T) ?
if (val != ~cnt) {
/ {! e' \- W" w& h$ D A0 w" A( V
size = cnt * sizeof (long);
9 F# f% T& ~7 r
/* Restore the original data before leaving the function.
6 J0 M) v+ U% i5 C8 d0 P
*/
9 s7 V/ L1 w; s# Z2 t5 @3 K
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: e6 x! v4 x' }! t) E; P5 P
addr = base + cnt;
& |9 I& |& J% b
*addr = save[--i];
4 Y/ s( u6 A7 e5 c# w
}
5 o+ a6 b3 O7 t5 k+ b2 K
return (size);
. ~: L0 h4 ^# A7 ]/ o; f
}
$ D9 i: U! H5 _$ }1 t
}
9 t7 H7 S( U0 T+ \! x0 d
* V0 \. @4 K' S) s1 }9 Y
return (maxsize);
3 [) |+ Z/ y: [
}
9 p3 x7 u1 S$ l7 [/ O) e0 Q
int dram_init(void)
# w, n; J9 p4 d6 H
{
. n8 u. ^9 g7 Z
/* dram_init must store complete ramsize in gd->ram_size */
, C3 h$ t) h6 ~" i
gd->ram_size = get_ram_size(
# K; r$ I/ b5 a& B
(void *)CONFIG_SYS_SDRAM_BASE,
9 ?: I0 w1 E; b# d- G
CONFIG_MAX_RAM_BANK_SIZE);
9 n# a b7 T6 z* h+ R) |
return 0;
' F# Y' n) a. M6 w
}
7 o# ~' ]" v) k6 }& [
$ [% |. d0 z( j: {" p% s- O
1 T& Z$ `( d$ N8 b* O0 @) V
2 ?' s6 Q2 C6 d0 ]& a
- h5 t Q {4 H8 s$ { |* W
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, Q+ t& s; H% o+ N
5 a) a: e4 n% D/ b8 A
# v, G% ?$ O$ V- |, Z
q! f7 ]" d0 h9 O
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4