嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 C9 Y" {) J' r |3 H/ y" H
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. Q4 `. s; g+ O; `3 q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 W9 Z. Y1 L3 [. x( h2 n
3 P- y+ p; `8 o7 a
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) x7 X6 R' }% e/ M+ M# X
& H: u2 h% x: ~$ J" Y
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 N% F, h$ u( [7 h3 o7 s- k
/*
6 N0 w6 T& n5 B/ [ y) E. ]
* Check memory range for valid RAM. A simple memory test determines
' x* N/ E) h; d& t2 l W* f
* the actually available RAM size between addresses `base' and
2 e0 p/ r9 q; E% I; j A
* `base + maxsize'.
" r; v+ \. l0 O
*/
" m9 n0 d0 y! Y1 A8 @+ e
long get_ram_size(long *base, long maxsize)
) u! I0 v1 `5 B" n$ }0 a7 W
{
/ p% m( X) g/ I7 o q
volatile long *addr;
6 f# e: U7 Y$ i# P7 N9 \. v
long save[32];
; | s0 H' J# m2 D8 |4 V/ X5 Q
long cnt;
" t1 \: y! |3 s0 e0 W2 q) z! [
long val;
6 J+ c. K% r1 |
long size;
% D) c) g& i0 n; ~2 K8 ?2 w& B
int i = 0;
5 G/ z/ f6 s3 p, L% {
8 j9 H3 n2 S% b
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ S' F5 c7 n" B" n
addr = base + cnt; /* pointer arith! */
* H. b$ I$ P" b: ?3 `" H( N
sync ();
/ {3 `) q1 t, n0 J; a" O
save[i++] = *addr;
) r4 l, g- N/ ]& P, X
sync ();
- F6 b/ O& W& [
*addr = ~cnt;
3 G. R8 l! M4 o4 C2 N- l5 k
}
+ L' {' e/ S- N/ ^' T; }. `, k9 u
! g+ G4 d5 o% t$ o2 E7 X
addr = base;
& \3 H: d- ]$ l6 x( O
sync ();
+ i8 _# f# r# C% h* o( @& u
save
= *addr;
& [7 Z, }6 [9 d; y1 y
sync ();
! R3 T: _. ?5 S% @
*addr = 0;
. v! g* u$ }, S9 g- f" L$ h- o
+ I- J, J& o* A! s$ t
sync ();
3 m0 p& C8 Q% J+ R! E" a
if ((val = *addr) != 0) {
" o3 U: @# Q/ N- Q2 n! E4 ^) B6 D
/* Restore the original data before leaving the function.
0 [- Y4 \; S" H, F
*/
0 H( Y/ o1 `; I2 V3 T0 ]
sync ();
' m/ ^1 ?& k Y3 f' _. H
*addr = save
;
, J* O% s; {7 p2 c& i
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' f( B" R4 b7 a( f. N
addr = base + cnt;
& D6 G3 z; m2 ~4 \
sync ();
4 `, x6 Z1 @5 o9 d% ?. G1 I* {/ i
*addr = save[--i];
2 G2 E: U" h6 L9 M. q
}
+ H) `# [0 a+ {; R
return (0);
4 K* ~9 g0 _$ v8 U) m7 Q- p
}
% `) \: R2 n5 R3 N4 a& f
( V" s0 e$ i+ `9 ]# Y# S: g! x
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 A4 K9 S F: ~; C& ? z
addr = base + cnt; /* pointer arith! */
$ t2 b% m0 ~: }( [
val = *addr;
, h- M+ n8 u* O D- f0 W
*addr = save[--i];
% k0 k: D/ Z/ J' y6 G
if (val != ~cnt) {
. J5 A9 l9 `' s
size = cnt * sizeof (long);
0 B: {1 f) y4 A0 F% G6 g
/* Restore the original data before leaving the function.
! S) U& P: z1 o0 h& W
*/
" T3 `2 S7 t9 S0 R
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! u* E6 F+ P8 h
addr = base + cnt;
6 i: M0 f& O& n& G8 r1 I- h
*addr = save[--i];
; F& K3 E. h! T/ Q5 O- \1 G
}
1 _" q& G/ i7 T% ]- p" C' B5 \; z
return (size);
' P9 e4 J f& M: f0 u- R5 X0 A! x
}
( g2 o H7 D A" R' W: K9 V" _
}
, j' N/ X$ W. T( c
: q& \( H% N5 K1 _. e
return (maxsize);
9 W, z1 @$ W& p/ v1 x3 |5 U$ Y- d H
}
1 I+ E* H! k$ g( a3 H
int dram_init(void)
' ?" _. V9 h- F6 B6 k0 {
{
" `$ D3 v2 }; c7 m) r& ~- P
/* dram_init must store complete ramsize in gd->ram_size */
3 B+ \4 S" @! b, J
gd->ram_size = get_ram_size(
% ~' `2 t% J# U7 I/ F$ Y3 H' V
(void *)CONFIG_SYS_SDRAM_BASE,
. p7 u, O6 b% Q- K8 d; }* s
CONFIG_MAX_RAM_BANK_SIZE);
1 @- h3 l8 h0 C. q3 x* {7 C
return 0;
1 Y7 Y( N8 g* R! w8 q
}
+ j8 f( V% I( r" D
$ B+ d$ K! f- m* q7 X1 A X
) g0 X# E2 }+ ~" s) L9 T V4 d
2 v- K0 H7 ~* K, {4 h; L3 b
3 [1 b: g4 U8 i6 {1 Z. z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' X2 i5 o$ p; S0 l0 |7 h$ v8 O g
( @+ \9 {2 N. J, e
- ^& L3 o$ @& e6 c8 W3 y
( { k& {' v `. v- Q4 }
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4