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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
# I0 T9 P3 ?; E& f8 |+ A& j核心板2:DDR2 256M Byte   NAND FLASH 8G bit
) y4 N9 H, s1 N; u1 N+ K3 m这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?4 }, [$ x4 P1 {  p# Y8 L- T
/ z5 o8 ^, m- n1 h/ O+ ^1 l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?. p& t7 N+ Y7 ]' G2 S3 H4 ]
! n) b* Q* D& F9 U" |$ |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:/ @. J( k' E! Y% f% T
/*
: ?1 i5 e4 Q; f5 {* Check memory range for valid RAM. A simple memory test determines
* V7 f. P3 Z% _2 N: I* the actually available RAM size between addresses `base' and( ^6 K- u, J" h" B( U2 \& k4 _- t
* `base + maxsize'.
; n  I4 q4 \8 k4 p" `*/! H2 a8 ~. n; I9 r* O4 L* O
long get_ram_size(long *base, long maxsize)
7 a2 ?# w) y3 h{& G9 f* v8 Q4 f5 a% R6 D; g
        volatile long *addr;# S2 H( g4 A7 y9 V" B
        long           save[32];" `9 v+ M5 ]+ R5 y7 m, S3 Z3 d
        long           cnt;( q: ]! `6 M. t0 f# W
        long           val;. g. W( B2 N) ~5 J3 X" a: g6 h  j8 K# D
        long           size;
; ^! ^2 Y* P. r0 S' C0 @7 c        int            i = 0;! K0 O5 }- E% M  f; g+ x
9 Z" {% U, s6 J
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 i+ F, z! w* ~( B# N" }: n                addr = base + cnt;        /* pointer arith! */
! q! s! \/ e; J2 n, `) R                sync ();! X& c* G- B: B0 E
                save[i++] = *addr;
# w. [+ L- K8 s                sync ();% \3 a) O9 H, _  b  k% t& ]
                *addr = ~cnt;, y0 K9 O, g0 r3 T7 b
        }8 Y# e: t" S/ E! R

" \3 g2 t' J! C; V! W5 V8 r% s: |        addr = base;
) D! }' }6 H: K1 `5 v        sync ();* w/ y; A& M0 y: O
        save = *addr;
9 ^0 s7 z4 ~) [+ T: n$ X        sync ();, T' F' K* z2 |
        *addr = 0;( \4 q( v8 B3 R
: V3 Q0 J8 g+ C& _9 Q' u4 S
        sync ();! f) m6 l" @# M, d
        if ((val = *addr) != 0) {6 k0 r$ ?2 p& W  [, d; L
                /* Restore the original data before leaving the function.
* [  H* z4 {& i; a7 ^. i( B                 */
% d2 m, Q$ U6 p" m                sync ();, V. Y4 @: ]% z+ a4 Y
                *addr = save;
$ B: s; @9 H$ Z' y8 @' J                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
  e# C5 F# V  L: Z+ i' @                        addr  = base + cnt;$ o. Y1 G3 g8 O/ N- m
                        sync ();) q7 O1 D" z4 s; J; M+ U7 G1 A
                        *addr = save[--i];# T* M; M+ l4 U% B7 E, m! {
                }
3 K( F, k4 l7 N8 J0 C  p6 ?1 \                return (0);
! O- r. H6 W' o4 q7 b        }9 D4 X- f4 R7 r7 D7 l

: A) Y7 }! i/ |' {        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 y1 |' a/ _$ H5 Z- D/ ]9 h2 M
                addr = base + cnt;        /* pointer arith! */% p$ v6 F' p) T" P
                val = *addr;
+ j+ Y9 t) D0 b7 j                *addr = save[--i];# L8 d: T- k9 P# E" R
                if (val != ~cnt) {' A; r/ G9 G6 E5 e* Q! R# I5 Z2 F
                        size = cnt * sizeof (long);( m4 S9 q8 [5 |+ W
                        /* Restore the original data before leaving the function.
8 @9 n. @8 p1 `' _% d                         */* o5 D* u" l" Z1 I0 h  y" @
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 q: n5 l% ]/ w6 P                                addr  = base + cnt;
6 Y4 ]5 A/ I% C* M6 M                                *addr = save[--i];
; t& T4 y% q/ G9 \1 f                        }
$ t' r3 H7 \9 o- z. g                        return (size);
: l5 E7 x1 O/ x                }
: J$ d9 v9 d6 a8 q        }
1 J/ k( C1 Q# ~  ?& j. k' \2 f/ z8 F3 s
        return (maxsize);, B7 ~* J. M8 ]$ i8 z
}" ^9 i5 m% y! ^8 ?
int dram_init(void)
# J4 O$ `" `  a8 P4 t# C& l{
" {+ I# c; P* z  @$ C9 o        /* dram_init must store complete ramsize in gd->ram_size */
! x- s! f+ e) E% X! t/ I        gd->ram_size = get_ram_size(0 H: B+ K' T! N; l) W2 K
                        (void *)CONFIG_SYS_SDRAM_BASE,
0 G2 v; J0 i3 ^3 L/ ]  ^                        CONFIG_MAX_RAM_BANK_SIZE);3 |* t7 ^0 ~7 Q4 A% x
        return 0;
; c. }$ b8 E0 @2 h) V. `. u) s, z}
% @3 v: T4 I  l1 m
9 V6 ]3 a0 A1 b1 |
7 h1 y/ M0 H: |8 s) a' `* @
! A# H: T6 c- z* ?+ w5 J1 I- }
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
  M2 ]' w' ~7 t& U& f- \0 e! \5 q5 K. y4 U$ k: ~

: t* |0 T5 e) L( P0 M

& y  e: H5 k; k
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 00:53 , Processed in 0.044053 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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