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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
3 v7 ~) a, ?3 X7 i: I核心板2:DDR2 256M Byte   NAND FLASH 8G bit
5 z) H9 Y+ n3 c' O; X这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?. j* _9 ]5 P: W% M% M+ ^+ i  H$ w
6 `+ ?8 \  n9 {/ W# c8 \0 Y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; z5 Q, D/ |6 k* f; n! i9 ]2 x) V6 C; b8 O- v! ]' o& H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 f7 m- G" q8 S% |4 @% j5 u/*
$ O5 r# _2 M- F) m* Check memory range for valid RAM. A simple memory test determines
8 ]& J& @" x1 E8 U% a$ O* the actually available RAM size between addresses `base' and# A8 Q4 b! A4 `" C& Y/ G8 ~
* `base + maxsize'.9 v6 M$ l+ K0 |: k: s
*/
' _3 x2 H( H9 a. J/ r: h0 d. Mlong get_ram_size(long *base, long maxsize)
2 L: v" L8 i, ]# v: I{' C. m  q1 G5 a0 f
        volatile long *addr;) m9 c) R" n2 ~
        long           save[32];' Z3 I6 _7 O6 O. q, U, B
        long           cnt;
4 {5 x4 t( c$ s6 {        long           val;
7 _) R+ y, G) [. S4 q! U0 X        long           size;
/ {2 D8 e. x4 d        int            i = 0;
& H4 S; K4 J+ o) n0 G
4 B' \0 d9 ]# J        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 M! [# g' L* Y% k                addr = base + cnt;        /* pointer arith! */0 f6 J+ r3 b0 f; \/ s$ l
                sync ();( W9 C3 V/ L3 i! r
                save[i++] = *addr;
. \5 w6 S) T5 ^1 ]2 M% K                sync ();
- `6 k0 T0 D1 C                *addr = ~cnt;4 `" K1 S8 R* W2 m$ G3 F
        }( j9 [! \  }& \# L  @
, L& z1 q; g9 m1 B( d
        addr = base;
$ k0 \2 D& ~0 _. E        sync ();
/ n3 q& l0 Y7 A3 _! a# {        save = *addr;
  f" ]  b. K. C8 W" P        sync ();
% a" w- I6 R0 ~2 H        *addr = 0;2 J3 E" h7 R% V8 Z- `( K- Y, g# O

$ A7 a( a! D! d' X        sync ();
% D1 ^) t: `/ q3 M        if ((val = *addr) != 0) {
1 e  ]) Z' y' @! H# T                /* Restore the original data before leaving the function.
: W  M+ b1 `9 W: E" ]8 Q                 */
6 a3 B/ g% g: B! z0 e8 }$ g& @                sync ();, Y$ E! k5 y1 v6 F; l# ?) a
                *addr = save;. T5 K- `0 B4 S9 V; @
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 s5 C3 j* e) \) W0 {                        addr  = base + cnt;
0 y0 f2 ]$ z& }/ d                        sync ();
2 C. t1 |+ K+ K! I4 \: l! O8 O                        *addr = save[--i];* b% d2 b8 N# _$ W- i, \- k4 W$ X
                }
6 V* i1 Z# {# M, u' Z                return (0);
; m  p4 w# d( \- l        }* M' j2 v2 v9 o; {! e
2 O3 B# J* d/ z! Q
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( ]( B6 s; |# P                addr = base + cnt;        /* pointer arith! */1 c, I" p9 \% y" c" X  b
                val = *addr;
7 ]6 r. y" d4 A  m# U                *addr = save[--i];
& I* i' r# _" P$ }1 A) B" `2 B% t                if (val != ~cnt) {
: H7 ^( {, ?. C                        size = cnt * sizeof (long);) E% V0 `* u) [% a. j
                        /* Restore the original data before leaving the function.
% l$ }2 A& b; |! h7 J( n                         */6 ?) ^  L+ P) r$ C5 \8 P' G) [! b
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% R, C* [" w- R# N# O                                addr  = base + cnt;
" }( D8 [# h! S+ X                                *addr = save[--i];
. d6 d) U' ^$ v6 f                        }9 z2 e0 y- w1 K) C
                        return (size);: `+ o: n9 ^/ X' e! U/ C
                }" F3 H+ x/ i, ~: T; Z
        }
: Z4 w4 Z2 f( k" M$ }+ u, N  o. T3 O2 o: a4 s1 x1 Y& |
        return (maxsize);
" u- O1 X+ m& F6 d/ P$ W: u6 u}$ u  q* \* B2 g, \8 H* j( ]9 F3 U
int dram_init(void)
' g$ n$ g8 z% m: r8 h( C  A{" O+ w) i, n6 p8 `3 t5 \+ K
        /* dram_init must store complete ramsize in gd->ram_size */" [+ ?  p$ `5 F: G) E
        gd->ram_size = get_ram_size(- D, F2 U* l0 I( e/ O
                        (void *)CONFIG_SYS_SDRAM_BASE,/ s4 S4 m- `% ]) A
                        CONFIG_MAX_RAM_BANK_SIZE);
9 v2 l5 o" _  L) @: ^        return 0;& Z) i0 \0 S1 V7 ~
}' g, e3 F$ z+ m& ?  B
: G/ E+ E4 |3 F2 ]
- l9 [) L3 c% q0 }+ M! k
! L+ p) I3 c& R+ ]! U1 g

+ L6 |* [9 w. B- XFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( h" N+ |" X) ^3 A
9 z0 @% g) |& w" r
2 c& ~) A3 l+ O$ m* m2 v1 ?
6 H2 h& X$ u2 A/ k
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 12:46 , Processed in 0.041894 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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