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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 _! m, h5 P6 U# ~1 ]& z6 M核心板2:DDR2 256M Byte   NAND FLASH 8G bit* }# @6 q  G; C- Z6 L
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ a' p* }+ Z& c+ e6 }$ j- K4 q4 q- D- Y: `7 W/ D  S+ S
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' z! I4 W# W5 x/ Q7 Z# Y; z4 P5 D' }& D$ M: P' N' \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 o' r1 @5 I+ \! H3 i0 {6 m/ i
/*/ ]' W* @4 s5 D
* Check memory range for valid RAM. A simple memory test determines
+ Q! r" Y' k/ E( F$ R2 P) f$ G* the actually available RAM size between addresses `base' and
2 j$ ~+ Z( m% j) `' H* `base + maxsize'.8 Q. ^: K9 J* ]* p0 `* f0 u& R
*/2 ?+ k3 l" D9 [9 T) y7 Y& @4 Q
long get_ram_size(long *base, long maxsize)
9 @5 |4 S$ B- i* r. z! p{2 n' l1 s1 x# H+ M: |9 F* @
        volatile long *addr;+ V- A8 O8 A8 j  d! y! r
        long           save[32];
0 i1 G. N5 f3 t6 ~# a( E# P  b        long           cnt;
. j( k0 i! m6 A* |3 J        long           val;
; I0 K( R# H  e. e5 \2 L7 \# E8 r        long           size;
9 ?$ ]4 i3 ]8 W7 _! ^$ X5 h        int            i = 0;
* n4 {3 @& I$ n, ~
# n  t* p3 \8 q$ p" ?) \( L        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 k- w# d0 q) t$ u8 E1 }* m8 j                addr = base + cnt;        /* pointer arith! */
' N: z* w* e1 Q& {9 N& M                sync ();2 A  \/ O% k3 H/ K9 G  q9 t6 i
                save[i++] = *addr;
8 `7 P0 z0 f8 x                sync ();# o$ |' ^) E0 |
                *addr = ~cnt;
, m; G5 p) M% a2 z7 m3 N* F: ^1 x        }
+ m7 u8 G4 H/ D$ x2 W
0 C- g$ X/ l/ j) h% z        addr = base;
7 t  B- H4 c( p4 s2 ^        sync ();
4 N5 t8 B9 z+ x        save = *addr;
7 ]; Z2 j3 v# B: b        sync ();
/ `: l8 z2 a) N6 t        *addr = 0;. l) n& p9 @$ A
+ h1 q4 a7 I( }9 e
        sync ();* a( X6 y9 f- _; `8 x9 j7 B2 e
        if ((val = *addr) != 0) {1 C% y! z0 o+ e: P% g3 e
                /* Restore the original data before leaving the function.
+ ~$ Q% Y* k/ U8 B1 J1 F; t                 */
7 e' {" \! D6 E& m5 ?                sync ();
0 o/ [3 X. c; y, U  ?) g                *addr = save;
: s8 S8 B) ^  R0 Z                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 o2 G. J# \  w6 j) b! e' ?
                        addr  = base + cnt;
, G' B: X; v; K; m4 g; D                        sync ();
; ^3 A3 ?$ D1 d                        *addr = save[--i];
9 ~) K3 i* Y/ l5 b; B; k" F6 R                }
4 @- l& |( ?8 A; C' h, |& v                return (0);4 V0 }; u5 h3 X: r& W' W1 x
        }3 m! K3 }, r. ~* x) p

# Y' W8 Q. d6 ?3 ~/ V! |4 I        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( W- N; T1 b: Q
                addr = base + cnt;        /* pointer arith! */
8 @* F% U) q- U% k                val = *addr;% ~! T, U; P4 I) X
                *addr = save[--i];. U* s5 M( O9 L" ?, m/ v
                if (val != ~cnt) {* M/ n1 `+ f2 @* e3 ]
                        size = cnt * sizeof (long);
& m- |" i+ Y/ b, \- O                        /* Restore the original data before leaving the function.
2 o) y3 I6 m: r. P# w/ L) V! i                         */
! I) J( t$ l: _8 j: ]$ `                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 g; N5 _2 |/ X* U6 p* U: ]) w
                                addr  = base + cnt;7 {5 N0 O, ~9 B* O5 `
                                *addr = save[--i];* i9 A; ?! y* Y
                        }
  ~% a; K7 d; l0 }                        return (size);. I) h8 k2 N0 p
                }
5 A5 O, W8 C8 T" o        }7 U7 A& n. S+ b: d. s

1 _7 j& B; D- O4 l6 s; g$ ]8 x0 q        return (maxsize);
5 t8 e) t8 T9 E# i7 ]}
0 R, U" p$ z1 U. b# D. Iint dram_init(void); a8 W8 Y  h% i7 C- ?
{
- N# [% l# U% D) d        /* dram_init must store complete ramsize in gd->ram_size */
. T/ S2 T: C3 e" Y        gd->ram_size = get_ram_size(
* t& ?3 c7 F; {8 k                        (void *)CONFIG_SYS_SDRAM_BASE,; \, K0 u! Y' c% z& r4 f3 ?+ B
                        CONFIG_MAX_RAM_BANK_SIZE);
7 F; F4 ~) w* V' f7 `5 |9 c2 d        return 0;
% O5 z" V: D: w/ c}* @2 Q/ w' G2 D! H* V& @9 C

* q- t$ Q$ `. ]) W0 f! ?* j5 R
9 F4 N; Z* g# _0 f0 m" e) P2 h) l) l' a- }9 W
& [- r! P- W/ {7 P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 ]+ {, Y+ @% h. ^
# r, d" k* b  x5 g, k
! @, g1 h8 z7 G7 y- O+ K3 l
% c3 t8 e0 a& m5 W; K6 Q; W3 X
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-23 22:33 , Processed in 0.038751 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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