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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit% X+ i" d$ w2 u$ m0 S$ R9 t- ^
核心板2:DDR2 256M Byte   NAND FLASH 8G bit% N& Z% d# [! K: b6 i6 K+ C
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 A$ i6 V  w; x1 U

  r8 I( a6 n: F, n% T是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ \" a4 b9 k" h1 z
, _5 m$ A4 A& n+ t6 p% G0 ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, s9 w& W3 y; H2 m9 J" ?* Q
/*2 x$ J" e" _3 e+ p5 |0 W
* Check memory range for valid RAM. A simple memory test determines
. P+ E$ X/ W- P1 r' I2 u* the actually available RAM size between addresses `base' and7 G' c3 \3 R0 n5 h
* `base + maxsize'.3 k- x6 K% h9 @# b3 i7 ^
*/  d# v& s6 `% N
long get_ram_size(long *base, long maxsize)8 J% n( y# s5 p& n
{; `' e1 Q' x4 D" B: Z0 d
        volatile long *addr;; o9 T# o5 Z1 l  _5 z% C
        long           save[32];
" [. c, a8 A/ B( x& u        long           cnt;
9 J  j8 v. L7 n" q! {- g2 B" h        long           val;
0 ]8 k9 Q+ @$ f4 C2 H! l3 f5 {/ g        long           size;
& B& i1 V# q" r; K9 H0 T0 Y        int            i = 0;
: z: ^: O; J( F; e& Z6 A. z- K3 {7 h7 ^7 G- _/ k
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ o2 M1 H* j5 z( Y- q6 p                addr = base + cnt;        /* pointer arith! */, u- D6 f6 x0 o' L
                sync ();
, Z1 p% u/ t& L* \+ a                save[i++] = *addr;7 h" c0 i7 a' P5 \0 b
                sync ();7 O' ^8 t  q6 V
                *addr = ~cnt;$ o- E9 G/ n+ P1 G
        }. A7 b* A( O3 Z3 V

8 E6 ?- R" u7 H' ]% ^0 g1 O) d, Q        addr = base;6 ]3 |" T6 o, p$ p
        sync ();8 u% K9 u% c6 g, W. e9 ~3 \
        save = *addr;
: ^- @0 e3 f. |( b( O0 y' X        sync ();& @& e  M7 J8 f3 I9 S) m8 r; R
        *addr = 0;$ [0 C. G1 e8 s* e. F8 ^( E# Z

5 r& K5 v" U1 ?        sync ();
$ d* i* Q1 F0 v# F9 `        if ((val = *addr) != 0) {
9 i# R, Y# z: T& V  H                /* Restore the original data before leaving the function.
9 r; p, W7 O! ?6 H                 */( V7 d/ c" y" o; W! f; A
                sync ();
8 f0 P5 B$ g7 a# x# p                *addr = save;
  w1 ^  E6 K2 j  k4 J( ^                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ L2 W2 Q5 k9 }; X, r( S) R                        addr  = base + cnt;$ C9 G  E- Y0 n! h
                        sync ();& F, M4 Z! o  L( o- s
                        *addr = save[--i];
, C4 K( Y  a& c$ E, l; P                }& B. u  _( ?% }+ e+ ]# U0 T. f
                return (0);* Z" J# }1 t4 }+ U" Y
        }4 F* V  V7 t: ?! j( d# z; @( P
* _/ ^5 a+ V6 W
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) O0 S9 t9 ^/ ]) d+ n" @
                addr = base + cnt;        /* pointer arith! */; A7 l, e  S+ Y4 g6 g$ X
                val = *addr;) [' K6 f' v+ r4 k2 M6 P- z
                *addr = save[--i];$ ^$ C) z* C* e
                if (val != ~cnt) {0 M9 |% P" {0 u( y& L' A" b) g
                        size = cnt * sizeof (long);
- D4 h7 _. u7 G; O                        /* Restore the original data before leaving the function., ], {2 V+ w! b/ K
                         */
: Q/ x- }1 P7 B& [; N                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 j2 \% {. N& W: f. P9 `: H5 F
                                addr  = base + cnt;
( E% e* b4 Z7 F7 C2 }. p) ~# x                                *addr = save[--i];
0 `8 D; R+ m% Y& O                        }
, L9 p5 P' ]3 }) t8 Z                        return (size);
9 Q  g1 l8 Q1 V; H+ @                }/ K* w, O- J) z3 k
        }( o: A8 a: f7 J% d7 n/ {! f" p4 F

, T6 r: y% Q! F/ V7 C9 ^0 b        return (maxsize);
. n& X5 h. b& |; h8 d: K}
4 D6 h! J- m( F0 `# x2 A. a1 |4 Wint dram_init(void)( s! o9 S( ]: ^' j. M  d5 e
{) Z, j# K9 S7 ^+ f
        /* dram_init must store complete ramsize in gd->ram_size */  k7 S5 R+ ?& p2 i$ Y
        gd->ram_size = get_ram_size(1 O; k, Y2 N6 V) F: N& r; v
                        (void *)CONFIG_SYS_SDRAM_BASE,0 x' t9 u5 ~* ?# O: `; R2 v
                        CONFIG_MAX_RAM_BANK_SIZE);. P+ B/ t3 Z$ \* g/ F* K" h' z! B
        return 0;/ x7 x" S& k3 l8 z
}
" ?- F. a" T+ u7 O0 s% l3 u$ t/ _7 f' E6 @2 [

: O& _6 s; ]8 M8 l+ T  M  c* w2 a7 r2 i% {: x. L: S, q4 m' k7 m0 _' N

+ \! h6 G" ?  |+ t2 a, QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# c& h: Q: s, y1 i8 |
& \) Q' N) v0 Q1 ^0 p5 Z$ Q2 o9 V3 T! Z$ |1 y' b1 f5 k/ r

- s+ t$ Z" R1 [" o1 G
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-20 01:45 , Processed in 0.040256 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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