TL138 uboot是怎么区分配置两款核心板的 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5584|回复: 1
打印 上一主题 下一主题

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit  e, H, v  ?( C5 R' A
核心板2:DDR2 256M Byte   NAND FLASH 8G bit  @1 _1 Y9 H) I
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
  b+ C2 n2 s# h0 a9 L, ]2 F7 l4 b  _$ K9 L
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?4 l& i# g  m7 Q5 H# u
. l$ e4 u( _, E9 f# e, @) S  E+ G5 S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! Q3 J& U7 @, D9 x6 ]6 c7 Z/*& A- l3 p/ G7 g) Z' b" I' z
* Check memory range for valid RAM. A simple memory test determines" Y  |; t) Y3 B
* the actually available RAM size between addresses `base' and
" v& u6 R6 H+ m3 L6 Q! B6 v3 \* `base + maxsize'.9 s( p: |2 ~- m* H) `  u
*/% \4 l1 X' r5 C$ V
long get_ram_size(long *base, long maxsize)) D6 i4 E  M6 W- }
{
( o* }$ H  A2 M        volatile long *addr;
( a; X3 I! w; k1 Q5 Y( U: ]        long           save[32];/ h) P/ [/ ~$ ?# i. r3 m
        long           cnt;
4 a9 m5 Z% k' l  K7 L        long           val;
$ V+ N4 Q7 j% W9 ~0 n/ E& R  v        long           size;
, k. f$ j8 x0 H6 L1 J  o3 u        int            i = 0;
# B1 `0 H5 \* F3 B( q8 r5 ^- K  I' T* U) ]: R
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {9 t& J, E6 z$ A
                addr = base + cnt;        /* pointer arith! */& B; Y; {* Y/ @
                sync ();
( k( O4 |* S2 L1 ?/ F                save[i++] = *addr;+ e( N! ]$ w6 L0 U5 E2 C
                sync ();: y7 F! y1 \% u1 o& J
                *addr = ~cnt;
  X% w- S  f8 n# T- V" V8 v        }1 `1 p5 |2 H9 v, E: R& [

+ x* D% |% W( b9 H( _5 S" a+ Y  ]        addr = base;1 f( V% \! d4 Y7 P
        sync ();# V! h: i- M+ e! K
        save = *addr;
3 q$ s9 p3 [6 U1 O, d% B! g9 o7 C        sync ();
/ m% Y$ L  n8 K1 R  ]        *addr = 0;
5 |& D9 L: M, j9 W, \/ I3 H" b
7 t8 U: I5 g$ H! y0 _: }        sync ();
2 b/ F8 K( e- b% O        if ((val = *addr) != 0) {
  a& h% J* i* [  e6 s+ Z                /* Restore the original data before leaving the function.
4 _0 a1 G8 _. ]' \                 */
1 i  n9 j% U- \7 h7 ?8 S2 l. u                sync ();
( g! a, A9 O5 F1 W# o( y                *addr = save;
* N( j( [8 l& x6 V                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& ]% h/ J4 o8 }3 ~                        addr  = base + cnt;# r( h" o' F4 q3 y; W
                        sync ();
! [. N* \5 ~+ B! l* g                        *addr = save[--i];
# h; B- F$ x! b/ V- Z                }
5 w0 b+ h, R' `# u/ D- [) |                return (0);
$ X& n) m! B* g; d7 E        }
) d9 h9 [, c; v7 u+ |5 Q  |3 Y) A
: r- j# G1 z' J        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 D6 R" ~3 x8 E4 R: P9 a# ~
                addr = base + cnt;        /* pointer arith! */2 E7 B3 ?. P8 c
                val = *addr;* j4 u& B; l, X
                *addr = save[--i];
! F( Z* J2 e3 u                if (val != ~cnt) {
( l! j) k  ]" h7 D! r" K$ m/ e                        size = cnt * sizeof (long);* t/ {0 O/ t$ ^$ X" R
                        /* Restore the original data before leaving the function.
! ~- C! y  m3 T+ x2 L1 Q                         */
7 r2 R$ ~5 t/ G) G6 Q                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 I9 @0 R& L4 y% R' \2 V" E                                addr  = base + cnt;; }" J$ T, G% ]  c' g1 O
                                *addr = save[--i];: ~  \) A) k! g; {. W
                        }0 J7 v2 F% t, _0 t4 K9 h$ W9 \
                        return (size);
# Y. T4 K7 b$ W/ V3 N6 |' \6 d) X                }
" Y  B, u4 ^) }3 L# ]- V& q/ h        }9 z% x/ X' f% C& r
. m9 I1 d+ D5 q) u3 y
        return (maxsize);; Z% T2 K( {$ p5 ?8 ~, w
}/ J% c5 g* b- v- u+ C
int dram_init(void)
& T8 S& n; w" j1 c* _+ Y- W{. Z9 T" w: j0 e# ^, O: z4 n. I
        /* dram_init must store complete ramsize in gd->ram_size */& g( d1 \. }" U8 z; K; P$ H+ W8 z7 j
        gd->ram_size = get_ram_size(" Z+ S0 z1 x7 s
                        (void *)CONFIG_SYS_SDRAM_BASE,5 E) Z6 l, N; H) |4 `/ I
                        CONFIG_MAX_RAM_BANK_SIZE);
8 A: A3 Y, a% c! }        return 0;6 m. I; m* f. i+ ]
}
. m& j; {1 }9 g5 k  x
4 T0 _8 x8 q% i4 r& h& P- f2 [, n' B7 N$ ?3 Z# C6 Y) P4 u5 b/ G  A

7 S  |- m% O. r. f6 j0 ?! d
; d. u. }6 ^+ GFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 L& c1 g5 d! u  ?, b) L
1 x# _! [1 W8 O2 Y4 e2 X& ]' E: J8 O' V% E# M; J- g. \* `- p
: P% D" v( ?8 G( E" E* [5 _
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-24 20:20 , Processed in 0.038987 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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