目录

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

开发环境

  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

使用官方配置编译

打开官方文件 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.dts
make 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 //关闭自动配置 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那加入根文件系统,所以肯定失败。

使用之前写在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中的根文件系统。

使用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制作根文件系统

链接:使用buildroot2022.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可以是offsaveenv
tftp 80800000 zImage
tftp 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'
saveenv
run 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,无法加载这个蓝牙固件。所以我们需要先找到配套的蓝牙估固件并将其拷贝到对应的目录。
我们从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/


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

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看看装载了哪些模块驱动:

有很多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 -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查看装载的模块驱动:

第一个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即可。

i.MX6ULL移植NXP官方Linux内核imx_5.4.47_2.2.0相关推荐

  1. i.MX6ULL移植NXP官方uboot2020.04_5.4.47_2.2.0

    目录 开发环境 设置交叉编译工具链 下载nxp的uboot 移植uboot 编译uboot 烧写uboot镜像 建立自己的单板文件配置 解决适配问题 适配 lan8720a 网卡 查看公版原理图 查看 ...

  2. i.MX6ULL系统移植 | 移植NXP官方linux4.1.15内核

    更新时间 更新内容 2021-11-15 初稿完成 2022-07-28 更新网络驱动移植部分 一.NXP官方linux内核 1. 下载 NXP官方linux仓库地址为:https://github. ...

  3. IMX6ULL 基于NXP官方Linux源码添加自己单板

    编译NXP官方Linux内核 每个板子都有默认配置文件,都保 存 在 arch/arm/configs目录下 imx_v7_defconfig和imx_v7_mfg_defconfig 都可作为 I. ...

  4. Uboot专题(一)—— 移植NXP官方Uboot(2016.03版本)

    linux系列目录: linux系统移植篇(二)-- Uboot使用介绍 Uboot专题(一)-- 移植NXP官方Uboot(2016.03版本) 文章目录 一.编译NXP官方uboot 1.获取ub ...

  5. 申威 linux内核,一种申威防火墙快速移植高版本linux内核的方法与流程

    技术特征: 1.一种申威防火墙快速移植高版本linux内核的方法,其特征在于,包括以下步骤: s1:预先制作生成内存根文件系统的压缩文件: 所述步骤s1包括以下步骤: s11:通过编译busybox制 ...

  6. 移植正点原子linux内核

    目录 前言 一.创建VSCODE移植工程 二.修改根目录下Makefile 三.添加自己的linux开发板 1.创建linux开发板配置文件 2.创建linux开发板设备树文件 3.修改编译文件 四. ...

  7. 移植NXP官方U-boot全过程

    一.NXP官方U-boot编译 1.解压缩官方U-boot 解压缩命令 tar -vxjf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 为了方便,修改文件夹名字 ...

  8. mini2440 linux内核编译与移植 课程设计,linux内核移植步骤-mini2440

    建立使用 Fedora 9,版本太高,由于链接库的区别可能造成不可预料的错误.或者说配置相对复杂多了.本教程仅提供给刚接触内核的朋友,大牛们当路过就是,有发现什么错误还望指教. ① 修改顶层的Make ...

  9. i.MX6ULL驱动开发 | 31 - Linux内核网络设备驱动框架

    一.Linux网络设备驱动整体架构 网络设备是完成用户数据包在网络媒介上发送和接收的设备,它将上层协议传递下来的数据包,以特定的媒介访问控制方式进行发送,并将接收到的数据包传递给上层协议. Linux ...

最新文章

  1. Table表头与数据列对齐问题解决方案
  2. Android零基础入门第33节:Android事件处理概述
  3. JAVA进阶day04多态(向上转化,向下转化)
  4. 计算机操作系统指导书,《计算机操作系统》实验指导书-2015
  5. 背景颜色 - bootStrap4常用CSS笔记
  6. 设置韩澳大利亚sinox弄winxp清除字体和界面美观
  7. 日语+AI语音黑科技,早道开启小语种AI智能时代!
  8. 第二百二十一节,jQuery EasyUI,Form(表单)组件
  9. Boost和STL学习资料大全
  10. python爬取饿了么评论_爬虫实例:饿了么爬虫
  11. MES工程师新手,该怎么学习?学习哪些技术?
  12. 特网云服务器 Windows自动更新相关配置
  13. RHEL8破解root密码
  14. ceph 写流程(1)
  15. 问题——TortoiseGit Git clone 的时候密码写错
  16. cents OS 重装yum,配置阿里yum源
  17. lua对接bmob数据库
  18. ES聚合Aggregation---原生(restful)api
  19. android quot;动画重叠quot;,自定义ViewPager实现仿 quot;多邻国quot; 的闪卡效果
  20. windows phone 应用提交商店失败总结

热门文章

  1. MIPS架构的交叉编译工具问题
  2. http://ask.dcloud.net.cn/question/11695 nativeUI的使用(移动的)
  3. 用matlab模拟凸透镜,凸透镜成像的计算机模拟.pdf
  4. 第51次全国计算机等级考试时间,通知丨第51次全国计算机等级考试开始
  5. Python高级正则表达式
  6. 中国AI+营销市场研究报告
  7. javas文档对象模型(DOM)
  8. 用C++逆向分析解密,制作游戏破解辅助外挂竟如此简单!
  9. 15 设计电影租借系统
  10. oracle11gRAC升级到oracleRAC19C