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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
- L' w8 B" ~& G" B5 p5 V# I核心板2:DDR2 256M Byte   NAND FLASH 8G bit
, R) F8 v+ J' v; G5 ]$ F$ X这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) T$ w! \( @# f/ O0 d2 Q2 ?  @& F& [3 l0 j; p
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, A) S( j6 X3 l1 A

% z* }  C) p& q3 Y) ?+ G: }# f! I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 j% w0 z5 T0 K/** [, j8 B  g! r
* Check memory range for valid RAM. A simple memory test determines9 f9 E' }. C, s8 w/ j9 ]5 [3 s
* the actually available RAM size between addresses `base' and+ D1 I6 a4 C' L8 ]2 j
* `base + maxsize'.; y/ u- e, |& b; D7 [1 a& \  _* x
*/% `# p$ }7 F9 Z5 _% a  k" O+ C
long get_ram_size(long *base, long maxsize)9 ~' `4 j; t, a2 L
{6 D- _9 [' c2 k2 ]: j
        volatile long *addr;0 d4 o2 I2 {2 h8 k/ b' A/ @
        long           save[32];2 G+ j, o9 Q8 P  T! x: q4 ^, n2 x9 @
        long           cnt;+ ]7 k' E% \( v- w: K
        long           val;
% v5 N! X: K  A1 w: h3 A        long           size;# d& D% P/ _+ Q/ f" V5 L. `
        int            i = 0;6 |& V; ?( D! s, f" g

8 B/ z' ^- f3 {# K        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 ]% F9 U; o2 q                addr = base + cnt;        /* pointer arith! */) e5 l. s# z) g% q+ y, b
                sync ();. v/ U5 G- A" Z
                save[i++] = *addr;/ h( P. j: U2 B" Q- d
                sync ();
7 A. n- R! [! ^                *addr = ~cnt;
: h( T( V& A) l$ x* i$ a/ j        }
- z. ?6 Q1 g5 a. W. \: M9 @. I
4 G6 g% [) J7 w; H5 B( }- k* v* F6 K        addr = base;  z- L( r( ]- e* G. n+ y0 n
        sync ();
# J- x6 A5 _9 f5 [0 k. |        save = *addr;
0 H1 p9 l: w8 [- \        sync ();
  ?  O: E% ]8 W8 n8 c3 S9 X        *addr = 0;0 e3 u+ F' v/ P% ~/ u
" W  L$ F3 ]& z4 S+ p
        sync ();" w. \/ v: z1 p9 X; \, w
        if ((val = *addr) != 0) {
/ V6 x9 ?3 e$ `* p                /* Restore the original data before leaving the function.
. g% `0 H4 {' B/ u: U7 S+ b                 */
4 _8 Y, N: \' T7 G                sync ();5 ~) J6 g' ?) R" a9 d/ y
                *addr = save;
+ \& V6 J$ J$ Q0 c2 h; J& c                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; o7 e3 [! x/ B5 W; v5 v6 f& I
                        addr  = base + cnt;
, q( Q0 {+ A$ w& \; ~                        sync ();/ `& M& {1 q/ @$ O& m  Z+ X
                        *addr = save[--i];" D- |/ C# q5 Z1 _# L) F6 Y  V
                }
3 W4 Y8 t. o7 H) g) _. T0 B                return (0);/ {9 h( |1 M3 P  s9 a5 i5 l, ^
        }3 q9 ]7 {, Y! K- ?1 `, G$ a0 E
0 J" `$ R! ], Y
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 q; G5 R- A8 ]5 Z  c2 b                addr = base + cnt;        /* pointer arith! */
- Y5 c$ E% t4 u" |                val = *addr;
* R) ~6 N) j! S) D8 U6 c* P                *addr = save[--i];  [' U% Q! g" L6 N" p$ {  r- q
                if (val != ~cnt) {3 W. B. p7 m9 n& Y  M6 u" B
                        size = cnt * sizeof (long);6 I' N0 X$ I1 S" }% N# L) Z  O) U
                        /* Restore the original data before leaving the function./ ~# `) x* e; J. [
                         */
4 L0 x+ t4 Z; V, Y$ F" d$ B; _* C                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- G5 l5 r$ n: B8 ^& x: R$ `% s) o
                                addr  = base + cnt;+ @* W: q& Q/ u7 p7 v& G1 c
                                *addr = save[--i];$ V5 i8 S0 R% B! G
                        }7 a8 ^2 A+ W! L+ j& T
                        return (size);
" }( P. Q- p' p                }
  P$ K# l, E/ I8 K; _        }
+ j0 Z/ Z( Y5 I" ]' J2 A8 m5 M
& ]* N) A- q5 o6 ?        return (maxsize);( i: H5 u+ ~1 Y" v# }
}
1 m. E+ E. C% L; e: \; lint dram_init(void)" a, w. g6 _4 p: C0 G, }$ O# ?* N8 l
{
6 h, S( _. b; X7 k2 q3 y        /* dram_init must store complete ramsize in gd->ram_size */
3 p9 s; }& P' b' W. [+ ~; L" x5 |        gd->ram_size = get_ram_size(
6 V3 Q' M* Q7 G. g                        (void *)CONFIG_SYS_SDRAM_BASE,9 o( Z& `' L$ C/ @
                        CONFIG_MAX_RAM_BANK_SIZE);5 x1 u3 f3 `# m# T# n: G
        return 0;
7 c& V, @! P% Z# G8 [$ C' T" v  @, b}; x% s$ b$ c7 _5 K

# \/ O* B7 X+ N* J/ z6 P8 n0 F3 O; d3 ^/ Y! v2 f& F

, ^$ j" h% h3 l2 ^4 r) d4 s  _- q; a% K1 k
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" P7 ~3 e# n6 \
" h  w  f! W" Z1 t: `" i) f& }7 p2 N% z. b( q
8 D- F# o7 s# R: |7 P: F6 k
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-22 14:21 , Processed in 0.036766 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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