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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
% D% {8 ^3 f( |! _7 c核心板2:DDR2 256M Byte   NAND FLASH 8G bit! J2 ~) v- R! Z* S8 P( Z' j
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?7 u& i" h- d/ ^0 v8 R# p0 i7 K
& Q2 H+ x+ p. I$ R  {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 S) y% g% ~4 O$ o3 R' q, r1 q+ Y5 r# {- N- T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ P: U1 D$ R# U/*% |& r9 R. Y0 O3 o
* Check memory range for valid RAM. A simple memory test determines
/ G/ E% z) U* T$ L; p( V; P0 w* the actually available RAM size between addresses `base' and/ @% l2 Y$ J7 P8 w0 [. k% \2 k
* `base + maxsize'.
/ R# l6 h: j7 h& l8 S*/
, L9 `2 a2 T* A6 k& Y3 v. blong get_ram_size(long *base, long maxsize)
8 b' n* Q( N7 M: p{
5 ~( _0 B' v" Q+ y$ Q' }        volatile long *addr;% J& a/ K/ u9 Y# G# Y2 J3 W
        long           save[32];
' i1 ~+ P% ]' f3 O/ c0 M        long           cnt;/ H+ h  h% m! {4 B* Y$ \3 P% A7 a& B
        long           val;
$ G& C2 S" J! G# g/ J$ k. B3 l        long           size;
* U! v! l5 K1 X5 k- m; X        int            i = 0;( O# Q% Q+ @* `4 M. g/ P

0 A  |; s+ ~# z- r& |" M. V  I& \4 Y( X        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ O) M4 Z% ?* N8 F9 W9 X                addr = base + cnt;        /* pointer arith! */
, F6 l- U- D2 @* |# Y7 E/ {. v1 U                sync ();1 G" N3 L$ N2 T
                save[i++] = *addr;. J  t9 d8 Z) X# ~3 f! w
                sync ();( z1 l0 R4 l$ N* }* h& W6 ]
                *addr = ~cnt;4 H# z$ L2 g0 B7 p: |- Z
        }
) O$ I9 z' a! ~' W9 b
/ U/ z/ c  }/ D4 p        addr = base;; H) O/ f% s, w- `# Y6 O  G
        sync ();$ o. o- p! Z; [7 ~: Q! H
        save = *addr;
! c; S% G8 V- s. X# t; N* x        sync ();
* p& [4 v! @  c* Q6 B1 o        *addr = 0;
+ y1 Q0 C; Z3 t, G& u8 i3 V! `( e7 @+ J% L+ {3 @+ g/ _7 h& [& t
        sync ();$ U' b7 r' d& J0 a* H+ g. F
        if ((val = *addr) != 0) {
% t  m& d3 g8 ~/ f7 o                /* Restore the original data before leaving the function.  `2 y  R0 N! ?3 }7 z- y! M
                 */
# b/ e9 A# R1 d3 @                sync ();
& v: q2 A. l3 H+ d                *addr = save;
7 v3 J& q* v# Y* j% @9 {" n" z                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {4 r8 ]* ^" |) v1 u
                        addr  = base + cnt;- K  D7 u9 j; y, S
                        sync ();: L! G& a: u& g* m3 W
                        *addr = save[--i];
3 ^. m. H0 \9 l8 w! A$ v                }
: |2 q' C8 T% [5 u% g% r2 u$ ~$ W                return (0);- g$ J, Q7 R1 {# F! W; c7 [+ y
        }+ L, h: }& z6 {6 M. o4 \
, C/ J1 o* x& k( V0 f
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 ?2 ?$ w/ J. A- j8 o                addr = base + cnt;        /* pointer arith! */
' \$ L6 c' K. J- ^4 _! w' |2 I) i. v                val = *addr;7 u8 w6 y8 Q6 S
                *addr = save[--i];3 `; N2 y. H, B/ ]
                if (val != ~cnt) {
/ s# f2 e8 v$ f; R- W% @                        size = cnt * sizeof (long);
# a4 c! {5 ^4 W8 K1 }# _                        /* Restore the original data before leaving the function.
1 ^8 v$ Z( H" [; J                         */
& B( K, }6 X  L! X6 b: Z5 m' v: _3 e' o$ O                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 v) z. u3 u* ~( e& c
                                addr  = base + cnt;
3 S* q# |. r( l0 B! Q  x1 G                                *addr = save[--i];& m6 z# c5 p( X, U1 S
                        }
4 i+ ]8 O8 x: a) u6 O" v                        return (size);2 T4 W1 k6 N8 `* D; U
                }
5 m$ I$ ^+ n. D) B1 y        }
9 w) w* P4 L. P
. \- |5 p% N2 p! n0 y        return (maxsize);$ L& j5 B/ I, E) |+ W
}: _5 ^" _% Y0 f, Z) A
int dram_init(void)6 a& s  i' G$ f* _" D' R
{
9 d$ p) A1 x- t  u/ T1 d$ S        /* dram_init must store complete ramsize in gd->ram_size */
. F5 K7 t* q7 ~6 E3 Z0 u        gd->ram_size = get_ram_size(6 X. \2 Y0 D$ U  x+ k. S
                        (void *)CONFIG_SYS_SDRAM_BASE,9 ~( A7 O& }# s) B- `$ c: q) N
                        CONFIG_MAX_RAM_BANK_SIZE);) V. H% a* b0 j4 o6 x
        return 0;3 h2 L" D6 g8 P* S
}
( n2 g7 p, d9 H
# u3 [: T! T+ m8 O4 |! k
" n+ O7 K* U- C& M& S. Q% d( N" h& d5 G% K$ Q: [

* k* p0 Z6 D+ WFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 O/ Y8 J5 d4 y, M6 K7 K; t6 t; S# B. a
% b; d' F4 w- `* _
5 g8 H( l' P* F4 R! S4 d
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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