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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit8 f$ d, S8 X- g9 |  P% B
核心板2:DDR2 256M Byte   NAND FLASH 8G bit7 u3 `3 N( |7 N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% q& o# m0 p2 l6 y* ~4 u# ]
4 o( \/ p% f2 j0 ?6 P是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' g8 s3 f8 K. {9 ?# C8 v7 |7 s* e% p5 s; ^) h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:' r, `" T2 @7 n% A
/*7 I2 B. |' C3 p. W6 S
* Check memory range for valid RAM. A simple memory test determines
  ?. ^1 Z4 W8 U; J5 ~# W; w* the actually available RAM size between addresses `base' and4 P8 q' F4 g5 v
* `base + maxsize'.6 j. H2 F8 V& b1 ^% Q, E# ~9 J3 B
*/
& k/ V8 _% A8 I' f7 a6 Tlong get_ram_size(long *base, long maxsize): p4 P- Y6 L/ j3 G
{
3 k+ w; C* C8 S) g) \& g* N; Q        volatile long *addr;
) ~( I( Q! z9 I, C# u        long           save[32];
. k  B7 `: L  s0 l1 C        long           cnt;
3 g* d2 J9 w. Y( y0 [+ O; D        long           val;
7 Y8 C% p8 y) \9 H3 T: M3 l2 ]' R        long           size;& t  o: `' l4 U- h
        int            i = 0;
6 l" [5 J. X' \9 Y) ]& v; U, C1 }! v
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! _" |, K) x! v) B$ J% H                addr = base + cnt;        /* pointer arith! */
# \! i! W8 P2 U0 u4 \0 k6 `+ `                sync ();9 J! N0 ^' ]5 R' p% u
                save[i++] = *addr;% ~7 F  B) }' q1 D$ m; c# }: C
                sync ();; g+ z* X7 n  n$ _: n/ l
                *addr = ~cnt;
! _% e6 Q5 @' R' \7 v        }
* V' T1 q  C# D7 B* i6 {
/ ~- a6 A6 C  ?* H. `3 x        addr = base;
; E/ X: q6 Q8 }3 t: u6 N6 S6 b! b        sync ();( i2 M" C! ~# B4 B* H3 x3 X( m- ~
        save = *addr;* [2 R5 {- C: W9 P+ h
        sync ();
5 z, Y% u+ i) T' ~7 k  c) T        *addr = 0;% l8 X' M) a& Q) ~& v7 I& d8 S
$ o2 I. A2 H( u, [/ X0 |" j7 j% y
        sync ();
% ?7 S  J5 }# k8 z& b+ h        if ((val = *addr) != 0) {0 L6 A# k  @, [. x
                /* Restore the original data before leaving the function.
- L1 \$ ~! W' j. n0 r                 */4 W9 v) ~6 @( z. t' p
                sync ();, E. R3 z$ n, P/ m4 R; k/ s3 |
                *addr = save;% W2 H, y' R( `3 F: z# Q' Q6 G
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 `# O( n4 O3 S- P* _
                        addr  = base + cnt;
: j6 g& d0 x* e* `9 i1 v8 `                        sync ();1 R" q8 E( o* Q" }! Y
                        *addr = save[--i];$ Y' G1 J! W% o( K  b. Y# ]
                }5 p$ q7 E! t: y# t0 z! Z
                return (0);; c8 m" r# D7 x5 [8 |* ~
        }: p5 v! M! L9 z& M7 g
) m4 Z4 X, y) B2 Z) }
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 x& k0 P, O( B; w: W, i% D* ^5 F
                addr = base + cnt;        /* pointer arith! */2 V1 w( G5 K3 d, C
                val = *addr;
+ c, h7 I4 u5 y" u                *addr = save[--i];* w, N' C& Z# q% e, y) b' l
                if (val != ~cnt) {
: J5 K1 D5 \, s' k                        size = cnt * sizeof (long);9 N2 ?+ A2 g7 Q  R4 @* ^5 e0 W
                        /* Restore the original data before leaving the function.# G! Y$ }! p$ c
                         */5 ~' I# r2 F1 f0 k/ g; V! h
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 x* M# R& z# R                                addr  = base + cnt;2 O( Y2 Q7 l! e! ]( O
                                *addr = save[--i];
1 F4 \) i8 o: }* M! W; \                        }. g, d7 x% }8 R7 W* o; Q0 V3 I
                        return (size);
0 G; J% r4 D3 w1 w                }
2 Q5 j. K. ]$ F5 o2 F        }
. V3 g7 C( G# {) Y9 z+ r" N
% U0 H% [) t# w2 k3 M        return (maxsize);
, i9 h* d4 P+ j; H7 `; `. x}
" _, ]8 k  u& ]& ?9 h7 ^6 ~& xint dram_init(void)
/ t/ y+ S# Z" X* C) K; W{
1 M! O  x+ ~' |0 N: Q- Q9 \        /* dram_init must store complete ramsize in gd->ram_size */
( }8 ]: ~# e0 y* E6 ]# y8 U- |        gd->ram_size = get_ram_size(
" ^0 W" H6 k  |2 s8 T                        (void *)CONFIG_SYS_SDRAM_BASE,
& |: E$ u" L! D9 L* W) T6 i                        CONFIG_MAX_RAM_BANK_SIZE);6 l, M# H1 U) A: G' e& A
        return 0;
+ c2 u! X4 `1 k% B, M% R}
: w# _0 z* Q$ f, T' ^$ p# ?1 I
4 J1 K' \4 O; N) n& ^/ O" D# ?1 V0 @! b! M. [, K

( C6 O& c( F, C9 s0 z# ^$ {4 w0 s+ A- J' \
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 V' u; E/ d' r% H* J) z% x$ i3 a
% M& h6 e+ u$ g$ t3 s: O
8 u% k  h" |2 i0 w1 D
  i0 d6 a1 L/ ]- m- K$ u, d
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-6 16:31 , Processed in 0.037547 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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