努力成为大神~
分类: 嵌入式
2018-01-22 21:58:50
龙芯目前使用PMON作为自己的BootLoader,然后开源的资源为添加了基于龙芯适配的Linux操作系统,最近上官网貌似发现其还提供了vxworks的BSP资源,感兴趣的大家可以上龙芯官网上看看,坐标为龙芯开源社区
要是链接进不去就百度龙芯开源社区吧。。。。。因为之前接触的为龙芯2H,所以就主要以龙芯2H平台聊聊。
关于资源下载
在开源社区里面提供了最新版的PMON和Linux,内容都是针对龙芯2H的官方开发板。
关于编译工具
根据龙芯自己的手册介绍,编译PMON需要使用mipsel-linux-gcc工具,而编译Linux需要使用mips64el-linux-gcc,因此针对PMON和Linux龙芯分别提供了单独的编译工具。在龙芯的开源社区和ftp服务器上均有下载,同时这里有一点,不知道是否有变化,之前直接使用开源社区中下载的Linux编译工具,在使用pthread时,会提示库的路径不存在,然后提示一堆不存在的文件路径,后来进行研究发现,可能是工具在进行路径打包时,设置了一个绝对路径,如果用户将编译工具解压到同其相同的路径时,就可以编译通过,不然会一直提示库路径错误。所以这里使用的是ftp服务器上的版本。
因为龙芯PMON和Linux的交叉编译工具不同,所以这里没有采用将其添加到环境变量中的方式,而是编写了两个保存环境变量的sh文件,分别命名为pmon-env.sh和linux-env.sh,对于pmon交叉编译工具,首先进行解压
点击(此处)折叠或打开
点击(此处)折叠或打开
同理解压Linux的交叉编译工具,解压路径为/usr/local,之后在linux-env.sh中添加如下路径。
点击(此处)折叠或打开
将两个sh文件的权限修改为777。当需要使用哪个编译工具时就source使其生效,当要使用另一个时则新开一个终端source另一个。这里可能大家觉得麻烦,也可以直接将路径全部添加至environment或者bash_profile中,可以根据自己的需求去做。
关于编译和烧写
编译的前提为交叉编译工具均已生效,
对于编译pmon,这里以龙芯2H为例,首先进入解压后的pmon根目录,编译生成配置PMON 所需要的pmoncfg 工具,命令如下:
点击(此处)折叠或打开
点击(此处)折叠或打开
生成的gzrom.bin即为目标文件,如果设备中不存在pmon,则需要通过ejtag进行烧写,不然可以直接使用网络在线加载,命令为
点击(此处)折叠或打开
对于编译Linux
修改Linux源代码根目录下的Makefile文件,修改文件中的ARCH和CROSS_COMPILE两个选项,内容如下:
ARCH ?= mips64el
CROSS_COMPILE ?= mips64el- linux-
接着拷贝配置文件
cp arch/mips/configs/loongson2h_defconfig .config
最后make
会分别生成vmlinux和vmlinux.32,所以vmlinux为64位,vmlinux.32为32位,这里使用vmlinux。
烧写前需要保证PMON中添加了NAND的支持,不然就得去找patch进行升级更新。
PMON中对于NAND的分区位于Targets\LS2H\include\ pmon_target.h文件中,具体为
#define MTDPARTS "nand-flash:10M@0(kernel)ro,-(rootfs)"
这里根据自己的需求进行空间修改即可,并且需要注意这里的分区得同Linux下的分区统一,不然会出错。
PMON>mtd_erase /dev/mtd0
之后使用的烧写镜像指令为:
PMON>devcp tftp://192.168.xxx.xxx/vmlinux.32 /dev/mtd0
同时之前在我使用的PMON中没有添加yaffs文件系统的烧写支持,所以如果想使用yaffs文件系统,则需要修改pmon中的代码。之前尝试进行修改,但没有成功,所以使用jiffs2文件系统,如果有大神,希望能不吝分享~
PMON>mtd_erase /dev/mtd1
PMON>devcp tftp://192.168.x.xxx/rootfs-jffs2.img /dev/mtd1
这里对烧写进行一个小归纳
当板上无PMON时:
使用ejtag烧写,在linux下运行,将gzrom拷贝到tmp后,
sudo ./ejtag_debug_usb
source config/config.ls2h
call program_cachelock
板上有PMON时:
load -r -f bfc00000 tftp://XXX.XXX.XXX.XXX/gzrom.bin
xxx.xxx.xxx.xxx为主机IP地址
烧写Linux内核和根文件系统镜像
mtd_erase /dev/mtd0
devcp tftp://XXX.XXX.XXX.XXX/vmlinux /dev/mtd0
mtd_erase /dev/mtd1
devcp tftp://XXX.XXX.XXX.XXX/rootfs-xxx.img /dev/mtd1
设置启动参数
对于 Cramfs文件系统:
PMON>set append ‘root=/dev/mtdblock1 console=ttyS0,115200 noinitrd init=/linuxrc rootfstype=cramfs’
Jffs2 文件系统:
PMON>set append ‘root=/dev/mtdblock1 console=ttyS0,115200 noinitrd init=/linuxrc rw rootfstype=jffs2’
对于制作不同的文件系统,具体流程如下:
(1)Cramfs:
#mkfs.cramfs –b 16384 XXX/rootfs rootfs-cramfs.img
其中-b 是设置块大小,后面的数值是根据NAND FLASH的block大小有关,需要同NAND FLASH匹配,这里选为16384。这里如果没有设置正确,在启动时会打印类似error -3 while decompressing! 8497b9ec(2060)->85370000(16384)的错误,所以需要特别注意。
#chmod 777 rootfs-cramfs.img //修改文件系统权限,防止出现无法烧写的情况
(2)Jffs2:
#mkfs.jffs2 -r /XXX/rootfs -o rootfs-jffs2.img -e 0x20000 --pad=0x2000000 –n
#chmod 777 rootfs-jffs2.img //修改文件系统权限,防止出现无法烧写的情况
mkfs.jffs2 各参数的意义:
-r:指定要生成 image的目录名。
-o:指定输出 image 的文件名。
-e:每一块要擦除的block size,不同的flash,其block size 会不一样。这里为128KB。
--pad:用16进制来表示所要输出文件的大小,也就是rootfs-jffs2.img的大小,如果实际大小不足此设定的大小,则用 0xFF 补足。--pad的大小可以根据自身需求进行相应的修改。
-n,-no-cleanmarkers:指明不添加清楚标记(NAND FLASH有自己的校检块,存放相关的信息)。