嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* u3 G7 \0 d: B/ g1 ?0 W核心板2:DDR2 256M Byte   NAND FLASH 8G bit
& x0 }" M- _$ r& X. f) H2 V这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; d& a3 a# Y& o# z8 y) h9 D9 N
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?1 N4 d. R; Z8 e

, d0 |5 ?8 |* \- t
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* t& T4 O3 M5 v# p* _) |/*
/ e% J9 i+ t7 C* Check memory range for valid RAM. A simple memory test determines
) _2 a  [6 p/ e/ r( z' L* the actually available RAM size between addresses `base' and; b1 M' D0 b  p2 e1 ?2 }
* `base + maxsize'.4 ^% q( q. w" `6 D0 q
*/
" ]1 ?4 Q7 `. l: K, B9 z& klong get_ram_size(long *base, long maxsize)
7 j- F3 `+ K( N& h1 m  |{
% @& k, k1 I' B+ p        volatile long *addr;+ f0 M" A4 e* N7 b$ g
        long           save[32];$ `& M; Y, X! T! |" g
        long           cnt;
  ~; m- y1 E; t' p3 e! W        long           val;8 R3 ]$ h) G3 Q  y
        long           size;4 N% q( `' D+ S
        int            i = 0;
6 z- s) ~; B% R- _$ \$ W
7 ]- A) Z* r$ Q3 x        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# d/ B8 o  P: @* ?2 I/ u: g% ~                addr = base + cnt;        /* pointer arith! */
& b! g1 o6 X  d1 V                sync ();, s  r6 ?+ P0 d3 E6 J& O
                save[i++] = *addr;
8 [& E% G" X7 f$ [! Q2 H                sync ();  K0 B) |& ^+ {
                *addr = ~cnt;
0 v: v" L  q: x        }
  M9 z0 o1 v. Q2 \  p3 Z7 E
, t  I# J, v- E3 a9 r8 x        addr = base;
+ D8 K3 c& [9 e" D7 n        sync ();
+ C6 t" u& a2 J+ c3 m; ?4 H4 g/ o        save = *addr;( P5 O+ u) q$ O: m& S
        sync ();0 C0 L8 ?0 P1 c: N$ q1 e8 w
        *addr = 0;6 g4 Z9 G. h; ^- |9 x1 b' \
8 V2 G) K0 q7 u" R9 {
        sync ();- h8 K3 f# r2 T7 W  m
        if ((val = *addr) != 0) {
, p4 Y4 r- O, @  V0 Y0 |! w                /* Restore the original data before leaving the function.
  h' o7 T- {: f; D                 */
: M/ I) b2 z) s0 I2 p7 @2 U) g1 k1 d                sync ();: h) c, y5 F1 H2 v# i$ Y
                *addr = save;
1 l# f+ o( r) @- G, C& R                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 |  |! g0 U4 t: h3 X9 G% R                        addr  = base + cnt;
) Y6 C- B: P& f' x/ o# D                        sync ();" k- S$ A; q: O& L
                        *addr = save[--i];& U3 e2 b( X, B. O# `
                }) H9 r; A6 I3 Z% {
                return (0);/ D& k" R( \# S5 h9 y0 @' {8 a, A
        }5 D- O8 |. q. W* |1 K& {, O
* C5 P' O( A/ K! d5 C$ x2 i
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 B+ S8 K6 g$ \0 w1 @3 K/ i: a                addr = base + cnt;        /* pointer arith! */
* f" R: v! M5 M3 g2 d* w" i                val = *addr;
. ~- D7 k# U" F/ b1 ~                *addr = save[--i];9 ]" \/ P! j$ w. F$ u
                if (val != ~cnt) {; h  ^& a3 ^) s/ \
                        size = cnt * sizeof (long);( z: y8 C6 ^+ W  Z5 V1 l, p
                        /* Restore the original data before leaving the function.
1 K" m1 b$ [  h( q                         */
9 f& E" {1 E6 n2 X9 T0 a                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 h. {4 W: ~8 }" k) b+ M( z$ @
                                addr  = base + cnt;3 D* `/ Q, W0 K- h' Y
                                *addr = save[--i];
5 F/ |, R5 C, C9 M1 O/ f                        }
/ F* @1 K9 w0 o1 y0 W; w0 {" q) R                        return (size);
. l6 k8 a3 R4 ^: `4 b                }# G6 E% I# s+ X( @2 _3 N/ x6 x
        }
; g: p+ P3 d8 S- Z4 T8 v
' f2 f- p* E6 c# v/ @2 k6 m# r$ ^        return (maxsize);# C% u, i% _; b: S4 J3 y* Z
}
. r( H+ M5 _, f6 u( |& ~8 {5 [int dram_init(void)' {; F; x  b: z/ s) q
{
3 Z0 `8 F: [- `+ g2 ^3 M$ Y        /* dram_init must store complete ramsize in gd->ram_size */
. ?+ ~5 X4 U( t- V' L+ b7 c& v' v3 }) j        gd->ram_size = get_ram_size(
9 n+ a  f% d6 q  t                        (void *)CONFIG_SYS_SDRAM_BASE,
& \# s# V/ K/ n! @                        CONFIG_MAX_RAM_BANK_SIZE);" T$ y" s& S( H% Q& t6 q8 K; H
        return 0;
! m+ S0 D  s$ A" V6 y& f}, m+ p0 }+ L# y; m5 ]$ d$ b/ y
" Z9 }; o: M$ c0 {" y( Z

# e1 Y) _+ W1 Q# Z; ^4 D
# G( H  O: X( F0 Z* W9 Z) [7 J" {) K5 _; E6 k: Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 c2 v$ P& e0 `+ u! i* H4 [$ F7 ^4 ^5 O) g7 _% ^* U. N3 Y( I; }
9 @( `7 A  O3 [0 ^* G6 q; i, i& d
; I0 c$ u3 L5 G) ^# F3 F; v





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