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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
4 v, ]6 Q- v+ V. u, g核心板2:DDR2 256M Byte   NAND FLASH 8G bit
& u  M* T6 g$ M这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?; ?' ?* ]9 S0 X( S0 K$ w/ S

0 l+ U) v4 J# o5 P4 Y' w是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' n( h& u% z4 N" b5 }( J
! b4 d6 s3 H2 W9 p: D0 U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 _/ Y0 d, I5 v) a2 b0 F% ]
/** A+ C1 N2 E/ G# F
* Check memory range for valid RAM. A simple memory test determines
1 k4 ?. B$ s8 {9 _+ y* the actually available RAM size between addresses `base' and: w- w7 F, Z* y- F) H
* `base + maxsize'.
5 |0 o( `$ a  L" u3 z*/
$ I8 C% W. q7 G$ f9 ?; n  e& wlong get_ram_size(long *base, long maxsize)$ X. U$ x" g/ G, a4 q! y
{
4 Z8 V$ Z# u" s        volatile long *addr;1 p* Z# e: ^$ H' H+ S) H
        long           save[32];
! l5 J- a9 [$ ]. w" N) ~4 {        long           cnt;
/ }! L& I9 N9 e' `9 i/ E8 d        long           val;) u5 K/ A; a+ j  Z& q5 H& d& c' j6 O
        long           size;
& f% ~- B% D% ]- d# Y6 l* d7 E        int            i = 0;& V' Y& `. `: [7 Q' R, }( B$ r

! H2 p7 x0 j8 T; v$ ^: t        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 R# T1 i; i$ t0 ?! c4 a& h
                addr = base + cnt;        /* pointer arith! */
3 a" k& ^  z1 ~2 _; d                sync ();3 f3 O3 {/ }# v0 A
                save[i++] = *addr;
, O: O; [& ]& f3 R8 b7 h                sync ();
' P; D% U' W+ R# u/ o  j                *addr = ~cnt;
4 H5 f: n9 F2 w        }
. }, f& ?( |$ n- }" H2 K+ |3 G+ c. V" u& X
        addr = base;
4 @$ K# I0 O1 M, q& _' c        sync ();! v/ U* C5 t4 U. g" y3 `4 O; a
        save = *addr;
( I1 k1 W' Q7 U6 U) q% o3 _6 ?        sync ();
4 u4 ]6 _  l1 t* s, U) |4 @* [        *addr = 0;' w" l4 c! ?9 r9 ]
% w* m" Q9 O% @0 A8 @* k2 d3 k
        sync ();# b( R7 N: G" J3 h* F8 H8 S7 f
        if ((val = *addr) != 0) {
( a! ]7 i6 t# M, C6 D% Z                /* Restore the original data before leaving the function.
. o/ y, W' f8 _3 l                 */
) @  v$ o# B5 n1 _                sync ();1 L3 M4 b% a, G% ~( |3 ?8 O
                *addr = save;
1 K6 M* n# e3 ?3 p                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {# v  O$ N) C8 o3 L
                        addr  = base + cnt;
2 C1 P4 i7 P9 o( y; c$ O                        sync ();
" Q2 s- n. w3 r. d+ l4 Q                        *addr = save[--i];
) z$ A2 {  ^6 ?                }
- q$ J$ W9 Y7 ]* O& n' i. B                return (0);1 X: Q% }, Y6 P8 o! ?" k2 O) H7 S
        }
% O4 E. b, \8 r; b5 ^) \7 o* _& B9 h
6 c) t$ A! l# ]        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ I% }4 y; b* I
                addr = base + cnt;        /* pointer arith! */
' b* G$ @/ y/ d% Z                val = *addr;
: ?' z% i- x5 T) H3 d0 R/ W                *addr = save[--i];
% w- G! A. ?: q& e8 }                if (val != ~cnt) {
4 }/ Q2 v$ A$ T/ E" M  S                        size = cnt * sizeof (long);
# q: W2 O+ a  S                        /* Restore the original data before leaving the function.5 R4 w- _% }. `% h# _$ \# h! k; ]
                         */
3 O$ Y. h+ i0 U+ }) N                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) p$ K9 v4 |  L  h/ y% e# L/ T# j5 t
                                addr  = base + cnt;
6 m- X3 `' l7 j3 A. K                                *addr = save[--i];  {% i% i/ K; x: z/ L0 q
                        }! Y% j0 U3 S% a- l; _
                        return (size);: }' p5 R5 e. \  r  G0 J7 d
                }! A$ x4 A2 n2 B2 x
        }# m: Y! `" t# m. w# A7 h. t+ t) N
8 x+ h, v  v$ t! [/ U) I/ U
        return (maxsize);4 ]# |7 N& L) z5 F
}
& v. ]0 g  u( j; y0 f: oint dram_init(void)9 f- O$ T+ P' Z8 h) `
{% u% ?! V* @! s' y+ |
        /* dram_init must store complete ramsize in gd->ram_size */$ e1 B- e/ n4 C
        gd->ram_size = get_ram_size() ]* y, p: Y& s) G' m1 y
                        (void *)CONFIG_SYS_SDRAM_BASE,- }1 Q8 f" K% u) H9 z4 u3 M/ h5 U
                        CONFIG_MAX_RAM_BANK_SIZE);
: K, ]5 m, u" V- m* ~        return 0;
* |, w; V/ r: s+ q, o/ \! u}' t: G- m; J5 b& d- S* Z

. [  q- [4 |- q$ h3 Z3 ~
" ]2 x, j* a, t8 r6 w7 P: F
$ W1 q8 u, D9 l8 C3 p0 g* Q9 Z- d
" K+ ^3 z3 P( P5 O, r5 ~FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 s# L# j) L1 s+ ~% e9 Q* A/ F- ~5 W) h6 i( z! s7 R6 H4 n
+ |" W/ k' W, q- L/ W0 Y2 g

% u1 X- K# E/ B7 Q( f7 \. j9 }; R
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-12 23:47 , Processed in 0.037253 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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