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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit: g& J; H) i3 B1 ~% T! A
核心板2:DDR2 256M Byte   NAND FLASH 8G bit4 \( o1 ^- B) |3 u+ D* C" h& h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?' r+ a) [7 Y! N1 Q* P: N0 `, v
" @5 J1 j/ l" v5 y: |1 ~
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 o8 r; Z3 U( d/ e$ b
! S8 Y1 [9 Y& k, ~. i/ d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:1 V( o% ]7 Q. V; U9 T5 ]) x
/*: U# W  C3 K$ V! Y4 [6 [) s: q2 M% `
* Check memory range for valid RAM. A simple memory test determines
& `# w) G9 n& {( j; I* the actually available RAM size between addresses `base' and3 h# ?9 l3 {! B' \5 |2 o
* `base + maxsize'.9 o: s; z1 K9 Z" A6 y
*/
) N+ R7 Y  x/ E2 nlong get_ram_size(long *base, long maxsize)/ A1 {! P' e* }7 |. ?# Y
{3 o; A& M* ]0 T& R
        volatile long *addr;5 B2 N. l- H5 m5 B* k# m& b& v2 t; D7 I
        long           save[32];4 Y  Y8 k& z* ]* ~
        long           cnt;5 t9 U( `# n1 x9 G
        long           val;/ `7 v" H) \/ l" l' v3 K. {8 y- {; U
        long           size;' ~4 K8 V; B! p  l0 R/ y
        int            i = 0;' V% b) z+ T, p' `1 j% X

% G% f. T7 O. |( j, F8 z1 n        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 z' b5 n* x# L' i# e) \
                addr = base + cnt;        /* pointer arith! */
3 ~9 d6 ]5 n% G9 N, ~                sync ();
, w9 a. \3 `" Z2 L3 z5 \8 V9 [9 d8 F                save[i++] = *addr;
+ H3 K9 ?+ _2 D1 j: w4 H- k* g                sync ();
& z# Y6 m! o- f" j* e7 K  K                *addr = ~cnt;
' [! r, K- Y, g( k        }# I3 N/ m1 y4 q0 {! T2 c

" i" i* M. L) p% z" [3 Y0 M4 H        addr = base;
! ?' L3 w4 F' f        sync ();
% W. _4 g# N6 f        save = *addr;2 e6 Q: @$ }( v5 w$ j2 G
        sync ();
1 U" a$ t0 Z; o( B2 k' u, L        *addr = 0;
9 E: |: T' w' ?5 H* K) l, Z) q& q
' L- I3 i* T; S' p, z        sync ();
) S! v9 y7 o9 f3 d        if ((val = *addr) != 0) {0 N/ z2 G- f, Q& t
                /* Restore the original data before leaving the function.% \" p  D0 R8 M0 [3 c, X% M- O/ Y) b: D
                 */
8 m/ g% w! H+ ^& E1 W" l" T; h                sync ();
! @& O' U9 c. R& ]$ K- D                *addr = save;( \) Q3 y/ |* g4 V
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {! b% T  ^  i, N/ m7 x1 T
                        addr  = base + cnt;6 }; W+ h* h9 Y9 E0 z2 a
                        sync ();& x7 m5 n6 R, L5 k4 @6 T1 x
                        *addr = save[--i];4 \* {& n4 A- G  \4 U" g; V* m3 c
                }0 o! T, s6 z4 J7 M3 C5 _% k
                return (0);
! Z- u1 }% q5 {; G: q0 k        }
# {, x, U* t  P( h9 [- \7 X5 O( O6 |$ t! A
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 u' l: K, n$ _& w0 [
                addr = base + cnt;        /* pointer arith! */
$ [( K% N; |" C0 l! U9 m                val = *addr;
) F1 c/ j. W: h% [: g8 }                *addr = save[--i];
9 l- c, d7 g$ F8 P6 @) J3 f                if (val != ~cnt) {
4 e8 r! C6 ?. i$ W/ {1 `                        size = cnt * sizeof (long);9 p2 g4 f# b- r
                        /* Restore the original data before leaving the function.. T% r7 }4 Z( i2 R
                         */" c9 ?; h" E2 i+ D# e
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: D+ R$ Q3 v: ~4 H                                addr  = base + cnt;/ ]" X* R9 U/ \& H  C9 O9 {
                                *addr = save[--i];
! H8 J+ s4 h) r1 h* E" j# Q6 s* k                        }
4 ^$ ^: ~! ?, w1 A' V- C                        return (size);
8 u4 a: ^7 l, e" X2 C/ E4 J' J                }
! A) Z1 q& W5 I, w1 d1 o, a        }
7 T9 K% j; H4 g+ ~, c
6 p  Q# o+ ^$ ~& L: j        return (maxsize);
) W9 t9 |- `6 h1 p7 [9 S- o}
: Y* n" S4 B+ {int dram_init(void)
8 r0 ~* ~" a6 M{
* Q6 C5 L# V+ k, w        /* dram_init must store complete ramsize in gd->ram_size */9 I1 [( Z) j1 \! p
        gd->ram_size = get_ram_size(, T% p3 b. D9 P% Q. R
                        (void *)CONFIG_SYS_SDRAM_BASE,% l) A) p+ r: a
                        CONFIG_MAX_RAM_BANK_SIZE);8 ]8 s4 J' k/ _/ S2 o. _3 ]: s
        return 0;
6 M1 B. X; H% K( j}% A& h; L/ o" ~4 r

' f8 M, p$ ~$ B# ]5 P0 R0 ^8 t7 o9 A: {

6 x* r# X1 E% h3 U- `4 A7 Q9 Z5 L9 q& U9 D4 e& ]/ j
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!/ q4 d" \) F% J, i/ ]# \

7 |- {# D2 m/ G7 y" m+ q# a% u- a/ V! x3 r, z$ e! e
! H% ]: A: k3 n7 q7 O3 v+ v! W
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-8 07:59 , Processed in 0.044851 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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