TL138 uboot是怎么区分配置两款核心板的 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit& O# d5 U1 H6 U- Z, D
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
" K, g. I  g! t+ g$ m/ w; Q& \这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" ]5 j; f1 X" J7 t! M9 W7 {5 m
0 f0 l6 ~3 D; z6 _# p& u, F# b是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* x$ n. @' g9 F; P4 O6 _4 }

9 u. o; A! t, M# X7 m8 z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% B: r5 a) y1 ]' V7 Y
/*( m3 L% I4 a( u) q9 l
* Check memory range for valid RAM. A simple memory test determines
4 @  O$ j. T" O* the actually available RAM size between addresses `base' and& U1 M, w1 [  k: H, a* Y. q* U
* `base + maxsize'.9 ^- H7 n; e+ e8 K3 b8 o
*/
0 X0 |1 k4 }6 Q2 mlong get_ram_size(long *base, long maxsize)& Y' E5 A- R' g! P
{
" i8 V- y5 B, u. [* K1 n+ D        volatile long *addr;8 J4 Q; y# K7 @7 H, k+ m4 S
        long           save[32];9 `1 N) ^# F6 m# P- Z& e# T9 I* U
        long           cnt;0 l& i+ E. `7 i8 ]
        long           val;! Q( \  |8 T3 `; d+ X' c! s) V
        long           size;
% p# t5 m, d6 l  X: d$ a        int            i = 0;
6 I( _& A, R+ R% d+ g% D6 ]" `' m4 H: r- Y  Y( w9 N
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' O' a- D; C, }. }8 x6 l/ S
                addr = base + cnt;        /* pointer arith! */- \- M( Y7 X( [3 Y/ t2 h
                sync ();
6 Y! u5 O1 X4 z; k9 m2 P3 j                save[i++] = *addr;
2 ~$ l% @2 q/ J: _) v0 T                sync ();( V3 p* s0 z% g
                *addr = ~cnt;" I( Z% R, `% L8 N' A( `. m" u5 D
        }
. [, |5 `/ \! G1 P  B: i" a, A) _8 w4 r9 \0 O
        addr = base;
8 f9 H$ N4 K  C& l0 C  Y        sync ();
4 _/ r" i+ H& }6 m) J        save = *addr;% V* p4 P# R- }5 T' ~
        sync ();* l- k) G6 h# ~' p/ {. c
        *addr = 0;
8 t+ K8 a+ B8 w' N, X$ m9 M
& m0 m: `6 M0 u7 _5 U3 s        sync ();. U) h4 S6 E7 U- ?
        if ((val = *addr) != 0) {
2 l8 S* C* _" I. O                /* Restore the original data before leaving the function.
! E+ Q3 i! O3 g- r                 */) k% j# k; P* {
                sync ();
9 I  W- b) N2 g                *addr = save;
5 D) h/ D( d: T  B- c                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 U3 s  v* l6 @6 t: r  `5 ^7 h                        addr  = base + cnt;/ l. f  o; b6 U; `
                        sync ();5 X; @+ c0 V% s2 L' i
                        *addr = save[--i];. f2 O( W9 K9 s
                }" m+ D& k  E5 w4 G, `9 f. v4 G% ?
                return (0);
& }9 D7 i/ A& H( j: x        }- T8 @& M2 R: @. Z

/ R& j# y( Y) a3 e! U        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 @/ S( _2 ]$ }! E1 D7 g! Y5 G* c8 o
                addr = base + cnt;        /* pointer arith! */: `* L* `8 A0 @) P( |
                val = *addr;2 |9 G5 X' q; g$ L" C7 A5 p! i" w
                *addr = save[--i];
. ?! D* Z0 u9 }# y1 H8 f  m2 Q# k                if (val != ~cnt) {
& u( b- y6 S4 R6 u' q' u" I3 P5 o                        size = cnt * sizeof (long);
. Z* o: }: L& l# O6 w                        /* Restore the original data before leaving the function.
  {+ |; K# `$ I                         */* }! _# L6 q0 b" l5 {
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 f. h" C4 _1 D- F
                                addr  = base + cnt;1 @3 Z$ v+ k1 Z/ w% {
                                *addr = save[--i];
- G, h7 {7 ~3 ~2 h- U                        }
0 [) x# n; S, B5 S9 @! b2 l5 x                        return (size);, c# z  P- F4 I6 b, O( R
                }& [, E! K: ^% k5 H% O. q
        }
" i: q( Y: `/ h7 {( b* r& }0 {/ x+ a5 \! _7 @. N) G
        return (maxsize);+ v7 c5 @( L. z* w
}
9 B$ ^" Z1 w( }8 m* o8 A- Lint dram_init(void)5 G3 o& K% R  I$ w6 o
{
% k: d3 m6 ^* o. U/ y7 Y- N        /* dram_init must store complete ramsize in gd->ram_size */; L* u. ]( [3 M; A4 [5 T, i
        gd->ram_size = get_ram_size(0 K" L  E: O: |% Y' }
                        (void *)CONFIG_SYS_SDRAM_BASE,: |, f* \6 k  Q. b9 O
                        CONFIG_MAX_RAM_BANK_SIZE);% f5 A& J6 N( ~$ I, }
        return 0;/ ]( r+ {8 S4 O& O0 J
}9 L+ `2 x( X3 S8 ?
; k- F" J+ f' p* N" W( ^

/ @) w; A& M: M7 ~7 }$ m7 Q5 @' c) D" `. G
5 G- W! o( p- {. Q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; w0 Q9 g9 W6 q* ]  ?5 A% n! h5 L. R! [; U1 Z* R

$ }8 M3 N+ g& G! p$ E! V* k, x
$ o6 S, N; V' }* |/ |2 V
回复 支持 反对

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-12 18:30 , Processed in 0.039353 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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