龙芯俱乐部开源技术社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2505|回复: 0

ls1c_robot刷机教程

[复制链接]

52

主题

125

帖子

4661

积分

论坛元老

Rank: 8Rank: 8

积分
4661
发表于 2017-8-11 13:16:04 | 显示全部楼层 |阅读模式
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到开发板后解压出来
  
  
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|龙芯俱乐部开源技术社区

GMT+8, 2024-5-2 14:28 , Processed in 0.121899 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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