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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
) Z2 \9 Z3 o/ t! P2 ~核心板2:DDR2 256M Byte   NAND FLASH 8G bit
' e% _% }3 \, d这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( M) e4 |8 w2 x' f
4 E* f% ~- b3 g8 T, t是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?! X/ E0 S! f; F

$ q# D2 V) Z7 d. T3 d. c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. L- B$ P! q; i' N2 @2 \
/*" e5 z7 u+ D- E: F2 h2 u: Q# L6 D
* Check memory range for valid RAM. A simple memory test determines
  O+ X1 k; s3 A- ?9 ^* the actually available RAM size between addresses `base' and
7 B+ j+ J# ^& b3 c( s5 k* `base + maxsize'.- z3 D+ D5 R1 h6 y0 r# a$ [
*/
" _2 \  |* c! {. Nlong get_ram_size(long *base, long maxsize)8 z$ u; h1 z+ w# \5 D, O' s
{$ V/ P8 O& D2 {
        volatile long *addr;+ G' J1 \5 D& @  w2 n: [; l
        long           save[32];
# H  \  s8 T3 i9 ^, W  ]        long           cnt;& P, l1 z) l% {9 y$ @8 ?2 `
        long           val;
/ L1 i. m% t% [9 c5 v        long           size;, J$ l( M- f0 V; R  J
        int            i = 0;
% r% U( _' n9 V. c# f! {5 t& }3 y
% I( U- \7 I" o( M$ s2 c4 G3 l        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ a, _8 n5 k! E+ Q( w! L( u3 R/ b                addr = base + cnt;        /* pointer arith! */
7 O. p1 _  O6 n& J                sync ();4 _$ H0 g! j& O$ b
                save[i++] = *addr;( ~& g( h7 l& f% F7 |* [- w6 H8 z
                sync ();- w' v# f3 u. d8 w. m4 m
                *addr = ~cnt;
# w: d0 Z, a6 J- ^1 \        }
6 k6 E% o$ T) h, d
) r- X2 }; Y: N        addr = base;
) J. W2 W  ]. ^6 }0 w: W; n. h        sync ();$ g# O- R- z9 q  G) m! G
        save = *addr;
, {# ?6 ?- q5 w9 o3 S* C        sync ();- O( {) Y) A6 ]+ ~' L  i
        *addr = 0;! S8 h7 b8 s1 {9 ?- H6 S

, Z" P0 W7 K. z* y3 K        sync ();) M2 r& z; m; ~9 F/ I
        if ((val = *addr) != 0) {; a& }7 ]/ i  r+ k9 n' i+ }( L, h
                /* Restore the original data before leaving the function.
. M% H8 P$ l% A8 S, ~* @                 */
4 o7 h) e! J( }                sync ();
) s! Q: Z( e  Z& N4 o                *addr = save;
+ H& d. Y6 X6 i0 n. O, ]                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" G5 `2 K: F4 E9 J" _
                        addr  = base + cnt;) [* q$ c. L5 i4 c  g8 f9 P
                        sync ();
2 [) L" h0 }1 N  v5 W                        *addr = save[--i];
& ]" J% B2 N1 m9 y" _                }- k5 S! r* [2 @, X( M. F6 Y
                return (0);
6 f8 B# I5 M+ A" c; o        }# e) c( n/ ?0 J
& e2 C3 _/ \% Z! _$ ?, o) o7 F
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 K4 P# O/ u* ?8 M+ u; D9 d& u6 y# I
                addr = base + cnt;        /* pointer arith! */
, @  Y) K4 Z" g% I                val = *addr;3 [0 y* d9 I( v8 E/ L/ x2 X' B
                *addr = save[--i];& E; f2 _+ Z9 i8 W5 J2 u0 S
                if (val != ~cnt) {
' r& Y, w; M5 \& s1 ~: K+ x5 f( c                        size = cnt * sizeof (long);
# l& J8 J% x  T1 p$ D1 q7 ~                        /* Restore the original data before leaving the function.
6 N5 u6 f; E* T) W, R* C, g+ N6 h0 f6 G                         */
- k8 k: z0 n2 b& L  a                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# |0 }" U- @4 I% V- ?6 o                                addr  = base + cnt;
* R5 L1 `! q" _! _4 p                                *addr = save[--i];
0 }- `1 N0 x! w, e4 ^* ]! a# v                        }6 w$ F% W) ?- p% |. F; f
                        return (size);$ r2 L1 s6 i) I1 |) ~, F" B
                }; I9 J( u) h) @; a* g" {
        }
- F0 k# t! u5 h- d* P6 G9 ?: c& j3 {7 ~9 L9 N% f0 t
        return (maxsize);0 |& H. k! D) c: m* d3 Y
}# f1 L! A( L) l3 j) c& X" k
int dram_init(void)0 Z. h3 e$ k6 H  _+ s# O
{
& G7 Y8 J) V0 z( Y5 @+ _" X* E; E        /* dram_init must store complete ramsize in gd->ram_size */* H0 w7 V6 V" ]  t+ P0 e5 y
        gd->ram_size = get_ram_size(
# O3 W$ i( C; I/ j' s                        (void *)CONFIG_SYS_SDRAM_BASE,4 Q8 L0 p. k, l
                        CONFIG_MAX_RAM_BANK_SIZE);
( S! O6 D8 y4 W& A! [! j9 |  Y# Z        return 0;+ _- S( J1 E2 v1 J
}
% _# c) b: u/ n3 \+ J/ X9 f% V" U- m- C. V( [
  ?1 u1 O% L+ u: V" l) ~+ u' e

0 |3 y# O0 {& u/ E: Y5 {: O( H# G2 M" f1 r! e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# P4 L# A- N/ Z6 s: |0 W( R

6 v+ H6 v1 K8 g' W4 I
+ d. t! r  y1 L" E
* N7 M: d1 O0 q! f7 P* W/ o. i
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-5 19:40 , Processed in 0.042181 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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