嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 ?) ?: r/ h) Y Z! e
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( ^( q* D1 {4 H: X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 w! q# A1 ^0 @2 ~6 J3 ^3 v
! s$ W2 I& _0 J! N
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. e7 V8 a, d5 L" q. w$ {) Z
! t3 o8 I5 }2 _+ D' ^
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. P, G. h) [# f3 N( J4 G/ s6 |6 o" [
/*
$ e& p" h' a& \
* Check memory range for valid RAM. A simple memory test determines
( d7 e. ^# q2 x p5 j. d
* the actually available RAM size between addresses `base' and
h& T# P, w$ I1 s2 F
* `base + maxsize'.
* G! \+ }6 f8 y- S* N: J2 G
*/
- d# X% C Z% S( R$ [ ?3 \
long get_ram_size(long *base, long maxsize)
0 o. a9 b* |8 g0 `" s# E
{
) F" t0 Y& B# A! d/ x) H) o$ _
volatile long *addr;
" D) ]8 L+ `/ ^: t7 V% {8 l
long save[32];
@+ r# S/ L5 k! N
long cnt;
2 @# ], M( o5 b% C: p
long val;
8 F; q# K) w% M: h7 W; ^4 n: c
long size;
8 A4 t3 w: Q% k; o1 O; z
int i = 0;
! Y% L: A0 x0 u5 T. F
- K( C, S: ?0 P$ B+ @- z
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- G$ k! v3 D0 `! K0 @" w
addr = base + cnt; /* pointer arith! */
% l _% ]4 U% W4 s1 B c& |
sync ();
3 ]* ^$ Z; O; Q* S+ m
save[i++] = *addr;
2 P7 W W' {! S9 f" C4 P) ~
sync ();
5 K% A( X3 R$ L: |& Z7 d1 {$ g5 ?1 d
*addr = ~cnt;
. ^" }, T+ C: e" l8 }
}
' b1 m5 q7 T* {6 Q; k: w# g4 J
3 m% c# R. B7 y# [, N/ H
addr = base;
3 `: I+ w- q9 j! |2 C3 i3 y# t' |
sync ();
3 O8 T' s. q6 f% D% W( f9 S
save
= *addr;
+ I |! m/ ^. J5 t1 k
sync ();
. J" \9 N" l9 a
*addr = 0;
( R% [, A( A9 E! [9 d8 F" j
`9 Z+ {: d. Y) X1 V+ b y
sync ();
- ?9 C* R% E! A' |
if ((val = *addr) != 0) {
, O" l3 v0 S' {: f) U
/* Restore the original data before leaving the function.
7 G. z+ [9 b+ ^7 m, n2 [
*/
6 k# c a5 R8 f: y% B' o$ a
sync ();
% H4 x/ W- w% K% I- T0 K
*addr = save
;
& Z/ m6 Y- F+ G3 d) S; b2 J6 l
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 n# u: S/ {. T# O# O
addr = base + cnt;
8 G- l8 q, b6 ~3 T2 s
sync ();
( z" j. [1 u- m
*addr = save[--i];
" X" s& F% z/ `6 e( l
}
' }) H t) Q4 b
return (0);
- Y- N B' h) g
}
1 [! \2 M/ S4 U
9 T2 F- @0 L4 @: l7 v$ g
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, [% E k: \. B# D0 B
addr = base + cnt; /* pointer arith! */
; R6 J$ L% q3 |+ D
val = *addr;
. K B# [$ d2 H$ e
*addr = save[--i];
, F3 s% w* m, h% z$ I
if (val != ~cnt) {
; B+ E0 r8 ^( g1 X0 q8 ~; p' V
size = cnt * sizeof (long);
. w' N9 Z R) ^
/* Restore the original data before leaving the function.
5 {" t0 Z: [5 Z9 U
*/
- S# t/ b/ _- e) j; I s
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 g& f: P9 K. T- T
addr = base + cnt;
, O% X1 D4 ~) l m; q2 D
*addr = save[--i];
/ D8 n" n, x( ]. X3 a1 H7 _
}
: p7 V- q4 s& g- f, f1 ~- ^
return (size);
9 p0 }! F4 C5 y; X* s5 [
}
6 X' S2 b I* ~' R* k, v, W
}
3 h& l% M# R* @: e) Z
" e& O" f Q, X s/ U
return (maxsize);
) e3 q( V9 |2 w8 B K* u
}
# c6 Z2 S( L! ]3 [4 Y X3 V K
int dram_init(void)
8 H( y5 c9 J& b
{
6 u @ O3 ^6 O
/* dram_init must store complete ramsize in gd->ram_size */
9 X( U# s2 f/ t, b8 u3 M; Y
gd->ram_size = get_ram_size(
' ~; D' ^9 t- [ x) N; m
(void *)CONFIG_SYS_SDRAM_BASE,
+ K. Z. {9 F! `& e# b
CONFIG_MAX_RAM_BANK_SIZE);
, m, f6 G1 b& s F2 h
return 0;
+ U! P& N2 C0 w4 K- u
}
' n8 T/ G5 T- Y! Y
& L; @. F3 F, F# l( E- L. }
% Z, y0 L! `: K- |# Z
, W" P. W$ G7 ?! B1 x
" K3 x+ _1 _8 u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% H/ b/ a! u' M5 H0 v. p
% Z% e& L. j2 W$ C, v
8 [# e6 G) Z8 F# I0 t. ?
% r+ h7 Y! f9 l( C# _
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4