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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
  ?5 k+ I* u7 _核心板2:DDR2 256M Byte   NAND FLASH 8G bit3 a& M! W0 m5 W, L) \, ~9 l# A% r
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?7 F2 U; p- Q' E
- Q& G4 l4 B) N2 N. Z% T  A+ ^, }' m  P
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" g* Y- q5 I: d" `4 }$ C* }) s
. ?* H9 N+ |% P' ]7 W0 Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ B/ p% s2 s3 l! Y! i/*
7 G5 d% X2 c+ Q* u, R* B* Check memory range for valid RAM. A simple memory test determines
# S5 W; i3 Z- U. z$ Y* the actually available RAM size between addresses `base' and
7 n# g+ y. r0 q; h9 \5 i2 ?1 S* `base + maxsize'.
# U) V7 I/ K$ w+ l*/
. }. p+ b9 s5 v5 }6 {' Vlong get_ram_size(long *base, long maxsize)% c! D9 _+ I+ S$ `$ z. J& ^
{
8 o- O2 R- L5 S$ A; G, f        volatile long *addr;
* c4 Q  [2 M, I        long           save[32];
- P( b8 {4 i  O! D/ [9 S        long           cnt;
& E  c7 ?4 K4 b( z! E4 q        long           val;( e1 `# k: v/ I) D
        long           size;9 y4 ?8 ]! l8 j9 N1 \2 t
        int            i = 0;  `3 G) K0 Q% h1 r# Q1 Y: ^, [

6 n- a0 d+ D+ R. [% Z        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {/ @9 E+ A& W; _
                addr = base + cnt;        /* pointer arith! */( C; H9 J, @+ p; ?; S. m/ J4 ]1 B# ?; \
                sync ();
. J/ r% |. k$ \4 L- I1 v6 K( U* z: P                save[i++] = *addr;
/ q. ^$ B0 g5 w. D4 ~                sync ();
) M" y' L* s) C  V0 G$ V                *addr = ~cnt;: K0 u1 {1 Q& x
        }
. X9 j0 l+ }8 C9 V7 e& T/ Q4 i2 D
        addr = base;
) H6 S. _( ?/ G1 R  T9 k8 f; k        sync ();
: B) r9 ], y) D        save = *addr;
4 t: A" l/ c* o. K7 d5 c        sync ();3 B3 W- o2 ]* F( D3 ?$ j
        *addr = 0;" S# o. c: b" R  k6 W

3 K5 \3 Z: |2 e" Q        sync ();
/ e2 }0 f  I& x9 |  ]' Q        if ((val = *addr) != 0) {- X( O" x4 B9 \* k& B
                /* Restore the original data before leaving the function.4 i2 l' j6 r! ~3 [; s2 w) _
                 */! d5 A  ?3 O4 N+ ^- m" {
                sync ();' s- ?. W0 z# K% j
                *addr = save;
. K/ o% P; H6 Q4 H. w" H- l. Y                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# p3 Y! H5 L0 \9 L: r6 p                        addr  = base + cnt;  F/ N, w9 \$ G6 t4 X* y$ o' T
                        sync ();# u/ W* Q) B+ T# j; q) o. B
                        *addr = save[--i];
2 ?' ]% A+ S1 g0 w: L5 W, |: G                }+ w  b8 H+ J+ K: w  m" [/ S" c
                return (0);
* ^# [7 j$ T" z# l' t& I        }" y/ J1 e& ?. A: {, L( ^

( C, k8 v) I, |        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) l& I& B$ y8 J9 B                addr = base + cnt;        /* pointer arith! */8 z4 t$ U  E3 [: Q
                val = *addr;
+ n( R) W) P2 Z, a8 D. q                *addr = save[--i];# @  u& |' s! w
                if (val != ~cnt) {$ [2 q1 S! {" V: a7 c
                        size = cnt * sizeof (long);
( w+ V+ Z) P7 D" j' d                        /* Restore the original data before leaving the function.% S" f+ v+ i: b* N, [/ f
                         */6 A: d& P' Z) Z6 R
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ V) ^0 X  Y5 a. K( K
                                addr  = base + cnt;
; @% z  J5 G7 d( K% V% @0 H2 R                                *addr = save[--i];
  T2 t+ i( e* R3 Z3 t                        }
9 J4 \8 \& G% Z6 O                        return (size);
, c" X+ q5 B+ k- s. \( W5 N. q                }
( d: B/ a# o5 L) B        }8 o+ C" d& L  z( P
1 G! u0 }: n; q- ~" c! q9 A
        return (maxsize);
4 x! c! q$ M. ]  ?9 ^/ S5 |: P}; A4 j7 V" t9 I  v* D
int dram_init(void)
7 W. w, D9 s0 X" ]: R% G{
. N/ z9 C5 C* l        /* dram_init must store complete ramsize in gd->ram_size */
6 `0 B* }2 X$ W5 `        gd->ram_size = get_ram_size(
3 w8 m/ J) c$ D                        (void *)CONFIG_SYS_SDRAM_BASE,
; j: m) }! h6 o/ ^6 n' y                        CONFIG_MAX_RAM_BANK_SIZE);$ w, L9 {) P0 D
        return 0;
# W5 q: T  L! ^4 D8 G+ k}  ]) r$ Z4 f6 w* e

: K3 I1 i* X" i0 A0 L2 @7 A
. k& L! z$ [  p0 F5 ]- D
2 {: A# F9 x, q3 T
! a1 H* f, E# CFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!0 w2 O% H! L3 M: m& z- p$ U2 g5 q
7 k3 ^; X& i" W8 p
5 F& z) z2 ]' K7 t
. }9 k3 j- @/ I. b
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-7 08:53 , Processed in 0.038785 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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