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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit  Y* B9 s. f+ x* ~. k
核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 G$ I+ x- T+ m" d
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?4 i! f* f0 @8 X8 f4 \

8 {1 s: b4 G( z* p6 k; g是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, b1 {+ r+ z* {! g0 _0 k/ Q2 v" v* R  t2 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ b' o: v5 C0 M3 }; p# S1 B+ r/*
- R+ U& P' o: k: @* ^' T* Check memory range for valid RAM. A simple memory test determines+ S5 h5 i0 _9 N* f& R  J
* the actually available RAM size between addresses `base' and
1 Q" C" j4 S) N* `base + maxsize'.* k5 Q# v7 \- r( _0 D: V
*/3 K: B! r. C# Y& _- @) [
long get_ram_size(long *base, long maxsize)
+ s+ |# z2 h$ p{
& N$ V/ p( g( {6 s* y3 [; O        volatile long *addr;/ `. R0 E( ]  U- a  I
        long           save[32];1 f+ \. d  H) l
        long           cnt;
' b' \1 k- {: {3 n4 C0 {        long           val;
$ R# t" U& N6 A0 U! \, a' K        long           size;
: x6 X4 I5 x: E6 x0 n7 x        int            i = 0;6 R2 J1 D. ~* I

8 H* \  o* j6 U' @        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {- P7 B2 w& Y: r+ h" D
                addr = base + cnt;        /* pointer arith! *// q) e+ H0 c8 n( o. M
                sync ();2 \/ o6 w7 J8 G5 ?' K$ q& e" A$ w1 ^
                save[i++] = *addr;5 C4 B" {& A: [7 A8 Z
                sync ();
0 u3 M! [* ~+ c4 H$ E- i* n' G1 }                *addr = ~cnt;$ c% P/ a  x; K. K
        }
9 n: ^; m% J, K: v  G* l; e
1 c6 m) s: m; z0 A        addr = base;
0 O. E3 r* q- E9 y! A) B        sync ();: `* R% m- z7 X5 N# Q  U2 |
        save = *addr;
& K' `! b, }4 u        sync ();
2 [2 I9 ?( [& Q! A        *addr = 0;
' P& U1 G/ _2 z  X' ?
& K+ q( O+ ?- M* |6 q6 {        sync ();
: a" G- L) \: W8 V2 x, e        if ((val = *addr) != 0) {
* v0 Q9 z9 w$ r" n5 U                /* Restore the original data before leaving the function.
( h& [# e6 Y1 ~4 m9 K' M( @                 */
. G% A0 L4 Y% v* ^. g/ t/ q% e                sync ();" {5 _' T, G" a: b* c3 |- v
                *addr = save;
! ^6 C+ i( L+ K                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* j0 f- B) ~+ f: l1 h2 C4 z2 h; S, r                        addr  = base + cnt;
4 s' f& x. b/ I- u2 y7 i$ ~# a  ?" X                        sync ();
% N, `9 F% g) O# L( S: [                        *addr = save[--i];% l3 K, K* F2 t+ i0 a) X
                }1 |7 b' _- ]1 v
                return (0);  I6 t7 ]8 @; W2 k+ ~' T
        }
% K7 X. t( Y4 }8 N6 i! ]3 t- Z: R4 i
2 X. J2 G% `( A& L5 @) v! c        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& j9 Y% q# \& {9 T& h8 |0 T                addr = base + cnt;        /* pointer arith! */, N+ Q) H( y: `+ c: h
                val = *addr;
/ Q; F( T# |; a! H' E4 g7 ~                *addr = save[--i];
" T, |. B, ?, u* V' d1 L5 e! h9 C! p                if (val != ~cnt) {
& ~, y# [6 J% f4 A6 W2 v                        size = cnt * sizeof (long);
. E0 y; Y* W) q8 w* A  H" Z: P- {                        /* Restore the original data before leaving the function.
" X4 W1 h, ?  d. w+ R                         */8 U4 u& T: W* [. _
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 i8 A$ Z& ]1 T' Q- G% ^& `6 x                                addr  = base + cnt;
1 Z- }! n% t4 y# Q* }                                *addr = save[--i];
" \3 o" b) J, H' K- a, g* x                        }
& h8 Y+ g. n! |3 w                        return (size);& e4 p" k) W) t& B7 g# w# i( C
                }
# S9 |: v. `, M5 t- B: s5 \( t) M        }  F; y2 u& K2 M% ^& a* s6 L

# h  m) C  v5 W/ ?        return (maxsize);
/ O: o( b( B$ e' o}
; ~. V/ s. |/ w- M. Qint dram_init(void)0 E  e5 s6 A" x* n$ d% Y2 g5 ]
{7 F5 Y' @* P. f6 D( i% v+ f
        /* dram_init must store complete ramsize in gd->ram_size */
% v3 R9 D2 u6 h3 q        gd->ram_size = get_ram_size(* W* n) _  j. u/ y- _& p
                        (void *)CONFIG_SYS_SDRAM_BASE,
& b/ r4 e% J+ h# r- I: @0 o                        CONFIG_MAX_RAM_BANK_SIZE);+ @# R) v% v) U0 ?
        return 0;
) O- a; g% t0 q$ a$ ^, i: ]}
  e+ r0 Y* v! n+ [3 k2 T5 A1 ]) R4 f
, C1 e$ }7 c: ]7 B/ H+ G/ g# _" t: b) @# R( W+ e8 ~

! a8 e% W' {. u, m# }, i+ [9 G! b) W# {* T( T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) R3 C7 `* i7 A( Y& i' w2 y2 ?; [

( W  J. K# z; H9 n/ i3 e! u3 w2 b5 `
# Z- W! f+ w7 l
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-8 03:49 , Processed in 0.057523 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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