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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit) l: Y$ e" A5 {9 z
核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 D2 ^9 \- i/ `) a/ V
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 U5 b: u( M- M5 K& \7 A6 M- x) M5 F6 ~% a/ Q. O, Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?7 I# W9 j2 p/ k8 A/ k# \! K

$ _" v8 x! n" f" _& G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- N0 {  S- W2 i2 N/*$ K5 S( Q3 K  N' t% g$ N
* Check memory range for valid RAM. A simple memory test determines
! e# B' Q0 ~( ^' v* the actually available RAM size between addresses `base' and0 ^4 z- y/ i% ~
* `base + maxsize'.
  v/ x4 [7 a: z. H( o*// s+ S8 j3 ~" P/ r5 b- x8 _
long get_ram_size(long *base, long maxsize)" c# p1 L1 H9 \  g% e
{
1 k6 V7 C3 f3 ]- W5 H' r9 j" X) d! o1 a        volatile long *addr;& \: B/ U# N7 J
        long           save[32];
: O5 `& {% |8 L- C/ f        long           cnt;
5 A& v9 Q8 [2 }$ K/ u- e$ ^        long           val;" R3 U% y( X1 K, w
        long           size;
  I8 B" l2 T  r! r        int            i = 0;
2 b/ L- I0 T" k# O- x! i" {. l4 T2 r2 t/ X2 u& U! A5 Z) K, Q7 n% W0 ]
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {% F. @; K/ A4 u5 V9 I! z
                addr = base + cnt;        /* pointer arith! */
1 c% I& ?. J* }* p0 x                sync ();
8 |5 S; v2 i5 A1 Z' U* \                save[i++] = *addr;
" g4 @* R2 p. C" c                sync ();
, q! d) s. Y1 t. x* R) v# O) c5 g                *addr = ~cnt;
* r# r' R& V, C* s/ g        }* m2 ^( ]; ^: {  p8 T

1 s  P# Q: G/ v. j        addr = base;4 U1 K6 y# i8 F3 m5 y
        sync ();7 w8 h, u, a$ A3 K$ ~
        save = *addr;
- [2 |& b9 t4 R+ l5 }        sync ();
# W8 c$ n) d/ M; ~8 g        *addr = 0;
, O& h" i  K  ?% z, U0 t& {5 p! L; v! q7 F& k3 H' Z) P: v
        sync ();4 @8 W1 T' ^( q6 `8 Q
        if ((val = *addr) != 0) {
) a  s2 N/ a7 u+ I                /* Restore the original data before leaving the function.
& `+ Z- W+ {$ P  G3 ~; ~- C' g                 */% _, T5 f/ {- C4 ?
                sync ();
+ t& S9 r5 z, U$ K( I                *addr = save;
2 J/ Q. Q9 P0 A9 k6 Z8 [                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {8 H! e- `" Y0 F# h" V; o
                        addr  = base + cnt;+ [+ [7 R' ~, q! {
                        sync ();
1 q# _( F# L. c, b                        *addr = save[--i];/ J+ I) F! \/ V1 }. _9 p' x
                }0 Y! ]! F  ?8 R( {+ U" b9 S
                return (0);
0 i8 z( ~+ u4 i& b- n* d        }. I$ k7 U  p" q/ ?7 Z) L; G
8 l7 s& N' `7 L+ }7 ]" t) M
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# R# A$ p' r$ |8 p2 ^( M
                addr = base + cnt;        /* pointer arith! */; U) \- d0 p7 b) @7 C0 A4 {2 `
                val = *addr;: Q0 N7 V' c2 u/ n% G& X
                *addr = save[--i];
" d8 T/ M- R  L; D  f4 x5 G                if (val != ~cnt) {  I! T! a1 U* ~" P
                        size = cnt * sizeof (long);
$ H! o) Z, C4 k6 V& A                        /* Restore the original data before leaving the function.
' ^, _5 N7 L$ X                         */
2 c( Y9 G" r& D; V" A! k6 g                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 U! X* n8 V, e
                                addr  = base + cnt;' b# i4 e( g4 ?
                                *addr = save[--i];
) C& r" D( V8 i! l5 X/ C                        }
9 l" O$ c  y5 D  A  u4 K                        return (size);# {  z- z. u# S/ p* d1 D! u, y" Q, ]
                }
6 O/ _  y5 r5 ]8 J        }
, ]2 i# J4 a4 M8 G$ Z. U. h7 G, j
/ }7 a& v2 V# Y+ r; m$ J! R$ p4 s        return (maxsize);6 N9 i% G0 ]) ]* W7 G
}
2 @% M% |& s( I1 eint dram_init(void)$ L% P* T7 @* A7 h
{
, q8 I! U% i) A6 m: X' ?        /* dram_init must store complete ramsize in gd->ram_size */
) i& @4 w" \- p        gd->ram_size = get_ram_size(
: b* X% S1 V: c0 g- ?- d  C. G                        (void *)CONFIG_SYS_SDRAM_BASE,
- ~1 u% _& H  A2 J                        CONFIG_MAX_RAM_BANK_SIZE);5 B3 K- ]" u$ e1 e! C7 X, q
        return 0;. n6 O0 `3 _# `6 m
}* h# j$ J) R  y. N
' Z4 r* d( H- f
7 P: E" Z3 x& S+ H. G+ _" F

/ T9 e. V5 h! d' W: N. [5 k. u/ l) N, q+ n3 G, e, K/ l8 [
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, i* X8 U. ~8 V$ {5 w) Q" r! p/ ^2 b9 k5 Q, N- W; G
& U0 M: M3 D, \( v' e1 v; `

) i3 I. [- t8 T  ]$ s( e
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-20 13:56 , Processed in 0.038963 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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