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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit; x+ j+ d* ]0 X2 R3 Y" S0 |2 A5 K  |
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
7 Q& s1 @, C1 O3 p% p这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?' U9 k  Q7 d. p7 _( Y5 h+ ?) h
% V7 \& s+ t: |) r3 x3 a
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. Q4 @3 V4 g: |4 r" s, r1 U9 E4 p
% @& b) P& c8 e; |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 i# b1 o1 y$ ]: J
/*, a! V; L. G' e: c# ?7 O
* Check memory range for valid RAM. A simple memory test determines  e% b4 g. Z8 F
* the actually available RAM size between addresses `base' and
: s# l3 r+ I- x% |* `base + maxsize'.
1 D8 |) i1 L* v6 z+ C0 v$ ~*/
5 j% [+ \- |" K, y- z# s8 Dlong get_ram_size(long *base, long maxsize)
3 j" h9 D5 z" J8 l( q1 R+ Z4 H{
3 {: j7 P# O$ O  W* T# C4 X: N7 x0 g        volatile long *addr;
: W8 x" b  ?9 E$ {7 D3 ?# l+ {        long           save[32];
6 N* Y  f- A, v3 j* o# C6 g        long           cnt;3 r9 q# F) v) H: [8 y
        long           val;  K: |% K) [- D2 S% ~
        long           size;
8 B6 `' H8 A) j4 B! o/ I: |& `        int            i = 0;1 m  M* i( c; i
4 e* X. f: X5 R% }6 y8 a. Q
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( K$ w% |! m$ D) w" m% \# T4 V                addr = base + cnt;        /* pointer arith! */
% x& |% C' N, m0 m2 g: d# Z                sync ();
, g9 s  |, j" `$ g7 A                save[i++] = *addr;
( I, r2 ^3 ~0 d+ Q1 F                sync ();
6 z) A4 \9 \6 j+ H. {0 S( h% k& t                *addr = ~cnt;4 C& S3 D/ I) N! C
        }/ z9 i# K, V% z4 p* G& Q

* C8 b# ?, T9 O+ j        addr = base;
: T+ l: T1 W! `- I, {' t        sync ();
! G0 \7 h6 K9 Q5 b1 g3 o% O        save = *addr;0 w0 ~  B% [% j/ p1 n
        sync ();
+ W- I& n" z* m" }% E- n        *addr = 0;
% G! \6 l6 r1 }
" l2 s& ^: }. T' |% w        sync ();2 p! F! ]& h: l3 E! X2 ~
        if ((val = *addr) != 0) {/ N2 K( n$ k8 N8 @0 \; O) X% \) v
                /* Restore the original data before leaving the function.+ j. g3 x* X  L& g# u
                 */6 a" o& T8 Y" B0 U( D+ U, g9 X. {
                sync ();- i2 G( k4 c  m6 R0 d8 Y
                *addr = save;
, W, n- }) I, W% e' L4 c                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 G7 w, g6 C  }                        addr  = base + cnt;
, t1 ?( ?" b  J( p) ?                        sync ();
3 J7 [, p$ M6 U2 P( F$ N9 o                        *addr = save[--i];
* J9 X: K+ Y( U* o3 |0 X0 ~! Q                }
3 V3 R# B4 ?4 j, C  X$ X                return (0);
3 r: a5 V1 P7 {. D* |3 w! ?/ o        }& U+ L* g+ u0 c
0 F1 L5 i0 d, ?: F! g
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# S% u$ D- J. z% r+ i$ `1 {8 O                addr = base + cnt;        /* pointer arith! */- x/ H% m" D4 V6 V8 ]+ S4 a
                val = *addr;4 w+ H: j3 ~( E+ F3 M' W6 t) U
                *addr = save[--i];
+ j* N+ I% i% f* l1 W                if (val != ~cnt) {
# w9 X% E- [8 T/ C$ f5 A5 X                        size = cnt * sizeof (long);, y( }1 D7 p1 m7 s" {+ A! ^# a
                        /* Restore the original data before leaving the function.$ \0 M( G4 g$ N9 H( S4 V/ Y$ f
                         */
6 @9 R1 o- k+ y0 G                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: J5 ~6 X0 H; q  B3 g& O* e
                                addr  = base + cnt;7 W8 S) W' E( V" i( f
                                *addr = save[--i];
* Z2 u6 l0 `7 E2 m+ S* X* x                        }
3 L* }& A: F! Q! r                        return (size);- A6 I" x* M) n% L% [7 }
                }% y+ R$ |. d( F; e
        }$ j/ D  q. m) s
( H9 g: K) P. S5 F* c" f" \5 w0 o
        return (maxsize);
+ O" w# k) _+ a}
7 z& _" {# T+ X+ A  Y% _+ kint dram_init(void)8 c; z) c+ {( v+ U3 o, ]
{, g1 `9 l% X0 }$ [5 P
        /* dram_init must store complete ramsize in gd->ram_size */
" Q; a- W  ^2 _. I+ b        gd->ram_size = get_ram_size(( g' L3 ?8 K3 x. w
                        (void *)CONFIG_SYS_SDRAM_BASE,$ Y# P0 F0 v# y( Q. e- w( i+ C
                        CONFIG_MAX_RAM_BANK_SIZE);! P& K& r) W8 B& _. |( K" s5 r4 D) T+ s
        return 0;
; _5 [6 m, C0 l}
7 v. q, `, ~, S/ x' v& b+ N) p1 Z. |4 e0 k! G2 m6 b

  w2 i7 `& a  c5 B4 t
$ D; {2 |1 M$ {7 C1 s( M$ Z! }" _3 W6 `( M% k
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 Z' m" t3 p( @5 i3 f- x* e# H
- _$ M. O: ]( J2 D5 J
. x7 @* v2 a' r/ {
; ?4 p$ B, Y3 M+ j5 y
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-6 06:30 , Processed in 0.039076 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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