接着上面的博客接着记录几句话:
2、移植NUC980的Uboot程序
1、U-boot可用于引导后续的操作系统等,对于操作芯片来说比较重要,对于裸机代码也需要实用uboot进行引导,操作起来更加方便。
2、使用的板子还是自己做的老板子,NUC980加上外置的SPI-nor-Flash芯片,由于新唐提供的代码只能用于NAND中,对nor的支持非常不友好,因此需要设定一些选项保证其可以运行在电路板上面。
3、首先要下载u-boot文件,开发不要重复造轮子,先去gitee上面搜索一下NUC980,然后找到uboot下载下来,下载方式随意,可以直接下载zip的压缩包,可以使用linus大神的git,随你喜好。
4、下载完成解压缩之后,包内的文件还是比较少的,这是因为上传文件时,生成的o文件,bin文件等都被删除掉了,嵌入式开发都是节约空间的好手,上传东西也要空间占用越少越好。为了方便写点东西,用的ssh连接到linux主机,目录如下。
5、在编译代码之前,应该做两件事,第一件就是make clean,保证代码干干净净,保证生成的文件都是自己想要的,第二件事就是找一下configs内部是否有现有已经设定好的config文件,运气不要太差,一般都有的,为了防止选项过多,用grep进行了过滤,对于留这么多文件,我对厂家的懒惰表示难以理解,如果我是厂家,我会将没用的config文件都删除掉,让用户用的清清爽爽,后续我会把没用的config文件全删掉。
6、找到config文件,一切都变得简单起来,直接用make nuc980_defconfig,载入已经设定好的选项,这下子设定界面就会好设计好多。
config文件用于干什么呢,对于好多解释比较高大上,其实理解起来比较简单,就是模板,这个模板可以过滤掉无用的设定选项,只保留有用的设定选项,在uboot的根目录下面有.Config文件,使用ls -a就可以看到,其保存的就是当前配置uboot的选项,如果执行make nuc980_defconfig,则nuc980_defconfig文件将会.config文件覆盖,这里就很好理解厂家如何制作的nuc980_defconfig文件了,直接将.config拷贝到configs文件目录中,改个名字就好了,是不是有点简单的侮辱智商,喜欢深入研究的同学们可以去阅读以下config文件写的都是什么,其实想一下也会知道,无非就是选中这个项目,取消那个项目,除此之外不会再有别的东西了。
7、对于移植U-Boot比较繁琐的一点就是要修改文件,此处修改的文件为include/configs/nuc980_evb.h 文件,根据新唐的官方文档进行修改,直接输入指令vim include/configs/nuc980_evb.h
,使用vim修改,修改内容如下:
去掉对NAND的支持,改为对SPI的支持:
打开uboot的输入框提示宏定义(想要什么定义随便写了):
直接保存。
8、保存完成后不要直接使用make指令,因为在禁止NAND之后,uboot在编译过程中,部分文件仍然需要使用NAND的宏定义,因此此时编译则会出现问题,需要修改配置文件,通过配置文件去掉对NAND的支持,并打开对SPI的支持,此时支持使用root用户进行操作,可以避免每次都要输入权限密码。直接在uboot的根目录下输入make menuconfig打开配置界面,我所用的电脑为windows通过远程ssh连接linux机器进行编译,并使用winscp软件传递文件,所谓的menuconfig界面,就是终端进行了着色,因此使用一般的终端都是可以打开控制界面的,不需要直接在windows下打开。对个人而言,一般喜欢使用两个电脑,一个用于做linux主机,一个使用windows进行控制,linux下的office文件处理和办公软件的确要比windows差很多,打开后的界面如下。
9、要修改的项目比较多,依次如下:
(1)关闭SPL,SPL是NAND-flash加载时用于引导uboot的文件,NAND-flash的块处理需要此文件支持,选中此项目可以在uboot编译时产生uboot-spl,可以引导uboot的启动,作为uboot的boot文件,由于nor-flash具有的字节操作能力,因此此项在nor中没有作用。
(2)使能SPI驱动,没什么好说的,如果spi都不启动,系统无法工作。
(3)使能spi-flash的驱动
(4) 使能spi和sf指令,去掉nand指令支持。
(5)配置完成后,可以检查一些其他选项,根据英文也可以猜出来什么意思,尽量不要多选,原因很简单,uboot用的不多,选多了启动慢还没用,得不偿失。比如此处修改为1s启动,则直接删除3(删除使用ctrl+←),修改成1即可
(6)选择完成后,直接make -j4(j4代表4个核心一起编译,如果电脑是单核心的,此处加这个参数没什么作用的,可能比较古老的电脑才是单核心的)
10、编译完成后,直接生成了u-boot.bin文件,此文件即为可以烧录进入ARM系统的文件,将他拷贝用于烧录的windows系统目录下即可,或者可以直接使用linux提供的nuWriter也可。
11、将电路板拨到usb启动选项,连接打印线缆,连接USB上电,确保电脑可识别到芯片,然后打开Nuwriter软件。此时,用于监控芯片的打印串口打印输出信息如下
证明当前操作已经被芯片捕捉,系统进入USB烧录模式。
进入NuWriter之后,首先点击Erase指令,如果是新的电路系统,建议将全片擦除。
然后点击选取命令,选取编译好的uboot软件,并填入相应的参数,点击烧录,将软件烧入
串口打印系统打印信息如下:
重新启动电路板,查看是否已经可以启动boot程序,如果可以启动,那么uboot应该移植的差不多了
12、为保证后续顺利工作,环境变量也可以同步烧录,环境变量实际是具有默认参数的,但是为保证实际使用,可将其烧入系统中。直接输入env,则会打印出相应的指令
比如需要查看env,则直接输入env print即可,env的使用非常简单。
直接去官网找一个env文件修改下就可以用了
baudrate=115200
bootdelay=2
stderr=serial
stdin=serial
stdout=serial
setspi=sf probe 0 30000000
loadkernel=sf read 0x7fc0 0x200000 0x800000
bootcmd=run setspi;run loadkernel;bootm 0x7fc0
前面主要描述了波特率和暂停时间,sf probe 0 30000000表示设定spi的频率为30mHz,此处可以设定为50,再大估计支撑不了了;loadkernel=sf read 0x7fc0 0x200000 0x800000表示使用spi接口将0x200000地址 0x800000这么大数据读取到内核的0x7fc地址,其实这么大也没必要,可以根据自己的内核适当减小。其他指令主要是bootm 0x7fc0,直接跳转到内核的0x7fc0运行程序;bootcmd为脚本文件,将上述的setspi和loadkernel等都进行了执行,烧入核心代码就可以跑起来了(核心代码使用data形式烧录,烧录的地址就是0x200000)。Uboot内容就这么多了,用到哪里学到哪里吧。