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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit9 o5 m! ?4 w/ C, S0 G2 I9 q
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
) @" X* ^: }* _/ R6 w这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ U. M* A! X" |' V: L/ f9 ]
& N2 v' S- o6 ~5 V是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 w+ ?0 A4 s7 ^& D$ h+ _/ m) }( Z/ F. B9 U+ v8 a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; b: Q! D/ E# A9 l0 _, d" I/*
, n4 k! }2 Y9 w) S: U* Check memory range for valid RAM. A simple memory test determines; ]& C, u0 o% n: P1 {5 p! v- W; V
* the actually available RAM size between addresses `base' and
9 j* Q" t: p$ j5 w* `base + maxsize'.
5 v( y; b( X. l+ k*/; l3 [% d8 M; ?, _3 I" E6 j
long get_ram_size(long *base, long maxsize)% P6 `+ c3 X5 X& p
{# i' w' y& U) a6 A+ o/ U) Q6 i
        volatile long *addr;7 z* x7 z& P' k/ X- x' s* W
        long           save[32];
7 l1 R, ^; p, e7 D        long           cnt;
. q* p% R2 A& s        long           val;
& c8 m# _! C# e  E6 V        long           size;
9 O. k( t. P- O" r        int            i = 0;7 [8 }" B4 c  E) W9 u4 P: w7 ~

% S; _4 n0 g/ A( u0 ~        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" {* F# n$ d+ A  X
                addr = base + cnt;        /* pointer arith! */3 h3 Y+ u# O* k: s& Y
                sync ();/ m$ t3 j+ }# a
                save[i++] = *addr;; E5 l% \% x" b8 j& |( j3 l5 j
                sync ();4 I$ F* L& u$ v) s9 y1 O" \
                *addr = ~cnt;
' [6 C1 W( u/ X/ `* O, v9 T        }
$ I9 E7 g' J1 {/ m7 B1 T: X4 x( K1 ?: Z3 K/ z
        addr = base;1 Y4 K. S0 o+ b9 b: G4 J
        sync ();
' @3 m. c' {7 D$ J        save = *addr;
# G3 ]& s4 P2 {5 Q; Z        sync ();3 b# Y% J8 ~/ _9 O2 ~1 [# h
        *addr = 0;
* U9 H4 C3 |) X  k: I+ V, E8 q" @. l
        sync ();  t3 \/ e. f$ c# p
        if ((val = *addr) != 0) {# g( ^2 Q& _' X; q# c# h
                /* Restore the original data before leaving the function.8 Y6 {1 ~3 N9 [  k0 m4 z, N& x) n/ [
                 */
: ^+ x! }& H* T: P! E. J                sync ();. z, H" ]% g% r% Q- S
                *addr = save;  y9 v0 |& ?' Y6 O0 g; I( i1 S
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {1 _% C1 h, h" Z$ S8 O, P, J9 U: V
                        addr  = base + cnt;
% i9 T" x! m2 C6 H: ^, I) r                        sync ();
2 B( i, X% Y3 h; s- b2 T- F! V                        *addr = save[--i];" A! {! v1 W% S  G' E
                }3 L- g, S( I" T
                return (0);1 T+ x! S  P# T" @, n! |7 s
        }
. U4 C( M7 `9 E) R" R! m2 W! s" }+ C. ]& [3 F% D- s- T! M7 Z
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# U% O' x6 z* q4 A" ^+ R$ [, y5 [
                addr = base + cnt;        /* pointer arith! */
$ H$ E9 m9 W% r- q                val = *addr;9 ?( B( ^# C( a6 o' u+ Z
                *addr = save[--i];
" E: O" F' a( w1 b# _. b* T: F                if (val != ~cnt) {
$ F3 _  r  p2 N9 e) o& O                        size = cnt * sizeof (long);
; U7 `+ _: n5 r2 b6 _                        /* Restore the original data before leaving the function.
0 \& b6 W+ \  {, q$ t                         */  R1 @% I, Z9 i. ?
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ E9 p7 e- U* w* o
                                addr  = base + cnt;; b+ u5 \( _; D) ^( _
                                *addr = save[--i];1 u& z5 @( Q" r  n" |6 K3 X0 n. O. m
                        }# t8 E/ t5 v: x8 I! S/ j0 B
                        return (size);/ D9 x& E8 }5 W& G" {7 t% s& t, q
                }
, w: ]' }1 l- }3 X4 g        }
; \/ S( }2 [- x8 ^; f6 s& J* w( T; G( N
        return (maxsize);
& @8 C, ?, d6 q}
) H; k0 p1 v( M3 M# Q' |3 yint dram_init(void)9 _6 _) ?# j8 Z$ b$ `4 B
{. M8 c) z( U0 K" a1 w; A
        /* dram_init must store complete ramsize in gd->ram_size */9 R6 j* ^, x* p" |
        gd->ram_size = get_ram_size(9 i) E0 ~* `7 @0 D
                        (void *)CONFIG_SYS_SDRAM_BASE,
0 _* `& b& N9 E+ _* [/ t' ^                        CONFIG_MAX_RAM_BANK_SIZE);) z9 G3 W7 r9 T+ |' z
        return 0;0 d9 x. s5 f- V" a* Y% A' Y/ Q8 _
}
, w9 ~2 l0 i$ X: d, E+ U6 s2 ~$ ?* q; R
, r9 J3 l# h0 [$ g# }1 ]; r. `

% v; t# w, d# i  @2 a4 k5 V
$ n# V1 f: `1 Q0 l/ n2 n0 NFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!6 h: R  Q% y6 L5 {  D6 D

% U$ q8 r3 q% T/ s/ S' }
! f: n- s# [* O5 d) m

! ?, c& q; ?! \3 r* C# b. H
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 16:13 , Processed in 0.036231 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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