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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit  w0 o. O* I* j' Q5 m" R, [6 ~( a
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
5 H) v: c( |' g% g" w这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?& p+ N- J. }  o( s# C
  z9 `' k  J7 F8 t/ P
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) k) w& K. l; A. Q+ k, P4 ]7 r+ I0 c. {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:5 H" ^. Q5 I: A' ~' v1 l: p% _
/*
: q, \- C4 A% _# c% \$ q4 T/ ^# L* Check memory range for valid RAM. A simple memory test determines
' Z7 n' z8 c6 u0 z' }! Z- E* the actually available RAM size between addresses `base' and
0 g8 ^! P$ X$ S* `base + maxsize'.$ D$ y0 h! l( ]7 Z) G5 C6 j  P
*/
# Y) H$ s. \. K, \) ]0 Ilong get_ram_size(long *base, long maxsize)! u( f, x2 P7 q8 x4 q$ Z
{* \# O& y# [' ?# |  |
        volatile long *addr;3 A* z/ T6 S5 [$ v/ |- R) h
        long           save[32];
/ y+ b7 W0 [( s1 K  F$ a& {0 {        long           cnt;  \4 i8 l2 G. L
        long           val;% x2 u! X" Q5 d  j4 ^; z6 f& I
        long           size;- \) C3 I; v* ]% d4 z
        int            i = 0;# z) h+ D  Q# a* w3 q

. V5 q/ R& @% |6 J1 A* S9 ~        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {) y, W  K1 U" ^& q% z. D: P6 N# V
                addr = base + cnt;        /* pointer arith! */4 `; ?7 K5 f/ p- R! I/ x" g
                sync ();6 g; L# w% V& H( ^# N& r; R
                save[i++] = *addr;7 ]2 X: I6 f- v) z/ ~$ B
                sync ();
/ E  U) r# c$ }+ p$ ^- ^2 i                *addr = ~cnt;
4 y9 r  p3 u& d! P/ i& P        }
& d9 V& @9 N. s) e# @( s- f# Z# Y  [2 s
        addr = base;
" b& |: N8 k: a1 Q& o        sync ();
6 m, b. r& Y% |$ S+ _: h" r        save = *addr;6 n& G7 t8 a0 @) I; ~# u
        sync ();: Q9 P# i6 ^3 s3 {4 U
        *addr = 0;* [: l* z' ~6 x4 J

9 w: K2 N5 r# i# G        sync ();
; L% U! P+ f3 L! |0 G        if ((val = *addr) != 0) {! U7 O4 A; V( ]8 R
                /* Restore the original data before leaving the function.1 L0 R# R/ A+ A; l6 O! k* X
                 */& Y  ]/ o5 p" |8 L; j% n4 g/ e5 A) w
                sync ();
, m/ h) ?! T6 \7 x. v5 r9 d9 g! r                *addr = save;) ^) S" R+ l. ?: ?% A) p& m1 t
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; p  y3 q7 w3 C% H9 _3 ?
                        addr  = base + cnt;
0 J, e) G' B5 Y1 H! u; c: c- ]                        sync ();
+ Y9 O6 M- d' _7 v5 h% E                        *addr = save[--i];7 B0 S% d/ a6 z
                }* P- A$ q( ^5 \* z! ^2 [# B, h+ B9 v
                return (0);8 ~  T" k0 G, x' e8 q
        }( U% V  A) n- w+ |! D

. A; {0 p, a+ I        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 g9 f- c5 l' H4 }  i, k& `
                addr = base + cnt;        /* pointer arith! */
4 n1 l# T, M4 K                val = *addr;/ D2 F& g/ V5 `; V  u
                *addr = save[--i];
9 S" r& O: ~6 y) ^0 c                if (val != ~cnt) {- r" E: b, _% H# I. V* N5 q
                        size = cnt * sizeof (long);
$ f1 F/ l. N" C8 `                        /* Restore the original data before leaving the function.
- E; n# u$ o! Y; Z1 u# x* o                         */% p. l, ]0 k6 e# T' W9 Q
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 I2 Q$ R$ o# h6 `$ H                                addr  = base + cnt;
4 M1 ~  n0 K9 Z+ m& k( b  ?/ {! _                                *addr = save[--i];4 R  I4 C3 o4 A* ~7 H/ L* ~% L$ B
                        }/ B  z4 }$ P" K7 O* J: H2 `- h2 P
                        return (size);
: w+ R% _' b0 Y  M! P                }
) [' y0 Z& p: V; a$ ?: z        }$ d9 Y$ n3 v+ z. W4 y: Q7 F

$ K1 k; q& V: L5 y. A        return (maxsize);( Q9 x1 ?. @4 }  y
}6 c8 ^( |& T5 I* d4 z9 N! p
int dram_init(void)
; S8 W4 y3 U- v1 Y: m& V{
% |8 Z$ ?! a8 s& l# Y( m        /* dram_init must store complete ramsize in gd->ram_size */
0 _  W  s  [% s, ]  g        gd->ram_size = get_ram_size(1 b: P' |0 c  M! ]8 h
                        (void *)CONFIG_SYS_SDRAM_BASE,8 Z; j. \; ?5 O( Y/ G' P. b6 P
                        CONFIG_MAX_RAM_BANK_SIZE);3 ~1 F! F: Z& X: O% j+ Q4 K0 R
        return 0;4 [# Z3 m; I2 Y3 X8 g* {, \
}# t# m) e: s) j& |
6 w5 n& C) `: c* B" c. Z

" }$ i8 _& T8 D# P0 I: k" O& C; a, g9 c0 H0 J3 }' i6 R2 e& S8 H8 i
+ f7 h1 L  J1 \* h. {. a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!( @/ y/ Q# [0 i  z( X7 p

. n+ E6 N2 ?) ~( R2 [9 ^
; @% c! x" n) u6 q; N0 U1 F) \# I

; a" N4 @8 ~3 S# F4 a
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-7 01:16 , Processed in 0.038488 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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