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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit  n4 K7 |5 D2 R5 l0 d( x) {( q: u
核心板2:DDR2 256M Byte   NAND FLASH 8G bit+ v4 M% x% e7 R5 W9 k3 V6 O* Y# k
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ K: k$ m6 F. p! G( E" n9 S& H! u$ y* \
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' M. j5 K$ R6 t$ q
5 d1 A5 R' J3 H9 J( A3 A- i  Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
  Q7 n' J7 U4 L0 n' }2 E- J& }/*
% Z; v' Q4 M' P; y2 S" D* Check memory range for valid RAM. A simple memory test determines8 ]1 y1 W# Z1 X$ A% D7 g9 x, S
* the actually available RAM size between addresses `base' and% D' S8 N6 d; H
* `base + maxsize'.; f- [% e) F. A' f$ U3 |
*/
1 Z) W9 `+ f' ~# |) ?9 xlong get_ram_size(long *base, long maxsize)- {+ m* v2 E. T" ]7 [
{0 P' I6 q" C! i5 y9 u% m
        volatile long *addr;, f3 N! [- i% c+ A, v! o+ I6 l
        long           save[32];
' h  C, M- Y9 T* w- R! @4 A" ~        long           cnt;
# r6 N4 X- U3 v9 _$ g4 i        long           val;" u% Z3 y8 R5 w! D& \
        long           size;
# F: p& W, C+ I        int            i = 0;
. ?' I( k, B* T" w, D" A( ^% g/ l
$ U+ s5 l" [7 N        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! R8 \3 E, V3 I                addr = base + cnt;        /* pointer arith! */7 m1 c# g- ?+ C, I8 w0 Y
                sync ();
% v) a/ Z, A0 k" ~. n% |4 C                save[i++] = *addr;' [" c0 R3 q* ?9 N( b, P5 H, A0 @
                sync ();
! y* K$ D. |6 c- F; M% m; G2 [0 j% z                *addr = ~cnt;. z( b. d8 P- p% `$ @
        }
: Z* F: V: _8 o
( S  {9 A5 V+ ^7 F8 w* c& y        addr = base;
1 R, V  a% D' S  x! b        sync ();6 |% T6 W+ {7 H
        save = *addr;9 f5 g4 k; ^" n* I$ G
        sync ();; F# v2 p/ j) R9 a. E- N8 ]
        *addr = 0;
& _( f7 C& u9 |) N2 e7 H9 a
1 G3 q' ~0 ?/ ?! w. u" p" k$ }        sync ();9 y  o7 ]( X: n+ o+ R
        if ((val = *addr) != 0) {
+ ]5 }8 W! c( S) s7 @. U                /* Restore the original data before leaving the function.
% g* j) o+ L7 m3 p, J1 j' l7 S                 */6 V- z0 a5 I$ _6 e: ]
                sync ();! H# k5 o- ~, c% {
                *addr = save;8 N/ k4 s9 U1 a9 K
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- ~  E. W8 [) }& w+ I( n8 M                        addr  = base + cnt;
( P( o& `' _& D5 ?                        sync ();) G) U% j2 @8 C1 o& U# g" r) j
                        *addr = save[--i];
" l5 k9 P* v, |# J) H5 t$ C1 B                }
* W0 |* c5 F% X/ I9 l( T5 H7 I7 r9 g                return (0);
& q7 x/ {. B# p$ ?- U5 N6 z! n' O        }: _/ R1 C3 e4 V( H: [& i" m9 K
4 ~6 ]% c* f1 t/ ^0 h
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- S0 M8 e5 y3 Z. `2 W/ {8 b7 d                addr = base + cnt;        /* pointer arith! */5 d8 a1 d1 Z& u% z% R
                val = *addr;
4 Y3 f5 s& y6 i( [: A$ T                *addr = save[--i];$ m2 \* G1 v. R7 ]  p
                if (val != ~cnt) {; b) L+ F- a3 y/ ?1 |
                        size = cnt * sizeof (long);
0 k* G! \5 Y! B                        /* Restore the original data before leaving the function.
) F) S1 {- B8 N2 J5 E                         */
6 d' Y0 A; p# M+ r                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) y8 {, r# v  ]7 B7 R3 s% \# d
                                addr  = base + cnt;6 e% z1 z7 q; U% [! ], I6 L! A
                                *addr = save[--i];
. D+ Z/ x  L; d                        }  x' X- k. S! [8 T+ n( h& a+ H
                        return (size);6 e6 z3 c: n' T  J" K. b7 I
                }1 Q5 k7 }8 C: e% p
        }
9 Z7 R% g& {* _* T- {( {, X) p
! F" r- \" k) G, X$ F0 X0 _+ |3 F, s) \        return (maxsize);7 ^- k; ^, T  v6 [' G& D% P
}
* W! R8 d4 L4 c4 Hint dram_init(void)
5 Q3 s* a  i2 z5 B6 z# R- H) s8 G{
' m+ M: y' `, I1 h+ ]        /* dram_init must store complete ramsize in gd->ram_size */" E% E) |4 _) I( _: u8 u1 V
        gd->ram_size = get_ram_size(* o1 `3 H* y. @: K% S4 y- x! `
                        (void *)CONFIG_SYS_SDRAM_BASE,
+ Q8 Y, z; C6 f/ Y# v7 ]                        CONFIG_MAX_RAM_BANK_SIZE);! a% T- y9 d: o3 Z  b" C& F
        return 0;8 b0 a% D7 [6 I/ S. ?0 s# E
}3 y) T: U8 D; R9 K

8 `: @( K7 O5 ^! F6 a! L7 f) ~9 @
# e, A8 |, ]- }: U5 U( C- o

) p7 B$ @4 y5 f2 X; C  wFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, |/ w9 B9 L# t" n- O9 R9 b
6 f( ?' f6 D0 ]6 M4 j9 z# f5 ~$ ~5 T! T8 V4 A' a3 {
+ o# V9 R, m& b% P5 k+ o& l
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-7 15:35 , Processed in 0.038516 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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