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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
' N5 V' z, p# r( a核心板2:DDR2 256M Byte   NAND FLASH 8G bit, T- z9 P- L; n
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" O! z' p: _8 d6 H" _# A. V5 s  O- x6 q0 n2 |0 u
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( _6 J3 Z+ I/ {4 I9 f7 Z" n3 S: g( Q6 D- Q. I7 c( ]5 o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 }: E3 z  P0 b* |/ F5 z& F+ G/ o/*! P) J( \$ h' `
* Check memory range for valid RAM. A simple memory test determines
, U" H; `7 F4 m6 s3 u" B' N6 z2 A* the actually available RAM size between addresses `base' and
! Q8 _% Y) ^* ~. ~% p! |* `base + maxsize'.
+ M# z. `# T! H5 ^4 ?' D*/
# [6 w6 _& y. k) o5 _8 Dlong get_ram_size(long *base, long maxsize)
7 L7 p( E. K; h# B- u6 G' \8 t{* b7 R+ V4 ^$ }3 o5 F$ H
        volatile long *addr;
& a6 Y- F- N0 N) V3 [        long           save[32];
. n3 @. Y% D! W+ {* b) f        long           cnt;
4 l; H( Y$ T$ P        long           val;
9 k' c* \+ Z1 x0 N! V) U. p" c        long           size;) x! m, W, `, B6 Q
        int            i = 0;. y1 }& H7 h/ L

: h9 ?3 H0 b( S3 M( Z: ~        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 g# P  K2 n. w8 m
                addr = base + cnt;        /* pointer arith! */
1 p/ i2 O# H& F0 R) w7 b                sync ();
. f+ k$ i4 I6 y+ e+ e: t1 U                save[i++] = *addr;
" z( X1 L& l' g9 P/ K                sync ();
/ U5 q$ N; t- ?, q. K5 x                *addr = ~cnt;: E& d3 c- b- H
        }
' W, `6 ?/ I5 T9 b/ v; C/ c$ E( a( c! B2 N  }8 w
        addr = base;5 t* B/ e% S8 [& q
        sync ();
! D! j% v; ?. M+ u; ?- @6 g0 R        save = *addr;
$ P& l3 M' T+ Q. J" c        sync ();
. _4 s+ y* I" l/ m( o* o, t        *addr = 0;9 s% v" l( t; E# @; l9 g  E+ G/ b; w

2 B8 f+ t. Q4 }6 t' Z  L        sync ();
: {) E8 N. P& Y5 p( U6 u        if ((val = *addr) != 0) {
, R( P; V6 A! k, p/ V5 K                /* Restore the original data before leaving the function.
6 \: ~1 D& P, l3 P: }$ b% c                 */
; C) Z- m6 S, M/ m! w                sync ();2 e# z6 n  G! ~; ?3 {2 p
                *addr = save;, L- h! u% q% A. R
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {# n" N) y# ^4 \2 Z3 J' p
                        addr  = base + cnt;
% x) `7 b% o. {                        sync ();
/ A. l4 `1 `2 Q& j9 T& \& b+ L0 \' q" ]                        *addr = save[--i];
5 [) `  L7 |5 ~# V                }
1 n3 F5 C- Y9 E/ v; e                return (0);
4 z8 n+ j- K5 m/ g" c+ k/ A        }
" s# e& p3 G% z
; y& f$ n( ]' y" ~8 x# o        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 Q/ O3 `0 r6 m$ I
                addr = base + cnt;        /* pointer arith! */& m, d' `: s0 v5 u* k+ V; \
                val = *addr;+ _# c6 e7 X' s
                *addr = save[--i];
) C4 ~+ S. |2 L! e                if (val != ~cnt) {
4 p: X2 T% p  A6 V4 K                        size = cnt * sizeof (long);8 e& a+ b2 P/ y1 M2 I2 m
                        /* Restore the original data before leaving the function.
9 L* |$ O. m" g! M                         */
$ }- ?9 c% Y, x6 H0 Y  ]; f2 M+ G                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- J9 l6 r; `- }; s2 ?9 D
                                addr  = base + cnt;3 \' I4 G0 D! g; V4 [$ A- x0 t
                                *addr = save[--i];6 ?# r3 U% F  o+ S. Z
                        }
0 u# }- ?. E% k! [+ c                        return (size);
! G# a* I: O4 Y$ U! M1 ^                }
& k, b! l0 `6 ]- C        }
( F9 v4 X; Z% `& Q) q, X' }: L1 t( n1 ^! Q" b3 c, Z" _
        return (maxsize);
$ n! R% F. ^; b( d' n}) f8 l! g- T6 T% v4 @
int dram_init(void); g6 Z( y7 }% m" G- ?( t5 }0 g+ ^
{) w% Z: C( q% m( T/ ]: v
        /* dram_init must store complete ramsize in gd->ram_size */" b6 j# X4 X! }6 ^1 d- E6 J) N# ?
        gd->ram_size = get_ram_size(
, }9 m6 S4 E) v0 t4 O  p( L2 d                        (void *)CONFIG_SYS_SDRAM_BASE,! v9 T% U0 p1 }' j, k
                        CONFIG_MAX_RAM_BANK_SIZE);
5 t3 ]# y3 Q6 Z7 I& j        return 0;
# `% ]4 L- t' f}
' Z1 a* Q% G2 B  x  k
. F0 S! l6 Y. D; e( R; |
: q; T# p) R& `0 }* u8 J2 e0 [4 u. T" b7 ]5 w

+ p5 i8 D# B: }% C4 k9 y6 QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!5 o" H3 F( B* Q
3 n+ k. q3 Z1 W& A& M$ `# {0 w& N

7 M# |: A# S5 E0 D( A

* _$ D( t0 O9 b; v! Z- Y9 J7 k
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-29 16:05 , Processed in 0.039271 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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