flyorange 发表于 2017-8-11 13:16:04

ls1c_robot刷机教程

uboot编译:
make CROSS_COMPILE=mipsel-linux- distclean
make CROSS_COMPILE=mipsel-linux- ls1c300a_openloongson_config
make CROSS_COMPILE=mipsel-linux-

编译后生成u-boot.bin

tftp更新u-boot
tftp a0100000 u-boot.bin
sf probe 0
sf update 80100000 0 80000

tftp服务器默认地址为serverip=192.168.1.3 可以使用命令修改环境来设置该地址
setenv serverip 192.168.1.3
saveenv
或者修改配置文件 u-boot-2013.10/include/configs/ls1c300a_openloongson.h来修改

开发板配置文件:
u-boot-2013.10/include/configs/ls1c300a_openloongson.h

编译和烧录linux内核
内核源码目录下:
cp arch/mips/configs/ls1c300a_openloongson .config
make ARCH=mips CROSS_COMPILE=mipsel-linux- menuconfig
保存退出,执行编译:
make ARCH=mips CROSS_COMPILE=mipsel-linux-

生成的vmlinux或vmlinuz可以使用pmon加载到内存中运行或烧录到nand flash中。

如果使用u-boot,则要生成uImage,以下是生成uImage的方法:
linux内核编译完成后,查看内核的elf信息:
mipsel-linux-readelf -e vmlinux
执行这个命令后会打印很多信息,找到Entry point这个字段,例如:
...
Entry point address:               0x806632e0
...
可以确认ep地址为0x806632e0,这个入口点地址在下面的制作uImage的过程中要用到。
注意:这个地址不是固定的,更改内核配置从新编译后这个地址可能就变了,所以要根据自己编译出来的内核获取实际的地址。

制作uImage:
/home/loongson/1C/u-boot-2013.10/tools/mkimage -A mips -O linux -T kernel -C gzip -a 0x80200000 -e 0x806632e0 -n "Linux-3.x" -d arch/mips/boot/compressed/vmlinux.bin.z uImage

其中/home/loongson/1C/u-boot-2013.10/tools/mkimage 是编译u-boot时候生成的工具,路径根据实际情况修改,这里u-boot源码路径是/home/loongson/1C/u-boot-2013.10/
其中-a 0x80200000 是内核在内存中的加载地址,与arch/mips/loongson/Platform文件中的
load-$(CONFIG_LS1C_MACH) += 0xffffffff80200000
地址一致,一般不用修改。
-e 0x806632e0 则是刚才使用mipsel-linux-readelf -e vmlinux查看到的入口点地址,每次编译linux内核后都查看以下这个地址,因为这个地址可能会有所变化,把新地址替换-e 0x806632e0这个地址即可。

生成的uImage就可以在u-boot命令行下使用命令烧录到nand flash中或加载到内存中运行。


烧录内核和根文件系统:
使用tftp烧录linux内核(压缩的uImage)和根文件系统(yaffs2)到nand flash
nand erase.part kernel
tftp a0100000 uImage
注意加载后打印出来的长度
nand write 80100000 kernel xxx
xxx表示使用加载后打印出来的长度,16进制hex

nand erase.part root
tftp a0100000 rootfs-yaffs2.img
注意加载后打印出来的长度
nand write.yaffs 80100000 root xxx
xxx表示使用加载后打印出来的长度,16进制hex

内核启动参数:
setenv bootargs console=ttyS2,115200 root=/dev/mtdblock2 noinitrd init=/linuxrc rootfstype=yaffs2 rw
setenv bootcmd nboot kernel\;bootm 81000000
注意不能有引号,nboot默认加载地址为CONFIG_SYS_LOAD_ADDR,CONFIG_SYS_LOAD_ADDR要与bootm的地址一致,这里是81000000
saveenv

内核启动参数也可以在配置文件u-boot-2013.10/include/configs/ls1c300a_openloongson.h中修改

nand flash分区:
开发板配置文件:u-boot-2013.10/include/configs/ls1c300a_openloongson.h
中修改分区
#define MTDPARTS_DEFAULT        "mtdparts=ls1x_nand:"        \
/*                                                "512k(uboot),"        \
                                                "512k(env),"        \*/\
                                                "1M(uboot_env),"        \
                                                "13M(kernel),"        \
                                                "50M(root),"        \
                                                "-(mini_rootfs)"

uboot_env 1MByte保留给nand启动用
kernel 13MByte用于烧录内核
root 50MByte用于烧录根文件系统
mini_rootfs 剩余容量(14MByte) 用于存放mini_rootfs

注意:
tftp加载文件有时要等待一会,大概5-6秒的样子。有时会提示加载失败,可以复位一下开发板再试。如果还是不行的话检查一下主机的tftp服务是否正常,开发板是否ping的通主机。

通过网络加载文件文件到内存的地址都是0xa开头的,比如通过tftp加载文件
tftp a0100000 uImage
其中地址就是a0100000
其他操作则不需要把地址改成0xa开头,比如烧录到nand 或直接运行,这时的地址是0x8开头,比如把刚才加载到a0100000内存的uImage烧录到nand
nand write 80100000 kernel xxx
这时的地址就是80100000,0x8开头
其实地址a0100000和地址80100000,都是同一个地址,指向相同的内存的物理地址,0x8开头的是经过cache的,运行更快。

但是如果通过网络加载文件到内存,内存地址开头是0x8的话会出现校验错误(可能是加载时cache出错),
所以如果通过网络加载文件到内存,需要把地址改成0xa开头。


内存太少的问题:
由于开发板只有32MB内存,比较小所以,所以uboot和linux内核中都没有选择lcd驱动,因为选择lcd驱动后会根据选择的分辨率大小占用内存,分辨率越大占用内存越多。
如果需要lcd的话,修改配置文件即可。



如不使用网络,可以使用SD卡更新uboot 内核和文件系统,方法如下:

sd卡更新u-boot.bin 到spi flash
mmc_spi 0:2
mmcinfo
fatload mmc 0:1 a0100000 u-boot.bin
sf probe 0
sf update 80100000 0 80000

使用sd卡(fat32分区格式)烧录linux内核(压缩的uImage)和根文件系统(yaffs2)到nand flash
nand erase.part kernel
mmc_spi 0:2
mmcinfo
fatload mmc 0:1 a0100000 uImage
注意加载后打印出来的长度
nand write 80100000 kernel xxx
xxx表示使用加载后打印出来的长度,16进制hex

nand erase.part root
mmc_spi 0:2
mmcinfo
fatload mmc 0:1 a0100000 rootfs-yaffs2.img
注意加载后打印出来的长度
nand write.yaffs 80100000 root xxx
xxx表示使用加载后打印出来的长度,16进制hex

内核启动参数:
setenv bootargs console=ttyS2,115200 root=/dev/mtdblock2 noinitrd init=/linuxrc rootfstype=yaffs2 rw
setenv bootcmd nboot kernel\;bootm 81000000
注意不能有引号,nboot默认加载地址为CONFIG_SYS_LOAD_ADDR,CONFIG_SYS_LOAD_ADDR要与bootm的地址一致,这里是81000000
saveenv

内核启动参数也可以在配置文件u-boot-2013.10/include/configs/ls1c300a_openloongson.h中修改


使用mini_rootfs更新系统
因为uboot烧录nand的方式是先把要烧录的文件(如内核或根文件系统等)加载到内存的某个地址,然后再使用nand烧写命令把该内存开始地址的文件写到nand中。
所以如果内存不够的话,会出现问题,比如根文件系统镜像比内存大,就没办法把根文件系统镜像加载到内存中,也就没办法完整烧录到nand。
由于开发板使用32MB的内存,内存太小了,而nand有128MB,如果根文件比较大,如大于20多MB,就会出现问题

方法1:
把根文件系统中比较大的文件先去掉,如lib目录,lib目录下都是库文件,比较大,可以先把lib目录复制出来,再把原来lib目录下的内容清空,
复制出来的lib目录用tar命令打包,后面会用到。
然后用工具制作根文件系统镜像,这样制作出来的镜像就小很多,大概小于20MB就可以,不会受内存太小限制。
用这个根文件系统启动后,再把原来打包的lib目录放到sd卡或u盘,mout到开发板后解压出来


页: [1]
查看完整版本: ls1c_robot刷机教程