1、找到SDK。每个平台都有自己的SDK(Software Development Kit),一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立的应用软件时的开发工具的集合。
2、一般会看到3个或以上文件,如海思,hardware、software、reference,硬件部分自己去看,我们看软件部分,进入后,再进入board下,我们会看到我们要的SDK包。
3、研究SDK主目录下的脚本文件或readme。进去SDK之后因为系统太庞大,比如海思平台,需要uboot、kernel、交叉编译工具等,很多需要在liunx命令行下执行的操作,如在指定地方解压某个包、mkdir、cp等操作,很繁琐,所以写成脚本文件.sh,通过source一次执行完,通过脚本可以看出到底做了什么工作,再分析。
"unpacking osdrv"、"unpacking kernel"、"unpacking drv"
4.1、看osdrv下的readme:
这时我们知道需要编译整个osdrv,去make,但是前提我们需要安装好海思平台下的交叉编译工具链,一般海思SDK里面会提供自己去找。
4.2、安装交叉编译工具链考虑的问题(就是将压缩包解压到指定文件夹,再导出到环境变量即可):
4.2.1、问题:我的Ubuntu是64位,你的平台提供的工具链是多少位,使用file + name查看你的工具链信息?
(1)方法1:换32位Ubuntu
(2)方法2:装32位兼容包
4.2.2、我们使用方法2:
(1)百度搜索方法,一般就是要安装lib32zl,用aptitude方法安装,因为使用sudo apt-get发现安装不了。
(2)测试执行arm-xxx -gcc -v 看是否安装成功。提示找不到stdc++错误
(3)百度搜索需要安装lib32stdc++6-4.8-dbg,sudo aptitude 安装
(4)再次测试可以运行了
4.3、分析osdrv下的主makefile:
按照readme提供的方法去make + 传参。这是会执行makefile,中途会出现很多问题,你要自己通过打印信息,与makefile对照,看问题出在那里,手动处理一些问题。一次能通过当然最好。
(1)make时,发现找不到arm-hisiv300-linux-gcc
(2)修改makefile中OSDRV_CROSS的路径,结果不行,原因是:make +传参中覆盖了变量的路径
(3)因为没有导出到环境变量?在ubuntu执行export PATH=/xxx/xxx/arm-hisiv300-linux/bin:$PATH
(4)然后echo $PATH看是否导出了,执行arm-hisiv300-linux-uclibcgnueabi-gcc -v,测试可以
(5)为了每次打开终端都能导出到环境变量,我们在当前用户的~/.bashrc脚本里面添加上面的导出命令
(6)还是不行,后面发现是makefile里面使用的make+传参是arm-hisiv300-linux,我们的安装的是arm-hisiv300-linux-uclibcgnueabi,所以我们要给安装好的交叉编译工具链建立符号链接,不能更改传参,因为makefile里面都是用arm-hisiv300-linux,你需要改太多了,不仅仅是改传参。
(7)创建符号链接,后面发现,在海思提供的工具链里面有一个脚本,来帮助我们在指定的地方创建了。我们只要执行就好。./cross.install.v300最好按照别人的玩,我们自己创建的链接放的位置,SDK平台没考虑,可能在执行一些其他脚本时,我们的符号链接会被删除。
(8)然后打开用户目录下的bashrc。vi ~/ .bashrc 导出符号链接安装的路径即可。
5.1、编译osdrv
(1)查看打印信息,制作uImage时,mkimage没有找到。进入 /opensource/uboot/u-boot-2010.06/tools 将mkimage cp 到/usr/local/bin下面,因为这是默认导出到环境变量的目录,这样mkimage就能被找到执行了,不然只有在文件所在目录下才能执行
(2)再次make ,到目前uboot、kernel已经完成编译,但是还是有错,到了rootfs部分了。
5.2、编译osdrv过程中(rootfs部分出现问题)
(1)错误:在编译jffs2_tool时出错,提示没有安装zlib库
解决办法:百度,叫你下载,并安装,但是我们的SDK已经提供了,makefile里面也解压,编译过了,生成了lib库(动、静态库)只是makefile并没有去部署它,只是他们没有注意,不成熟。所以我们自己去部署,将库部署到与jffs2下面的include去包含即可
错误分析:出了错就看打印信息,最终追溯到makefile,看执行到具体哪一步出现了错,方法就是看makefine执行的命令,与实际目录下生成对应文件,到了具体哪一步,再根据我们的需要,删减makefile,最后发现是
(2)错误:编译rootfs时提示“hints”没有找到
错误原因:因为Ubuntu版本太高,而SDK使用的mtd-utils-1.5.0版本太低,16.04支持更高版本的如果需要将jffs2移植到arm开发板上,那么就需要下载源码进行交叉编译了,这就需要下载工具软件源码包mtd-utils了。编译实在tmp里面进行的,最后生成的镜像在tmp/mtd-utils-1.5.0/,这个文件里面有很多种文件系统格式,就有我们要的mkfs.jffs2格式。
解决方案:修改操作系统头文件 vi /usr/include/netdb.h 将__USE_XOPEN2K注释,注意#ifdef与#endif是一一对应的。
(3)再去make,还是会有错,但是,到目前,从对于生成的文件来看,已近得到了mkfs.jffs2,只是因为makefile在编译rootfs时,会把它编译成好几种文件格式,编译成其他格式时,出了错,导致,makefile接下来的命令没有被执行,所以我们要手动执行makefile下面的操作,使我们需要的命令被执行,然后生成需要的镜像,之后将makefile中准备生成其它格式的rootfs命令删除,不然还是会有错。
细节:要想做到这一步需要对roofs制作过程,格式等比较了解才知道,自己得到了需要的,才能正确的更改makefile
(1)当uboot、kernel、rootfs镜像做好后,通过烧录软件HI_TOOLS,uart方式将做好的uboot镜像通过3518e的isp机制烧录到spiflash开始地址,下次启动时,内部BL0内置代码从会尝试选择spi方式从spiflash这边启动,uboot启动成功,进入uboot命令行
(2)uboot通过设置传参bootcmd、bootargs,设置server、ippr等,以及搭建tftp服务器才能去通过tftp下载kernel、rootfs镜像到spiflash,再加载内核到内存,并引导kernel启动,告诉内核各种信息,比如mem系指定系统内存大小,使用串口几打印信息、使用什么方式启动rootfs,最后在哪里启动内核等(kernel和uboot内存地址是连续的,所以启动kernel完后,内核直接引导启动rootfs)
(3)rootfs启动后,搭建nfs服务器,挂载到Ubuntu,这样就实现了文件共享,将rootfs需要的库,ko等nfs方式cp到rootfs的指定目录下,当然这是文件夹形式的,方便调试用,最后要做成镜像,需要将之前制作该镜像的文件夹进行库部署、ko添加等,再去手动制作镜像,之前的镜像制作在osdrv中make时,makefile里面操作