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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
/ y% d; _- ^7 g* T  T) ~核心板2:DDR2 256M Byte   NAND FLASH 8G bit
1 a8 h8 V4 L- Q& E* e这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?- m2 Z! q% x$ Y% R- o' h

% x  C6 B+ v; q" {- b2 T+ j5 N是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 ~" s0 u! M) ^
5 T, Q8 k7 ?6 d  J' |: p4 X5 [6 }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 p' j3 o, Y) Z2 X7 M/*$ z4 }) j# t7 @6 F
* Check memory range for valid RAM. A simple memory test determines
/ _+ t: Y. K4 g# B0 D8 o' J! v7 N/ w* the actually available RAM size between addresses `base' and1 N) ?$ @4 z. E6 \( Z( X# L
* `base + maxsize'.7 X& v" E7 X4 ?; X
*/
7 l3 J  ~. T; i& |/ G, m( k' ]long get_ram_size(long *base, long maxsize)
+ F! S2 C) f3 e& V: X{
' e: d2 K! t3 m/ D        volatile long *addr;
, P/ L# K5 z9 p2 F  V/ |7 g        long           save[32];
. b) T- R8 m$ J9 ~  I1 r! V        long           cnt;2 }, a. y; D5 S8 w# j% `" v
        long           val;
. E  k7 s3 @6 @, g% R2 W& f- q        long           size;0 s9 E5 H) D/ Q  h8 G5 A
        int            i = 0;2 r% V& f' {* B* n5 r: Q2 ~  A% x' E
( i; Y8 R: v7 H
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 q' j6 Y- p: z- {' K6 `                addr = base + cnt;        /* pointer arith! */3 c& @$ m2 @1 H* w' s( K1 p
                sync ();+ W# a# @. i' Z9 H' r0 g2 M
                save[i++] = *addr;
4 F. U7 A& A$ M1 i                sync ();
# E$ e* r4 \- K5 Q                *addr = ~cnt;. e: J/ a4 ?' p% H) Y% R
        }/ K! r$ S! Q: k' v
' L# w5 e0 F1 V' C% N0 q
        addr = base;! ?7 m  d( o/ I% I, }
        sync ();
7 Y" g8 L! G/ a        save = *addr;
* D- i4 O7 e' j        sync ();
3 ]7 G& G" B% b' H: B; D        *addr = 0;
6 m& C5 M- M2 x# a" H
/ B. `2 n. m, m# b! X, ~        sync ();5 v# V( p2 J9 \
        if ((val = *addr) != 0) {
9 p+ S8 f; A$ D5 n                /* Restore the original data before leaving the function.& s: A5 _( P! |% T2 F
                 */
) T' \8 p7 K0 p) s                sync ();7 i1 }1 N  \# [
                *addr = save;3 T" l! ]9 R  z5 \: a
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {3 @. E# c( O$ z* M
                        addr  = base + cnt;2 f) d* }) J4 @+ D  S. U' L
                        sync ();' Z) [: X% t: g# j8 F) G7 U* `
                        *addr = save[--i];, n4 f' r' d2 M( c+ |  L, n* I
                }$ r& R5 T' R. C5 u2 n( h) x5 i
                return (0);: B) }& i- g/ \+ L$ w" B. N! s9 E. V7 H
        }
" V: @+ U' B( v7 s. S6 n' s/ G4 k8 M& j, F3 D8 y8 @9 @
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 H9 Z" f) k2 T# r& l, q
                addr = base + cnt;        /* pointer arith! */" E1 @# ?9 ^7 }2 T$ H( Y7 B
                val = *addr;
1 s) G5 s: a0 w' g8 _; w2 q                *addr = save[--i];
" ~, I# ~! R9 A0 |* K* e' B                if (val != ~cnt) {( }" o' o0 ]9 k
                        size = cnt * sizeof (long);. K% O. k# b+ K4 F& H/ u
                        /* Restore the original data before leaving the function.
+ H" U: V1 v+ u( U% Q' ]                         */
+ }* ^# q+ {# R/ V                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: L( t* J* j$ P3 F4 V' b# C8 c0 L                                addr  = base + cnt;
! B. \& b9 A9 w1 f8 B# ]                                *addr = save[--i];7 x1 U2 T& P: U3 Z8 C, S0 Y
                        }
$ z! J, b5 m& i                        return (size);' R" _2 Z! k& o7 r; Y! T$ M8 P& s$ a. s
                }( z7 O: D7 L; F9 h; S$ I
        }; r3 b: j8 A- I5 }- ?! b. {' `
4 V! x$ D! _9 }5 V+ c( E9 D
        return (maxsize);5 t# _) a* u" J3 o
}
# P% p# r0 I2 f' u6 {9 x7 a" \6 Eint dram_init(void)4 x! S  R. o3 J& m: s
{
' L# o$ B8 u" V9 K  \" r        /* dram_init must store complete ramsize in gd->ram_size */  t& {/ w2 V' {" R2 t
        gd->ram_size = get_ram_size(0 [6 t9 B4 H; @( f8 E
                        (void *)CONFIG_SYS_SDRAM_BASE,% b1 T' D0 D% t: \7 d
                        CONFIG_MAX_RAM_BANK_SIZE);9 y- A( C- Y9 G5 V
        return 0;
0 x$ I( x4 J3 T( v}, k3 w8 r% R+ N' \7 ?. L4 T

- X7 P9 T% e3 A. y+ I1 ]% y% H
& n# l$ M3 y$ G0 ]/ O, y
* r- J- Y; g4 t# ?  g6 Q  V2 S7 t: v# v. C% ~: U7 ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* R! z$ j2 u  x7 r
; Q, c  x4 r3 {# b3 r) L  V+ t

9 c. p* Q/ ]/ U3 b( `
+ ~) ?( k, Y1 K$ ?  a3 i* H
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-28 02:51 , Processed in 0.039420 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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