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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit' u6 \/ e6 M$ ]" p# x+ T
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
: g: m3 l; f1 g/ x这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?# y6 L( e! R3 ]  ^$ `

+ s5 z7 n* S, x是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?# H7 A/ Q! C! F# ~  s" h
' E6 p6 y% J$ X7 R% {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 `' v  I% ~0 w/** m. @- Q! k0 t- U  ?. V8 j$ ~
* Check memory range for valid RAM. A simple memory test determines) t, r) }. H% c9 r/ `1 s
* the actually available RAM size between addresses `base' and
% z1 u' ~% X& _# Z2 q. {* `base + maxsize'.
2 A$ A( D$ Z) Q# F4 [1 `3 E*/
# X' E* O7 [% q& W7 X! R5 q' m" klong get_ram_size(long *base, long maxsize)3 ^9 \! b3 a8 h7 A8 i; Z
{' m. l/ F# ^6 ~4 p# b, }+ ^
        volatile long *addr;
& n& s- I/ P) i; N        long           save[32];9 q4 U  \8 w) h* {+ W5 {
        long           cnt;
% r2 P( n% s# x, |) J        long           val;8 m& d) q$ {5 c! Q
        long           size;
4 m6 E" y+ [1 G) j, `        int            i = 0;
( _; ]6 e8 z1 f: m/ F2 Q9 ], S
. @' ^" d. x6 a& J0 N, u, V        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 v! P! t% Y$ J2 G$ u                addr = base + cnt;        /* pointer arith! */
; V+ s7 k; Z# ]2 ]) s: `                sync ();
( q+ R* F8 r0 B+ c& [; B$ [                save[i++] = *addr;
$ i$ K$ V2 q( m2 Z" S$ ~8 z4 u                sync ();) X8 @: @  Z/ n
                *addr = ~cnt;
" A0 D6 A7 l1 N: q* q        }
+ k9 B7 k5 H' y5 I7 c: e$ c" X& r3 f0 Q" G
        addr = base;
9 z7 `' y; a: [" _9 ?& P/ y$ S' X        sync ();& C4 [7 }+ |) ^2 Y
        save = *addr;# E% Q7 y2 f6 s( Z0 l5 A- ~) x
        sync ();
8 l& I/ D* L  R& J. G        *addr = 0;
+ G- g* l1 d( C' L+ g* i9 H3 q1 q% d3 j7 ^/ D5 r8 {, ~
        sync ();5 O" E  t; c7 L
        if ((val = *addr) != 0) {
/ j: x# D7 R9 T; z; a4 u4 L                /* Restore the original data before leaving the function.
4 l5 x# t1 l2 L7 b% Y7 P6 Y7 G- V                 */
8 `# s3 K' U8 a: o% J- ]6 c                sync ();
6 g4 v& V4 u) N  ]  o                *addr = save;
4 n9 X6 z; E: X% o3 v                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) b3 E* c" g# q& w7 \0 C+ P                        addr  = base + cnt;
( u) R$ ]: S1 k- o* A' Y' ^) f+ ?                        sync ();
9 V" h- Z: c8 x- c& s- C$ ^                        *addr = save[--i];% J+ H/ u: b; k
                }; |: c! B9 G6 y: V5 S3 v5 f; Q
                return (0);4 @5 \& i( F" C. B/ f8 W
        }
9 s3 v# F% W+ p/ K$ i3 {6 b. v- P2 R- h8 B! Z  H
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ L; M4 N' \- I3 B* ?
                addr = base + cnt;        /* pointer arith! */
: F% H4 b  f, f4 ^; _                val = *addr;
- J7 z( P- g  a) J                *addr = save[--i];
" M: b" G2 I8 R( `                if (val != ~cnt) {
$ ?/ H1 x5 _$ \& ~1 _                        size = cnt * sizeof (long);
, @  g: T6 C! u/ |                        /* Restore the original data before leaving the function.
3 w7 p5 }8 C$ p" g# x0 V, v                         */
3 J: S3 F; ~  h2 s  S: s) \                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ q4 W; M1 Y0 T' H- z
                                addr  = base + cnt;
/ k# g+ V5 B0 k& I% I- q                                *addr = save[--i];
$ Z. v' Q2 M* N: o0 }. G) [$ M                        }# v6 G- H1 B( v1 g) u; W& Q
                        return (size);
" r; b- k) L- J& \8 L                }5 A- r& |& i, P4 ^/ P
        }
0 t7 \3 D  M! v6 F/ Q7 A6 E9 |5 j
        return (maxsize);
/ s6 g" Z6 Q  v& D}; d4 \" P) V9 I5 e3 x& }+ g
int dram_init(void)
. C8 \( C* p9 r5 T, o8 y{/ [& o3 k" P2 \6 K( N! k8 D
        /* dram_init must store complete ramsize in gd->ram_size */) v/ n8 I6 ?: `3 u1 q1 c% s6 |% F2 i
        gd->ram_size = get_ram_size(
2 C5 O+ E( j7 L, X0 R& _# Z                        (void *)CONFIG_SYS_SDRAM_BASE,
2 N+ z. t$ A2 W' l9 b& C                        CONFIG_MAX_RAM_BANK_SIZE);
6 w/ x9 C& @5 p" t, y        return 0;
( d( Q1 ?7 m- C- ^: M5 V}
" a6 L& X  Q6 E. ?
6 O5 n0 C9 Y! [1 [3 l# R
  l$ E% l4 w1 R0 p6 X. U
6 ]7 e5 F' N; A
0 s1 q: t! D9 D2 a" e. i$ ]FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% ^' y1 {  a0 e2 j5 g
* {0 c! g* ~! l5 O* [9 y: w1 f! e
( q  `; k. K. q) d4 e( A7 g
6 J! s- t5 R2 }# t" N
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-31 00:25 , Processed in 0.039490 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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