嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
' z7 H$ j$ D% v1 [
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 }. J# S" m" D+ ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 Z$ L0 T3 x! t% \ ^, L' Y! G
- Q2 `0 }8 t0 r' g
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 w. N( z6 W% ]' K2 G# I( O8 [
& e" t1 W+ U- I& o( {, s X) M
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* e5 I" @% B. r4 f9 O
/*
+ ?7 C- b) D1 g5 a1 t3 p- a
* Check memory range for valid RAM. A simple memory test determines
7 w: `+ N E/ x: S! _% k
* the actually available RAM size between addresses `base' and
6 {( I' D$ o6 x* i
* `base + maxsize'.
% b9 l% t" J7 G: h' O8 `; _/ M# k; I- ?
*/
# ~* ~2 |; U$ X1 Q. ^" Y
long get_ram_size(long *base, long maxsize)
s' N0 \# \$ P' h. i- |
{
( I( m- n- z, y1 z% b
volatile long *addr;
: s2 Z: S- S) N @1 o
long save[32];
% ?& l' K& G- r6 h8 L9 U+ x+ ?2 n
long cnt;
& y# x, n B( t, u# C
long val;
1 P- {2 v# ?0 ^3 d4 w" `
long size;
( V: x& Q& a/ n8 c: o+ c
int i = 0;
. N* C4 i; H: Z/ Y2 ?" \" V4 Q$ x
8 e; ] c0 k" _' w. c( x
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* I/ s, H: y c( G4 s
addr = base + cnt; /* pointer arith! */
# x. a* J$ N7 O+ H- y# U7 r+ y D
sync ();
" [$ I3 {7 c( j1 Q5 Q' r, Y
save[i++] = *addr;
0 O( T3 I( {0 t) T& L% w/ a
sync ();
0 f4 B4 ` K. `# L, e
*addr = ~cnt;
3 P! F9 k7 s' f9 t% R
}
' J& h" G* T4 v; M
. ^$ Z7 F) f% H+ [( t' l6 o7 z' z
addr = base;
9 S( T& L, X, S
sync ();
# j! H9 D u4 H9 O
save
= *addr;
- \) G7 Z1 N" Y1 k1 X; q! B
sync ();
3 v6 @+ S$ N# z6 A& X2 p1 ~& n
*addr = 0;
: b; N+ j. V+ y* {& n. p
) p* y8 X9 u3 w
sync ();
! |( G& V4 t8 k9 ^! i" s/ c, M
if ((val = *addr) != 0) {
! _0 r" c8 U! A G
/* Restore the original data before leaving the function.
: `; ^# r: M0 k; r
*/
' P) z+ P; w* X+ n- K+ s
sync ();
! f. \! ]1 b, [; [* `: {7 i, u4 J
*addr = save
;
! k# W w& @, L! v* I a# R
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ p' L" h5 q* o. t+ q" N$ v' H
addr = base + cnt;
- j1 Q: j4 d4 C) r0 p( w& e5 U
sync ();
/ ?$ U {) j# g' u" k, O; [
*addr = save[--i];
/ D: ?3 u. ?" @7 B( m5 X
}
+ P/ V7 r! W' C! P; O
return (0);
- A% b4 n3 B: X: A% ~
}
3 I8 [2 ?% [% \! r2 f7 |
6 L7 U9 |- s5 N, z: u% p
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, V! ^0 O: ~" u4 E
addr = base + cnt; /* pointer arith! */
8 b/ q( i6 D% y/ ^
val = *addr;
& ?# p; D$ y% n9 F
*addr = save[--i];
# g# t; x1 Z1 b/ E% P! F- _
if (val != ~cnt) {
. n% q( y; \! H' r
size = cnt * sizeof (long);
) T2 `! N* d) W3 ]$ z! Q" M
/* Restore the original data before leaving the function.
* Q0 M0 b5 t F ]2 _5 u3 k# A& H9 v
*/
( Q! ~. ?( k1 Q6 b
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, z9 U- ^" L2 u" I' j9 K0 C% G
addr = base + cnt;
' u$ W7 e7 R4 S+ l/ ^
*addr = save[--i];
. _& y h+ j; g
}
- K. G) f& S: G1 ?# Q+ K
return (size);
\9 E, G' ^0 {. ~- d9 V
}
8 N' e; p Y* [- f6 x o; W
}
# ]; g5 k$ D% V( x/ l
" b' l$ j2 i- @; K$ F! L, E
return (maxsize);
, ^. I' j: |6 w6 w3 C
}
: t5 g7 ^. C1 I, U* M
int dram_init(void)
/ F# T" |3 d$ x7 I
{
$ Q( R5 A; W* Y. P8 e+ @. {/ l
/* dram_init must store complete ramsize in gd->ram_size */
- ?4 L& ~4 |! w; F# q
gd->ram_size = get_ram_size(
' g# Y* e% B0 V! V: N
(void *)CONFIG_SYS_SDRAM_BASE,
/ W$ R( j9 ^( y, F% h7 X
CONFIG_MAX_RAM_BANK_SIZE);
- `; }0 K1 u5 ^
return 0;
: T: u- U5 H1 e+ O* {1 H
}
/ U6 g7 X4 }8 ?
0 Z2 @4 q4 k3 c5 ]& j1 ]
7 \6 f7 x; a7 g+ W4 I$ R
8 d9 ?3 a* o) j$ y( [
. @3 F: p* Y4 ]# a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 y7 q6 O( g4 B9 G4 e; y
! k6 F4 Z5 u0 ]/ b1 b# {9 {: t
L& ^: t& u+ I
/ P* s; W- L! _ \/ u2 M- b0 J
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4