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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit0 Q" B& M. i8 W' x' T/ _) F: I
核心板2:DDR2 256M Byte   NAND FLASH 8G bit8 U- b: h' I. X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& _7 Q7 O5 _5 s6 Q5 ^, x  x5 ?$ f2 g; W1 P% J- E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?9 A+ g) b1 g, f& U0 }  b5 g. v

/ P" p* Q! t$ k: h6 q7 C( y9 k: ?7 n" ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ c8 E3 K7 F: W: W% v- Z9 t/*1 [, L$ h/ {& E# u5 X
* Check memory range for valid RAM. A simple memory test determines
/ t6 _8 ?7 N4 |) b* _* the actually available RAM size between addresses `base' and0 b5 ~5 W' \' u- e
* `base + maxsize'.
# b1 J1 v; q9 b" O8 L! X# t8 V*/
  _/ F/ }3 }) y+ e7 E, J" G3 tlong get_ram_size(long *base, long maxsize)& Y) s& w3 O1 r+ ~7 C
{8 C* p* ~  Z$ o9 v2 b8 @
        volatile long *addr;
5 G, b; E! X, T5 w5 M5 G; F# |: {        long           save[32];
# A. W( i2 _3 P! R- S        long           cnt;
& d% o2 s# k% I0 Y6 e% _        long           val;
( S. I. t9 R/ a4 |) t        long           size;+ e1 j. m) p' ~3 d, u2 l% n
        int            i = 0;" R+ F% n6 c. _: v& {

4 I7 h4 b; @5 j1 [$ U        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {3 j( e7 I7 _) L/ u$ V
                addr = base + cnt;        /* pointer arith! */$ i+ V: L: P* R" R! u
                sync ();' J: D; r7 A3 K$ y7 N0 ^
                save[i++] = *addr;/ R% M8 |9 X' b
                sync ();
7 m( `( [+ J3 [6 q                *addr = ~cnt;0 m5 @! g8 P- z& m6 U- |+ A
        }8 A1 g6 \) T# v  i$ X5 I* }" T
1 U& B" v, U- R9 |+ n
        addr = base;
/ c" I* ~8 H: k) S$ q        sync ();
$ T2 @+ b3 l, ]/ }7 e3 d; u        save = *addr;
0 d' U* Y7 Q% L1 C& F" v        sync ();
  o- [. e1 _) Z2 o, x& M        *addr = 0;4 q9 F0 u& |  u! l. U
7 G/ s% q% H  y' O
        sync ();
& e. Y( H: k& d9 _+ j        if ((val = *addr) != 0) {9 s* U% C% J5 Y
                /* Restore the original data before leaving the function.
6 Y" i8 ~4 G; g2 o                 */! K+ b( `8 R# o8 S- ?2 Z2 {: u5 v
                sync ();
# S8 }; _3 r4 W                *addr = save;
6 C: k5 u- x9 i6 ?4 F+ M2 f                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' R* B! \5 W, {& }5 c" V6 a1 g
                        addr  = base + cnt;
/ n6 a- Z* w% p7 Z& R: @                        sync ();9 E2 d0 J' z" p5 _3 P# v
                        *addr = save[--i];# `8 M) f" P) ~3 u' M
                }- S" p' _# p* h
                return (0);! o3 i8 S+ _# G. g7 G9 ?
        }9 k0 Q9 s5 E( z* p* \# `  n1 j

( Z; P' s; ~' Z- H/ z% q        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ g4 S2 Y; u) |9 w- Y: t1 e; H( F                addr = base + cnt;        /* pointer arith! */
8 T* {( r# I; R                val = *addr;# x1 b; c3 x, q3 {* Q' y; Z9 S
                *addr = save[--i];
# n+ _; v! i- T. U3 [                if (val != ~cnt) {
  q) |- D8 J( T1 h# ?! |4 v                        size = cnt * sizeof (long);* k+ q0 M. Q. j% I
                        /* Restore the original data before leaving the function.
8 ^# i9 R0 r9 b2 a8 t! B- e                         */
$ S6 ~) \( Z# ^+ L1 V% f                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: }) p5 s$ N4 V: }5 n4 X- ?7 K9 b                                addr  = base + cnt;( o8 ~( C) a/ w% L4 _
                                *addr = save[--i];
4 g" K: \$ C$ Q4 d% k5 i                        }: {4 k: h& T2 w: f4 W8 w1 _
                        return (size);
7 C" n7 M, c. E8 j                }3 o. M7 }# }) [3 r9 x8 O
        }
) v. o( Y$ h9 e3 Y8 L! x3 v% x
        return (maxsize);  d% w' V, ^# C& o
}: ?, Z2 z; [! t. R; T
int dram_init(void)7 j- R' {2 b9 D0 Z) \
{
! V8 {* ]  H$ E* [7 r6 v0 i' A( @        /* dram_init must store complete ramsize in gd->ram_size */& a, K' w* y  k
        gd->ram_size = get_ram_size(! i  p7 E3 k+ c" r
                        (void *)CONFIG_SYS_SDRAM_BASE,, v  h  _: h( I" B
                        CONFIG_MAX_RAM_BANK_SIZE);
; m0 J, t" K1 j8 S' h7 r- }' ~        return 0;
' A6 U! R% c3 U2 h3 e/ D}# j8 Z  K+ b" L% Y1 f* a5 B

4 O' k3 j/ Q+ i0 Z6 I1 j8 s2 a; b/ }6 z8 _9 j

$ c6 m7 H9 I" q' Q9 g, F0 R* b: _4 l! f( N& Q9 ]9 v) d- V% u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; d! f! ^' U9 A: o6 k& M
: ?0 O% h' R9 P2 A$ z# A2 |  a6 O9 ?# G. O) X' j& C% l
; g4 G, X. k# {3 L. }8 |1 p
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-15 05:59 , Processed in 0.042030 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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