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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
3 |! P& y' v* K: E1 {) b核心板2:DDR2 256M Byte   NAND FLASH 8G bit* X9 ]( `9 `1 \
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?; o) d. B# ?. x- w1 O, S" T: c; Y
) u) `; c2 l9 l" i% Z) e9 v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?4 Y! h: a3 ]5 e! F
$ ]: o' `( \; K- U0 z7 h& _( Y9 k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% u: {, T* n% a' g
/*
( X2 ]( A5 s6 d* Check memory range for valid RAM. A simple memory test determines  C3 f& A5 ]4 e% S# P
* the actually available RAM size between addresses `base' and
# r2 v0 q6 W2 u2 D5 o* `base + maxsize'.
* U4 H% s) a( k9 Z4 Q: e*// w* j: R7 I& _9 N3 |( p1 P
long get_ram_size(long *base, long maxsize)
( ]1 f1 e: a; L" K- F# k  Q* g{/ K0 N+ N* L3 {/ R( Y* G
        volatile long *addr;1 l( r$ h& Y  p, U
        long           save[32];
9 J% b0 c" W6 K- t. I2 d        long           cnt;
+ {+ L/ x( D' }/ ~! L        long           val;
. T* |( G/ A+ W$ u- D        long           size;+ E9 I0 B: j! q( T
        int            i = 0;
6 m7 R. V% ~6 u, z4 g; H# z" ~% n( u) H' r
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {+ Q5 @; L+ _. b" [
                addr = base + cnt;        /* pointer arith! */
, M$ G- i. [" ?8 M                sync ();* H+ s- }! m2 Z" _$ [
                save[i++] = *addr;& `+ H, L3 t: E3 {( b
                sync ();( B9 T6 H! m; B3 q
                *addr = ~cnt;
$ ?3 ]' P# P) N2 U) {, r        }6 b1 Z* K' [# e2 P

5 F+ t2 d- E2 F( b$ E. ~        addr = base;
7 G. Z& E" L) D" _$ |        sync ();
6 u+ x9 d( T/ P& M        save = *addr;  o$ ^; U) l- ]
        sync ();) _# f/ G# c1 O
        *addr = 0;
( c1 m/ Y6 a* R) F1 g/ ?
7 q% V. S  {* [+ ^1 \$ W! w        sync ();3 q, F. p+ n) T; C" V/ {+ n  R, \5 F
        if ((val = *addr) != 0) {
# C8 a9 [: t" q. i2 [( [9 u                /* Restore the original data before leaving the function.
5 q9 a  F& u3 Q, a                 */
- G6 r! ^9 H* q" f1 u                sync ();
9 r- k" N# {4 [# T5 j  {                *addr = save;6 T* s; B9 D1 P& e: v
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" P: U" A& t# H- {+ x  o
                        addr  = base + cnt;
4 h; n& V$ v8 Z3 q7 [% V                        sync ();
! l  E# G, ?/ ]                        *addr = save[--i];
/ U. V+ r6 O6 `- V7 h4 m/ N4 U                }0 y0 p& _6 C" |% ~
                return (0);% j) F2 r& x% }1 q+ K
        }( P' O; [6 Q/ a" S
" z/ r/ |/ A0 r
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# S1 ^" v% E1 k
                addr = base + cnt;        /* pointer arith! */+ q: A5 X* D  v
                val = *addr;
$ e" u$ c5 \' H7 v& H+ U                *addr = save[--i];% B5 A: X$ [% P6 v
                if (val != ~cnt) {; Q+ G! e  ?$ p+ ]
                        size = cnt * sizeof (long);
  Q0 d2 a  S9 n& ]! b7 f                        /* Restore the original data before leaving the function.
4 E( F% G. A7 n; V                         */+ H) q  [$ Y% H* }; O( {
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! F% C, I1 B* W5 r; }. P4 q1 Z% u1 \
                                addr  = base + cnt;
) P6 U+ u& l8 ]                                *addr = save[--i];. Z; H8 i) l/ s& v( n
                        }
( s; h6 C, x2 Z' S                        return (size);5 Z, |, S1 u% O7 B5 C2 J: ?6 P1 k
                }
4 d& q; n7 e6 \4 K/ ^$ o        }
& B# n* c! a7 x1 Q/ q1 L/ M! Q: i! ?0 C# X( [& _! g
        return (maxsize);/ |3 ^1 N2 H4 G" g  G
}5 ?' q0 \4 G5 ^' A  ~
int dram_init(void)
: ?9 ]# W, @+ V! w; L% |/ a/ ^{
2 m% C; Y, j( ?7 p" d        /* dram_init must store complete ramsize in gd->ram_size */
/ d5 {& |- E' a) }' ^        gd->ram_size = get_ram_size(
/ i+ Z3 z5 s+ m8 S- V                        (void *)CONFIG_SYS_SDRAM_BASE,
. K/ c, [. u# F2 b& u- R0 X1 @                        CONFIG_MAX_RAM_BANK_SIZE);! M% e8 Z2 c: K8 V5 |3 l
        return 0;. `" ^. c% f; L/ y/ @9 R
}
' {8 a+ W- Q+ G# h  W  x4 n2 F/ ~/ b' }9 x, Z7 r
, }# s2 r- L9 n; [3 \: i, Z
9 \- h7 O4 A* v
8 H! ?: _7 @" s% T5 b0 u' |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; w- t3 n1 J" F4 x6 i' F
0 u* O9 Y: Z! n. [( O$ u* w( g" d- x- p9 B

; T3 j2 f, G7 F' s
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-9 22:52 , Processed in 0.045488 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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