嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
' A5 \' d z' [& K
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( A: Z- r7 `$ L5 [+ p
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& ^; [% u x/ ~6 v; ~* Q9 }4 s
" q W' T2 D. T
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! B& d9 I7 |# Q) w
; d7 Y6 b" |% k L2 ?2 D/ T
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 ?5 E3 T# y: z3 e t( I& U: q
/*
$ R1 o* }- p( e! e/ z, _% q# P
* Check memory range for valid RAM. A simple memory test determines
6 U" u! F) M0 `% w# W4 h
* the actually available RAM size between addresses `base' and
! u4 }& e' I0 Y9 f
* `base + maxsize'.
/ a6 K5 [3 U; N( u, z: ?9 l
*/
0 W7 ]% J' g- s/ R. I) v( m; v
long get_ram_size(long *base, long maxsize)
( @+ y+ q7 Q, E- L; z5 A
{
" j; \3 k k5 Y M
volatile long *addr;
9 Q( G; t. H. |9 y: T7 O. z
long save[32];
: r, B* M1 F/ r z3 K
long cnt;
. _- P7 R8 M G: z
long val;
5 t1 t8 V0 }) _: l
long size;
; M5 K. A) {/ m: F2 B
int i = 0;
5 K+ Q9 P* k4 d9 |4 I2 e
' N9 E6 q7 r) T6 p. w* J3 @
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ |: |- d: P+ T! x& l
addr = base + cnt; /* pointer arith! */
, a- _; [' }3 p9 q
sync ();
( t% Z0 [1 Q' J
save[i++] = *addr;
4 u8 _% A' H$ d5 E
sync ();
; T, ^, o9 b0 J( |; Z, t$ [
*addr = ~cnt;
1 o4 p( }" d& Y
}
8 q- I" e" \' x- Y% ^
1 X9 \1 y- w# g
addr = base;
0 A/ f2 z/ D% y% w3 e
sync ();
5 }. g& V2 |; n
save
= *addr;
1 {/ ], D. s4 F! A; h* A8 k
sync ();
8 {1 l7 B3 j( h- v4 L# [
*addr = 0;
6 j" S, _3 F. H0 k
4 G, B+ o" ]6 u7 g0 f8 Y7 Q
sync ();
g! f: z+ K+ B+ `! Q5 a2 |
if ((val = *addr) != 0) {
0 v( S6 d" [5 k& }- g3 ]% `
/* Restore the original data before leaving the function.
# a& D2 C' T+ A( y! U
*/
3 y! s/ G) Z/ `: A* {% L$ O
sync ();
, \) S3 Q$ F. ` Y
*addr = save
;
0 G! w% S1 T- Y: T, K
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ F" o/ C Z8 s% a' i4 q
addr = base + cnt;
! p3 k! U) {6 A% \ {. X
sync ();
: m* G1 G# r. v4 _% b, Z9 y0 j
*addr = save[--i];
5 ?* U* _& h2 |/ p) v! [6 e- W
}
# @" s" _' D( _' l$ b+ M$ ?1 T( A. Q
return (0);
7 {: j3 d+ K; H* X6 u& R
}
0 B+ F! P" A& t
7 P) u% g& a, s8 S" ^
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 L6 R) `3 V, x6 M
addr = base + cnt; /* pointer arith! */
8 J% _9 Q4 e2 l
val = *addr;
+ K! P! _: q1 a3 U ^3 |+ V
*addr = save[--i];
( G7 ]5 e) ~ @2 @" [2 x$ y
if (val != ~cnt) {
- a2 _6 n+ {# Q& p7 j, m
size = cnt * sizeof (long);
. Y0 Z# D& Z3 D+ {- g/ q* q
/* Restore the original data before leaving the function.
- r4 I; C3 ~3 |4 |0 l9 V7 A& J' e
*/
* ^8 A/ L- M9 m* X
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* z* I o/ i: T1 M6 ^' Z9 m
addr = base + cnt;
1 v% Q; w3 q* A/ T/ f9 b2 I
*addr = save[--i];
" x! K v& z3 Y) L6 s- [. s4 {
}
8 O9 W- I) {: F" F( l( G9 J" ~
return (size);
( h' I3 r. q( [8 K+ _6 f' E
}
1 ]5 l2 ]" h- z, H" l* b
}
% D: ~8 x" F7 ^7 `0 \
: b( M. k6 i2 h4 P
return (maxsize);
1 y2 i+ [% [# v, v
}
' V7 L3 _: }( H' L
int dram_init(void)
+ I; V1 ?6 Q9 M
{
: W: }- }# F$ T% x( s, t
/* dram_init must store complete ramsize in gd->ram_size */
$ g: j/ B+ g. J( }0 s
gd->ram_size = get_ram_size(
# \) f* B/ L( f3 T& W; d2 ?
(void *)CONFIG_SYS_SDRAM_BASE,
; B9 M) {1 o" L5 f& ~! o* x3 _
CONFIG_MAX_RAM_BANK_SIZE);
1 p2 _; h9 a3 M$ s5 i& c& k& E
return 0;
: o, S& G p( i& w0 q( n
}
: Z7 _0 u1 s; h2 `4 y
* i' [' M' |/ h- t R$ v
6 ?0 }- N7 Z" n
$ e8 m6 X& ?' C$ I7 r! i
" K/ c% n1 f& L6 a; I- f
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# j5 R! r1 h4 v: M
. E" a8 b0 w! @0 W1 g9 ~8 S( W
& A4 P2 g& l. _
' I8 G! n+ s' Q8 D9 ^4 N5 c: M# T
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4