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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 z- [) G: {$ `- R% G& ~核心板2:DDR2 256M Byte   NAND FLASH 8G bit
2 K5 e4 N+ o- S' `& r9 O这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 F& Q' d' v& S9 b
! Q1 b8 _7 m2 ?3 u+ U是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) m; \  v- r$ ]. @
6 H7 j$ q) f4 ~6 v# \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& P8 F" f2 p- u
/*
' y; [/ u  e$ R1 y$ X* Check memory range for valid RAM. A simple memory test determines' q- F$ L5 Y7 w7 O
* the actually available RAM size between addresses `base' and
% l! i/ q9 Y  }  Q6 v. E& x0 c* `base + maxsize'.
5 T6 N* a: D- y*/
3 _2 Q7 r6 b2 _8 Y3 L, Llong get_ram_size(long *base, long maxsize)
% \# p" n. v9 w( s6 ]{
- P& C' f6 @/ {9 U+ x        volatile long *addr;
* t' W8 M3 I6 c- p) a        long           save[32];# ?" E" `, N* y; d  G2 Q7 O  V
        long           cnt;
1 g6 C3 F1 p" `& E. R( q        long           val;: W9 W* |8 }( J  Y
        long           size;
3 i# B# X, j0 R. D  q9 `# ^        int            i = 0;
. [  x0 F, d# F  z. Y+ O. [9 G$ [) F
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" h* [) V# k" v                addr = base + cnt;        /* pointer arith! */
7 l+ W* H, {' T, I                sync ();
5 z# ?* v/ F6 d  f                save[i++] = *addr;4 G* D; j# n% i3 w5 I
                sync ();
) a$ m0 w& ~* a/ G) Z                *addr = ~cnt;
) d( b, m; `# j# ]  ?' `0 f        }
/ [7 ~6 u( R8 [- {; J; F0 {+ A
; q& L4 Z' ^4 i3 H( h5 T9 ~        addr = base;% b0 N7 [7 `) U" d# i3 J3 u  J
        sync ();
& v7 D" J8 t$ G3 Y$ Y0 s9 {        save = *addr;
, g  B' t) x- a3 a1 n) T/ I( b- @        sync ();
3 C& l6 q5 j" x* Z4 |1 w        *addr = 0;
/ Z6 Q# Y3 n9 A5 B! ~- D& h6 L3 {# y$ o0 D- G
        sync ();
" A+ m1 S1 x2 a& j& Q' R        if ((val = *addr) != 0) {, r* j4 A; l, U6 \( Y! r2 p. {+ Y: D
                /* Restore the original data before leaving the function.  h$ @' r% U9 \$ o
                 */
, O/ y) Y! r+ c2 B4 i( Q                sync ();5 a, ^" P7 ?& ~' }" L
                *addr = save;
5 U8 @! W" B$ O                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; X& _7 f( K1 a/ n0 j/ y4 H
                        addr  = base + cnt;  Z2 E3 b+ @. z
                        sync ();! U2 r. b6 z1 m. o
                        *addr = save[--i];# I$ x8 W7 k1 P' g
                }+ X9 e8 q4 q# h! T5 z# l, V
                return (0);
5 S* Z3 z' ~1 Y% D5 N# e9 X        }- w$ \- |4 g, Z
  V3 i, G1 S5 s7 n6 R& t  @
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ r" \( d- m) @$ {& w1 o
                addr = base + cnt;        /* pointer arith! */
# M$ `6 l6 F( y# w. N                val = *addr;# M( W3 K7 _) x  g" }0 ^
                *addr = save[--i];% e; G) o  W- m
                if (val != ~cnt) {
1 i$ Q, ?% i2 U( b                        size = cnt * sizeof (long);' b) m- U$ T  O- O& l5 M
                        /* Restore the original data before leaving the function.1 g$ h1 u* M; ]( u
                         */( h% w& ]( g! B, F, T" }% p
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( v7 E( g9 Q9 @( Y' Y                                addr  = base + cnt;+ Y: i: A2 {3 b' U
                                *addr = save[--i];
  ~! ~7 u( J' o                        }& f6 m& e( y2 g- [' X* h( ]  k
                        return (size);
: a" ^6 u! C* E, ]                }
) a# y  I- V/ Z+ N5 {6 }2 q        }
8 C" ]! m7 T( O; m! Z; y% k( P* p9 E( ^7 b1 S4 x- Z1 X& m" H
        return (maxsize);
7 ~; N9 L; ~2 Z! @: B' H0 l}. G0 T: T9 {! L1 Z7 C3 i' _6 @
int dram_init(void)
! L1 Q. i* F/ p* [{3 S2 ?4 X+ M( l7 J  P3 ~6 n
        /* dram_init must store complete ramsize in gd->ram_size */
0 ]7 h9 c7 m/ r# p        gd->ram_size = get_ram_size(
4 ~7 b1 ]8 P5 n% n# B                        (void *)CONFIG_SYS_SDRAM_BASE,
8 I" ^' `( ~9 C7 }                        CONFIG_MAX_RAM_BANK_SIZE);
; L4 r  r7 h7 J4 F' m        return 0;8 W$ }: B# T  W8 C" S
}" U$ q$ J. h% f6 Y
: t( A! \1 o8 {+ x7 [, v
( w5 [9 S8 a3 `5 i+ X; @7 L9 `

* f6 U1 C$ r$ y2 M6 m  ?$ E7 n2 ]1 o5 `, ?3 A! o  T, O2 P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) s4 n: i, G. D2 n* f
7 v- [" I( y% t7 k
, r0 i* M$ v, J/ a1 j

3 _7 W4 M* a" }" h* J% D
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-3 04:01 , Processed in 0.036592 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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