嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* g/ c/ j/ |6 {( n1 A+ _% w- S
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ ^, o, k O a0 u# Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 N& H- T# [: G p- R
, x( T5 f7 p; H
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& |. X8 l( T1 K5 G$ Q7 u7 H3 D0 O
. w; D% `3 J5 a! g2 y
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ Y0 v+ q4 a. _ \/ e
/*
8 I7 o! q' i! m5 f) ~
* Check memory range for valid RAM. A simple memory test determines
5 n, L- g+ H# O6 V: S
* the actually available RAM size between addresses `base' and
& q: n8 u* B+ Z# {- }6 P9 P3 Z0 j
* `base + maxsize'.
. i( g# Q2 y, k+ Q, |
*/
5 s+ n# a' _, M3 ], l
long get_ram_size(long *base, long maxsize)
- @6 z- G# D3 {
{
) ?( h1 z. p% s& J7 U8 t8 ^) x
volatile long *addr;
/ x6 m2 r+ E8 H9 p
long save[32];
; U P; c* I! ~" W: c
long cnt;
$ w8 I! S- @3 |: m( F# L' \
long val;
! Q, t( U" v7 d
long size;
/ v4 S; \5 _. z4 j# @
int i = 0;
/ `- S0 s6 z9 x+ |' K
) |0 [6 w; }. @ L# o
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' ^0 n, s8 ~* d
addr = base + cnt; /* pointer arith! */
' g4 Z; v% |( o7 r3 M9 P
sync ();
/ N7 K2 p/ r! @2 _8 _# }# Z/ k+ k
save[i++] = *addr;
. L) R6 N, h* H8 _: T" ^: h- T1 S6 n
sync ();
e5 u! g" \; c" @( i
*addr = ~cnt;
1 \; k7 h$ D# k9 P, h
}
7 B! a# F. _; f9 }5 |) C3 r
" H' a( P Z. u- R$ a( F
addr = base;
9 k7 n- F, _: T( n" N; ?& {6 J
sync ();
" a( c: T/ A" E3 w5 M' r
save
= *addr;
6 Y# Z Y- D0 F
sync ();
$ y. T7 v1 K1 ]4 S4 ~
*addr = 0;
- v6 Z+ n& n2 J7 f
2 P- V3 E0 @1 d5 Z1 _8 x+ v
sync ();
6 M' K$ J1 ^" H9 f; t
if ((val = *addr) != 0) {
! q5 L* q5 F/ c+ V
/* Restore the original data before leaving the function.
+ u3 z& B: n: \0 h% `" \! z: }
*/
8 h! O( c7 Z% P
sync ();
" {6 R$ m/ ], B P9 f7 I
*addr = save
;
* y2 p! f/ |$ v6 f5 m! t
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 p5 @* ]7 B! s! e+ M' {" e4 S
addr = base + cnt;
7 a" _' A2 _6 x( }' v
sync ();
. Y5 |. v0 |" `& T
*addr = save[--i];
* c5 h% H8 k# ^5 r# o
}
; m) f1 w. S5 ^! a. q; `
return (0);
/ p7 S( ~! A( E( k3 _8 `5 e; D4 A2 F
}
5 H: c2 F8 h I, Q0 ]
) b j7 E: z" B6 i. \) W
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( g# |& n) u; T- O8 c
addr = base + cnt; /* pointer arith! */
0 S; |/ k: a+ r: j8 E
val = *addr;
/ `6 ]' C6 v8 ]) F. |
*addr = save[--i];
0 H& t' k+ w# [- X8 t9 [0 |" V, n
if (val != ~cnt) {
0 ~# _: z' _3 B! `- g/ j* t; @
size = cnt * sizeof (long);
/ F$ }( @0 o5 l( ]! O# G
/* Restore the original data before leaving the function.
5 x) Y3 k& u6 g
*/
" V' M0 j% j4 w) {1 }# Q
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* I, q2 Y ?+ V! p7 @7 r
addr = base + cnt;
9 u! e" }3 G1 a6 i2 H! c
*addr = save[--i];
- `6 r6 Q6 P9 o
}
0 @4 h& ^; @( E* r$ O+ b
return (size);
7 m6 e1 G5 {; X# S+ m5 b
}
+ u9 k. [& C+ p
}
' A( e/ u: U( P# ?& R: V
/ l: g( p# P( m& m
return (maxsize);
% e( A! x$ G" w
}
$ b+ ?, u: V, b0 b j' N
int dram_init(void)
" w" n& g( Y- b; G
{
/ d# a# X3 t2 ]+ Y% O: j
/* dram_init must store complete ramsize in gd->ram_size */
* {& I4 X9 R. F$ l- ]3 |
gd->ram_size = get_ram_size(
+ Z7 ]# q+ y$ X
(void *)CONFIG_SYS_SDRAM_BASE,
C% n( N; h+ X- S$ `7 _4 @1 I
CONFIG_MAX_RAM_BANK_SIZE);
8 H, K& g8 [; H/ N* S
return 0;
2 I7 I. x1 P/ R/ p' }
}
! Y2 D7 |# i% m- k
! h5 u0 U& H3 c; U+ \
7 E0 F( O( f# a( X4 D. W" Y
8 ^7 i/ Q- [+ W; J4 a4 y
- t5 t; I) W* N2 C
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* R9 m" x6 s- D: T
7 X- \. l7 q$ T, p; y" p$ a
, ]0 ~+ T% ?6 c Y; v- r
8 P O& G( l0 R3 Y7 k* N
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4