嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
+ X5 [1 ]7 e' R+ J+ H0 ?( z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 t# O5 s# G7 S! K l
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' j, _. S( U$ z1 a& h8 K
. a8 @; l: X: Z' @. b
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# n( B+ ^* o* Q' Z# w$ Y9 f
& a4 ^ J9 U. l" u- p% r
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- B% A9 S$ p% r8 _
/*
( E, L. w; T' Z5 `: p9 |9 ?8 w
* Check memory range for valid RAM. A simple memory test determines
! t% Q8 m3 n$ _# B" }# \& o
* the actually available RAM size between addresses `base' and
. ]5 e1 r& x+ q% Q
* `base + maxsize'.
+ O M1 T$ i9 G" K
*/
( {0 A# E0 P, T( `9 c/ T5 ^2 J& n) X
long get_ram_size(long *base, long maxsize)
/ f$ k! W4 b, f) n; Z4 A
{
& Q6 K; F% T5 Q4 Z( Z" f8 D
volatile long *addr;
0 i# U& O6 y W7 f* `
long save[32];
: u+ j% c0 d1 w
long cnt;
( z" z( ]) U, X2 Y8 \+ w. j
long val;
; r- e. F0 R* g1 e
long size;
, h: x8 S- C- p6 ^6 E$ C
int i = 0;
" F% H) N |. B
: V* h/ ~. i6 n" \: I+ @
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( l7 |5 J# Y9 N# Q
addr = base + cnt; /* pointer arith! */
q9 N" H2 _$ t6 e# [
sync ();
% F% q1 \& S: i9 k1 ]3 Z) `
save[i++] = *addr;
3 U6 U/ Z( b* u2 u- j s( d( p6 h
sync ();
+ b8 u, U5 c" g4 \
*addr = ~cnt;
: c% s3 C1 L: h" I6 y: F$ ]5 e; r# g' b
}
! T' _' U, M T) s) h7 Q: B4 x
7 }, Q, T( `# a$ @
addr = base;
! d2 v' G$ j) }7 D7 W+ Q' R
sync ();
) f+ y6 E# `; s2 b+ V
save
= *addr;
& o$ T8 ]8 N; ?" d* O
sync ();
" E E; K* ~8 z* C: U' e' g
*addr = 0;
: p7 j' S7 N+ o4 ^8 h
t4 R3 ^$ m J+ \
sync ();
9 T. v) R, F3 G% u
if ((val = *addr) != 0) {
. c6 \8 g4 N$ {3 b' R' v! K; ^
/* Restore the original data before leaving the function.
: I$ M) _9 R. d. `9 G, E* M
*/
( b- m: F# U/ q5 a
sync ();
" F+ Y2 S/ n6 _% _( d
*addr = save
;
2 s/ w+ a1 A( X8 S+ U4 x( n0 x
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ b6 e! }7 ]# o# v/ y7 o
addr = base + cnt;
+ M' G& k; m6 y$ Z y; a, l9 D' `
sync ();
' w+ V6 m d" ^, k. }: r
*addr = save[--i];
. k% ?/ W( K. U: X. m& r% u3 o1 E
}
7 v) b+ ` g$ P* T9 ?8 m) R# ^
return (0);
! l- H9 Z0 t4 G4 G; _ M
}
; o! c2 ?# [+ l; \
! r; t8 k6 i) s$ y5 c1 @
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% j2 h8 U5 }) V' }' a" z+ q
addr = base + cnt; /* pointer arith! */
6 `+ [! b& ^! _- e4 K1 W
val = *addr;
$ H1 f: G# H: m
*addr = save[--i];
9 x2 J& T6 Q1 l7 E% g8 Q2 ]
if (val != ~cnt) {
" O7 t6 l1 Z/ v3 l# {/ K6 e* E, [
size = cnt * sizeof (long);
& G4 m A! g( E( T: m
/* Restore the original data before leaving the function.
3 j; R+ ~7 n: P2 C% H& g# k
*/
0 V6 I& ?2 ^) I# B7 i
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, G& ~ O) O8 i" H$ N% E
addr = base + cnt;
+ A5 a- A# O- n+ w; R- A% r
*addr = save[--i];
- w9 q* G" R. _. m8 r
}
- }1 i, u% k5 J$ f
return (size);
& `/ v3 a0 V! P0 Y9 Y
}
|& V2 [1 F, K/ G
}
# g! E, M" v7 J' r0 v" K8 N
. b- w. R9 x' u+ _1 P! [
return (maxsize);
% P5 i$ ?$ W' g, b
}
4 }/ E! G) W% w
int dram_init(void)
# D" j4 \8 w# N. p5 [6 B
{
5 S% c4 }4 J& R. l+ \& ]# \# X- W
/* dram_init must store complete ramsize in gd->ram_size */
7 {' u$ ?$ D3 }5 }
gd->ram_size = get_ram_size(
8 n5 }' _. N& Y0 v- t
(void *)CONFIG_SYS_SDRAM_BASE,
- f! f$ N3 M8 Z
CONFIG_MAX_RAM_BANK_SIZE);
5 m h+ v# I4 c |6 n6 @' V
return 0;
1 W( l+ F9 z) i t8 L \
}
I2 ~9 B# N$ U" q5 i1 b
. \4 g1 w$ w% H4 r2 Z9 e9 \3 U, T( C
0 j5 ^& z! G) N7 J+ n c$ \
+ }6 _* D4 `4 p, `7 P- B
; D6 r" P) d' T! L0 _0 f
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 T) n4 u- V: b/ o
- N6 d/ D- a+ n6 n. F2 X0 l+ C8 H
( B9 K- R+ p% J, s( c5 W8 J
1 H* X% L3 m6 y% G# a/ ^3 h% M6 Z
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4