开发环境
- 系统:Ubuntu18.04
- 参考资料:百问网 IMX6ULL开发板(从零移植篇-预览版)-V0.1,正点原子驱动开发指南
- 开发板: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/
。
设置好交叉编译工具链之后就可以用官方的配置文件先编译得到zImage
和dtb
。
make imx_v7_defconfig
make zImage -j4
make 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-evk
和imx6ul-evk
有很多相同的地方,6ul
和6ull
这两款芯片的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可以是off
saveenv
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" ]; 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
重启之后再看看:
移植驱动
移植触摸屏驱动
进去根文件系统后使用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好像需要其他软件。文章来源:https://www.toymoban.com/news/detail-660588.html
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模板网!