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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit7 P! j! |- a" p+ @% y* R% O
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
7 j, u) ?. d) }# d1 }: p# [* \这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 ~9 |" f" m. g1 \4 y/ O0 }# L# A& e' P- g: S
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, v* _$ Q* W, M- ?+ g
9 I+ \6 P% d! l7 X- f% P8 C+ l( W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% D3 O* p5 p/ q+ k
/*# o, A8 T$ n# R  }4 |) J$ R& M
* Check memory range for valid RAM. A simple memory test determines# }7 z- ~$ L0 I' G' h! |
* the actually available RAM size between addresses `base' and5 k8 ]# D  z' K( V+ a6 a' t: d* f  U/ R
* `base + maxsize'.( r5 @( b4 ^. m; |8 D1 f
*/
2 G$ l! W  v- p; Y( M  c0 Ilong get_ram_size(long *base, long maxsize)
# e- B9 ^" L# `/ {{
9 A5 ~6 ]! L/ Y, [1 p3 @        volatile long *addr;
( a) }2 X- l+ K9 E$ v        long           save[32];* x/ }: \+ e9 `
        long           cnt;
6 M8 B6 h5 |: {# [        long           val;2 ~1 F% i) o* Y6 ]: E. r* v6 f& h% o
        long           size;9 t* Y) N, V! p) ~! N& n9 S# t
        int            i = 0;+ p, x7 @5 @1 `9 f8 d$ A# g

' M! I+ w1 }- q' l7 [$ z4 V        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {  \; f4 ], I  N! _; l. `
                addr = base + cnt;        /* pointer arith! */8 ^/ R4 R% N( N" u+ j1 w2 ^& Z
                sync ();. l1 Y) {9 e0 ~5 v' _( g  ?" X8 Y
                save[i++] = *addr;
- [4 n& T1 F1 t( O5 F3 q0 I: Z                sync ();8 |+ a/ H9 M# d& @
                *addr = ~cnt;
% x" H) J, S8 S8 L: G) d        }7 j3 k. M5 t1 s

, M& q1 O, ]8 [* U        addr = base;- ^% w; s9 M6 o! f* k: I
        sync ();
5 |' a) q- y9 ]! _: W& J  I$ x        save = *addr;
8 T" C& l6 k8 I/ j$ R# C        sync ();: q! c0 t! A5 C7 B% I
        *addr = 0;
7 h+ B- V9 n0 A' p" }! ]; U' _: u- ?) D9 G. }( Y# ]3 v
        sync ();
: n7 g9 e+ j8 }7 O% _% }        if ((val = *addr) != 0) {* o, Q  P) w, E3 q1 y! t6 [
                /* Restore the original data before leaving the function.! B8 w' \) `# f$ ~" N/ V
                 */- S. x2 ^3 s% k' M1 x
                sync ();
1 h$ S7 j* o8 I6 T                *addr = save;7 U' \& q( L$ G7 ?' \- P' B2 J
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 I6 \- h4 I& W+ `  t                        addr  = base + cnt;4 Z6 i: n. T9 ?# Z: y# w
                        sync ();
, i. A. x5 _( O+ J+ E7 x                        *addr = save[--i];
' ~+ _8 C" v5 g4 c. o                }
: k- M1 Q: _4 m8 H* o9 p                return (0);! Y1 \) }- ^0 D1 k4 R4 a
        }
; H2 h+ X; c( Q4 ?1 g$ Q2 ~, u: ?( a+ k, {" C* P
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( S6 z8 V7 Z' J2 }; u9 d5 e
                addr = base + cnt;        /* pointer arith! */
: _. }$ A3 G) b6 o+ i" Z3 }" O                val = *addr;
$ c2 l- Q8 f9 z5 t2 _                *addr = save[--i];
+ Q1 z  S! N( d3 U7 ?) N5 x" z$ s                if (val != ~cnt) {" P: B& e6 ^7 n+ x1 [: d; X8 I
                        size = cnt * sizeof (long);
% w2 ?" P" T/ j, P9 W/ z6 v2 e' Q                        /* Restore the original data before leaving the function.# E; U* }( N2 r5 Q1 t8 f, \
                         */
; k: i" N+ F. m5 z  A                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ R  Y4 M( z7 L7 C' H+ b% C. \+ [                                addr  = base + cnt;& O% N+ G* T. a0 X* T: s
                                *addr = save[--i];8 D5 N- Y9 K- P( N
                        }
! w0 u; }2 n, h+ p6 F! J; G                        return (size);, m5 ]2 T/ h  m
                }
5 H5 D5 t( z3 O9 ^: U% i) J        }
3 C' h7 z+ {# w' l# P" l3 O* b0 p
        return (maxsize);
8 }/ l" l4 [2 `3 @( ?}) H" u6 ^. j4 j1 G1 j
int dram_init(void)
: X6 J$ E% A' N5 |{2 B9 b( J9 y9 B- O, T9 O' o
        /* dram_init must store complete ramsize in gd->ram_size */  H- W  b; `+ b  |8 K7 O% j
        gd->ram_size = get_ram_size(/ e( J1 Z* v' H' @
                        (void *)CONFIG_SYS_SDRAM_BASE,  R3 q* |9 o1 Z  Y7 \& T
                        CONFIG_MAX_RAM_BANK_SIZE);, J7 B9 J! A7 G$ Y0 @
        return 0;5 _, N4 ]5 J# R  j
}. p- N1 `) R' r) r% E
7 v! C1 h2 m  E& d+ G  H3 j# O

5 d' F$ P& ]( ]( F2 F' ~( ^0 H. P8 L6 O8 h

4 a) ]5 Y0 O" O( ]0 @0 U$ TFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!5 Q+ ?' s9 L" h" n7 x* U! c
" {  ^) ]) U) h# J- g5 q( \

9 S  s6 N# i: M) l: O: G+ s

8 _' r1 k7 C. ~3 Z
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-5 16:34 , Processed in 0.036681 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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