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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 ?9 |2 y9 z1 @( L核心板2:DDR2 256M Byte   NAND FLASH 8G bit
4 H6 ~" j8 A: s6 l+ L; j这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 |3 x3 B; M5 Z) G

# `2 \) j/ H* c' {是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?  E* q3 J  @9 L, Y0 y" g% |2 V
; h4 Q6 b6 @& j. v) w6 ?: l4 ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 R4 k- r: |; d" U6 d! `- r/*
/ m2 Y9 _1 g2 E& e/ O/ m8 g" Y3 b* Check memory range for valid RAM. A simple memory test determines
0 D  c1 k( O2 S# @% i! s8 c- A* the actually available RAM size between addresses `base' and
# Y8 s5 ^# ~/ r. s* `base + maxsize'.3 i7 l. h9 I8 T" H9 Z3 \
*/7 B2 D5 @7 F! g; G
long get_ram_size(long *base, long maxsize)
$ g. [( P9 p* G1 w8 ~7 ^{9 ]' ~2 S: y4 |2 u/ s  C
        volatile long *addr;
+ }" f2 D! \5 }0 \1 r& E- N        long           save[32];
3 h; R$ ^+ A/ M2 H9 r5 e3 B        long           cnt;
# d0 @9 L5 M8 [* E4 L& `' t7 q4 ?        long           val;
: y* V& X7 d- M- I' s* j        long           size;
# n- S. A: Y1 \8 i        int            i = 0;
  s$ t. w/ P* R' |4 y7 Q; L1 d6 ]* D7 K3 q  W
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( F, Z  F: x8 U3 U- q$ l" Q
                addr = base + cnt;        /* pointer arith! */
# d  L% h9 r4 z$ `0 {& i% O                sync ();* f; d: D) X5 Q; }
                save[i++] = *addr;$ p; q; s5 y/ B9 T; A8 x  V
                sync ();
2 |+ d% I2 O  Q- m9 q/ e* b                *addr = ~cnt;
, i& l9 A8 Z  L5 n3 {        }
0 S5 I/ i3 y! l( d0 s1 J7 ]3 N8 D; G
0 f8 _. @. c% U. C* F" f        addr = base;+ ?* T/ P1 L- z0 F
        sync ();( P; e. W9 i& T$ P% d1 T: _
        save = *addr;
# @. I; i7 o! i, t: f) d5 c        sync ();
$ C- ~% g8 P; r; X1 b+ q/ K7 N        *addr = 0;
- Q  c0 {2 f8 Z. T; \
4 R' A) x, I* C1 s$ r7 _- y; t        sync ();
' ~" s$ N# Q6 G5 @; B: p2 Z        if ((val = *addr) != 0) {) P$ U' Q9 o0 }& m
                /* Restore the original data before leaving the function.
) s, v. B' v/ S0 ]6 H                 */! N7 n& }. u! |6 y) ?
                sync ();( P; K- G* g' c
                *addr = save;
6 Z; y* f1 K1 U) B3 O                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 c" G. w! z5 [5 D9 k; `9 X                        addr  = base + cnt;
, J; q; i6 X0 B  u: o$ ], I5 d                        sync ();) c; {  c' ]- }
                        *addr = save[--i];( ~' P3 m) R1 T: g! R4 t
                }% d- o" P5 S0 H  n7 L6 h
                return (0);
7 B' Q) t2 ]7 T& A        }$ {5 m) J& r/ A$ `7 Y
4 K0 y4 Q/ I" n; y6 y) z' E
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 B' ?5 m1 [: }% s; M1 a+ I" N0 q2 r
                addr = base + cnt;        /* pointer arith! */
" }9 [; ]% S9 d7 P/ P                val = *addr;
! E" b' e/ a& ~5 T+ k7 a+ B" a  T5 ~                *addr = save[--i];
- l' B  W& T1 `+ G3 e0 _                if (val != ~cnt) {  [, E& G* h. ^: j4 L6 v' ^
                        size = cnt * sizeof (long);9 c8 C& W; c- `$ H7 v( e2 u
                        /* Restore the original data before leaving the function.# o* l; W& ?+ M6 t1 Y; l- m& _
                         */
4 S7 y  O: ?- P3 h                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, j2 K9 h$ ~, Q( Y; y$ [* [! K7 B                                addr  = base + cnt;
7 m" H( ]. Z7 g2 N* [: p  ]. t                                *addr = save[--i];4 f0 t' P# Q9 _
                        }
, x$ q8 k; Q9 P) P3 h( J                        return (size);
8 @2 _4 f) p* u+ O                }1 m0 c. [* G; U- |
        }2 J- p, ^( Q* Y
% l' M/ L8 y6 ^  W! l
        return (maxsize);
9 B9 P% B  x5 t4 t+ z2 c1 y}
% N8 Q2 v2 r/ P, }9 o9 E& ~# Qint dram_init(void); I& f/ u% w+ E5 M2 Y! N
{
5 G+ H& L5 V9 a" e# @3 U4 ~        /* dram_init must store complete ramsize in gd->ram_size */' f0 x. W5 \2 W( X* S3 v$ g) a
        gd->ram_size = get_ram_size(, z; V9 H: Q) E' f$ ~5 l5 G/ D% S
                        (void *)CONFIG_SYS_SDRAM_BASE,  W/ l$ j* I" G4 _1 X
                        CONFIG_MAX_RAM_BANK_SIZE);
( Y) i  ]1 n+ n6 D        return 0;  H" G- g( m, f/ |# s
}+ l+ i& h, s$ ~

7 q0 Q- P7 M0 j- t9 F9 Y
) I) B0 V& Z7 c0 ~- R
/ v2 Z/ p) D$ B3 S9 u" D7 z. F
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* D5 O' m+ L2 v* a8 V2 E+ E
5 q1 W: W$ O: C! f9 }: M! _
- ?" t. }6 a' F* ?
7 Q7 X- u+ g2 U& K0 H% a$ A
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-2 17:19 , Processed in 0.039431 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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