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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit0 ]! d. ]/ o! ]% W5 W9 z5 `% H
核心板2:DDR2 256M Byte   NAND FLASH 8G bit! A- N. W4 N! H9 |
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 P0 ?) T5 Z& n; w8 ?) L- t) S3 p5 M' W& B) j; r' ^' Y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; m: E. r% q, ^2 J5 I

9 ^7 v+ R  e5 w8 q, b" a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& G* A1 l7 ?- P, |) ?, O
/*' C9 K8 ^6 N. O) B
* Check memory range for valid RAM. A simple memory test determines1 \9 M. ~4 _& k6 H/ `. @4 X
* the actually available RAM size between addresses `base' and
* s$ Y9 I# I! }* `base + maxsize'.! B7 I  M6 H3 h; P: U4 U; F
*/
! R2 S5 m. S) N% h" `$ @$ ilong get_ram_size(long *base, long maxsize)4 I$ b8 G7 m9 V9 {3 T
{
% ?: L0 f- @& S, x4 j        volatile long *addr;
1 @# W  ]) y+ W+ I        long           save[32];6 G8 n: n& Y# o# i1 {% e& K
        long           cnt;
3 f, Q  }  P2 F6 M. `        long           val;7 k1 S0 R) ?% W
        long           size;6 w& \- E$ U, f: U, Y
        int            i = 0;
' ^& V" m0 `& l  M1 `# o# s1 o
9 h. K- P% V% u# E) }2 ^" _        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 S( n/ N; ]4 u5 `5 I$ Q                addr = base + cnt;        /* pointer arith! */
- m' s& G; ~' }5 B                sync ();) K" M6 }4 c* J6 T, f" P" M4 _
                save[i++] = *addr;
+ d* z' k7 s- F                sync ();
9 v8 F9 z! w( C- K6 ^                *addr = ~cnt;0 d- A4 H/ ~4 v" q" r: r
        }
% e" C) m0 D4 r. _" M+ k7 n! ?7 R, g& E# }1 Y& e
        addr = base;
) N1 I3 T1 E4 F9 t7 K- C        sync ();+ V5 c$ {- b- f0 I  N% e! l
        save = *addr;0 q; y6 G( N2 y& s3 e
        sync ();
# f& L# X0 P  M7 O" o        *addr = 0;  L, ?: h7 Y: D. i. k4 b
' o* E$ Q0 w! R& B$ J+ U4 L
        sync ();
# \- U) z# U8 ?7 ~; T; h        if ((val = *addr) != 0) {
0 h1 n3 g0 H8 q/ X0 |. _& r                /* Restore the original data before leaving the function.
; t) [& q4 l: J6 V                 */2 R7 ~- L. L& O0 {
                sync ();
  a( I6 |. Z% L; `+ t6 f# w                *addr = save;
" A: s) m! V3 {& s: m9 f; I                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 S9 Z$ e' R8 W/ n! `
                        addr  = base + cnt;+ x+ J; B; J- ?
                        sync ();. o) r& J. a& b1 ^
                        *addr = save[--i];5 [: n, y5 t' N. u
                }
% p( w5 h/ g( F' _+ L% z  J$ F                return (0);
8 G5 a" [( n0 m5 ]6 B4 l        }
' k' s. l* W& n$ j/ R7 B, I) Y4 d2 e$ z# X4 m) T
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. R( ~, ~6 G9 R4 S3 r* n0 J. W
                addr = base + cnt;        /* pointer arith! */- r2 W) f$ n3 ^+ T/ P5 g
                val = *addr;1 G  o5 O3 Y% W9 o$ `
                *addr = save[--i];
! s% |3 ~. s6 J6 }1 \                if (val != ~cnt) {
; W) }) V$ f/ i) O; j                        size = cnt * sizeof (long);
- ?7 P: D3 J) b) x8 r! |                        /* Restore the original data before leaving the function.
4 p1 Z+ h) h, n- H1 R% |                         */
9 G9 `; u4 }% O0 ]* n                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! C- d0 w* f1 A                                addr  = base + cnt;
6 D. M. T& T& B7 H                                *addr = save[--i];8 m' y* ]. J! W7 v' t, e  V
                        }$ |0 d. T1 O# L. P; b% S
                        return (size);
5 |* q2 p. l8 q6 J% v; o2 n$ ^                }8 A) x: K( l: Q+ ~
        }
; C3 C' h$ R3 `$ O; X& R) ^5 o
2 P4 N( @- U( _; r  l: @6 J0 d$ C& p' N        return (maxsize);
9 ~0 u* F. s" z) f% `4 S5 N6 Q0 w}
! K) e% }) {5 c5 w9 S6 J: Gint dram_init(void)
* P2 K: ^4 j$ M! w{
. M$ m& l7 m7 u$ W: K        /* dram_init must store complete ramsize in gd->ram_size */
# c. W/ Z% @, c. P) T' I- d        gd->ram_size = get_ram_size(% F0 G. Q* c& {- r
                        (void *)CONFIG_SYS_SDRAM_BASE,
! e2 z5 a' v( Z& o) I                        CONFIG_MAX_RAM_BANK_SIZE);) C/ C. V% v; L+ l
        return 0;
& M# J. Y9 p- e5 K" Q# L}& q% K+ p% x1 b5 r" p) |; z1 R) I& T
+ S$ Q- ~- P1 o, U' C

0 s$ F% P) Q% E$ l
' L8 {7 t: Q+ e; J2 z9 h# t$ ]
# `" p0 r& F  sFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 ~$ K9 H$ h! H; d5 O' ^/ I) a0 J5 ^; c9 a9 r) s' [
! R) C* }9 S0 d! _5 A

0 w( c0 V1 @" J; ^1 O6 S
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-17 21:21 , Processed in 0.039184 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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