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

这篇具有很好参考价值的文章主要介绍了i.MX6ULL移植NXP官方Linux内核imx_5.4.47_2.2.0。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开发环境

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

设置交叉编译工具链

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

export ARCH=arm
export 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 https://source.codeaurora.org/external/imx/linux-imx
cd linux-imx
git checkout remotes/origin/imx_5.4.47_2.2.0

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

git clone https://gitee.com/weidongshan/linux-imx
cd linux-imx
git reset 63736cb7c46268a6e6aab654ad3849d85d5581a0 --hard

i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发

使用官方配置编译

打开官方文件 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/
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
设置好交叉编译工具链之后就可以用官方的配置文件先编译得到zImagedtb

 make imx_v7_defconfig
 make zImage -j4
 make dtbs

i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发

使用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.dts
make dtbs

出现错误,flexcan1节点没有找到:
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
百问网的dts只包含了imx6ull.dtsi,这个是描述芯片的。
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
我们再来看看官方的dts,可以看到,真正描述官方evk板子外设的设备树文件是imx6ul-14x14-evk.dtsi。很明显imx6ull-evkimx6ul-evk有很多相同的地方,6ul6ull这两款芯片的pinctrl也是差不多的。
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
下面是官方设备树的can1节点。
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
这是百问网的can1节点。
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
其实在imx6ul.dtsi里面就是命名为can1,这里我们也改成can1吧。然后编译设备树,错误可以忽略。

make dtbs

i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发

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

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 //关闭自动配置 IP
setenv 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那加入根文件系统,所以肯定失败。
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发

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

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

print bootargs
bootargs=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'
saveenv
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk.dtb
bootz 80800000 - 83000000

可以看到成功启动emmc中的根文件系统。
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
使用uname -a 查看内核版本,确实是5.4.47。
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发

添加自己的板子

添加配置文件

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
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发

使用nfs挂载根文件系统

使用buildroot制作根文件系统

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

nfs挂载根文件系统

启动开发板,在uboot中查看bootargs环境变量print bootargs,这是我们从emmc启动根文件系统,我们要修改为从nfs启动根文件系统。
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
修改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可以是off

saveenv
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-nice.dtb //使用自己改名后的设备树
bootz 80800000 - 83000000

可以看到成功通过NFS挂载我们制作的根文件系统。
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
看一下ip地址ifconfig
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
然后再ping一下Ubuntu,没问题。
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
但是看上去总感觉哪里不对劲?↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

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

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

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

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

if [ "$PS1" ]; then
	if [ "`id -u`" -eq 0 ]; then 
		export PS1='# '
	else
		export PS1='$ '
 	fi
 fi

上述代码是原始的设置 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'
saveenv
run nicenetboot

重启之后再看看:
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发

移植驱动

移植触摸屏驱动

进去根文件系统后使用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

i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
打开Kconfig文件,将gt9xx的Kconfig加入。

vi drivers/input/touchscreen/Kconfig

i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
使用make menuconfig打开内核配置界面,输入/gt9xx进行搜索,像进入哪里就按相应的序号。
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
我们之前移植的是百问网提供的4.9.88的设备树文件,里面已经有了gt9xx节点了。
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
之后我们编译内核,make zImage -j4,然后将内核镜像拷贝到tftp服务器目录

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

然后重启开发板,同样在uboot中使用 run nicenetboot 命令启动系统。进去系统后使用hexdump来测试一下屏幕的输入,没问题:
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发

移植蓝牙驱动

先看看启动信息:
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
提示firmware file rtl_bt/rtl8723b_fw.bin not found,无法加载这个蓝牙固件。所以我们需要先找到配套的蓝牙估固件并将其拷贝到对应的目录。
我们从https://gitee.com/weidongshan/linux-firmware 仓库获取对应的蓝牙固件程序,获取到固件后,执行拷贝命令将对应的蓝牙固件拷贝到 nfs_rootfs 目录下等待后面测试时使用。

git clone https://gitee.com/weidongshan/linux-firmware
cd linux-firmware/
sudo cp -rf rtl_bt/ ~/nfs_rootfs/buildrootfs/lib/firmware/

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

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

重启开发板看看-----》先lsmod看看装载了哪些模块驱动:
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
有很多bt开头的驱动,应该是蓝牙没错了,看上去像是成功启动蓝牙了。

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

i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发

移植wifi驱动

同样将wifi固件拷贝到firmware

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

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

make menuconfig

i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
然后编译镜像和模块,拷贝到相应目录,重启开发板。

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

重启后:
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
使用lsmod查看装载的模块驱动:
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
第一个rtl8xxxu就是wifi芯片驱动了。使用ls /sys/class/net/查看net设备:
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发

我们可以使用ifconfig wlan0 up 命令来启用 wifi 设备,使用iw dev显示网络设备,之后使用 iw wlan0 scan | grep "SSID" 命令来使用 wlan0 搜索附近 wifi 设备都有那些,搜索后会自动显示出周围的所有 wifi 名。
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
i.max6ull移植新版本内核,i.MX6ULL系统移植,linux,git,运维,学习,arm开发
连接无密码的wifi通过iw就可以连接,有密码的wifi好像需要其他软件。

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

到了这里,关于i.MX6ULL移植NXP官方Linux内核imx_5.4.47_2.2.0的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • I.MX6ULL开发笔记(二)——硬件外设操作

    在文章http://t.csdnimg.cn/EGWt9中有介绍Linux下文件目录,那么在Linux系统下,RGB灯也是一个设备,所以我们需要到 /sys 目录下去操作这个设备。 之后,我们进入到 class 目录,这里挂载着开发板上的外设: 在这里就能看到熟悉的硬件接口了,那么我们进入到 leds 的目录下: 可以看

    2024年01月24日
    浏览(53)
  • 016——DHT11驱动开发(基于I.MX6uLL)

    目录 一、 模块介绍 1.1 简介 1.2 电路描述 1.3 通信协议 二、 驱动程序 三、 应用程序 四、 上机实验         DHT11 是一款可测量温度和湿度的传感器。比如市面上一些空气加湿器,会测量空气中湿度,再根据测量结果决定是否继续加湿。DHT11 数字温湿度传感器是一款含有已

    2024年04月16日
    浏览(40)
  • 012——LED模块驱动开发(基于I.MX6uLL)

    目录 一、 硬件原理图 二、 驱动程序 三、 应用程序 四、 Makefile 五、操作         又是非常经典的点灯环节 ,每次学新语言第一步都是hello world,拿到新板子或者学习新的操作系统,第一步就是点灯。         LED 的驱动方式,常见的有四种。 ① 使用引脚输出 3.3V 点

    2024年04月13日
    浏览(47)
  • I.MX6ull GPT高精度定时器

    一 简介 GPT的全称是General Purpose Timer,它是一个32位的向上的定时器, GPT 定时器也可以跟一个值进行比较,当计数器值和这个值相等的话就发生比较事件,产生比较中断。GPT 定时器有一个 12 位的分频器,可以对 GPT 定时器的时钟源进行分频。 分析方式 同EPTI  它具有以下特点

    2024年02月08日
    浏览(54)
  • I.MX6ULL ARM驱动开发---网络设备驱动框架

      网络驱动是 linux 里面驱动三巨头之一,linux 下的网络功能非常强大,嵌入式 linux 中也常常用到网络功能。前面我们已经讲过了字符设备驱动和块设备驱动,本章我们就来学习一下 linux 里面的网络设备驱动。   网络设备驱动程序的体系结构分为4层,依次为网络协议驱

    2023年04月17日
    浏览(38)
  • 018——红外遥控模块驱动开发(基于HS0038和I.MX6uLL)

    目录 一、 模块介绍 1.1 简介 1.2 协议 二、 驱动代码 三、 应用代码 四、 实验 五、 程序优化         红外遥控被广泛应用于家用电器、工业控制和智能仪器系统中,像我们熟知的有电视机盒子遥控器、空调遥控器。红外遥控器系统分为发送端和接收端,如图下图所示。

    2024年04月16日
    浏览(45)
  • i.MX6ULL驱动开发 | 27 - 使用WM8960 CODEC播放音频

    WM8960是欧胜公司(wolfson)的一款低功耗、高质量的立体声音频编解码芯片。 其内部集成D类喇叭功放,每个通道可以驱动一个1W喇叭(8Ω),内部集成3个立体声输入源,可以灵活配置,拥有一路完整的麦克风接口。 WM8960内部ADC和DAC都为24位,主要特性如下: DAC的SNR(信噪比)

    2024年02月02日
    浏览(47)
  • 017——DS18B20驱动开发(基于I.MX6uLL)

    目录 一、 模块介绍 1.1 简介 1.2 主要特点 1.3 存储器介绍 1.4 时序 1.5 命令 1.5.1 命令大全    1.5.2 命令使用 1.5.3 使用示例 1.6 原理图 二、 驱动程序 三、 应用程序 四、 测试         DS18B20 温度传感器具有线路简单、体积小的特点,用来测量温度非常简单,在一根通信线上

    2024年04月12日
    浏览(49)
  • 使用一根网线,让Ubuntu和正点原子I.MX6ULL开发板互相ping通

    准备一根网线即可 2.1 找根网线将I.MX6ULL和电脑连起来 2.2 让I.MX6ULL通电运行起来,我这里使用的是正点原子版本的内核、 2.3 进入电脑的网络连接后,按照如下步骤操作 2.4 将ip地址、子网掩码、默认网关设置如下,= 注意,子网掩码一定要是255.255.255.0 IP地址推荐使用192.168.5.

    2024年02月19日
    浏览(51)
  • 基于I.MX6ULL的Linux C多线程物联网网关+STM32+Qt上位机+Linux C++多线程服务器(含web)的多种无线通信系统的智慧农场

    我国是农业大国,而非农业强国。近30年来农业高产量主要依靠农药化肥的大量投入,大部分化肥和水资源没有被有效利用而随地弃置,导致大量养分损失并造成环境污染。我国农业生产仍然以传统生产模式为主,传统耕种只能凭经验施肥灌溉,不仅浪费大量的人力物力,也

    2024年04月14日
    浏览(91)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包