标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit7 P- n; O' i. H" ~: E% d$ u
核心板2:DDR2 256M Byte NAND FLASH 8G bit* D: Q- c7 i" e2 J
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢? $ Y0 }. k; g: s + N! a+ q7 z) x是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' h8 B) e1 Y+ m' O. B. w2 s
. M+ P/ f2 U! p2 s 作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下: : S8 R- R$ u/ f2 m' t0 ~/*+ E+ ]6 p! r4 Y
* Check memory range for valid RAM. A simple memory test determines) e$ s6 c1 y. `# }( E& _
* the actually available RAM size between addresses `base' and( A3 _: z4 A' `0 X/ i0 x- O
* `base + maxsize'. s& u9 z: I5 G6 O+ V- t! |- o*/ " Y+ r* t% s+ xlong get_ram_size(long *base, long maxsize) 5 {" b" }: _6 I- s2 w0 P# r9 K( M$ j{ ( s& ?/ b5 y) I& V volatile long *addr;2 C4 E- T7 v- J! `
long save[32];2 d1 R1 Y1 B) D' g y6 N/ c
long cnt; % C4 a( a6 h0 j2 [- ?9 _! N/ |5 F long val;; p O/ |$ O0 V: h% r
long size; 8 n/ V! B: x, G! K% P int i = 0; ; E+ m2 `' R! z a. [) Y& Y4 | - n% n; ?% E/ I: f for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 `0 j" G: q+ Y2 b- N3 D+ k
addr = base + cnt; /* pointer arith! */ ! @ B5 k4 W4 @& d4 y sync ();0 p0 H: x4 r* w; N* m6 I
save[i++] = *addr;5 b; N5 d) Y2 C& G$ ^9 W; f
sync ();, ^! d; D, U" J
*addr = ~cnt;- X$ L/ N+ o# L+ E2 N% j$ f
} $ Z" L4 m( m' D! c V. { 2 f& a, g1 Y A% J4 t, ? addr = base;8 |% j5 }! p7 m2 N
sync ();1 {1 I4 @( t4 V' m1 r- w, Q6 w
save = *addr;/ {6 |& f% p5 h4 Q; p& p" n# B9 g
sync ();: n; S6 a" e6 `$ f7 O
*addr = 0; / m2 r7 ^ q5 r# a& ?2 ?5 M% i4 h* }$ M8 C# [* G2 {. ~
sync ();/ T* y6 P* T' E+ P
if ((val = *addr) != 0) {; n- j* l- V% c! |0 _& R& n
/* Restore the original data before leaving the function.% P+ s' c5 P* z' z
*/ 7 @, W# r5 U7 N sync (); / _( v! z+ A1 I7 y4 {/ ? *addr = save; 3 H2 [) J8 v4 L8 |) _ for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {5 Z4 u1 Q6 t) ~4 J4 h7 w+ a
addr = base + cnt; 7 q c% k7 g7 q. t9 F1 @ sync (); & S4 C6 R& z b, O, D9 _' g/ S *addr = save[--i]; # l$ e/ @" W: w3 \. E- \* ^ }8 e. c, G u: ?6 M- Q: L4 y
return (0); ( H& w2 T/ M" s8 G1 y' k } 6 d0 h" c8 H- S+ u& U( H2 |0 D$ u6 U* Z- {# _2 E3 c# E. v; F& Y+ I! u
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ ?/ o# n4 u; k
addr = base + cnt; /* pointer arith! */$ l# t8 \7 H1 C' l4 p5 P1 W3 M
val = *addr;2 `5 p/ f5 x' B4 j4 P) P
*addr = save[--i]; & |! s6 U+ {+ v- c3 _# e7 G8 g if (val != ~cnt) { ) T- L* z: P3 w, o# E5 i- r- j, \ size = cnt * sizeof (long); 0 F/ o$ ^2 G* X0 z% ^ /* Restore the original data before leaving the function. - p% Z' V2 {4 q. K' Z+ Q% M */7 ?4 T: b: G) T7 v
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 W. p! n# W. h3 e L7 ?4 S
addr = base + cnt;1 l0 h; F4 h4 X
*addr = save[--i]; ; _7 x: ^4 F/ _$ O& C5 ? } 8 E: J3 H" g) o2 j! v; ~1 q3 s+ K return (size); , F# M/ O$ o. B O. F }* K4 o; H3 A$ F' @
} ; \4 u0 T6 }! v2 ]0 k! N- C, X% ?" c0 c8 k8 I
return (maxsize);# a. A% _/ m6 j# z0 T2 F
} $ R6 J' s6 ? m% Iint dram_init(void) 6 p* H1 i4 I0 X{' }/ W8 K3 [2 k
/* dram_init must store complete ramsize in gd->ram_size */( F8 [" c) H }: k7 s
gd->ram_size = get_ram_size(' r& [+ C: R0 K$ [3 Y
(void *)CONFIG_SYS_SDRAM_BASE, I9 W/ @; h6 v
CONFIG_MAX_RAM_BANK_SIZE);# ]0 Q2 S ?; Z; [" W, F/ y7 T; ?. ?
return 0;0 h" I; ~9 U2 [
} * N# V8 R a% x) P8 f6 K( Z+ R% g8 x % P: T: D/ P" T; N# E- z' N P8 o) b
+ b8 n9 Y1 \3 o* K* {( W/ V8 Y ! n' l0 _5 O, P3 Z f( FFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# R& `" w( C" c. J; E! e. H
& k. j7 X, ?5 }/ _0 h4 |. l" G
7 |5 W p a# ]/ i4 p6 g 8 p# U0 d: a; Z/ d4 w! _