龙芯开源社区

 找回密码
 注册新用户(newuser)
查看: 4558|回复: 8

龙芯1c平台(智龙开发板V2.0)内核启动时出错

[复制链接]
发表于 2016-4-10 17:17:54 | 显示全部楼层 |阅读模式
(1)内核源码为linux-3.0.82.tar.gz。
(2)编译所用配置文件.config为该内核源码下的arch/mips/configs/ls1c300a_default(同一目录下ls1c300a_openloogson_v2.0_default也试过,出现同样错误)。
(3)交叉编译工具为gcc-4.3-ls232。
(4)文件系统为yaffs2,文件系统制作上没有问题,而且内核编译配置中已勾选对yaffs2文件系统支持的选项
(5)内核启动之前内核和文件系统的烧写命令和启动参数为:
mtd_erase /dev/mtd1                                                                            //擦除数据
devcp tftp://192.168.1.5/vmlinuz /dev/mtd0                                              //下载内核
set al /dev/mtd0                                                                                         //设置启动参数
devcp tftp://192.168.1.5/nfsyaffs-uart2-null.img /dev/mtd1 yaf nw                 //烧写文件系统
set append " root=/dev/mtdblock1"                                                        //根目录位置,块设备                                      
set append " $append console=ttyS2,115200"                                                //设置串口3,115200波特率                                                   
set append " $append  noinitrd init=/linuxrc rw rootfstype=yaffs2"       
set append " $append  video=ls1bfb:480x272-16@60 fbcon=rotate:1 consoleblank=0"
reboot                                                                                                  //重启

以上是相关参数。
按照上述的条件进行启动后,内核启动报错,错误信息如下:
yaffs: dev is 32505857 name is "mtdblock1" rw
yaffs: passed flags ""
VFS: Mounted root (yaffs2 filesystem) on device 31:1.
devtmpfs: error mounting -2
Freeing unused kernel memory: 204k freed
Failed to execute /linuxrc.  Attempting defaults...
Kernel panic - not syncing: No init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.

错误信息显示文件系统应该已经挂载成功,但是无法执行linuxrc导致出错,我刚刚接触linux,请问各位大侠,是不是按照默认的配置还不足以启动内核,我还需要怎样做才可以成功启动内核?
发表于 2016-4-12 22:00:39 | 显示全部楼层
代码里面mtd分区调整过了吗?
我拿到的源码中默认是分了4个区的,跟开发板PMON设置的3个分区不一致。

可以参照这里
https://github.com/hchunhui/loon ... 3bbfaccbbb2c403d897
把分区改回来,再用s1c300a_openloogson_v2.0_default编译试试。
 楼主| 发表于 2016-4-13 13:39:37 | 显示全部楼层
本帖最后由 sukepp 于 2016-4-13 15:25 编辑

非常感谢,我确实没有分区,很有可能就是这里的问题。
你的意思是我把内核的分区参照PMON里的分区改成一样的就好了是么,但是我如何查看我的PMON的分区情况呢?而且我的PMON烧写内核时为何把内核烧进mtd0,把文件系统烧进mtd1呢,那bootloader难道在mtd2么?
后来我打算更新PMON来实现和内核分区一致,但是不小心刷成砖了,正在解决中。
发表于 2016-4-13 14:51:53 | 显示全部楼层
pmon的分区怎么看我不太懂,我了解的信息是这样的:

板子上有nor和nand两种flash

bootloader(也就是pmon)原来是放在nor flash 里面的,1c启动时从nor flash 里面读取pmon
mtd0~2都是nand分区,其中kernel是mtd0,rootfs是mtd1

后来好像是说因为1c也可以配置成从nand flash 里面启动,所以kernel和PMON里面就把nand分成
mtd0~3,其中bootloader是mtd0(但是实际智龙板不用,还是从nor flash读),kernel是mtd1,rootfs是mtd2

无论是怎样分区,只要pmon和kernel的分区结构是一样的应该就能成功启动。

成砖可以买一个ch341a的编程器,把nor flash取下来刷回原来的pmon解决。
 楼主| 发表于 2016-4-13 16:23:24 | 显示全部楼层
我内核源码ls1c300a_openloongson_v2.0_platform.c文件中默认分区如下:
static struct mtd_partition ls1x_nand_partitions[] = {
        {
                .name        = "bootloader",
                .offset        = MTDPART_OFS_APPEND,
                .size        = 1024*1024,
        },  {
                .name        = "kernel",
                .offset        = MTDPART_OFS_APPEND,
                .size        = 13*1024*1024,
        },  {
                .name        = "rootfs",
                .offset        = MTDPART_OFS_APPEND,
                .size        = 50*1024*1024,
        },  {
                .name        = "data",
                .offset        = MTDPART_OFS_APPEND,
                .size        = MTDPART_SIZ_FULL,
        },
};

我直接将第一个分区(bootloader分区)删去,后面三个分区的依次按顺序补过来这样可以么,代码如下:
static struct mtd_partition ls1x_nand_partitions[] = {
        {
                .name        = "kernel",
                .offset        = MTDPART_OFS_APPEND,
                .size        = 13*1024*1024,
        },  {
                .name        = "rootfs",
                .offset        = MTDPART_OFS_APPEND,
                .size        = 50*1024*1024,
        },  {
                .name        = "data",
                .offset        = MTDPART_OFS_APPEND,
                .size        = MTDPART_SIZ_FULL,
        },
};
请问这样就可以了么,kernel和rootfs分区的大小还需要改动么?
发表于 2016-4-13 18:58:30 | 显示全部楼层
不行吧,kernel分区大小是14*1024*1024,rootfs分区是100*1024*1024,要跟pmon一致。
否则从pmon用devcp刷,分区还是对不准的。
 楼主| 发表于 2016-4-15 17:02:28 | 显示全部楼层
notyet,你好,我后来看了技术文档,如你所说,我将kernel区、rootfs区分别分为14M,100M,代码如下:
static struct mtd_partition ls1x_nand_partitions[] = {
        {
                .name        = "kernel",
                .offset        = MTDPART_OFS_APPEND,
                .size        = 14*1024*1024,
        },  {
                .name        = "rootfs",
                .offset        = MTDPART_OFS_APPEND,
                .size        = 100*1024*1024,
        },  {
                .name        = "data",
                .offset        = MTDPART_OFS_APPEND,
                .size        = MTDPART_SIZ_FULL,
        },
};
但是错误仍和原来一样,出错信息如下:
NET: Registered protocol family 17
ls1x-rtc ls1x-rtc.0: setting system clock to 2092-12-27 07:30:10 UTC (3881201410)
yaffs: dev is 32505857 name is "mtdblock1" rw
yaffs: passed flags ""
VFS: Mounted root (yaffs2 filesystem) on device 31:1.
devtmpfs: error mounting -2
Freeing unused kernel memory: 204k freed
Failed to execute /linuxrc.  Attempting defaults...
Kernel panic - not syncing: No init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
请问是因为需要分区改动的地方不只是那个分区数组,还是说有其他原因导致无法启动?
发表于 2016-4-15 23:31:27 | 显示全部楼层
sukepp 发表于 2016-4-15 17:02
notyet,你好,我后来看了技术文档,如你所说,我将kernel区、rootfs区分别分为14M,100M,代码如下:
sta ...

楼主你好,这个情况我没遇到。
我觉得是不是可以先刷一个以前能用的内核,看看能不能启动,先排除一下rootfs的问题。
 楼主| 发表于 2016-4-16 09:17:28 | 显示全部楼层
本帖最后由 sukepp 于 2016-4-16 10:42 编辑

@notyet,你说的没错,我之前刷了龙芯官方给的内核,并且挂载我自己制作的文件系统可以成功启动,所以我觉得问题就出在了内核上。我其实只是想写一个驱动在板子上跑起来,但是现在却是官方的内核镜像和自己编的驱动模块版本不一致,无法insmod,用我的驱动模块对应的内核却无法在板子上跑起来。

本版积分规则

小黑屋|手机版|Archiver|Lemote Inc.  

GMT+8, 2019-9-18 11:37 , Processed in 0.187309 second(s), 17 queries .

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