У меня такая проблема - имею 4 SDRAM чипа 2Mx16x4, проц pxa255, linux 2.6.17 ванила. Так вот SDRAM подключен, по девелопер, 32Bit Bus, 32MB на 1 cs и 32 Mb на другой. Так как на каждый CS 64MB идет то у меня получается дыра 32MB между рамами. Теперь, если boot строку прописываю mem=64M то при работе с файами больше 20MB происходит crash. Так тут я понимаю 2ой ram не доступен.
Пробовал в boot строке прописать mem=32M at 0xa0000000 mem=32M at 0xa0001000 но кернел вообще не грузится.
Пробовал в mashine start добавить :
Код
static void __init fixup_my(struct machine_desc *desc,
struct tag *tags, char **cmdline, struct meminfo *mi)
{
mi->bank[0].start = 0xa0000000;
mi->bank[0].size = (32*1024*1024);
mi->bank[0].node = 0;
mi->bank[1].start = 0xa4000000;
mi->bank[1].size = (32*1024*1024);
mi->bank[1].node = 1;
mi->nr_banks=2;
}
MACHINE_START(My, MACHINE_NAME)
.phys_io = PXA_PHYS_IO_BASE,
.io_pg_offst = (PXA_IO_BASE >> 18) & 0xfffc,
.fixup = fixup_my,
.boot_params = PHYS_OFFSET+0x1000,
.map_io = my_map_io,
.init_irq = pxa_init_irq,
.timer = &pxa_timer,
.init_machine = my_init,
MACHINE_END
struct tag *tags, char **cmdline, struct meminfo *mi)
{
mi->bank[0].start = 0xa0000000;
mi->bank[0].size = (32*1024*1024);
mi->bank[0].node = 0;
mi->bank[1].start = 0xa4000000;
mi->bank[1].size = (32*1024*1024);
mi->bank[1].node = 1;
mi->nr_banks=2;
}
MACHINE_START(My, MACHINE_NAME)
.phys_io = PXA_PHYS_IO_BASE,
.io_pg_offst = (PXA_IO_BASE >> 18) & 0xfffc,
.fixup = fixup_my,
.boot_params = PHYS_OFFSET+0x1000,
.map_io = my_map_io,
.init_irq = pxa_init_irq,
.timer = &pxa_timer,
.init_machine = my_init,
MACHINE_END
но никаких результатов это не приносит. То есть машина грузится, oпредляет 64MB но
Memory: 32MB 32MB = 64MB total
Memory: 29660KB available (2248K code, 415K data, 100K init)
память остаётся прежней, то есть 32MB.
Естественно пробовал:
Код
unsigned char i;
for(i=0;i<16;i++){
//node 0
mi->bank[i].size = (2*1024*1024);
if (i<8){
mi->bank[i].start = 0xa0000000 + i*(4*1024*1024);
mi->bank[i].node = 0;
}
else {
i-=8;
mi->bank[i].start = 0xa4000000 + i*(4*1024*1024);
mi->bank[i].node = 1;
}
}
mi->nr_banks=16;
for(i=0;i<16;i++){
//node 0
mi->bank[i].size = (2*1024*1024);
if (i<8){
mi->bank[i].start = 0xa0000000 + i*(4*1024*1024);
mi->bank[i].node = 0;
}
else {
i-=8;
mi->bank[i].start = 0xa4000000 + i*(4*1024*1024);
mi->bank[i].node = 1;
}
}
mi->nr_banks=16;
но результатов это не дало. Где-то вычитал про select ARCH_DISCONTIGMEM_ENABLE флаг, что нужно активировать, но загрузка вешается на:
RedBoot> fis load linux
RedBoot> exec
Using base address 0xa0108000 and length 0x00180000
Uncompressing Linux...........................................................................
............ done, booting the kernel.
Linux version 2.6.17-my (root@linux) (gcc-Version 3.4.3) #1180 Fri Aug 10 09:17:33 CEST 2007
CPU: XScale-PXA255 [69052d06] revision 6 (ARMv5TE)
Machine: My Board
Warning: bad configuration page, trying to continue
Ignoring unrecognised tag 0x00000000
Memory policy: ECC disabled, Data cache writeback
Memory clock: 99.53MHz (*27)
Run Mode clock: 199.07MHz (*2)
Turbo Mode clock: 199.07MHz (*1.0, inactive)
CPU0: D VIVT undefined 5 cache
CPU0: I cache: 32768 bytes, associativity 32, 32 byte lines, 32 sets
CPU0: D cache: 32768 bytes, associativity 32, 32 byte lines, 32 sets
Built 2 zonelists
Kernel command line: init=/linuxrc root=1f02 rootfstype=jffs2 ro console=ttyS2,38400
PID hash table entries: 512 (order: 9, 2048 bytes)
Console: colour dummy device 80x30
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Может что-то я не правильно делаю, или у кого то есть другие идеи.
Буду благодарен!