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到开发板后解压出来