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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
  F5 S8 F( C/ H, t6 O- R! b核心板2:DDR2 256M Byte   NAND FLASH 8G bit
4 y. g6 A! z! H- i' q9 |7 W这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 D9 {  ?5 F1 Y
0 F1 p# V3 T+ C( \6 w# ^  L是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& o5 ~9 _# R% d, ~& @- @1 Q
4 [5 y) ~% ^% ~: f% c$ @7 E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:4 ?$ N; J3 {. _- C& B, F9 L
/*. i. }7 u. ?6 L5 f5 ]: x, }9 D
* Check memory range for valid RAM. A simple memory test determines
1 J9 x6 b/ R) F0 K% Y+ B. A* the actually available RAM size between addresses `base' and
, q) f9 K5 d2 c4 m. U6 x* `base + maxsize'.! L$ v7 s7 d' R
*/  O$ Y6 L# r$ s5 U, r$ O+ ?1 v
long get_ram_size(long *base, long maxsize)
- {0 [* z) ?0 f{8 ^9 i, j7 t8 I) g
        volatile long *addr;
5 ]1 c) Y8 }6 E$ d: ]        long           save[32];5 m% \& N' {! ~* t
        long           cnt;
  Z# o7 e3 D' a- o7 Q        long           val;
4 ~" B- x7 E) p7 b1 v  U        long           size;
: E( X. P7 T- R/ A2 C5 O0 X        int            i = 0;
8 J) t7 B/ t; }4 w+ H0 a; a) g% F
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ P0 U$ V+ Y. Q+ a* }% P6 ?) P
                addr = base + cnt;        /* pointer arith! */
% C4 }9 |0 R  u; Y! [                sync ();
: n$ K5 S( W3 m                save[i++] = *addr;
% T7 B3 x3 H+ l' N1 Q" }" M3 [                sync ();
1 ?* R' r: P! A' X: c9 E( c                *addr = ~cnt;
: E& a. I& h) K9 g% u        }
% E2 u& U; \0 F  O( F  Q! d& }" M# R9 c5 @
        addr = base;
7 U% ~4 q  r4 l2 m        sync ();: O* y, Q% I* t
        save = *addr;
$ c$ X# j/ D. t7 b        sync ();+ f. P; K: g! a! X' _, x
        *addr = 0;  K' h, U( A, g; O3 ]* n# V

: l9 Q. F! S3 R2 ?5 r- O& A  x        sync ();' Z& D; a% r9 y' j+ p
        if ((val = *addr) != 0) {
3 R; u6 Z! N6 Y) ~                /* Restore the original data before leaving the function.  N, z! a$ Q/ i
                 */
- v0 {2 @# u3 j( H                sync ();( w+ a2 E* y1 I1 N- H% d
                *addr = save;  [6 _& r; d8 h7 p- s# ]
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {& j" m6 f5 j  H0 j/ G
                        addr  = base + cnt;
+ l$ d* H% t- P8 g" a2 S5 @' I                        sync ();
% B) T; w/ E  m1 e! _3 Y: \! Q                        *addr = save[--i];
& B* P& n# x( J* ]( m                }# K) @: r( @/ F. |4 h3 T
                return (0);- Q- o& C  I0 j5 i
        }. m0 e. I0 e' o) W- ]
9 J  P4 |" \  J6 c: d
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! }0 B# `3 J7 f! A, s
                addr = base + cnt;        /* pointer arith! */3 N5 ~  A3 M; \( w% R% A
                val = *addr;
+ V5 n1 d' }  k; k                *addr = save[--i];
- ~0 b% l% s6 l, f! t                if (val != ~cnt) {
; [7 x& G2 S3 Y. r* i$ o7 c                        size = cnt * sizeof (long);
* Y' W9 Q6 N3 A8 U0 h1 j! u; I                        /* Restore the original data before leaving the function./ D( a2 O# s5 _- }* H' Y. x
                         */) K6 P8 c; a, M
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ n( k9 ]/ g0 f- G7 X
                                addr  = base + cnt;9 S# v% J0 F' o( u) ?! h; x
                                *addr = save[--i];
/ [3 s9 M/ H: }7 A8 o; x                        }
7 Q- H3 s- A. o! `( n                        return (size);' _; C9 p) d4 f& `* p$ Z- v
                }" i5 _* s" G# x* ?
        }" @3 ?% @6 d( y# r2 V" H) O. Z
7 ~. t7 C5 Q) B' o% Q
        return (maxsize);
" @' O- T/ Y7 V7 Y; |}$ v0 K! @1 Y9 R) N9 a: l! S$ C
int dram_init(void)6 t- l3 _" j. U$ E: A( d8 k/ T
{5 F3 T$ E: p# F! U
        /* dram_init must store complete ramsize in gd->ram_size */3 d4 w& }" v# P5 y6 |, }
        gd->ram_size = get_ram_size(9 R  K# u( b. k$ v3 d/ C1 i9 M+ q
                        (void *)CONFIG_SYS_SDRAM_BASE," K' |3 h2 M% Y5 W
                        CONFIG_MAX_RAM_BANK_SIZE);4 m; ^. z- y8 u0 b& j8 Q3 r3 p  n  W8 p
        return 0;
, z$ D. m7 i% T& |5 a$ ]; ?4 u! ^! {}
6 f2 d2 H! A" r
" C' ?! K, W% L
+ F0 b& I1 N# s$ c1 D% K
. t& b+ K* B$ Y& `, N! r/ a2 t, g  r" u" S: ~
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% s% g$ x6 P* @$ Z' {
+ ?+ `7 ~' o5 n1 r, x

7 h* A9 U2 l0 A$ _5 G
8 o7 x& R, ]' S) w
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-12 20:31 , Processed in 0.040169 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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