S 3 C 6410開発全記録(二)『メモリサイズを計算し、UBOOTでメモリサイズを調整する方法』
前章では起動用のSDカードを作成し、自分でコンパイルしたUBOOTをSDカードに焼き付けています
このUBOOTコードのメモリ構成は、手元の開発ボードと一致しないに違いありません.ここでは、メモリサイズを変更する方法と、メモリサイズがどのように計算されているかを明らかにします.
一、メモリサイズの計算について
1)ハードウェアの型番は、飛凌の開発ボードの中で
128 MメモリはK 4 X 51163 PCを採用しています.このチップは総サイズ512 bitビット幅16256 MメモリはK 4 X 1 G 163 PCを採用しています.このチップは総サイズ1 G bitビット幅16であることがわかります.
2)パッチ数2は、いずれも2 DDRで32ビット構成
3)DDRのチップブック128 Mを見ると、合計4個のBANK行列アドレス線数がRow=13 Col=10256 Mで、合計4個のBANK行列アドレス線数がRow=14 Col=10である
4)256 Mメモリを例にとると、メモリサイズの計算は
各BANKのメモリセル個数=(2^Row)*(2^Col)=2^(Row+Col)各メモリセルは16ビットのデータ総容量=チップ個数*各チップのBANK数*ビット幅*行アドレス線数*列アドレス線数(ここでは単位がbit)=2*4*16*(2^14)*(2^10)=2^(1+2+4+14+10)=2^31 bit
バイト2^28に変換メガ2^8 M=256 Mに変換
ここで説明する必要があるのは、行列アドレス線の総数が>16であり、行列アドレス線は実際の使用中に時間分割多重化される.
二、メモリサイズの変更
表示するメモリサイズの変更
CPUに対応するレジスタ構成の変更
『s 3 c 6410_rev 12.pdf』196ページ,5.5.4.4 MEMORY CONFIGRATION REGISTER
ここは2枚なので01にします
256 Mメモリチップのパラメータを例に
『K 4 X 1 G 163 PC.pdf』チップマニュアルには以下のように記載されている.
ここではRowを011に設定しColumnを010に設定する必要があります
ubootコードでは
実際、CPUのマニュアルを読むことでメモリを正しく構成するのは難しいので、参考になるコードがたくさんありますが、なぜこのように変更したのかを明らかにする必要があります.
行列アドレス線の設定を変更するには
1 Aを00011010に変換すると、我々が調べたRow,Columnのレジスタ構成の値であることがわかります.
一部のコードでは#define DMC 1_も変更されていますCHIP0_CFG 0 x 150 F 8このレジスタの値は、#define DMC 1_CHIP0_CFG 0 x 150 F 0は資料をめくってもこの値が何のために使われているのか、なぜ修正するのか分からないので、私はここでこの値を修正していません.経験のある友达にもなぜか教えてほしいです.
UBOOTの自挙アドレスの変更
UBOOTの自挙アドレスを変更するとboard/samsum/smdk 6410/configを変更することが一般的に考えられている.mkのTEXT_BASEの値ですが、ここではできません.
ネット上で資料を見てみると、現在多くのs 3 c 6410開発板はUBOOTの自挙住所を修正していない.ここには検索と修正の過程が記録されている.
MMUアドレスマッピング規則の変更
UBOOTが起動し、md cfe 00000を入力し、メモリのデータを印刷し、私たちとコンパイルしたu-bootを表示することができます.binは一致する
三、参考資料
専門家の詳細:メモリの動作原理と発展過程(見る価値がある)
http://blog.chinaunix.net/link.php?url=http://memory.zol.com.cn%2F47%2F474952.html
6410プラットフォーム上でLinuxのDDRパラメータを構成する(直接結果が与えられ、参考になる)
http://flydream1129.blog.163.com/blog/static/482344592010112033628978/
S 3 C 6410のDRAMコントローラ(羅列が非常にはっきりしている)
http://blog.csdn.net/nanjianhui/article/details/4264302
《s3c6410_rev12.pdf》
『OK 6410開発ボードハードウェアマニュアル2.1.pdf』
《K4X51163PC.pdf》
《K4X1G163PC.pdf》
このUBOOTコードのメモリ構成は、手元の開発ボードと一致しないに違いありません.ここでは、メモリサイズを変更する方法と、メモリサイズがどのように計算されているかを明らかにします.
一、メモリサイズの計算について
1)ハードウェアの型番は、飛凌の開発ボードの中で
128 MメモリはK 4 X 51163 PCを採用しています.このチップは総サイズ512 bitビット幅16256 MメモリはK 4 X 1 G 163 PCを採用しています.このチップは総サイズ1 G bitビット幅16であることがわかります.
2)パッチ数2は、いずれも2 DDRで32ビット構成
3)DDRのチップブック128 Mを見ると、合計4個のBANK行列アドレス線数がRow=13 Col=10256 Mで、合計4個のBANK行列アドレス線数がRow=14 Col=10である
4)256 Mメモリを例にとると、メモリサイズの計算は
各BANKのメモリセル個数=(2^Row)*(2^Col)=2^(Row+Col)各メモリセルは16ビットのデータ総容量=チップ個数*各チップのBANK数*ビット幅*行アドレス線数*列アドレス線数(ここでは単位がbit)=2*4*16*(2^14)*(2^10)=2^(1+2+4+14+10)=2^31 bit
バイト2^28に変換メガ2^8 M=256 Mに変換
ここで説明する必要があるのは、行列アドレス線の総数が>16であり、行列アドレス線は実際の使用中に時間分割多重化される.
二、メモリサイズの変更
表示するメモリサイズの変更
./include/configs/smdk6410.h:#define PHYS_SDRAM_1_SIZE 0x10000000 /* 256 MB */
CPUに対応するレジスタ構成の変更
『s 3 c 6410_rev 12.pdf』196ページ,5.5.4.4 MEMORY CONFIGRATION REGISTER
P1MEMCFG 0x7E00100C R/W 32-bit DRAM controller memory config register 0x01_0020
Active chips [22:21]
00 = 1 chip
01 = 2 chips
10 = Reserved
11 = Reserved
ここは2枚なので01にします
Row bits [5:3]
000 = 11 bits
001 = 12 bits
010 = 13 bits
011 = 14 bits
100 = 15 bits
101 = 16 bits
Column bits [2:0]
000 = 8 bits
001 = 9 bits
010 = 10 bits
011 = 11 bits
100 = 12 bits
256 Mメモリチップのパラメータを例に
『K 4 X 1 G 163 PC.pdf』チップマニュアルには以下のように記載されている.
32M x16 BA0,BA1 A0 - A13 A0 - A9
ここではRowを011に設定しColumnを010に設定する必要があります
ubootコードでは
./include/s3c6410.h:#define ELFIN_DMC1_BASE 0x7e001000
./include/s3c6410.h:#define INDEX_DMC_MEMORY_CFG (0x0C)
./include/s3c6410.h:#define DMC1_MEM_CFG 0x00010012
実際、CPUのマニュアルを読むことでメモリを正しく構成するのは難しいので、参考になるコードがたくさんありますが、なぜこのように変更したのかを明らかにする必要があります.
行列アドレス線の設定を変更するには
#define DMC1_MEM_CFG 0x0001001A
1 Aを00011010に変換すると、我々が調べたRow,Columnのレジスタ構成の値であることがわかります.
一部のコードでは#define DMC 1_も変更されていますCHIP0_CFG 0 x 150 F 8このレジスタの値は、#define DMC 1_CHIP0_CFG 0 x 150 F 0は資料をめくってもこの値が何のために使われているのか、なぜ修正するのか分からないので、私はここでこの値を修正していません.経験のある友达にもなぜか教えてほしいです.
UBOOTの自挙アドレスの変更
UBOOTの自挙アドレスを変更するとboard/samsum/smdk 6410/configを変更することが一般的に考えられている.mkのTEXT_BASEの値ですが、ここではできません.
ネット上で資料を見てみると、現在多くのs 3 c 6410開発板はUBOOTの自挙住所を修正していない.ここには検索と修正の過程が記録されている.
cpu/s3c64xx/start.S
#ifdef CONFIG_BOOT_MOVINAND
ldr sp, _TEXT_PHY_BASE
bl movi_bl2_copy
b after_copy
#endif
_TEXT_PHY_BASE:
.word CFG_PHY_UBOOT_BASE
include/configs/smdk6410.h
#define CFG_MEMTEST_END MEMORY_BASE_ADDRESS + 0x7e00000 /* 128 MB in DRAM */
#define CFG_MEMTEST_END MEMORY_BASE_ADDRESS + 0xfe00000 /* 256 MB in DRAM */
#ifdef CONFIG_ENABLE_MMU
// #define CFG_UBOOT_BASE 0xc7e00000
#define CFG_UBOOT_BASE 0xcfe00000
#else
//#define CFG_UBOOT_BASE 0x57e00000
#define CFG_UBOOT_BASE 0x5fe00000
#endif
//#define CFG_PHY_UBOOT_BASE MEMORY_BASE_ADDRESS + 0x7e00000
#define CFG_PHY_UBOOT_BASE MEMORY_BASE_ADDRESS + 0XFE00000
board/samsung/smdk6410/config.mk
//TEXT_BASE = 0xc7e00000
TEXT_BASE = 0xcfe00000
include/movi.h
//#define BL2_BASE 0x57E00000
#define BL2_BASE 0x5FE00000
movi_bl2_copy , UBOOT 256
MMUアドレスマッピング規則の変更
board/samsung/smdk6410/lowlevel_init.S
mmu_table:
// 128MB for SDRAM 0xC0000000 -> 0x50000000
.set __base, 0x500
.rept 0xC80 - 0xC00
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr
// access is not allowed.
.rept 0x1000 - 0xc80
.word 0x00000000
.endr
:
// 256MB for SDRAM 0xC0000000 -> 0x50000000
.set __base, 0x500
.rept 0xd00 - 0xC00
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr
// access is not allowed.
.rept 0x1000 - 0xd00
.word 0x00000000
.endr
UBOOTが起動し、md cfe 00000を入力し、メモリのデータを印刷し、私たちとコンパイルしたu-bootを表示することができます.binは一致する
三、参考資料
専門家の詳細:メモリの動作原理と発展過程(見る価値がある)
http://blog.chinaunix.net/link.php?url=http://memory.zol.com.cn%2F47%2F474952.html
6410プラットフォーム上でLinuxのDDRパラメータを構成する(直接結果が与えられ、参考になる)
http://flydream1129.blog.163.com/blog/static/482344592010112033628978/
S 3 C 6410のDRAMコントローラ(羅列が非常にはっきりしている)
http://blog.csdn.net/nanjianhui/article/details/4264302
《s3c6410_rev12.pdf》
『OK 6410開発ボードハードウェアマニュアル2.1.pdf』
《K4X51163PC.pdf》
《K4X1G163PC.pdf》