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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
9 p3 x/ M8 T( n- j. j( d核心板2:DDR2 256M Byte   NAND FLASH 8G bit
8 p, R; D+ X1 _8 T这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) ^$ k: O3 T; `. O8 X; e; J. q" r! X8 i6 B* f
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 V9 _2 L. H. ~" Y' V
, Z: a0 o( H( y/ u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; u/ f0 m* |; I) D* r/*
. Y0 Z2 s5 j9 |* Check memory range for valid RAM. A simple memory test determines# T/ T# ?  T, ]3 F$ }
* the actually available RAM size between addresses `base' and
: b/ D3 R  v# A( g1 q* `base + maxsize'.
, w9 @* K" d' `% v9 C*/
. u2 h" T9 |# F2 S1 blong get_ram_size(long *base, long maxsize)
$ w' l, ?7 E- k/ K2 a6 S{
( I7 D3 x1 Q* q  o( C; s' H        volatile long *addr;# F3 P4 L1 Z! v8 I2 l4 c
        long           save[32];
8 }3 j* V2 F6 P( J        long           cnt;
- u( y3 e* R1 H+ Z$ K' A5 K        long           val;8 h' s& X+ {4 l% }
        long           size;% [- N2 Y2 o) i8 \
        int            i = 0;3 t0 j: [) W; f5 G" ]; q0 J* |
$ K! n) d3 H7 Y7 G; E
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( k! D5 {" q1 P* d
                addr = base + cnt;        /* pointer arith! */$ \. q' ?  ]( W7 g
                sync ();
- Z4 r" R3 {& o: }3 I  y                save[i++] = *addr;; z- m% T8 i, {8 Q2 K) K7 ]) L
                sync ();5 ]8 X$ q3 @: I/ A5 l
                *addr = ~cnt;5 k% B. e) G- }' U' `, J+ [7 Y
        }
- @* C( o$ I) g% q: S
4 r* }  C  K5 r& P- W- m. s, P$ \+ O8 |        addr = base;  n7 _& a% r2 S2 ^3 O2 a- m( x1 [& b4 S
        sync ();
6 Z  ~0 V: h- K4 I  F4 u3 g1 T: o        save = *addr;
  J7 A' V3 _) @8 Z1 R) n9 v' A        sync ();9 K, e+ J/ B8 j" ~
        *addr = 0;
. d; c9 K+ t3 M4 c& z; Q1 {& U# ~5 {! B( m% k- ?* h5 q6 y1 M
        sync ();6 V, _0 x) Z* S  N/ [5 h  h- a$ W
        if ((val = *addr) != 0) {
; a% H- X7 a) F3 k7 d# f                /* Restore the original data before leaving the function., B( @" N& j: y- {
                 */% d9 Z5 p, x) B1 s: ]
                sync ();
% }! H, e, i' N                *addr = save;
; h6 @7 I8 k- L. G$ J                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 \5 K% F% |4 ^8 e# b1 f                        addr  = base + cnt;
3 F% i5 N2 z# I4 G/ S( r                        sync ();
3 s8 j9 i' s* }' u                        *addr = save[--i];, h" Z& D! `& M7 ^& @5 |) ]
                }8 c8 I# @) B) ]. v/ d$ G
                return (0);
" }6 z) C* E$ W$ m% @4 }2 t6 c        }- p* v1 K- U( Y6 S) n" D! b# _
/ N5 \& G5 E/ @( d% C! T- J2 m( q
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 z9 H+ t. P( q2 t$ a                addr = base + cnt;        /* pointer arith! */- m: v* O8 F; D, H, H- \
                val = *addr;! k! P6 Q0 f  X& `1 I
                *addr = save[--i];
/ D8 A3 x; x) a                if (val != ~cnt) {4 O' O3 J! N9 T# Y7 a
                        size = cnt * sizeof (long);5 P$ B6 I; n0 L
                        /* Restore the original data before leaving the function.4 Y& a3 ]. f& A- _8 M" O+ M
                         */2 J, F$ Z8 ^9 i0 o
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% x. y/ U6 T6 R- m% E6 s                                addr  = base + cnt;
/ _! n6 X; R- ]3 h5 Z# z6 U1 E                                *addr = save[--i];' V7 |$ c" c* j( g2 j
                        }3 S+ O; n* d0 D$ j8 M  z* H8 U
                        return (size);
, W+ K: B  p, c                }
9 \& F3 f' u7 \, u' s$ Z3 k        }2 `& {$ Z! l: X! U: A1 U
: a6 q, o  j0 N/ C6 q
        return (maxsize);" q% s7 U# D6 R+ ]; ^) ~1 K
}9 a  @2 v1 N) m2 w4 n0 \
int dram_init(void)
4 c6 e" s( k+ R{7 g5 `3 x, J, Z6 q; s5 i
        /* dram_init must store complete ramsize in gd->ram_size */
# M! \. h( s6 O, ]        gd->ram_size = get_ram_size(
0 X; G" [4 P( t2 X6 I5 X                        (void *)CONFIG_SYS_SDRAM_BASE,
& g( ^$ E& K. h0 M" j+ K$ L( e- y                        CONFIG_MAX_RAM_BANK_SIZE);1 ~2 K! T' n  n3 Q9 V5 t! W0 _
        return 0;
( h5 ^* S' E- n+ m0 f7 J}
$ Q" z/ I1 g* d  l
' N. G; j+ O, {1 c$ I, w  m! \
1 T" K7 u0 y: c+ t% Y/ V5 N; e
) j9 o* K1 U, ^$ b; o* r7 R; @; T- L+ f1 R
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!2 U) Q, \: Y* C+ W4 E8 T; j
% J! o+ N5 n# r
8 o! b2 Z- d5 a; t/ E- n/ x) p
# ~( \/ ?. {0 n6 u5 y
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-30 02:32 , Processed in 0.042359 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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