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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
, Y9 A# w# S6 a0 A4 z核心板2:DDR2 256M Byte   NAND FLASH 8G bit6 ?0 L$ Q. k) _; o, B8 m* [
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 }! J1 z% ?9 C" `2 N% i. T. Q- N0 [4 e8 Y( [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?! W+ o1 b& @; Z! T  p( y2 S" h

  k  a; A1 h5 y2 d" d' G: ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) {( g* h' [! i, E5 N" q7 @* L
/*
) x* T/ k% l. Z& q! I7 F( Y* Check memory range for valid RAM. A simple memory test determines: E5 t8 J. n% O1 @& D+ x" j$ a4 [- G
* the actually available RAM size between addresses `base' and7 u- m" D# K% ~: A! K
* `base + maxsize'.
7 @! ^. b% `8 Z% @- s% q2 @2 E*/
% K1 E% ^1 `) x4 ^0 mlong get_ram_size(long *base, long maxsize)
6 t( a, z* J2 u{4 a  g8 q  ]. ?9 D
        volatile long *addr;2 T. i- K/ |1 K; y
        long           save[32];
  s7 k9 t! ~) \9 {        long           cnt;$ t7 z% @" j5 `4 S+ G; v( \% P
        long           val;# K- y! a$ v- X' g3 J
        long           size;
5 i- _0 ]1 f" {        int            i = 0;6 Z6 U0 I5 |  {2 ~) p9 \, ~6 M
& G! F& |7 X6 i2 k& ^
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {: @4 H7 r  {9 k2 D- y9 Z9 B0 A
                addr = base + cnt;        /* pointer arith! */# @7 e3 V" J5 b' q' q5 U, n
                sync ();! D7 ^' O- X# @6 Q5 l4 ]* f
                save[i++] = *addr;
0 o2 D% Y9 W8 e8 c9 i                sync ();) w$ x6 r* V8 k) w( d/ z! }
                *addr = ~cnt;" Y7 \$ u0 Y6 Y
        }
- L8 Z3 d2 @7 P5 Z, T+ |. M( Q$ [' f2 B4 ?4 O  w
        addr = base;5 @) f, X$ ]" m1 m+ T
        sync ();
* \3 l/ o" @; Y2 Y% r) Y5 ]3 j        save = *addr;+ {. y* ^, b7 a0 y8 b. v3 q
        sync ();
6 `7 H1 L! [) }, S: ?/ V& a        *addr = 0;
7 L: E2 t4 g/ e- A
  f! e- ^$ e' e$ T2 F" f- _5 T        sync ();) p9 N2 `, Y- }; |" m# F
        if ((val = *addr) != 0) {# K  e8 @+ E7 l
                /* Restore the original data before leaving the function.
" E+ _( i8 l. i9 b8 Y' v                 */, _: f" {& {( c7 F3 v
                sync ();
4 c* u" f. g7 G+ P, o( `                *addr = save;" O* w& e/ P, Z1 }+ H( K+ z' n
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, J2 P+ R. |. ~( v% c2 a  W  g+ \                        addr  = base + cnt;
7 o5 c  J, q5 I" w1 H' I" n2 u) q; N                        sync ();* S2 v  ~6 q4 T
                        *addr = save[--i];, o9 q4 I$ ^! {# b% }" @' _
                }
% p3 v9 S+ U9 y$ ]                return (0);1 g  Q( B9 C( v/ ~
        }
: U) m0 h& m3 S% E
- Q' K+ P0 w6 s* @* Z0 m/ r7 q1 M2 ]        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ V) U5 r! X9 w. T+ D
                addr = base + cnt;        /* pointer arith! */4 A: ]5 [  d1 ?/ o4 y
                val = *addr;
1 D7 B6 S% |9 g$ P" i                *addr = save[--i];
3 H1 \2 ^4 g0 d  |$ \, [                if (val != ~cnt) {: E% P+ s0 T& `$ R" G, l$ D  {  i
                        size = cnt * sizeof (long);
3 ~0 O* C' k) ?9 k5 {8 c8 w                        /* Restore the original data before leaving the function.
, W9 D: K: R- E  ^                         */
3 Q( J' m8 A, b' ~, w$ c9 @                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ U7 q& G0 }# l/ f. I. t; e5 y1 u                                addr  = base + cnt;
) M/ W& H0 Y4 t* c7 ^; _                                *addr = save[--i];
3 G8 u9 j4 j3 z* N                        }1 g3 L5 {2 {6 R9 ]
                        return (size);
8 @8 y& H' G4 |6 n, s                }
( @. A3 p) G% a: j        }; y/ g$ q7 D, e% k3 ~
- v1 c( k1 l' F" ]
        return (maxsize);7 ?9 `4 Z. y6 y
}
. g/ R' F; A. I# J! Gint dram_init(void)
* d& ?9 y9 l5 e$ }$ ^# h{' m" s) P  u8 n* f
        /* dram_init must store complete ramsize in gd->ram_size */
: s: x, D3 E2 z7 S, i        gd->ram_size = get_ram_size(  s9 H1 z+ o6 W1 G
                        (void *)CONFIG_SYS_SDRAM_BASE,
* B: Z6 U( z$ b4 A0 n: |                        CONFIG_MAX_RAM_BANK_SIZE);
, {0 M7 @! O4 p  Y        return 0;
' C: u) W1 U, a3 g+ m( v}; C9 N$ o& o$ p7 U; {9 |7 o% k

7 g# y+ c% A  }- n
. h' K0 R4 }' I0 h8 b0 o6 S
# V! W. V* [/ {) g/ r4 P/ q2 {1 l' D
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* T7 S* X% l. g2 Y

0 ?* q; C/ |4 ~8 m9 G4 ^" Y/ ~& r& [

: u. C, l+ o) e! c) |
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-19 11:08 , Processed in 0.039422 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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