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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* E+ ^4 }. W# c4 }( J0 ]核心板2:DDR2 256M Byte   NAND FLASH 8G bit
+ H8 \; B( _, q/ w; m  n这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?# E4 i5 v9 Z9 Y# ]$ H- T

% B' o; r! ]7 Y  v6 P" c3 h是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 b( B$ m/ t7 T9 `, b% q" g
' w9 y; O' z$ k' O7 `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 H# r( A! u7 d5 p3 m4 a/*
# H# A1 `" [- k' M# x* q2 D  b2 V* Check memory range for valid RAM. A simple memory test determines& }' _  L$ y9 o; C7 ^
* the actually available RAM size between addresses `base' and: t4 V2 E* a; w6 C
* `base + maxsize'.' N4 b5 R  b" b+ s
*/5 [2 r1 u  U% y" I9 ?
long get_ram_size(long *base, long maxsize)
$ Y; O1 v- {4 r6 I{
# B* g. _( R6 p# ?. \( r        volatile long *addr;
/ T, }* f4 I' o3 N6 Z) S        long           save[32];# h& q' G0 o  J3 V
        long           cnt;0 y& w# o7 Q( L/ s+ n& \
        long           val;
6 W3 `3 q; M) Q+ u        long           size;! |. G6 k" e$ h2 G. j1 n
        int            i = 0;; `9 {3 V" X' O1 n  g5 h. Q
% J9 j. l! P% ^, n" o: \, P9 m
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 g9 P( x/ E, c4 |4 R# ]+ ^                addr = base + cnt;        /* pointer arith! */4 ]3 z. o; ?* b9 \! ^
                sync ();
- w. y" l1 ?2 i' O+ p! b8 `7 [                save[i++] = *addr;
9 y% f0 a% p) m6 p  F& f" L                sync ();
2 p) }8 W# X0 z- J; L; R                *addr = ~cnt;& E! V5 a8 M- F
        }
3 i: g1 b" [5 I5 H: d! C% C; Y$ d3 W6 A7 ~
        addr = base;, g7 v4 S$ r6 r4 A
        sync ();
: I" S% t; E2 K! |3 B        save = *addr;: b8 w+ E& Y. a2 ?$ p
        sync ();
  _% c" r8 c& S4 V3 F, u        *addr = 0;, }8 b) Y; @6 j/ ]+ K

$ e' m8 a4 |/ A        sync ();
& E+ f, L5 @: T$ c; E) V/ U        if ((val = *addr) != 0) {$ D( O9 x- F  n$ r/ B  \) A
                /* Restore the original data before leaving the function.0 P: c4 H! k! ]7 ^) y
                 */( E) E; i' P  e" {* u+ ^
                sync ();
6 q4 J: c3 a1 Q4 r' \1 d8 I' ^                *addr = save;
7 |8 Q, ^) W$ U/ \# K' S- r                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
  _& N/ L" l3 b# |2 @+ ]& l) g                        addr  = base + cnt;
. M/ X8 k% k$ L5 z5 l                        sync ();8 J3 Q; X2 W& Z
                        *addr = save[--i];0 Q- ]$ w/ Q6 ^
                }/ x2 B* K- u& [" `# J  q
                return (0);
2 U# @+ Q( V  L% b: ]. t        }
  ~5 C- r: }- \1 t% E, z3 \% j  K6 r. h+ P2 @
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. i( ]( A6 @4 b% W" S$ V                addr = base + cnt;        /* pointer arith! */3 q9 B3 ~1 g7 ^* G) }
                val = *addr;
  G0 A4 w3 T# ~4 l* ]                *addr = save[--i];9 M# e4 f9 U; o+ G1 |
                if (val != ~cnt) {
( S& ^# d4 l3 R8 n7 R8 k: m                        size = cnt * sizeof (long);/ N- N  S4 S7 g
                        /* Restore the original data before leaving the function.
& d# [  d* Y4 h! N+ e! B                         */( F5 N1 ]8 M; n& u- f+ K
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 K  G6 F1 l$ V- g6 q' ], }+ S: g
                                addr  = base + cnt;
% y4 j0 _$ R# p  o! e+ U! q                                *addr = save[--i];3 s( Q9 k$ f6 J) c5 T
                        }
1 A8 L- b' E9 b* z# r                        return (size);8 z+ h* e5 _  W7 Z' }
                }
; Q# d; z: T* p, e8 |        }" N* S3 `" k$ x& Z. `4 Y* {5 j
$ D' E' W4 X/ ~& i+ D4 D% X+ r
        return (maxsize);* \5 [! c# e1 ]) h
}
' u' \" o% q6 f% i0 [- ?int dram_init(void)
  G; p4 U4 j/ L" Z, B{
5 C, k1 X, V6 i2 y        /* dram_init must store complete ramsize in gd->ram_size */
2 v. h; G9 H2 ^+ w& d8 ]4 u7 Q( q2 ~. M        gd->ram_size = get_ram_size(  G; s3 _) `! b$ P! s) }& Q3 M7 m
                        (void *)CONFIG_SYS_SDRAM_BASE,
3 I$ @: V) I2 e& Z/ J                        CONFIG_MAX_RAM_BANK_SIZE);4 n# ?* J1 C  V- k6 r4 W
        return 0;4 N2 z0 G0 }; l5 u% j; |
}) u$ v# Q7 G6 D0 V9 z# r# g
  H/ Y* d+ q8 [% O! t- e  r* T

/ J. R8 w! f( z( F
2 j0 p6 M0 \" R0 a: i7 a  N7 G2 E7 ~7 V: f# P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- u" }7 a& T! U7 r" B  A$ j$ i: B
6 V, D4 [) u+ w7 O6 a+ j
! _! w8 ^, l6 s' P, D5 K- O5 f
  l  {4 a' d3 L  [/ q3 n% s
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 21:50 , Processed in 0.042685 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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