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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit7 P) }) c- L& \- B0 U
核心板2:DDR2 256M Byte   NAND FLASH 8G bit9 R' R, Y" z5 P( b6 ]
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- Q- K, s& S9 N! M# g. V# D9 f$ ~+ J7 H' u3 X! r7 i1 A3 _9 {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' R: Y# n! F& `% a# @6 ?' {  I  Y1 Z, n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:" k( ?+ T: P2 ?! H
/*6 q0 P+ j! ^- p5 v# b4 a& l
* Check memory range for valid RAM. A simple memory test determines( Q( Z5 r; x8 b+ ~8 Y
* the actually available RAM size between addresses `base' and
0 O9 r2 @0 q; m/ i* `base + maxsize'.
6 u1 r) K2 r7 k/ \$ Y! v*/
. D& H& q/ n0 Flong get_ram_size(long *base, long maxsize)2 ^1 V, a$ k: S/ c6 s
{
' N  W' L! J4 X7 Z) g7 f, {        volatile long *addr;& \4 q' B! l% v6 W& Z; J
        long           save[32];. B5 u2 F7 |' N* b& j# @
        long           cnt;
0 Y0 `  S; ^8 z8 O) i, u/ k3 ^        long           val;' A! ^8 Q3 \' i: k* S& ?8 e
        long           size;: ^4 C0 M) c( z& n
        int            i = 0;
7 M  k/ y, U5 c# J$ f0 [! F
2 m+ i* f* l4 L/ I3 P/ {        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' f% Q$ Q' g/ s  \6 ?% m) p: X                addr = base + cnt;        /* pointer arith! */# d! o5 `4 D5 y4 B- b) I
                sync ();1 _& T" V1 X$ V8 `
                save[i++] = *addr;
( d8 X: x/ V5 j                sync ();
! A3 {* E  K( n. L$ L) f# [7 U                *addr = ~cnt;
$ e  a# j0 a  f2 m7 X        }
) R. M+ X8 K; U; M0 v: g$ b) P+ @/ ?' z  q( T
        addr = base;
& x/ J; ~" J8 {; m        sync ();
6 O( Q9 p2 \! j' s1 z( E' l; x+ M        save = *addr;- i; \* _6 i) o! K6 R" m+ C* ]- m2 A
        sync ();
4 `5 {* L+ k5 J: F/ Y7 b        *addr = 0;8 @2 o5 L- t! c: l7 K/ x7 i

6 Y& ~; j" D+ E& G5 ~2 ~        sync ();
- c) j% \$ C# ?        if ((val = *addr) != 0) {8 w9 J  N0 b1 W, N" f& p' C
                /* Restore the original data before leaving the function.
$ M$ `0 m4 |3 [8 y- n& }! y' c                 */) p2 [4 J/ y/ ?9 m7 \! L
                sync ();3 _; G4 j: o7 B1 ^+ R/ A
                *addr = save;# Z) ~, c- D. j" O) `" i/ A! P
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% m8 L$ G3 o* P, w
                        addr  = base + cnt;) e- K! z4 F, n5 Q* h# w
                        sync ();
" b7 s2 t+ K( ?  M) r& @                        *addr = save[--i];
5 O( h1 ~. r: b8 _# A                }1 f* N2 U# G6 K, r7 p$ q
                return (0);( @& c/ a# Z% S6 ?* g9 x
        }
& P, l1 O7 V1 q! D" x8 u& `$ M' Y/ G+ g  y! D  K3 j7 ]3 x
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) O# h5 O6 {1 P' ]- |5 S+ X
                addr = base + cnt;        /* pointer arith! */
4 L9 _% g/ U3 S; V+ g                val = *addr;
7 s  Q* o6 U8 M2 W" Z: L* j# @                *addr = save[--i];8 `- C3 [: U3 @: D- N1 p6 ^+ Z* L
                if (val != ~cnt) {/ f' p7 A$ |# `  |. d0 F5 b
                        size = cnt * sizeof (long);$ N7 q/ m' p  Y9 k6 J7 R
                        /* Restore the original data before leaving the function.
( |/ q/ A( P4 {* g+ `0 c/ m                         */
+ E4 {  |6 ~2 d+ z: p                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; @0 P8 @; q- I" e5 A' [. i                                addr  = base + cnt;, L6 p" V* F: j; e- m- s
                                *addr = save[--i];
! `9 ~+ O" ~( Q- }: l& O) o                        }
, M) A  E) I8 E* \, m$ X& U% w                        return (size);
9 m) y& q: J7 K. D                }6 F! F3 v, |/ S- X
        }
+ h+ Q  R, A8 ~( R* w1 e1 {
+ b# C2 d2 s; Z9 Y" t5 A        return (maxsize);
0 e3 Q# ?& ?! O1 [& Z5 a}& S& ^! o9 }4 N# g9 Z' w4 a* H
int dram_init(void)9 A0 I$ F- y% R- _# [# P! M4 X5 y
{' b" s1 P& m+ z
        /* dram_init must store complete ramsize in gd->ram_size */) c3 x% \4 K4 \* b+ M  S5 `4 R
        gd->ram_size = get_ram_size(! k  ?; {% L7 [" j& u2 j
                        (void *)CONFIG_SYS_SDRAM_BASE,# ?( b: I% J3 ~. n# s- I
                        CONFIG_MAX_RAM_BANK_SIZE);
& V- c2 T5 }  Z# J; h) v+ B        return 0;
* G( O( Z( r% o; P; F}- p# |2 v; V- h! I) P9 U

. Z: u4 i% u$ g; q5 e, J, g( f! J
2 }4 B, n8 f7 d+ T6 ]' r
; i3 |& E" L) b" M0 n& ]' `, W6 o' \/ M! @" V- v4 n8 U9 |  k
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!+ J3 C. t  ?1 }

3 V2 I8 Q/ c+ R0 D7 U. A4 p; D% |1 O# L, I+ x) \$ c

4 w3 i# e/ M3 R3 j
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-23 00:34 , Processed in 0.047478 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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