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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit, n; @% x" b1 e& X( X& F
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
/ ?! e8 ~7 w) ~这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. u3 D5 a$ r1 `; K+ A( [2 T, I* K4 p* Y  u' N$ |" u7 {7 f
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, k* f" \: C0 V8 z' a+ K# |# b, a5 Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( n9 w7 C/ m( r" U/*3 N: L. R' [6 |' n6 w
* Check memory range for valid RAM. A simple memory test determines  I8 |3 |  ^" a. l, ^
* the actually available RAM size between addresses `base' and0 g8 q+ p6 G4 W& ]& O
* `base + maxsize'.
4 A4 p- r9 H9 C' `& A6 G*/
2 O3 G' E6 b* W9 \! a9 ~long get_ram_size(long *base, long maxsize)/ C( f" I: ^7 \( ^& h8 s
{
0 F3 i4 z' g' K        volatile long *addr;7 L. f+ W5 B  o) |
        long           save[32];7 a1 s' o5 J3 ?% m" k9 S
        long           cnt;
0 |, U0 ?" e8 p* l* O, i        long           val;
3 r4 h+ J6 w5 g1 E        long           size;
' O% _9 ^/ V6 O+ ]5 L3 l5 I" O        int            i = 0;* `% h- q" W; U9 e
+ o8 y: u# G' u6 L5 G
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {; l4 e% \7 m/ U
                addr = base + cnt;        /* pointer arith! */; T, }' N7 @6 t! H( n: W
                sync ();
$ F* j- a0 P8 ^0 k; p$ C- _                save[i++] = *addr;
( D( Q/ q8 H, ~3 ?                sync ();" A5 b2 g3 x2 Q. q. r8 g4 c6 z+ v
                *addr = ~cnt;; m* g7 |9 @7 W, m5 a' K
        }2 Z. {% A1 B+ ~! P, ?0 {
* v' |* U. P; `* v0 z
        addr = base;
0 q! z: o, M; D: x- V        sync ();
, i8 ]. E* e& O  Y% A& b        save = *addr;
# J! I! x5 U6 f' f) K        sync ();/ Y- R4 v6 `! c, X4 d; A4 x
        *addr = 0;- C7 Z; P: x: U6 U1 E8 a

' V! l* d$ r; z- i        sync ();
' w9 D5 @, E/ [$ R+ L* P9 d        if ((val = *addr) != 0) {8 b' h1 _8 D, L! n( ]9 E/ @
                /* Restore the original data before leaving the function.
* |7 R2 M* o! e4 b) T: E# P& s                 */" W) a" D0 Y0 R1 ~- T1 k
                sync ();/ n% W4 J" L' e
                *addr = save;
- C" J. g  ?2 P" v/ p' Q                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {! I6 `4 A% x+ R+ x% o7 P, w9 I: |
                        addr  = base + cnt;
6 v" u9 c/ ?1 n: V' ~                        sync ();% ]/ }1 g, q# A2 y3 [7 |
                        *addr = save[--i];
( b2 e% N2 z3 r  O  k6 D                }
" g" C  p( G* R4 {( Q. B                return (0);- n* I8 Z3 N$ R6 e/ }5 c
        }7 S/ U$ A6 u& C& v7 e' o
% ]* u. ?7 `* O( p" p* y; T% w$ K. \
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 f' w$ m7 K# f# `                addr = base + cnt;        /* pointer arith! */
% V3 d8 o( ^8 y2 |: Y8 v0 O9 e. \% w! E                val = *addr;
0 q8 F( i$ d( I2 I: }9 J& q                *addr = save[--i];: p; h7 Q/ D. i! O
                if (val != ~cnt) {( E0 q# Z* @+ E3 M/ }% E
                        size = cnt * sizeof (long);
# r1 ~, y% M3 d3 f0 Z5 b                        /* Restore the original data before leaving the function.
7 [/ e. S3 F: j- c: _# p                         */
# S' w& y( e% V+ T                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: I% ?6 Z5 P4 O' S1 |$ z, A! e
                                addr  = base + cnt;
+ p) v1 p3 {2 M! O, Q* V- T- Z                                *addr = save[--i];8 g$ N/ i$ D. ?
                        }/ Y6 B$ m" N" b6 J3 V) G
                        return (size);( m/ Y- `3 a5 w# m2 g
                }
4 O8 K7 g% }6 A$ F  ~. K7 ]! F1 u        }
' }; b6 u1 K8 u/ o$ A7 M
4 G. D5 z- V, C) W* {. i# L% X        return (maxsize);
8 L. {. {+ O2 Y! g0 W, d}$ b2 x7 i  q/ E& o! C  j
int dram_init(void)
" h3 A, y4 a' E9 r2 j% h{
8 z# j, X3 Y( Y; _/ f' j; L7 y        /* dram_init must store complete ramsize in gd->ram_size */; h% w8 c6 D' c8 S
        gd->ram_size = get_ram_size(: h* H9 y2 L. q" W" X. v4 I
                        (void *)CONFIG_SYS_SDRAM_BASE,
! }6 m3 u; \! `0 J                        CONFIG_MAX_RAM_BANK_SIZE);; [" r$ t/ K1 e- ?9 D
        return 0;6 u2 v3 Q6 s: h7 P, v! l
}
) v! H6 _5 D7 k7 g2 a
4 T" k" }( c  Q0 K9 F, L, G4 q0 t% A; O8 c$ r6 V
3 C- V. v- F) U7 @5 A" T
4 c9 ~( C. Q. d; K
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 _% Y4 t2 V+ d, o) X% A. N" H3 {4 y0 A; L4 L
' q: u0 m5 m% q7 j+ L2 j4 I# d
  l6 r4 N$ B9 s) [( o4 p
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-9 05:20 , Processed in 0.039841 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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