书接上文,先前把U-Boot移植完成了,有兴趣的男子伴可以通过传送门过去。
Linux系统的移植早已完成,而且果然还是移植没时间整理资料,没办法,2年级的娃真的很难补习……
如今我对野火开发板的移植早已完成了纯净Linux系统、Busybox根文件系统、SDL+OpenGL、Python3.6,下一步开始移植音频、WIFI、蓝牙、以及键盘系统,而且音频早已搞了三天了,移植找不到设备,看了无数遍源码,都无果,后来换胃热哥提供的5月份的FullQt,仍然是音频设备错误,技术客服回答可能是音频模块坏了,这三天会给我送一块新的板子来,希望一切顺利吧。
这篇上面先谈谈我的Linux和根文件系统的移植吧,以及关于Linux内核烧入eMMC和远程加载的几种方法,关于SDL的艰辛……先不挖坑了,有空再整理吧。
书归正传。
火哥提供的Linux没看,好像集成的内容太多了,不够纯,由于我比较喜欢处,所以就从NXP官方早已打算好的系统开始移植吧。
虽然NXP提供的系统源码基本是可以用的,要更改的东西比较少,那就直接动手烧写他的系统吧。
NXP官方系统烧写测试
NXP的系统可以从官网下载,或则从我提供的联接中下载都可以。
命令如下:
makeARCH=armCROSS_COMPILE=arm-linux-gnueabihf-distclean
makeARCH=armCROSS_COMPILE=arm-linux-gnueabihf-imx_v7_defconfig
makeARCH=armCROSS_COMPILE=arm-linux-gnueabihf-all-j16
第一行命令用于去除工程中之前编译的残留文件,最好这样做,否则有惊喜。
第二行命令用于指定配置文件使用imx_v7_defconfig,这是EVK板子自带的东西。
第三行用于编译内核文件,时间比较长,尤其在虚拟机里做,你可以先吃杯方便面,回去就好了。
以后就编译出了Linux的内核文件,在arch/arm/boot中,假如存在zImage和imx6ull-14x14-evk.dtb两个文件表示成功,否则肯定是出问题了。我剖析问题可能出现以下几种:
没有安装交叉编译环境,但若果你做了U-Boot移植,问题应当不在这;
没有安装lzop,直接apt-get安装一下即可;
配置文件名称弄错了,imx_v7_defconfig;
CROSS_COMPILE=arm-linux-gnueabihf-前面没加空格,这个错误很低级。
假如两个文件都下来了,这么恭喜你,第一关过了。
下一步开始启动,启动前要保证几件事:
早已做好了U-Boot的移植,而且还能正常启动,假若不晓得这是啥,去传送门看,先把U-Boot移植好了再回去看这个;
服务器端(Ubuntu或其他Linux端)安装了tftp或则nfs,关于这个教程这儿不写了,问度娘吧。
用U-Boot启动NXP的Linux内核
先用tftp启动,把两个文件拷贝到tftp的目录下,启动tftp服务器。
启动U-Boot步入命令行模式,更改bootargs参数
setenvbootargs“console=ttymxc0,115200root=/dev/mmcblk1p2rootwaitrw”
saveenv
设置U-Boot网路参数:
setenvipaddr192.168.1.55//开发板IP地址
setenvethaddr00:04:9f:04:d2:35//开发板网卡MAC地址
setenvgatewayip192.168.1.1//开发板默认网段
setenvnetmask255.255.255.0//开发板子网网段
setenvserverip192.168.1.128//服务器地址,也就是Ubuntu地址
saveenv//保存环境变量
之后尝试用tftp加载内核和设备树文件,并启动。
tftp80800000zImage
tftp83000000imx6ull-14x14-evk.dtb
bootz80800000-83000000
前两行是通过tftp命令把服务器端的两个文件拉出来放在指定位置,Linux内核置于80800000,设备树放到83000000,6ULL默认从80000000启动,并且这个位置早已放了U-Boot,但是我们U-Boot加载Linux的时侯还须要用,所以位置要往前放,这个参数按照自己的喜好设置吧。
或则通过nfs启动也成,先把两个文件放在NFS的目录下,命令如下:
nfs80800000192.168.31.128:/home/mars/Linux/nfs/zImage
nfs83000000192.168.31.128:/home/mars/Linux/nfs/imx6ull-14x14-evk.dtb
bootz80800000-83000000
通过我测试,我的NFS要比TFTP快好多。
另外就是可以设置bootcmd参数,把启动命令手动化,这样就不用每次进U-Boot启动Linux系统了。
setenvbootcmd“nfs80800000192.168.31.128:/home/mars/Linux/nfs/zImage;nfs83000000192.168.31.128:/home/mars/Linux/nfs/imx6ull-14x14-evk.dtb;bootz80800000-83000000”
记得用saveenv保存参数。
这儿有个小插曲,我认为是你们可能会才到的坑,就是NFS加载的时侯会出现ERROR:Filelookupfail的错误,这是由于uboot中使用的NFS版本是V2,而ubuntu的NFS版本为V3或V4及以上版本,致使uboot不能在NFS服务器中找到文件,所以须要更改ubuntu中NFS的兼容。
打开/etc/default/nfs-kernel-server文件,改三行内容:
RPCNFSDCOUNT="-V28"
RPCMOUNTDOPTS="-V2--manage-gids"
RPCSVCGSSDOPTS="--nfs-version2,3,4--debug--syslog"
改完以后重启nfs就可以了。
Linux内核启动后控制台会蹦出一堆的内核加载信息,但到了最后发觉加载不过去了,提示“Kernelpanic-notsyncing:VFS:Unabletomountrootfsonunknown-block(0,0)”,这是没有根文件系统引起的,这个先忽视,旁边会提到。到了这儿表示你的原始内核早已移植成功了,吃杯方便面奖励一下自己吧。
改建自己的Linux内核
这部份内容对于野火用户来说十分友好,由于野火的开发板基本参考了NXP官方的板子,要改的东西不是好多,也没有太艰深的地方,甚至比对门家的还好弄。
2.1添加自己的开发板配置文件
配置之前,先用makedistclean清除一下工程,否则看着太乱。
上一节中我们编译官方内核的时侯使用的是imx_v7_defconfig这个配置,这个文件在arch/arm/configs中,我们直接复制一份,重命名为imx_embedfire_emmc_defconfig,这儿面是一些模块配置项,前面在移植声卡网卡一类的东西的时侯须要改动,在这我们先不动了,永远是的就可以。
复制设备树文件,Linux内核中所有的设备树都储存在arch/arm/boot/dts中,素有imx6ull-开头的都是关于我们这块CPU的设备树,也是NXP官方早已写好的东西,我们从imx6ull-14x14-evk.dts直接入手。
复制这个文件,更名为imx6ull-embedfire-emmc.dts,今后涉及到设备树更改的,都须要在这儿进行,本小结中先不动丫。
设备树文件有了,我们还希望在Makefile中才能找到他。
打开arch/arm/boot/dts/Makefile文件,搜索一下dtb-$(CONFIG_SOC_IMX6ULL),在最下边加入我们设备树的名子即可linux移植时需要编译设备树文件吗,这样在进行编译的时侯才会根据我们的设备树文件编译出imx6ull-embedfire-emmc.dtb文件了。
至此,配置文件基本全部搞定,重新编译并通过U-Boot远程启动测试一下。
记得,在编译的时侯使用imx_embedfire_emmc_defconfig这个配置。
2.2更改eMMC驱动
在Linux内核源码中,eMMC采用的是4线模式的,而野火iMX6ULLPro开发板用的是8线的,不改变也能用,但既然人家提供了8车道,为何还要在4车道拥堵呢!改丫的!
打开imx6ull-embedfire-emmc.dtb设备树文件,找到&usdhc2标签,更改成一下内容:
pinctrl-names="default","state_100mhz","state_200hmz";
pinctrl-0=;
pinctrl-1=;
pinctrl-2=;
bus-width=;
non-removable;
status="okay";
2.3更改LCD驱动
LCD是在硬件开发中比较常用的一种设备,在U-Boot移植的文章中,我们早已做了野火7寸LCD的移植,在Linux下,可以搭配SDL、QT这样的GUI库制做出精致的UI界面。
在Linux中,应用程序是须要通过操作LCD实现字符、图片等内容的显示,在裸机开发中我们可以随便分配一块显存给LCD作为内存用,而且在Linux中,系统对显存管理是很严格的,对于系统显存和用户显存有着明晰的界定,正常情况下是不予许随便访问的,而在我们的LCD编程中,我们的驱动程序和应用程序都须要访问同一款称作“显存”的虚拟显存实现勾画,所以为了解决这个问题,FrameBuffer应运而生,系统内核通过FrameBuffer对内存进行控制linux 输入法,对界面操作最终都是基于FB进行编程的。在Linux一切接文件的中心思想推动下,我们可以在/dev目录下找到内存对应的fbX的一系列文件,我们明天要做的LCD显示用的是/dev/fb0。
LCD的驱动有好多,NXP官方和野火及对门家的开发板都是使用的RGB888的合同,驱动NXP官方早已写好了,会在/dev下边生成一个fb0的设备,倘若有多个显示设备的话就会出现fb1、fb2…。
过多的理论性内容网上一大堆,不啰嗦了,开始实战。
在Linux配置外设,无非就是操作设备树文件,对于相同合同的LCD,驱动基本上都是一样的,只须要依照不同的LCD硬件调整参数。在移植U-Boot的时侯,对于LCD的移植早已讲得很清楚了,就是更改类似控制器hspw、hbp、hfp等等一些时间相关的参数。
打开imx6ull.dtsi文件,找到cdif:lcdif@021c8000这个节点,这儿所有的配置项就是用于控制LCD显示的,这个节点在I.MX6ULL平台中是通用的,既然是通用也就意味着丫是不完整的,所以还须要我们在自己的imx6ull-embedfire-emmc.dts中做更进一步的配置。
我们先看imx6ull.dtsi文件中关于LCD节点的描述。compatible,这个数组在配置文件中是通用的,表示兼容性,LCD的兼容属性是"fsl,imx6ul-lcdif"和"fsl,imx28-cldi",在原文件中搜索就可以见到相关适配驱动的信息,有兴趣的可以读读源码。
打开imx6ull-embedfire-emmc.dts,找到pinctrl_lcdif_dat段,这部份是关于LCD用到引脚的配置,野火开发板和NXP开发板的引脚结构是相同的,所以这儿基本不用改,并且建议你们之后做实际项目的时侯尽量也用这种官方推荐的引脚。
第二个要更改的是&lcdif段,这儿是关于LCD具体参数的配置,这儿改的东西比较多,大部份须要依照你手身上用到的屏幕显卡参数进行配置。
这儿再度引来GT911的数据指南。
Item
Symbol
Values
Unit
Remark
Min.
Typ.
Max.
HorizontalDisplayArea
thd
-
800
-
DCLK
DCLKFrequency
fclk
26.4
33.3
46.8
MHz
OneHorizontalLine
th
862
1056
1200
DCLK
HSpulsewidth
thpw
1
-
40
DCLK
HSBlanking
thb
46
46
46
DCLK
VerticalDisplayArea
tvd
-
480
-
TH
VSperiodtime
tv
510
525
650
TH
VSpulsewidth
tvpw
1
-
20
TH
VSBlanking
tvb
23
23
23
TH
VSFrontPorch
tvfp
7
22
147
Pinctrl-0:这儿面配置了引脚的具体情况,这儿用不到复位,所以要删掉pinctrl_lcdif_rest
Bits-per-pixel:象素格式,我们采用的是RGB888的合同,所以长度为24bit
bus-width:线宽,按照自己板子的DATA讯号线对应,野火7寸屏用的是DATA0~DATA23,所以我的是24线
clock-frequency:象素时钟,搜注重是33.3MHz,所以应当是33300000
hactive:X轴像质数,800
vactive:Y轴像质数
hfront-porch,HFP,210
hback-porch,HBP,46
hsync-len,HSPW,1
vback-porch,VBP,23
vfront-porch,VFP,7
vsync-len,VSPW,1
hsync-active,HSYNC数据线极性,0
vsync-active,VSYNC数据线极性,0
de-active,DE数据线极性,1
pixelclk-active,时钟数据线极性,0
这种参数设置好以后LCD才能正常显示了,若果出现白屏或则死机的情况,很有可能是某个参数弄错了,尤其是宽高。
第二步就是配置背光。
NXP官方板子和野火用的都是GPIO1_IO08控制背光,所以关于pinctrl_pwm1这段也不须要更改,关于pwm1这个节点的信息,在imx6ull.dtsi文件中可以找到,假如找不到就直接在imx6ull-embedfire-emmc.dts中重画一个,尽量不要去改动imx6ull.dtsi,虽然人家是通用的设备树信息。
在imx6ull-embedfire-emmc.dts文件中可找到&pwm1的段,status设置为okay启用背光,通过阅读Documentation/devicetree/indings/video/backlight/pwm-backlight.txt得悉,节点backlight就是背光的设置段,compatible属性设置为pwm-backlight,对应的驱动文件是drivers/video/backlight/pwm_bl.c。背光的PWM频度官方推荐是5KHz,这个我们就不改他了,除非屏幕闪动厉害。
brightness-levels属性描述了屏幕的照度级别,原文件中只给出了几个值,我们把他扩充到0~255,0表示PWM基频为0%,背光完全关掉,255表示背光信噪比为100%,背光全亮。其实linux服务器系统,这个值可以任意写,只要不超过255就行。
default-brightness-level表示当前照度级别,随意设置啥都行,这个值表示的是brightness-levels的Index值。
调整完毕后重新编译,,启动新的内核,这时侯假如屏幕上出现了小企鹅,恭喜你,LCD移植成功。
假如你的小企鹅没下来,瞧瞧menuconfig中DeviceDrivers->Graphicssupport->Bootuplogo下边的三个选项是不是都选中了。
可以通过/sys/devices/platform/backlight/backlight/backlight下边的文件操作背光显示,须要注意的是,这个文件必须在开发板的系统下能够见到,在Ubuntu下是看不到这个文件系统的。其实,这是后话,由于这时侯还没仍然根文件系统涅。
这个目录下的max_brightness表示最大级别,也就是default-brightness-level的Index值,假如这儿面我们设置了7个值,那max_brightness最大就是7,而不是255,不晓得有没有抒发清楚。
brightness表示当前的背光级别。
2.4LCD的额外设置和LOGO更改
最喜欢的环节,改LOGO。
在你的Ubuntu系统中先装个软件爱你netpbm,用apt-get可以直接下载安装。
做好你的LOGO,bmp和png都可以linux移植时需要编译设备树文件吗,之后用这个软件转换成ppm格式的。
具体命令如下:
bmptopnmrainbow.bmp>rainbow.pnm
pnmquant224rainbow.pnm>rainbow_224.pnm
pnmtoplainpnmrainbow_224.pnm>logo_linux_clut224.ppm
第一行可以换成pngtopnm,第二行命令要求源文件和目的文件不能重名,第三行尽量保持同名。
最后把logo_linux_clut224.ppm复制到源码devices/video/logo/下替换原先的文件,并删掉logo_linux_clut224.c和logo_linux_clut224.o。最好是在编译前清除一下工程,这样保证不会出问题。
这样LOGO就改成我们自己的了。
在U-Boot中,设置bootargs,加一个console=tty1的输出,即setenvbootargs'console=tty1console=ttymxc0,115200’,这样屏幕上就可以看见控制台输出内容了。
等移植完根文件系统以后,在更改etc/inittab文件,加入tty1::askfirst:-/bin/sh,这样我们的I.MX6ULL显卡就可以接收到剪片的输入了。
在默认情况下,10分钟后LCD会死机,假如须要下降这个时间,或则是要设置永久亮屏,只须要更改源码drivers/tty/vt/vt.c文件中的blankinterval白能量即可,0表示常亮。
另外,步入系统后可以通过fbset查看屏幕的参数信息。
2.5更改RTC
RTC也就是系统实时时钟,用于记录系统的时间,在野火I.MX6ULLPro开发板上有一块钮扣电瓶专门用于在系统掉电后维持系统时间。而在Linux驱动中也早已写好了RTC的驱动程序,NXP早已帮我们最好了移植,所以这块我们就不用在动了,直接用就行。