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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit( U  U3 Z2 H3 L% W- Q
核心板2:DDR2 256M Byte   NAND FLASH 8G bit5 w1 ~) @% @, F5 M2 F' I& _8 ^+ Q, `- `
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?' z) }5 n9 [4 A9 X% w" G
( G( ]' i4 k/ w$ t7 v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?4 W9 e8 I% F8 [

% o1 k) T: F' _" ]( }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% `1 W0 y7 P' Y% x9 T( T/ {5 x/*
( H! ^# J# q  ^3 m( h9 d* Check memory range for valid RAM. A simple memory test determines
1 q' U& t* Z* n, B5 U* the actually available RAM size between addresses `base' and
4 y# y: W' W( e! S( N! K- w& i* `base + maxsize'.' G3 K7 n5 h) v8 j
*/+ N1 O( j/ h' a) z
long get_ram_size(long *base, long maxsize)
+ z3 ~! k5 g% C0 I8 Q6 o6 E' {7 z5 V{& X! Y0 B4 w, w9 A; v( ^- ]5 ~
        volatile long *addr;
8 V) h5 j1 F( n! a" ?        long           save[32];
  U9 W$ n  L* X2 U        long           cnt;
) h2 D# m5 N' l! `  ?/ t% o( m        long           val;
8 |7 q/ Y. C# l' c" W# E        long           size;9 w* n7 ]: V% ]. a+ `
        int            i = 0;# s8 @5 F' f( F- A  M2 c
5 ]0 T# i8 H+ j5 ^" h4 w
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ J! o8 g* s1 V: m8 D# p+ @' A                addr = base + cnt;        /* pointer arith! */
1 ^; X% Y9 R1 e4 D0 a- i                sync ();
8 f* \+ s) T0 a2 I  d, f& O                save[i++] = *addr;" p! Q/ C; T' H; l6 |6 o1 i( F" T
                sync ();
; M- D1 _! G( }2 W  p: c2 S# M                *addr = ~cnt;
8 d% C6 d/ }! u5 ^1 N! N        }2 [$ j: q, E7 R0 C
* M8 a; C; h- B3 _  t
        addr = base;; j  x& U. j8 y# [% C* d
        sync ();
- O. I, ^; N1 a2 n$ {        save = *addr;+ V8 n7 F4 F- ~, |
        sync ();
# D# }5 [8 G" G5 l5 W        *addr = 0;
2 Y+ v% C+ p5 H  k/ Q5 |: F% c) \! d2 t/ R1 p) y: a, g+ M
        sync ();/ L0 h' D# ]# ~- q
        if ((val = *addr) != 0) {/ e: @6 t4 y1 l( d9 o0 p
                /* Restore the original data before leaving the function.
# \4 w: T7 k, V; [4 T! B                 */
# P! S7 y0 H! y- Y                sync ();* e8 A. B. s6 c# y
                *addr = save;) a1 I4 M& w+ J7 S8 y" W; [6 k! k- y
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {4 i+ X" H+ @, W9 a1 u, q
                        addr  = base + cnt;* o" t/ ]9 F( T$ N3 v7 h& z
                        sync ();7 _% C2 O8 P5 K* `# g1 k3 ?- ~
                        *addr = save[--i];
6 d+ }! G" P0 p$ a                }
% z9 u* ^' g0 N/ o                return (0);
7 F: S3 l4 g" e) {        }
5 K. H4 C3 l, b5 [
# R+ C5 L' a! O  N- @1 _: U! W1 h        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% B6 u! b' W/ _6 d4 m                addr = base + cnt;        /* pointer arith! */
' D1 P2 I' @4 u. k5 B                val = *addr;
& ~: r+ i% Y* H" b* S                *addr = save[--i];
% {+ `& m1 h# V3 A4 v% |3 X                if (val != ~cnt) {
/ v6 @& N8 d4 C* J" z                        size = cnt * sizeof (long);
3 {3 C! A' q3 y* q& j' t: f! s2 R                        /* Restore the original data before leaving the function.
$ Y/ z" h) Y# t& t, r                         */
3 y% H) C- z& E) z6 g' W2 p                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: F1 \! @% i& A7 k& m/ a
                                addr  = base + cnt;; v# v+ b" R# b0 _6 c8 E2 B7 M: i
                                *addr = save[--i];4 ?; t4 J4 I+ G' m4 a8 V
                        }
7 |/ d9 r# T. n2 M) L; H                        return (size);
( B- ]1 D* ]3 v* J7 s! q                }
5 I$ D8 k9 _" Y# s: L- q) Y! x        }
% _5 D; n2 F2 ^5 ?. H8 n5 A. l, M5 \
) s( B0 |! c  [0 q+ {        return (maxsize);
7 S  H& F6 T, k% `}6 y7 q3 f, P/ o% S
int dram_init(void)
4 q" A! d6 P1 z" Q{
3 X4 v# H1 Q; i8 }        /* dram_init must store complete ramsize in gd->ram_size */1 q# J  |2 k. n' z
        gd->ram_size = get_ram_size(: S, T2 c% g# A& h  V
                        (void *)CONFIG_SYS_SDRAM_BASE,
, N; A% @  y& G9 d1 _" P9 K                        CONFIG_MAX_RAM_BANK_SIZE);
: @3 n0 L+ c6 |  g2 N9 ]        return 0;
* h( w5 i* t" d4 U8 |}1 s( l& C/ S9 g* }" ~
: F5 c2 i& }; u5 d% e

; K7 d5 D: o2 W( }; V+ V( @7 b( {$ X* Z  |; y

2 U0 p+ i% x! w! L9 E: |FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# u: R' o2 K- A3 t2 E
9 n# M9 m! T/ h7 ]' a% j
; m1 n+ r% b$ T& @+ i8 U

( y- K/ A& ^5 @4 P8 t
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-10 09:04 , Processed in 0.038373 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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