嵌入式开发者社区

标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页]

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit, k$ D+ {  _5 x+ y) c
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
( d. s3 r9 e& o这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?* N: L8 w. R/ o: m
# S- N" D; S2 `* d/ W, ?
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; F' q( p- d6 R5 Q+ p% v% h
1 D) d0 y! w/ Z1 V( g  O
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) R! G; `, F3 {' X( M
/*' p' Q/ W2 X& T
* Check memory range for valid RAM. A simple memory test determines# G' Y  ]( B7 T% K) d
* the actually available RAM size between addresses `base' and
4 S, G& a, E. R$ Y) [) C( ^* `base + maxsize'.3 p' |3 B4 o# Y% b! {! R3 D
*/: x% Y( ~6 R4 S% A* [, k5 ^0 P' X
long get_ram_size(long *base, long maxsize)
1 s0 ]- l3 u" Z{
  K; a# ]5 i5 \" h        volatile long *addr;
4 t0 G" m0 Q4 A$ `        long           save[32];/ g' j  ^8 q0 a+ \/ A" }6 O8 b7 h
        long           cnt;+ p9 o! S- I. H9 x9 n+ o
        long           val;
- ]/ @  e/ w, [* ]        long           size;6 w, n5 j* P# n4 C
        int            i = 0;
8 x& M1 ~$ Y" _% Y  P# `
8 E, m5 M) l5 h, V        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 i; z7 U; r: R1 ], P                addr = base + cnt;        /* pointer arith! *// J/ P; e! z# W+ q) |, a
                sync ();
! ]$ ^) {. `# P' }0 e2 M# X! o" n                save[i++] = *addr;
0 q' B! f  n; ~2 J% J                sync ();/ o0 I0 q7 a% A3 s
                *addr = ~cnt;" \" F7 i' `9 ~4 l1 Z9 T
        }
' E8 y) d9 @) {. _6 T" G' R8 D; x
3 A) l: \/ G, v" ?" P        addr = base;
5 C5 G  d- h/ X9 {( m- G7 C0 t" ~        sync ();
( d. m; h) |: j3 f5 e0 C% A        save = *addr;
, ]5 r. y5 a8 y/ D! t9 M        sync ();$ T. i% O: o7 y0 L# l. j
        *addr = 0;; a! l# ^! t3 X4 F
4 p: W( m9 T0 Y) H6 A! `" [! [
        sync ();
7 w' I6 H; d$ T. h7 O4 ]        if ((val = *addr) != 0) {
! f$ z4 V6 h% n# y: w$ `( }$ Y                /* Restore the original data before leaving the function.2 X3 Y; Q5 R, h
                 */2 o. |5 {# [& w6 P( @0 Q
                sync ();
/ v! |/ H" y1 |* O' m/ [  ~# D, `6 L                *addr = save;( e' D) r! O. Z+ H
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ m1 L0 L" X8 f9 u' N. t1 f
                        addr  = base + cnt;
0 n2 C- ^% t( w8 i2 g                        sync ();
/ Y" P4 h1 e$ {% v                        *addr = save[--i];) _$ Z' r# Y( u8 T
                }: D3 [+ g$ @* g; W9 }
                return (0);" q+ c) s' n( t9 _9 o% k3 u/ e7 r
        }7 r  s3 c4 M& z; ?
- w9 _0 O+ ]% f2 R5 p' V0 j7 Q
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 I# Z7 ^5 k" ^; j+ R- u
                addr = base + cnt;        /* pointer arith! */
7 ~5 I7 K$ P& t9 {3 k$ }% ?; P                val = *addr;/ K+ j+ g: z# O  T4 d, v: o5 _
                *addr = save[--i];' i  h" q4 A6 q
                if (val != ~cnt) {
( |# F* u4 e! Y9 K3 k8 o4 b& z                        size = cnt * sizeof (long);3 i* [2 f7 {; L. H& L& V! q, F) ~
                        /* Restore the original data before leaving the function.' [9 t3 l8 S2 S1 m" E( ^
                         */
; W( J3 R# R4 M/ o; I                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 k* t* t! Z( X* S1 b3 k0 o8 ?                                addr  = base + cnt;3 x; B$ f1 U4 }$ R4 K9 M5 q2 Z
                                *addr = save[--i];& q! I* L- i7 F
                        }
8 _4 _3 R, R, v) E/ Y2 a: W7 x- N                        return (size);" d$ O( W! g6 @. D" q- k9 `
                }
4 g! K% j0 `( J/ |( T+ C0 p        }
; C5 b- h$ I5 K3 c0 g' F3 I. h
  n& A# f" a! h; a2 O' \4 y  v+ F! m        return (maxsize);3 |5 u: Q3 I( \4 g: w- C4 D
}
$ x& k3 {) o( xint dram_init(void)
1 ]. p+ }2 S( {; p! j{3 s% e+ H: T2 g% Z+ ~
        /* dram_init must store complete ramsize in gd->ram_size */( J0 T0 P) ]$ {) s
        gd->ram_size = get_ram_size(( X7 ]* \$ \8 v. {5 W
                        (void *)CONFIG_SYS_SDRAM_BASE,# `# o! N: Z+ T, F( e0 W
                        CONFIG_MAX_RAM_BANK_SIZE);% U! J. U* j) x; r. F
        return 0;
5 R# i' u  \0 E/ O* I}1 J/ ^/ j2 t. ]: p3 H& w0 R/ ^

' ^( ]+ \" Z2 k* E1 I: [/ i2 ?
/ B1 T5 ^! b% ?/ s; d* R
7 o: i$ p% N( g7 h2 U7 Z* p: t+ D% P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- j$ w9 b: z  ~1 O7 }) c6 l
# r4 N, C( f1 m5 G4 @
- ^) W4 V. d) E
0 M- z* ]' t( A* U





欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4