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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit9 y2 E% l8 r5 Q
核心板2:DDR2 256M Byte   NAND FLASH 8G bit" M% l5 Y; c$ p/ j1 t( W6 V
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 |! q9 w" Y0 Q; u- g3 Z+ Z# j" B/ m" L" y4 G
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?7 E- G' ^3 n  J

1 s7 v' X7 |+ C# _( W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* ~- g: l0 X: V
/*
* ~( j. f3 ~$ Z3 p4 `: K$ A* Check memory range for valid RAM. A simple memory test determines
) v- n6 _  x# w2 U% C* the actually available RAM size between addresses `base' and
( k1 q7 H% a; x" C- q7 T. m5 m- Y* `base + maxsize'.& d- }) F4 d/ Q( v: r6 |
*/8 H- z* Y0 V- p. S
long get_ram_size(long *base, long maxsize)
! O9 N5 s5 }& D& [8 j' L{3 @+ Y& O/ n. E  |
        volatile long *addr;5 j( M- @4 C5 b( i6 d, Y
        long           save[32];! t) i: N. E/ S9 s3 Q, V" h/ S
        long           cnt;  K" t* A  h2 r! K; Y0 ~
        long           val;: g# p/ ]* t% E0 I) D  T
        long           size;# M  W' w! {* U3 c# ?% ~( _
        int            i = 0;
) P7 n7 U5 I0 {5 j- s3 p: @7 I% D
# _& f1 L' I2 C' w4 m        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; K/ p0 _+ b7 J" k                addr = base + cnt;        /* pointer arith! */" g- f! t+ v6 G1 D5 }
                sync ();
- M* k6 U' {" }2 ]9 a( ~1 I8 P, ]                save[i++] = *addr;
3 r* `8 I& N7 `0 h; D7 Z' h$ H                sync ();- M/ X+ b) _% I7 x
                *addr = ~cnt;
9 u* Q, |, B" H% a) U        }
9 C! b3 l2 L0 ]( z4 o
* c) i% {4 \! D        addr = base;% W* p0 |2 D; t9 J# y
        sync ();, H" j, U/ h  O8 E2 ]: O! @
        save = *addr;& C& ?, U9 i9 Q
        sync ();* I$ A( v2 ]! h. L
        *addr = 0;& I7 V5 w  c  a1 i( m2 X
4 v, g! O$ k! h3 T- b. M
        sync ();9 p8 m6 z6 f: |, |' h1 k: v( \3 I
        if ((val = *addr) != 0) {
% r( {, R: @( ^' R5 ?                /* Restore the original data before leaving the function.
; A2 m. r% S3 K% V" w, D                 */3 z1 a) l. ]2 r5 A; W
                sync ();
" @0 R: i6 g! |& G) Q+ ~                *addr = save;4 H" g9 G8 V# X9 Q7 ^2 w
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ [3 W4 j! b% X
                        addr  = base + cnt;
6 y" f  y; ]) M& x" p                        sync ();8 n. |! [/ Z& r0 Y1 r, r& N/ Y" g
                        *addr = save[--i];0 k0 ]& a2 Y8 Y
                }4 t$ H' n4 t1 w$ g( ~0 M" h, l# `3 o
                return (0);
/ c: U4 X- t+ O7 J/ b        }
2 |2 `  W# I& `/ n0 k/ d
5 A0 B% M$ k9 F        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 h" {0 O5 M7 [3 `) w, [
                addr = base + cnt;        /* pointer arith! */
  N: w8 X- V  A" n" M" J( V- i                val = *addr;
! b/ G4 G  V  V                *addr = save[--i];
* d; p% \% c2 `. c+ D. p& I7 n8 i                if (val != ~cnt) {! l& Y1 H9 t/ B* c1 b  c6 o3 ^( ^
                        size = cnt * sizeof (long);
6 G% {4 k/ I, ]& O" O6 L; h- |                        /* Restore the original data before leaving the function.
" n% ~. W  ]  O. Y  d# E) l5 k                         */
" A% f9 x" d& C" E' L  y' p9 ?                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# v* k' C4 F1 ~) Z3 d                                addr  = base + cnt;
$ K/ A5 x5 r5 g3 L" r9 ], Z' [% d                                *addr = save[--i];3 h! _2 `" o9 g1 N- Q
                        }
: z9 i/ t6 a( H& W& H4 w% ~                        return (size);9 e! i- t2 M& X5 F& Y3 T( C
                }3 @: X% N3 `4 c, z* p2 B7 k
        }! k- L# o  Z5 ]8 }2 G& l) q

' \5 h2 \: O% b0 H$ V4 X! E$ ?        return (maxsize);2 R+ G* z7 Q  V
}
0 e3 {  r+ \. o& l, w; L" n0 Q8 f1 ]int dram_init(void)
" a/ P2 E- S* s4 ^- K' a: p2 N{7 O9 C& Q# v, U* ]
        /* dram_init must store complete ramsize in gd->ram_size */
2 t& P& m6 }) W1 h- x  l7 U        gd->ram_size = get_ram_size(0 A9 a( T1 F, U* w7 L, S
                        (void *)CONFIG_SYS_SDRAM_BASE,: ~/ y3 S7 u! @" F7 N/ x, I! w* `" w
                        CONFIG_MAX_RAM_BANK_SIZE);! E9 D& C: g3 y( Z% y3 x
        return 0;, E* {: A5 T8 Z" q9 J
}
! |5 j$ Y- ]  P& R/ y" R
# t& @9 G4 D6 S5 C) J7 m4 M! G0 S8 a5 c

8 _/ g4 D- i- G- i( P0 o) o; q- t, Y' E4 q0 @# r! m4 K/ P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! D, U# Q8 U3 V2 M8 B
( ~3 A9 a0 y& U# k+ s8 x, v) z- y- ?: Q0 V

' x7 g/ Q. k3 H# s% B
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-28 17:36 , Processed in 0.040969 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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