nomaze 发表于 2014-03-12 22:29

linux arm ddr flash 配置

请问各位大虾,kernel里面arm的ddr sdram以及 flash 的大小配置是在哪个地方啊?   start_kernel这个函数里面吗

nomaze 发表于 2014-03-12 22:40

start_kernel --》 setup_arch --》 paging_init会初始化页表,但是 这个和 ddr sdram 具体有多大好像没有直接联系吧?

nomaze 发表于 2014-03-12 22:42

网上搜了很久没搜到啊,抓狂了,有没有人 帮我解答一下,万分感谢

Hugo801122 发表于 2014-03-13 13:37

没研究这么深。

nomaze 发表于 2014-03-13 13:53

自己来解决一下, 移植内核的时候, 会建立自己的machine 相关文件,放在 linux-xxxx/arch/arm/mach-xxx/ 下, 而这个文件中会定义

MACHINE_START(MINI2440, "MINI2440")
    /* Maintainer: Michel Pollet <buserror@gmail.com> */
    .atag_offset = 0x100,
    .map_io = mini2440_map_io,
    .init_machine = mini2440_init,
    .init_irq = s3c24xx_init_irq,
    .timer = &s3c24xx_timer,
    .restart = s3c244x_restart,
MACHINE_END

这里的
    .init_machine = mini2440_init,

mini2440_init 是自己实现的函数,会对ddr sram, flash大小等进行统一配置。

另外,似乎bootloader 传上来的参数中也会带ddr sram的大小。

arm-linux-gcc 发表于 2014-03-13 17:29

本帖最后由 arm-linux-gcc 于 2014-03-13 17:53 编辑

ddr的size配置,4种方法:
使用dtb时:
1,dtb中的memory节点的reg属性来设置,这个memory节点必须具备device_type = "memory"这个属性才能够被内核作为ddr size使用
2,dtb中的chosen节点的bootargs属性里的mem=字段来设置
不使用dtb,即老的ATAG_CORE方法时:
3,ATAG_MEM来设置
4,bootargs中的mem=字段来设置

1和2都存在时,内核会使用2忽略1
3和4都存在时,内核会使用4忽略3
1和3是等价的,2和4是等价的

修改1或2都需要重新编译dtb文件
使用3需要修改uboot的代码,因为他是在uboot里写死的
使用4直接修改uboot的环境变量bootargs就可以了

3.3的内核起,arm才能支持dtb
不过mach-244x貌似不支持dtb(三星真尼玛懒),所以就直接用4是最方便的






flash的size是通过id得到的,驱动会读取flash id,然后根据id就能够知道size,参考nand_ids.c

mtd分区可以在内核里写死,也可以通过uboot的环境变量mtdparts传递给内核(PS:由于直接使用裸的nand flash,所以没有emmc/ssd/hdd那样的mbr/gpt,所以分区表并没有保存在nand flash里面)

nomaze 发表于 2014-03-14 17:10

十分感谢,再问一下,这里的第四点中 bootargs mem=   设置了之后是不是会解析到第三点的 ATAG_MEM呢?因为我看到代码里__tagtable(ATAG_MEM, parse_tag_mem32);   是不是说bootloader 传上来的参数在这里被解析呢回复 6# arm-linux-gcc


   

arm-linux-gcc 发表于 2014-03-14 17:17

回复 7# nomaze


    不是,而是先解析ATAG_MEM,后解析mem=,这两者的解析是在不同的函数中,后者解析出来的结果会直接覆盖前者的结果
页: [1]
查看完整版本: linux arm ddr flash 配置