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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit+ ~. A+ ~8 r! Y& N. U  p
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
& P9 H! c& s* O这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 i) Z+ L" _, W- y4 O& O/ i  ~: ^- H# }+ T% Z; _
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 H+ r  O/ x* r6 d" u9 x) e1 S
2 R6 A) a! J8 [% U7 w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:; a0 k& Q3 q9 ]* C; X+ c2 m
/*( a, B/ a' d& @! d4 T8 ?
* Check memory range for valid RAM. A simple memory test determines" S' ]% x4 S' {# Y9 O- A, c0 Y
* the actually available RAM size between addresses `base' and3 }. q" M6 }% O: @* M0 O- e
* `base + maxsize'.
9 Z4 m. g* A& g# j*/
$ o  C2 U" o& l& hlong get_ram_size(long *base, long maxsize)+ w) k9 Z1 f$ H; M
{) }. n  t- ~7 F, X$ |  m5 q2 u: M$ A
        volatile long *addr;
* u( |) h& g" e5 w5 e+ A# m        long           save[32];
% ^. |1 ^8 y" R# I/ W2 t- u        long           cnt;. p# C' z9 N% V# _# \5 Q
        long           val;$ A5 f8 W, \/ F1 m' w/ [
        long           size;4 M3 D; t" L# f; u6 }1 X
        int            i = 0;
+ K2 ]3 u5 b( k1 Q# ^
8 q2 ?; Q4 ~) ^4 F) j: C        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( Q) o" V8 D7 A# b                addr = base + cnt;        /* pointer arith! */- e, Y" E8 ^  a
                sync ();- p1 \$ I0 X: L. O% E8 l
                save[i++] = *addr;
6 N5 p1 g2 [+ k                sync ();! j2 M  K  s0 F" v; ?  S$ V
                *addr = ~cnt;8 P$ d5 o$ V2 @; d+ y
        }6 b. G: o/ ]& r# C, i$ m0 }5 O

( N' L: \" p% o3 n8 h! h& u9 u9 T        addr = base;
% ?& E8 j# e4 S        sync ();
& O% |2 I7 Z( `$ J        save = *addr;
1 ]* P5 j# D+ \* w, T% {+ x2 v        sync ();- x/ x! W6 b% o1 l! U
        *addr = 0;
" u& R0 ]9 M+ Y' F( S; ~
" t) o0 y9 H/ O+ O/ _. E( E        sync ();  ]* E' t+ i. R* k6 H" D/ A( T
        if ((val = *addr) != 0) {
2 V; L; ?% Z+ v, X                /* Restore the original data before leaving the function.# T" d. q0 @6 q; O( q, O/ O! j
                 */8 B# W; r* c, E: k5 p7 N9 ~9 t
                sync ();
, G, r" L4 Q/ x+ w$ h: g                *addr = save;
% w2 t. Z: g7 v0 r, k/ a: ?                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% I/ n" t  Y. k  ?5 G/ a  n
                        addr  = base + cnt;2 O6 v- s2 U, ]& {0 p, T
                        sync ();3 k" H* a7 Q3 ?  r( Z1 a4 w
                        *addr = save[--i];' B/ Z+ l$ v* t$ h- U
                }
8 s3 X9 G" t2 K, v# w                return (0);
% }3 Y$ S& f3 b6 e) J        }) ~5 L* Q8 Z4 M

* q) R- u6 A3 e- H5 P        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( d0 V# c! ?1 O. ?2 n' }' M7 w
                addr = base + cnt;        /* pointer arith! */
8 A7 _: P- @" `6 w% T1 C                val = *addr;
0 {& a2 f- j0 ~' d  O# S) k                *addr = save[--i];7 Y# H7 J( k/ ^9 u( W/ f4 X4 A
                if (val != ~cnt) {. p# E, p  {! N6 U# _
                        size = cnt * sizeof (long);
3 n# B' C2 p" z$ N2 L6 k                        /* Restore the original data before leaving the function.
5 E+ l% w6 T: Y4 I+ i( z3 \                         */
: D4 V7 s$ [& O! u                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ D" c6 Y: l0 C7 ]" d8 [
                                addr  = base + cnt;  ~8 F7 K/ p2 @# t+ K
                                *addr = save[--i];% t# ~9 |' |& q4 l- w
                        }  o6 z0 ]$ ~" y' R
                        return (size);6 j8 ^1 R7 C9 Y4 o* k
                }
' d' E1 w- L& i* r2 b2 F        }& _+ @6 W% J& _0 M: Q  E/ ?) p6 a

- h2 P; v$ i; @        return (maxsize);6 h* D) p) {- J' L7 A
}2 I6 i* y4 h. u- o( X1 `* h
int dram_init(void)
- P: @  F$ J# K) e  Q8 Y; g7 _{
, I! b3 h: V: ~; g        /* dram_init must store complete ramsize in gd->ram_size */
" }* P- l8 \9 u* V* k5 ?+ }        gd->ram_size = get_ram_size(" Z/ A$ }, B- D$ c3 e0 s2 S' u) Y
                        (void *)CONFIG_SYS_SDRAM_BASE,# L$ E" K6 g) W8 ~% k2 R% m! S
                        CONFIG_MAX_RAM_BANK_SIZE);0 ]7 f! K5 V1 I
        return 0;0 ~9 o9 H. Z6 V7 a  {0 u% T
}( [2 B( E  z4 R: d
1 D3 [( G$ ^- o: X/ \9 ?5 v+ W+ a
( k8 G: M% C5 T+ `  ?9 f# D

. E  b$ `5 [& Z& f6 L
: e& p& K! B3 X# d! J& z  w4 DFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) [* q: Q# m- I0 g7 V4 F# l2 o
3 E8 A( B" T1 ?) P5 ~3 D

# i6 \& Y8 T( B/ b# t
# t% B; ?" d# F$ F/ f; G
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-14 13:44 , Processed in 0.038620 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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