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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
; [1 r5 L7 }# z* y! E8 w- X4 y核心板2:DDR2 256M Byte   NAND FLASH 8G bit. b. x. ~" B7 G, T- M
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
! s* u% i* \8 [; _8 s* Q
9 Q4 u9 T1 M; N1 z; H9 |是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?# \/ K# i( r: v

! H  d! r. y3 z, `5 W  z; D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:3 q+ N0 h( ]/ m; M: f8 v2 A
/*
3 f. M; I7 C' f) P& k* Check memory range for valid RAM. A simple memory test determines
# t+ @2 }1 u2 ^* the actually available RAM size between addresses `base' and
, o" Z& t0 V; O, }) _6 v* `base + maxsize'.! p" s1 f" O' ?% L# H
*/
7 F8 J. j2 O/ J- U* @1 _long get_ram_size(long *base, long maxsize)
0 L5 j3 K  D2 A5 I" g{$ U. d% ?; a3 P' v& E4 A* ^, `9 }
        volatile long *addr;
0 I, r  J# ^$ |: v, e        long           save[32];0 |! M  D  ?3 }# ^- a4 n
        long           cnt;
6 E& x, }3 t/ O" _3 ?        long           val;
6 u" `  m" ?' c* H" B4 x% ]        long           size;  F2 Y$ O* I& ]0 A% Q: O* ~- H" O
        int            i = 0;
" k: U9 d% ?7 N5 Y9 z: U4 Y3 X/ ^: p+ n' C$ O% q
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& v8 ]3 |* d2 u6 s                addr = base + cnt;        /* pointer arith! */6 o3 a8 Y# h  k! i* {# k
                sync ();* B6 @' Y) h+ r: H3 P6 |
                save[i++] = *addr;
; ^' i+ D, F2 y6 h) _                sync ();7 E# x# n$ Z7 }7 ]" Y5 |6 ~& h' X
                *addr = ~cnt;
2 c: U: J! _+ W8 w& n% r; O" p        }
: G0 l9 ~1 C0 r( [( C+ |, f0 r: u4 ?9 {9 D' }. L- ]& ^
        addr = base;6 h& z3 L% U1 l2 a* U. h  D) M
        sync ();
8 p+ I) Y$ Q# a" |- h$ |        save = *addr;) U" T* Y" n% B" c7 G8 a
        sync ();
1 y* E* V0 b; b        *addr = 0;
! M; r) r1 Z0 p( j3 ^; m# @1 g: E" c2 h* T  X  \
        sync ();# }' g% o* v, w" X' Q
        if ((val = *addr) != 0) {# ]. P( \( z  n: x6 y1 x! J( ^
                /* Restore the original data before leaving the function.; ^. U2 p4 m4 g) J! w
                 */
9 ], \. r, i0 ~+ j                sync ();
' j: Z( q0 H' P, I                *addr = save;
4 d% k- H% o# r; j5 `$ p4 k3 {5 c0 c. Q                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! C0 X5 r. |6 n$ r                        addr  = base + cnt;
4 ?, x+ Y2 o7 \7 n& P6 i7 i                        sync ();
% ~# C% {1 m- W& L                        *addr = save[--i];
5 ]( o- h; L  p! Q: A; {                }
/ u3 i, o1 f7 N' K5 N                return (0);
$ s, K2 V1 O- _, j0 U        }( m  R8 M9 c9 N) k9 A: a. i) I- m
2 L5 H& [! ^2 Q& \+ E
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# c6 p, ^+ o! G5 C                addr = base + cnt;        /* pointer arith! */# @* F' @! U* a/ f7 W
                val = *addr;5 |2 V5 _' n& }
                *addr = save[--i];
9 Y8 s1 _! ~! Q' B( H  J                if (val != ~cnt) {5 O9 b2 X7 T3 s" q; S- e7 I$ o
                        size = cnt * sizeof (long);
6 {% v& h6 I6 G% v                        /* Restore the original data before leaving the function.) S% |! P3 X  K" O/ M
                         */
' k2 y* \" [7 f9 N' v; e& o! a/ G                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* S' \: p* b) V& l* Y, W4 a- D0 ^                                addr  = base + cnt;
2 g7 {6 E' p; j4 C. c7 t                                *addr = save[--i];, b; k2 B- D9 r+ v, H
                        }  y3 h0 `' y) Y0 l% U: J' W
                        return (size);! c2 S7 w6 l6 I. Z# u$ t8 w
                }" Q  z+ Q7 C, E7 W5 P0 K
        }
; s9 `) k( S3 [& X+ ~+ q) j/ y2 \% A9 n! i& u! y$ @
        return (maxsize);4 l) z8 d) q' D+ H+ {  @
}
) [" F! v$ t$ w2 a( n' `& G5 j& E7 Pint dram_init(void)
' N# T# u2 ~7 Z1 H{
6 ?* @. r2 W) c* d: G        /* dram_init must store complete ramsize in gd->ram_size */
( t. n. F* w% B- ?: W        gd->ram_size = get_ram_size(
3 V3 \+ {. _3 F" K" Z                        (void *)CONFIG_SYS_SDRAM_BASE,
( e* ^/ Q% t2 c: L- R6 _0 k                        CONFIG_MAX_RAM_BANK_SIZE);$ O- s2 g7 f) d# q* K% r% s
        return 0;
8 H2 ?  X8 z3 r7 h6 L# E}
. S- K( j$ F: w: \7 J. [, k1 v% h) ~
9 g% S, Z# X& o9 u8 A) U% ~3 |0 G. x8 [) P2 Q$ H: H) }9 w
0 [" G$ y( ?1 L: s+ R5 {& s4 @7 B

! ?" r1 X! ^: C0 X( j) R* TFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ ]" e7 e( A, X2 Z' }% z0 A% P: B8 f% g
5 p6 w6 q, t2 |) E
; Z' C2 T$ p+ |. @1 |
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-14 02:26 , Processed in 0.039085 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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