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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 B: p4 Z7 b4 a7 k核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 Q% q" Y  L) U0 M6 S
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 ^6 m" }9 w7 u) i4 }* B/ p- `( C# F" s6 Y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?. i4 e1 T1 T7 v9 q, H0 x2 \- k
8 \8 o4 y8 [% C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- {' o, o! }# @9 U0 |: }0 r/** e5 D, s9 u# {
* Check memory range for valid RAM. A simple memory test determines( }: g& M  j  ~7 V
* the actually available RAM size between addresses `base' and+ W7 E! V9 I/ F3 B
* `base + maxsize'.+ k) e& b6 L. n! |3 r
*/: a3 ]& }% B! h
long get_ram_size(long *base, long maxsize)& n- W) \- R. L+ V5 l! K2 k. P
{
9 c5 o9 N: b5 j+ S  [2 \! ~        volatile long *addr;
- i! g( R* E5 p5 |        long           save[32];
* r( @  s, W: `        long           cnt;, Q2 F+ S9 F. F  i7 X: E2 v
        long           val;$ e  r( U" X- S! c! m; |& p$ v1 r" ^! D' U
        long           size;
, U7 G7 z$ V3 }) o' X# j& t# r        int            i = 0;
$ ]" f. c% V: t* u
/ e5 k2 J0 [0 j        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {  D8 a4 G6 [* ~! T7 w2 Y; i
                addr = base + cnt;        /* pointer arith! */
+ B$ j' h1 W: d* ]/ Q$ e                sync ();
/ H! s/ J0 H/ j1 g% {% V                save[i++] = *addr;
. b% x, \& I! u                sync ();
0 c7 I% R: G) ]/ K( d% D8 D8 {                *addr = ~cnt;
* K, ?) c: _0 [8 E# ^. C        }
: S6 Y/ p, @# F4 R2 P8 E9 N- O/ y' r
        addr = base;. X2 Z+ d  Y1 D: h/ `9 W
        sync ();  R4 e5 l% {0 r' X9 V
        save = *addr;7 d1 k. z- ]& \7 U' V
        sync ();0 i1 O  b3 P+ X0 e, t
        *addr = 0;2 O5 o- i' t. w& U9 E& e' F

9 K3 f) E* O( b- F1 {. k  D9 w        sync ();
$ V' @% Q9 M" b        if ((val = *addr) != 0) {
( v' l9 |7 b7 ~6 A$ {7 \                /* Restore the original data before leaving the function.& e5 A/ j& d4 Y) s* P
                 */% I' G: A% Q: C1 P" q4 ^
                sync ();& `2 m  G' t- P- G! N
                *addr = save;; Z5 T3 K" V  f1 y
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% B, q0 g( q* S1 T6 d5 v+ R: @/ ~% {                        addr  = base + cnt;5 g' S) n( \; ?
                        sync ();( g1 @2 C) p. p! K4 E
                        *addr = save[--i];
" l4 }9 |  }- d3 t: u                }, T% F+ D. S1 Z; n1 _* Z* q
                return (0);1 w& S) x: K* w7 ^
        }5 o6 ]% F2 E8 {7 M4 `% f' A- M

0 @; a, m/ O+ ~. ^        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 \. C% K7 t) Y) A, C                addr = base + cnt;        /* pointer arith! */
2 G) J% e& o; G* X' [9 r* Z& v  u                val = *addr;# h, ^+ \! q. R( O* I4 a9 R
                *addr = save[--i];: m. l% j4 Y% q; e- \1 }/ n
                if (val != ~cnt) {- h5 G# W. c3 E- ^4 s2 C
                        size = cnt * sizeof (long);
3 k8 L+ q/ }% \3 ]) z                        /* Restore the original data before leaving the function.
4 }& ?* p5 I* M+ Q                         */
2 M! z5 M2 j2 w( \                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  A3 r5 \# i7 p2 \6 c' K6 X                                addr  = base + cnt;
# c6 G! O6 Y7 D) ^% g/ s                                *addr = save[--i];2 ]# d- E& z3 |
                        }
: I: `1 H) e, w% _  j6 ~                        return (size);  R1 |% B0 p* k2 |
                }
7 d! c* y+ y- ^" n0 a9 y8 c. @7 s        }
) j  z9 C# `" \6 e( u$ p& I
  k$ F: e3 z2 P6 E' H# L" U: _. E) V        return (maxsize);
+ _, c5 c5 b8 C6 u5 e}0 G$ s6 h7 ]3 I9 J: x' I
int dram_init(void)/ f7 a5 r7 ~7 @
{) P9 @" w4 w' \( E: l
        /* dram_init must store complete ramsize in gd->ram_size */
4 n; m% Y4 }5 B% P( Y6 H; m        gd->ram_size = get_ram_size(1 W! L* g/ d7 t) e3 F# f
                        (void *)CONFIG_SYS_SDRAM_BASE,) r% V6 ]4 d: B- T
                        CONFIG_MAX_RAM_BANK_SIZE);' I" R8 B* e- h- a& R( u
        return 0;
2 [9 N* z" H+ i}
  m7 h+ ?7 U- u: V- {' T7 _5 l; D, b( _

" ]  h# X! }+ \8 U
- c1 U; I* T8 I# c
0 b6 V! w2 C- z8 ~  ^. }( ?FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# Y, a% F1 S6 m) s) p- K5 u: D  x  K! v. ^- X5 d
* i5 T$ y; m1 `$ K* B3 @1 r
0 S/ Y* a+ ]% X3 ^' g  Z5 c' ^
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 14:06 , Processed in 0.037792 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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