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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 _* p' Y0 ]. n$ V; J4 r/ n3 i核心板2:DDR2 256M Byte   NAND FLASH 8G bit9 x8 x# o. @# s+ T: \* `3 l1 w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?5 _7 k) p( T2 y* D* G% [
5 P8 Z4 M9 w( s/ h7 B: M4 s3 ~8 x
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" g& w8 y* A) k/ a  W3 |
4 g* V1 n$ O, q- t7 ?- _6 h+ `+ T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! F7 `, W& W% s+ h8 B. s/*
9 @( l! D! _5 u  A$ A; P* Check memory range for valid RAM. A simple memory test determines
( s, K6 m/ J- [( Z9 m* the actually available RAM size between addresses `base' and- f8 z; b( ?- H) |3 {+ S5 Y, S; N( @
* `base + maxsize'.) Q; I& f4 F2 q2 q2 \
*/
% S3 I  |! {5 i+ d. g( [) O3 B% N& Jlong get_ram_size(long *base, long maxsize)) ~4 M0 F0 R& |% K9 F
{5 |. r4 Y( K, f- ?
        volatile long *addr;
) q5 N( g  e; ?+ G6 Z9 k0 s        long           save[32];
4 N2 r: p9 B4 ~. G; U        long           cnt;
9 Y) u- z* [" Y        long           val;
: C; t4 [. R: q9 O7 A7 t        long           size;
0 g+ O4 J+ }6 I8 u6 B! d: V        int            i = 0;: I1 T5 H( ~! }7 A4 }* W4 @. u

% h0 K. B; ~% y( B) Y        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 v4 B) P4 n, j3 M% _                addr = base + cnt;        /* pointer arith! */
" Q, g) F6 I" f                sync ();6 I  ?, R4 c9 {! L, n+ @
                save[i++] = *addr;
- C! U$ D4 p- k; A6 Q                sync ();4 D) q' K, \/ H+ K
                *addr = ~cnt;
2 i9 V; M' B3 g7 ~' q5 t5 [& C        }
$ h- u7 |+ h2 s
1 b# [  s& G$ |# f3 D        addr = base;
( l/ q$ U. l  u  P! A0 {: F5 ^        sync ();( Z! Y  B+ D! \- a) m
        save = *addr;, }6 f  ]: c+ Q9 ^$ m' D# k
        sync ();' f4 b# I& v/ a2 {- H) I3 O5 k, p
        *addr = 0;3 d# q' B, D3 H: c' K( G

) H, P8 N! ?3 J9 |; ~  x        sync ();
& f& I6 }7 k7 M. g# `) e        if ((val = *addr) != 0) {
9 {! Y$ N+ m1 g3 Y" V                /* Restore the original data before leaving the function.5 l- d+ q0 f/ a3 U0 j+ {0 l
                 */
  Z. A) ]+ E0 x2 |' x# ?                sync ();8 X$ }9 ^3 e2 \  k0 n
                *addr = save;+ b6 K4 H) m7 p2 y& j, h7 a' R
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 X% f7 K- ~9 v7 d6 t  C- |                        addr  = base + cnt;
+ {; Q1 U) d0 t% B                        sync ();
4 r0 V) ?  a- M8 p* f- L9 r2 s$ j                        *addr = save[--i];/ l9 U3 c4 |+ M! ^
                }- W& P# T3 Y. J' ?' f
                return (0);
, n  c' Z  h. c5 q/ x  L( L        }6 W- u* n% ^% f) c
6 @1 `$ Y* Y* z. z: q/ ~. e6 ]
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- D: V/ V$ h# H                addr = base + cnt;        /* pointer arith! */
( O. X6 U& e+ F' ]                val = *addr;: M3 c1 g. Y4 d, M: j7 b9 @
                *addr = save[--i];9 J0 Y6 }  `) C0 ?( Z
                if (val != ~cnt) {
. _( U# Q9 ~  P/ Z& V' ]% l                        size = cnt * sizeof (long);' y7 X+ H+ @/ s! X' _) }
                        /* Restore the original data before leaving the function.
8 k+ G: w- q& b& a                         */' b7 \3 F; k' \% ~
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" I! e# ^% D& \* t0 t4 E, @/ m% f! u                                addr  = base + cnt;, Z9 [! ^9 J& D2 n, D
                                *addr = save[--i];5 |5 e$ b' i$ b# B# Z  e1 Y; A
                        }2 c2 N  M( Y8 V
                        return (size);
4 z* {; G8 S. S1 Y  ^/ N                }
# z0 J7 ]( I. {3 z" C$ u1 x' p  X, J        }9 l3 i# f. S8 F2 S" A% ^, x
' z* `4 w% m3 ]: M- G
        return (maxsize);
+ p0 M' D* |. C3 x}: k# w# e: `% s. C+ q# l
int dram_init(void)
4 ?- @) o0 B( g; a* `  N+ J7 }2 o{6 {$ J6 l( e1 P2 p& F1 @: v
        /* dram_init must store complete ramsize in gd->ram_size *// E- `4 K! Y5 G- s
        gd->ram_size = get_ram_size(+ n, E: _, T# ?; c3 G$ y! [: Y
                        (void *)CONFIG_SYS_SDRAM_BASE,1 Y2 g0 Q  P+ O3 \7 [
                        CONFIG_MAX_RAM_BANK_SIZE);
/ I9 F1 x( V6 u, E0 V! R# t        return 0;
# y/ j. t4 Z! K* K6 W}2 z- M1 h( U7 B

" w5 a0 O) W+ S3 b6 B: H, F& p
2 k, s* s/ Y& K8 W" q+ i) c
, O% o, C" h  \8 n
  a/ V' w" v2 _FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 k4 K) n  ~, ], d7 Y
3 ~$ i$ L% R- D: b: ?- C( @9 J# o9 k  B: E- G( r6 t% E

- d7 z; h# Y3 j" r7 v# R
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-24 20:04 , Processed in 0.038705 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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