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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit2 D8 ]7 n& N2 u- B$ i% _  v5 y
核心板2:DDR2 256M Byte   NAND FLASH 8G bit. C  S% ?, j- V) G3 b
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 S1 u2 [' Y) p: t' T% s
+ E* u4 i+ |8 H' g! D是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?8 r! a" @- |/ Y& R& |1 z) `; f6 D
+ x% R& E. l' m' o% f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% N$ D$ w2 L8 M5 y! N$ E7 Z% M0 V, e4 v/*0 o/ V* K; D4 l
* Check memory range for valid RAM. A simple memory test determines
0 C$ T5 q- K5 E" |3 P2 c  X* the actually available RAM size between addresses `base' and; u0 N6 D# }/ F- J! p% A9 t
* `base + maxsize'.
9 g2 R: x, O6 w*/. \! V. \3 Q( M2 C
long get_ram_size(long *base, long maxsize)
, t9 ?+ l* C8 S6 _+ p% t{
6 K5 j( [: q* T2 J( I3 s        volatile long *addr;6 ^) E6 n0 s. @) z' A
        long           save[32];
: s) T! e+ i6 x        long           cnt;) p+ E: e1 d$ E
        long           val;
2 G; c5 r/ x4 A# K2 z8 h        long           size;
. a  U9 P0 B6 K# P( A        int            i = 0;
1 D& w7 r1 p: L7 g6 q2 Q  U' }+ f) Q  {- m: l
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 G4 m3 W' H! H( Z$ B                addr = base + cnt;        /* pointer arith! */; P& E. m# C& y# X3 L, V, Q' g) \
                sync ();
' V. S: _, z* k& u# G, s                save[i++] = *addr;) @  p) A: }/ m
                sync ();4 D# L4 [( |  p- }( w& ?# _
                *addr = ~cnt;) _8 Y. m; |& `3 p9 b
        }
9 h  H: N" U! p" C3 C) Q, b7 i) h
        addr = base;
/ @1 Y3 ^4 |+ j. z        sync ();
  Q9 I' H0 N3 N0 M        save = *addr;& @9 O* h  L5 F( _
        sync ();/ K( |+ E3 z+ o2 j: ]& o; V1 J! Y
        *addr = 0;0 f; R$ r8 r% p; s
) d- Y$ X4 J/ H
        sync ();! }6 e0 T) [8 u: t, c
        if ((val = *addr) != 0) {% L: H) U6 Q+ J3 d, s
                /* Restore the original data before leaving the function.) N+ y; p( S$ s9 b2 A  J- ], N2 D" F
                 */
/ l% u9 X$ y  L  M                sync ();
5 `/ G  {8 y7 }1 l# b- O                *addr = save;
, k1 E7 o4 M& @$ V  _! b                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {1 |  I7 O4 C8 r7 B. I. x1 k9 _
                        addr  = base + cnt;/ [# d0 r! I( U5 [  @8 A* j5 \
                        sync ();
, [& T6 v" \+ Z4 [/ I                        *addr = save[--i];
$ M8 p2 H! T1 H0 h6 D% c                }$ N, o# ?' P0 @& V# `$ O
                return (0);
) e- ]% Z2 X3 n* l        }4 P: d2 P9 N+ N+ {
7 v/ K- U: |) X
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 d4 Y( r8 d* {  p' ]5 Q1 d# T                addr = base + cnt;        /* pointer arith! */
- D& x$ s+ f! m% X7 R; C5 d" q' }                val = *addr;
5 ?! B# Z# D% U" G                *addr = save[--i];
' c; R% E& n  w& u8 K5 t, ?                if (val != ~cnt) {" Z& d' h: B- \9 Y
                        size = cnt * sizeof (long);( {" x$ s  K' w. ~- F  T( j" A
                        /* Restore the original data before leaving the function.
3 Q1 l9 X! g0 c7 @" g, y                         */: w# m) ^5 p+ z+ ?7 b' u; m' x
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  k9 @5 t3 z2 m0 Y
                                addr  = base + cnt;
& d$ l3 b. W" G  t# I. _                                *addr = save[--i];
3 |  [# V: v% r% q) Q                        }* q+ N6 I+ h$ N/ \, R
                        return (size);
$ k  D! a8 x9 ~- Y$ [! G# A                }
' I% u) T8 ~6 r7 N# ^/ i        }
- q& R+ p- V  l% \
/ B' ^) x. _; _5 o' b! \        return (maxsize);
4 q# Y) I. ^2 [% H1 I1 K}
& @2 B7 v* x, a; Wint dram_init(void)+ N8 y: v( p% V
{
3 k  w% ^$ a0 ~% o' l, r  a; m        /* dram_init must store complete ramsize in gd->ram_size */, U, \' _7 B, D! b6 w9 f
        gd->ram_size = get_ram_size(
, g; i5 g5 Q  Q+ b0 t' _                        (void *)CONFIG_SYS_SDRAM_BASE,
6 n" ~' D6 l! ^! m, p8 D- J0 R+ ]                        CONFIG_MAX_RAM_BANK_SIZE);
3 O$ K- |" W; O- k. R        return 0;9 Z8 C9 X$ {$ T6 u, L) C2 y
}  K5 M; K7 ?/ i1 K7 ]7 D) k: g

! x1 A  w  K! [+ ~9 \  Q
. w: w0 f' b. K1 c- |, G# D
# {( P2 z- e, m, y) \2 U
  h, q3 B& G% P; z) d7 X3 TFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! e* S; ~3 A; S4 T3 v9 i# K- \1 K% V) ?0 {- Q9 s

" d+ z0 b: @6 l$ n

7 @4 s+ s! b5 e2 T+ [
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-8 05:35 , Processed in 0.040337 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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