TL138 uboot是怎么区分配置两款核心板的 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4102|回复: 1

TL138 uboot是怎么区分配置两款核心板的

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
发表于 2014-9-11 09:33:39 | 显示全部楼层 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit: }  G4 e6 h4 l4 v; x* n
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
) {0 ?  }* \. P+ f+ m1 |这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- S$ Q) y3 `9 L
2 S) u/ a3 W/ B: r是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; g9 s& R, {. \8 a! T3 j  q8 l. L1 k: x0 p0 V5 X; I
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
发表于 2014-9-11 18:55:41 | 显示全部楼层
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:/ n7 _* F( y" ~
/*/ f. N  q9 P( `' _4 Y" Q$ O8 v# y. F
* Check memory range for valid RAM. A simple memory test determines: M, d5 j7 m& c6 v0 z
* the actually available RAM size between addresses `base' and
& {9 R9 Z1 Q2 Q" a$ }0 |* `base + maxsize'.
" n. }/ ]% d( e5 s*/
, O4 L( A( ^9 X" H7 ]& m5 along get_ram_size(long *base, long maxsize)3 x& v- w7 _1 N1 O! `7 u
{
3 ^& A* c- m  H2 Z3 Z        volatile long *addr;
% D1 Q+ v+ l0 w& e/ c2 X: a        long           save[32];
4 J2 B9 A% h. z# A        long           cnt;* D# C' U( g  H6 p$ Q
        long           val;
7 v3 y" E+ f( [/ s  n        long           size;
/ V9 p1 j! c. H1 v0 R9 C- ^        int            i = 0;3 m$ D( j1 _  t# O

& E0 v' V& B+ P9 c8 R6 @        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 L( F! A9 M: y# T5 Z9 v, ^2 ?! p                addr = base + cnt;        /* pointer arith! */0 v3 j# D- ^" \% W; n4 z
                sync ();! ~4 d4 V6 S8 b# b% v
                save[i++] = *addr;
, i9 h% O$ t9 d0 f7 \7 P4 [                sync ();- s* s* Z9 ^5 a7 i* f4 N! W& `) C
                *addr = ~cnt;0 F+ v) v( O  F% G& l9 J- V2 b  a
        }
0 e! l1 q1 W' H3 ^6 s0 i: c0 e1 B7 P3 W( W& ^% v4 ]+ ]. C( x
        addr = base;
6 |6 e6 k! J% N; ^& i, Y% P' X0 V        sync ();
+ p/ p1 X" [4 k0 A7 {) j* s        save = *addr;2 t  m  S& N( {, q% G! D* L5 i0 E
        sync ();
! T% N' A7 S/ p        *addr = 0;
  f  K! {6 L" v( I+ G" a+ ?: c( H* z: V2 |% J4 @
        sync ();6 P  }6 t2 y0 H. s: |9 L
        if ((val = *addr) != 0) {" \9 n: X4 _1 x3 g1 \  J
                /* Restore the original data before leaving the function.
8 ^/ v( U- U$ D3 O- F1 y7 E                 */
6 l0 j! I; Q! H: q$ Y                sync ();
0 _0 T# D( T4 V$ _0 i/ X- @                *addr = save;
5 E/ s% F$ L% a! W                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {7 ^8 z% [% S. W3 J
                        addr  = base + cnt;& C5 {# D/ K7 X  X6 R' w
                        sync ();) I% ~+ p9 A" d; A7 ^6 u5 C
                        *addr = save[--i];
, e3 B8 c" P9 n' [8 U                }
7 E% t7 \! g6 s( T5 Q$ L5 ]                return (0);
" `2 ~1 ]3 c9 T- ^8 F% o) u) h, c        }' E2 N* K( a: w1 v! ?: Z
/ A% Z, D6 g9 n, r7 Z' U' E# f
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 \$ I5 J5 X/ t/ z) {8 N1 r
                addr = base + cnt;        /* pointer arith! */
3 w& }, {% w6 ~" z% C) {6 v: @* x                val = *addr;
- P& b  M9 h3 N- L4 p                *addr = save[--i];3 V+ D9 k, L. |* N# A; C* w* C
                if (val != ~cnt) {
8 m0 j: H+ A! `* X+ n7 W                        size = cnt * sizeof (long);" W+ z/ x7 K- O4 |
                        /* Restore the original data before leaving the function.! N! \5 u' H0 a/ Q& B( }" a
                         */
8 x" X$ }' f! k/ g$ @, ]6 z                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) t) e8 V. q% m/ _+ ?1 m! Z* H
                                addr  = base + cnt;4 B5 U2 H* g: q: X
                                *addr = save[--i];9 l3 G) K. X1 Y
                        }4 |" f7 G5 G& Y' R$ U* L6 h
                        return (size);
) D% G! _6 H1 c3 d& `2 w                }3 f- p9 R) b) [( o. M
        }9 H3 P4 d4 R& J5 b# y) y: j- F
" [2 z  ^( E3 P1 i3 G! ^2 c
        return (maxsize);3 F8 p0 s& C1 e6 ^/ s+ B6 K
}
7 F5 M2 `- b, |* ?4 Y& \int dram_init(void). {$ V, U, W* Y% I8 W6 Y
{" _: l( B" |  z: }
        /* dram_init must store complete ramsize in gd->ram_size */$ c! p4 r0 ~8 S' n. x' Y+ Q
        gd->ram_size = get_ram_size(
- ]# G2 I3 \3 \                        (void *)CONFIG_SYS_SDRAM_BASE,
' B/ w; @- l* K9 u                        CONFIG_MAX_RAM_BANK_SIZE);- e9 A% {# D7 Z2 d
        return 0;
7 |9 R1 K6 p9 F! B- {, G% S}
& X+ K& ~# K) u  S4 x' u: B/ v0 G- G4 @8 g
' u6 {) g, @3 _" F
& }" \7 n- z) R. U1 h
4 N2 X1 g- o. M0 ~
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 Q6 n2 l+ X4 |! r+ t/ Y5 P2 U. u2 s# y
( i" M3 s. z, G. I: Q' t
5 {6 ~& T: R3 ?" ?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-3-29 16:18 , Processed in 0.038844 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表