嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
# O' T4 u: Z; h9 n2 E' b9 }! g/ ?
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, A. w3 D9 u1 m1 d' d
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 _0 n9 O1 F) {# \- i* {
+ O" f8 v- U$ C1 Z) `. E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; n/ n8 m+ U. d1 m. l) B
4 P d( o" b, i; }+ ~
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 t& k* ]. A' X9 r5 @( F8 y* h
/*
4 ~! I$ Z, ]. I0 j6 G2 v3 D
* Check memory range for valid RAM. A simple memory test determines
! N5 A5 `9 O! m& r( j* i
* the actually available RAM size between addresses `base' and
! I0 N6 e; P' m* ^' p! {
* `base + maxsize'.
' V1 I( H6 r" Z3 }( W# u* t7 U
*/
; W; E4 _& Y# K5 W: \ d
long get_ram_size(long *base, long maxsize)
8 U7 p+ C/ }3 V! `- b) y/ }
{
! Z, @- g" A( w$ g& n8 }+ p
volatile long *addr;
9 u9 q4 N) ^& q! S. H% j0 g& r. q
long save[32];
! {% M- k% i" t0 _7 ]
long cnt;
6 @# J0 [8 _4 s) Z+ w8 m% c
long val;
9 l/ A1 x( T) ]' d
long size;
! V" Z. z- P9 W# M+ \
int i = 0;
$ E) W. r& b* @
7 L5 a" {& \. Y( _' W+ X
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: r0 h D X% P. o3 ~
addr = base + cnt; /* pointer arith! */
! U: ] o# f# u6 K5 p$ q) ^/ ]) E/ A
sync ();
4 Q9 |+ _6 s9 b, P4 u; d
save[i++] = *addr;
( C7 b" g6 w `# A: L
sync ();
% U9 E4 u$ ^/ X. [8 D# R
*addr = ~cnt;
! `& i! l/ y+ q& B6 t9 ^8 G
}
! Q+ c% S+ G- F. \
p; I- l/ p# z& z1 z4 e
addr = base;
6 K, y' F% ~ y' k6 p
sync ();
0 A4 H" M, J7 x& }% p
save
= *addr;
- Z* m3 U" Q* f: s
sync ();
7 @' o0 p* b! q- V
*addr = 0;
) v8 f# S1 \7 k4 o" v( k1 w
: j0 n& w# P/ l% m
sync ();
( ~2 p) W9 N4 I
if ((val = *addr) != 0) {
( U1 y3 e- i0 K. y) A" b. h" r4 ]
/* Restore the original data before leaving the function.
+ |* i' F, Q# F" L O
*/
0 q% P+ S% z& c# w2 w3 M
sync ();
' }4 L2 k, }4 D5 n4 ~, K; i& j
*addr = save
;
# o* e7 K) \% l, m+ X+ U
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 [& j) P: l$ t2 L7 a8 @" l
addr = base + cnt;
7 G5 a8 ~2 z4 I- h0 F
sync ();
. g( E' }7 l1 s' N8 y6 p. Y* u3 Y' X
*addr = save[--i];
& A+ q3 ~) X3 C9 V
}
7 P0 A& S& x1 C, ]: w
return (0);
; h5 [5 s8 T7 [* E. [2 F9 D
}
2 D4 l$ N/ \' H3 @$ M' [/ E
5 G* Q5 X6 W4 Z M8 i4 a8 A7 h
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' N! h6 ?4 ]3 c- e8 ?, |: ]" A
addr = base + cnt; /* pointer arith! */
. b' T; S0 }" q: U: S# O, O
val = *addr;
* |8 {. G& l+ W, Z: q
*addr = save[--i];
! \4 V% I* t0 ]3 z/ O/ m7 F
if (val != ~cnt) {
5 n$ M' ^7 ~3 q5 V" y
size = cnt * sizeof (long);
7 C, |- y9 P2 A2 q- W) o
/* Restore the original data before leaving the function.
* a/ w( K! @6 z
*/
% {! u; z4 U3 p) c
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# g/ E) n* [% X( [7 P7 O
addr = base + cnt;
0 v ^; u+ k# s Z- j& ?' x9 e3 }5 Z$ e
*addr = save[--i];
8 T. K6 `6 [. T4 F; F9 r
}
+ s, Z3 l# C9 s
return (size);
- Y' f, M/ _' S! K! Y' ^5 H
}
) W: m% r0 B+ p; K' w+ t" u
}
( p% C' u: E" M/ J6 I k |/ l
1 ~9 W& d2 x8 `6 y1 f+ l2 a; o1 ?
return (maxsize);
6 g, S; w; g; X3 s- F! O$ X
}
/ m6 H& G! |* i& g7 \
int dram_init(void)
- V) e* ^; g# V
{
1 k/ g. ?( o& u7 \/ G
/* dram_init must store complete ramsize in gd->ram_size */
) ^: W4 m/ |0 m" @: C& ^7 O, H
gd->ram_size = get_ram_size(
8 u+ `( b& v; p! H' m0 Q
(void *)CONFIG_SYS_SDRAM_BASE,
% L) {+ U/ R& h
CONFIG_MAX_RAM_BANK_SIZE);
6 f/ P8 V! }* f+ k5 n' x! K
return 0;
' e8 _$ i$ w+ A* U/ F" M0 m# I
}
+ Z# K5 A3 R3 y4 ?- V T2 o8 m5 R3 [
4 h+ [1 d* x5 a) o1 s
( n1 f6 j# N' c
; b+ d& y0 P |% R! C" s1 {4 g& G
0 |5 T- N% l2 ^6 m# T) T7 M2 g
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 r9 ?" g+ m4 F, `
& j8 E7 c0 R/ g# C
; Q ?* l8 H: t+ }( }& N
+ Z% j9 i% w( r
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4