300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > i.MX6ULL移植NXP官方Linux内核imx_5.4.47_2.2.0

i.MX6ULL移植NXP官方Linux内核imx_5.4.47_2.2.0

时间:2023-06-01 09:30:50

相关推荐

i.MX6ULL移植NXP官方Linux内核imx_5.4.47_2.2.0

目录

开发环境设置交叉编译工具链下载NXP官方维护的内核使用官方配置编译使用4.9.88版本的设备树通过网络下载内核镜像以及设备树使用之前写在emmc中的根文件系统添加自己的板子使用nfs挂载根文件系统使用buildroot制作根文件系统nfs挂载根文件系统使根文件系统显示当前路径移植驱动移植触摸屏驱动移植蓝牙驱动移植wifi驱动

开发环境

系统:Ubuntu18.04参考资料:百问网 IMX6ULL开发板(从零移植篇-预览版)-V0.1,正点原子驱动开发指南开发板:100ask i.MX6ULL PRO

设置交叉编译工具链

交叉编译工具链的获取就不写了

打开.bashrc文件。vi ~/.bashrc。在该文件最后面添加如下(根据自己的交叉编译工具链)

export ARCH=armexport CROSS_COMPILE=arm-buildroot-linux-gnueabihf-export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin

下载NXP官方维护的内核

(1)直接从官网下载,非常慢而且内核较大,可以用第二种方法下载。内核版本尽量和uboot一致吧,我这都是2.2.0。

git clone /external/imx/linux-imxcd linux-imxgit checkout remotes/origin/imx_5.4.47_2.2.0

(2)下载有百问网提供的gitee上的修改过的内核,然后reset到原来的分支即可。

git clone /weidongshan/linux-imxcd linux-imxgit reset 63736cb7c46268a6e6aab654ad3849d85d5581a0 --hard

使用官方配置编译

打开官方文件imx-yocto-L5.4.47_2.2.0/i.MX_Porting_Guide.pdf文件,阅读 P9 页 Chapter 2 Porting Kernel 章节可以得到 IMX6ULL 编译 kernel 的步骤,其中编译 imx6ull cpu 所使用的配置文件是imx_v7_defconfig此文件存放在 linux-imx 目录下arch/arm/configs/

设置好交叉编译工具链之后就可以用官方的配置文件先编译得到zImagedtb

make imx_v7_defconfigmake zImage -j4make dtbs

使用4.9.88版本的设备树

使用百问网提供的4.9.88版本的设备树,也就是6ullPRO开发板的设备树文件。可以先备份官方的imx6ull-14x14-evk.dts文件。同时也是因为我使用的百问网已经适配好的设备树,所以像网卡这种自己就不用适配了,和uboot那里差不多。

mv arch/arm/boot/dts/imx6ull-14x14-evk.dts arch/arm/boot/dts/imx6ull-14x14-evk.dts.bak

然后将老版本的设备树复制过来,然后编译。

cp ~/100ask_imx6ull-sdk/Linux-4.9.88/arch/arm/boot/dts/100ask_imx6ull-14x14.dts arch/arm/boot/dts/imx6ull-14x14-evk.dtsmake dtbs

出现错误,flexcan1节点没有找到:

百问网的dts只包含了imx6ull.dtsi,这个是描述芯片的。

我们再来看看官方的dts,可以看到,真正描述官方evk板子外设的设备树文件是imx6ul-14x14-evk.dtsi。很明显imx6ull-evkimx6ul-evk有很多相同的地方,6ul6ull这两款芯片的pinctrl也是差不多的。

下面是官方设备树的can1节点。

这是百问网的can1节点。

其实在imx6ul.dtsi里面就是命名为can1,这里我们也改成can1吧。然后编译设备树,错误可以忽略。

make dtbs

通过网络下载内核镜像以及设备树

tftp和nfs在Ubuntu和板子上的配置可看其他博客或者板子的开发手册,可以通过nfs挂载根文件系统

将内核镜像和设备树拷贝到tftp的服务器。

cp arch/arm/boot/dts/imx6ull-14x14-evk.dtb ~/tftpboot/cp arch/arm/boot/zImage ~/tftpboot/

在开发板上配置相关环境变量。

setenv fdt_file imx6ull-14x14-evk.dtb //设置需要下载的设备树文件名称setenv ip_dyn no //关闭自动配置 IPsetenv serverip 192.168.5.11 //设置 ubuntu IP 地址,你的网段可能不一样setenv ipaddr 192.168.5.9 //设置开发板 IP 地址,你的网段可能不一样setenv nfsroot /home/book/nfs_rootfs //设置 ubuntu nfs 文件系统所在目录。run netboot //执行网络启动命令

启动开发板看看。成功下载到内核和设备树。但是根文件系统是从nfs挂载,我还没有在nfs那加入根文件系统,所以肯定失败。

使用之前写在emmc中的根文件系统

uboot通过bootargs环境变量提供给内核相关参数,先看看自己开发板的bootargs。可以看到我这里设置是从nfs启动。

print bootargsbootargs=console=ttymxc0,115200 root=/dev/nfs ip=dhcp nfsroot=192.168.5.11:,v3,tcp

修改bootargs从emmc启动根文件系统,然后用tftp下载内核和设备树,bootz启动。

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'saveenvtftp 80800000 zImagetftp 83000000 imx6ull-14x14-evk.dtbbootz 80800000 - 83000000

可以看到成功启动emmc中的根文件系统。

使用uname -a查看内核版本,确实是5.4.47。

添加自己的板子

添加配置文件

cp arch/arm/configs/imx_v7_defconfig arch/arm/configs/imx_v7_nice_defconfig

添加设备树

cp arch/arm/boot/dts/imx6ull-14x14-evk.dts arch/arm/boot/dts/imx6ull-14x14-nice.dts

修改arch/arm/boot/dts/Makefile,在evk板子下面添加我们的板子。imx6ull-14x14-nice.dtb

使用nfs挂载根文件系统

使用buildroot制作根文件系统

链接:使用buildroot.02.06制作根文件系统

nfs挂载根文件系统

启动开发板,在uboot中查看bootargs环境变量print bootargs,这是我们从emmc启动根文件系统,我们要修改为从nfs启动根文件系统。

修改bootargs环境变量,然后从tftp下载内核和设备树:

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.5.11:/home/book/nfs_rootfs/buildrootfs,v3,tcp rw ip=192.168.5.9:192.168.5.11:192.168.5.1:255.255.255.0::eth0:off'其中:root=/dev/nfs/dev/nfs并非真的设备,而是一个告诉内核要通过网络取得根文件系统。nfsroot=<server-ip>:<root-dir>参数nfsroot这个参数告诉内核以哪一台机器的哪个目录以及哪个网络文件系统选项作为根文件系统使用。<server-ip> 指定网络文件系统服务端的IP地址。如果没有指定定,则使用nfsaddrs变量指定的值。<root-dir> 服务端上要作为根文件系统要挂载的目录名称。ip=<my-ip>:<serv-ip>:<gw-ip>:<netmask>:<name>:<dev>:<auto>参数ip设定网络通讯所需的各种网络接口地址。如果没有给定这个参数,则内核核会试着使用反向地址解析协议或是启动协议(BOOTP)以找出这些参数。<ipaddr> 客户端的IP地址。<serverip> 网络文件系统服务端的IP地址。<gatewayip> 网关(gateway)的IP地址。<netmask>本地网络的网络掩码。如果为空白,则掩码由客户端的IP地址导出。<name>客户端的名称。如果空白,则使用客户端IP地址的ASCII标记值。<dev> 要使用的网络设备名称。如果你只有一个设备,那么你可以不管它。一般指定为eth0<auto> 用以作为自动配置的方法。,可以是on可以是offsaveenvtftp 80800000 zImagetftp 83000000 imx6ull-14x14-nice.dtb //使用自己改名后的设备树bootz 80800000 - 83000000

可以看到成功通过NFS挂载我们制作的根文件系统。

看一下ip地址ifconfig

然后再ping一下Ubuntu,没问题。

但是看上去总感觉哪里不对劲?↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

使根文件系统显示当前路径

我们使用构建的根文件系统启动以后会发现,输入命令的时候命令行前面一直都是“#”,如果我们进入到某个目录的话前面并不会显示当前目录路径。

“PS1”环境变量 用于设置命令提示符格式

PS1 = ‘命令列表’\! 显示该命令的历史记录编号。\# 显示当前命令的命令编号。\$ 显示$符作为提示符,如果用户是 root 的话,则显示#号。\\ 显示反斜杠。\d 显示当前日期。\h 显示主机名。\n 打印新行。\nnn 显示 nnn 的八进制值。\s 显示当前运行的 shell 的名字。\t 显示当前时间。\u 显示当前用户的用户名。\W 显示当前工作目录的名字。\w 显示当前工作目录的路径

我们打开/etc/profile 文件,找到如下所示内容,然后将其屏蔽掉:

if [ "$PS1" ]; thenif [ "`id -u`" -eq 0 ]; then export PS1='# 'elseexport PS1='$ 'fifi

上述代码是原始的设置 PS1 环境变量的代码,将命令提示符设置为了固定的“#”,我们将其屏蔽掉,然后输入如下,然后重启开发板:

PS1='[\u@\h]:\w\$ 'export PS1

重启开发板加入uboot之后,我们可以在不影响原本启动代码的基础上,自定义一个环境变量nicenetboot来启动开发板,之后我们按任意键进入uboot后,执行run nicenetboot即可:

setenv nicenetboot 'tftp 80800000 zImage;tftp 83000000 imx6ull-14x14-nice.dtb;bootz 80800000 - 83000000'saveenvrun nicenetboot

重启之后再看看:

移植驱动

移植触摸屏驱动

进去根文件系统后使用hexdump /dev/input/event0测试触摸屏,不能用。

拷贝 Linux4.9.88 内核版本的触摸屏驱动到 Linux 5.4 内核版本,并修改对应了 Makefile 和Kconfig 来增加此驱动,最后在配置文件中增加配置项来把此驱动模块编译进内核镜像中。

cp -rfd ~/100ask_imx6ull-sdk/Linux-4.9.88/drivers/input/touchscreen/gt9xx/ ./drivers/input/touchscreen/vi drivers/input/touchscreen/Makefile

打开Kconfig文件,将gt9xx的Kconfig加入。

vi drivers/input/touchscreen/Kconfig

使用make menuconfig打开内核配置界面,输入/gt9xx进行搜索,像进入哪里就按相应的序号。

我们之前移植的是百问网提供的4.9.88的设备树文件,里面已经有了gt9xx节点了。

之后我们编译内核,make zImage -j4,然后将内核镜像拷贝到tftp服务器目录

cp arch/arm/boot/zImage ~/tftpboot/

然后重启开发板,同样在uboot中使用run nicenetboot命令启动系统。进去系统后使用hexdump来测试一下屏幕的输入,没问题:

移植蓝牙驱动

先看看启动信息:

提示firmware file rtl_bt/rtl8723b_fw.bin not found,无法加载这个蓝牙固件。所以我们需要先找到配套的蓝牙估固件并将其拷贝到对应的目录。

我们从/weidongshan/linux-firmware仓库获取对应的蓝牙固件程序,获取到固件后,执行拷贝命令将对应的蓝牙固件拷贝到 nfs_rootfs 目录下等待后面测试时使用。

git clone /weidongshan/linux-firmwarecd linux-firmware/sudo cp -rf rtl_bt/ ~/nfs_rootfs/buildrootfs/lib/firmware/

拷贝蓝牙模块所需的镜像文件到相应的目录后,重启发现内核依旧提示找不到rtl_bt/rtl8723b_fw.bin文件,由于 usb 蓝牙模块驱动程序是编译在 zImage 内核镜像内,可能是由于文件系统在蓝牙驱动模块后才挂载启动的,所以提示无法找到对应的文件,此时我们可以将 usb 蓝牙驱动编译成驱动模块在进入文件系统后手动安装 看是否还会出现找不到 firmware 文件问题。

make zImage -j4make modules -j4cp arch/arm/boot/zImage ~/tftpboot/sudo make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs/buildrootfs/ modules_install

重启开发板看看-----》先lsmod看看装载了哪些模块驱动:

有很多bt开头的驱动,应该是蓝牙没错了,看上去像是成功启动蓝牙了。

dmesg | grep "Bluetooth"看看启动信息

移植wifi驱动

同样将wifi固件拷贝到firmware

cd linux-firmware/sudo cp -rfd rtlwifi/ ~/nfs_rootfs/buildrootfs/lib/firmware/

提前拷贝好 wifi 固件后,接下来配置内核 rtl8723bu wifi 模块的驱动程序。

make menuconfig

然后编译镜像和模块,拷贝到相应目录,重启开发板。

make zImage -j4make modules -j4cp arch/arm/boot/zImage ~/tftpboot/sudo make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs/buildrootfs/ modules_install

重启后:

使用lsmod查看装载的模块驱动:

第一个rtl8xxxu就是wifi芯片驱动了。使用ls /sys/class/net/查看net设备:

我们可以使用ifconfig wlan0 up 命令来启用 wifi 设备,使用iw dev显示网络设备,之后使用iw wlan0 scan | grep "SSID"命令来使用 wlan0 搜索附近 wifi 设备都有那些,搜索后会自动显示出周围的所有 wifi 名。

连接无密码的wifi通过iw就可以连接,有密码的wifi好像需要其他软件。

iw命令需要自行安装,在buildroot的menuconfig界面搜索iw即可,下载时会有几个包无法下载,复制包的地址然后在windows浏览器上打开就能下载了,下载完后上传到buildroot的dl目录对应文件夹下就行。注意上传文件时,对应dl文件夹的权限要设置一下,直接sudo chmod 777 path即可。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。