搞了整整两天才整好!踩了不少坑,记录一下
0. 操作基础
操作前需要设置好如下配置
1.开发板和ubuntu能够互相ping通
2.开发板的SD卡中安装好uboot,我用的V2.4版本的,其他版本应该也行
3.准备材料
- 01_chrdevbase文件
- linux-imx-rel_imx_4.1.15_2.1.1_ga_alientek_v2.4.tar.bz2
这个文件在01、例程源码->10、开发板教程对应的uboot和linux源码->02、linux中->V2.4版本及以后版本底板使用的linux 路径下
1. 配置I.MX6ULL
- 开发板调至SD卡启动方式
注意只启动u-boot即可,及时按回车
- 设置环境变量
环境变量中的ip、rootfs路径等需要根据实际情况调整
setenv bootargs "console=ttymxc0,115200 rw nfsroot=192.168.5.252:/home/alientek/linux/nfs/rootfs ip=192.168.5.251:192.168.5.252:192.168.5.1:255.255.255.0::eth0:off"setenv bootcmd "tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000"saveenv
红色箭头里面的值需要根据自己的实际情况进行调整
2. 编译 linux-imx-rel_imx_4.1.15_2.1.1_ga_alientek_v2.4.tar.bz2
- 将linux-imx-rel_imx_4.1.15_2.1.1_ga_alientek_v2.4.tar.bz2压缩包复制到Ubuntu中
- 输入命令解压压缩包 tar -vxjf linux-imx-rel_imx_4.1.15_2.1.1_ga_alientek_v2.4.tar.bz2
解压后图下
- 创建imx6ull_alientek_emmc.sh 命令为gedit imx6ull_alientek_emmc.sh
在imx6ull_alientek_emmc.sh中输入如下代码
#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_alientek_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j12
- 输入如下命令编译linux内核
./imx6ull_alientek_emmc.sh
5. 找到zImage和imx6ull-alientek-emmc.dtb
zImage在arch/arm/boot/路径下,imx6ull-alientek-emmc.dtb在dts路径下
- 将zImage和imx6ull-alientek-emmc.dtb拷贝值tftp和nfs文件夹中
这里的nfs和tftp是开发板挂载到ubuntu的文件夹,可以和ubuntu互相通信
tftp和nfs文件夹的路径必须和刚才步骤一设置的环境变量相同,不然无法通信
3. 编译字符驱动设备文件
- 将刚才准备的01_chrdevbase文件夹中的文件拷贝到ubuntu中
- 打卡Makefile文件,修改Makefile中的KERNELDIR的路径
这个路径其实就是刚才弄的linux内核的路径
- 编译字符驱动设备
4. 启动linux内核
- 输入boot,可以看到开始启动内核
- 输入命令 modprobe
如果提示没有4.1.15这个文件夹,那么自己创建一下
在这个路径下创建/lib/modules/4.1.15”
- 将ubuntu中的chrdevbase.ko拷贝到开发板的/lib/modules/4.1.15中
输入如下命令进行拷贝
sudo cp chrdevbase.ko /home/alientek/linux/nfs/rootfs/lib/modules/4.1.15/ -f
- 建立依赖
输入depmod命令
- 加载字符驱动文件
- 输入modprobe chrdevbase.ko 和
这里可以看到字符驱动设备已经被成功加载!
总结:
花了整整两天时间才弄好字符驱动模块的加载操作
我是看了正点原子第三期才开始弄第四期的,但是第三期是跳着看的,(因为实在是看不下去,感觉讲的抓不住重点,一看就想睡觉,晦涩难懂)
由于步骤很繁琐,这个教程写的并不是很详细,如果你是第一次调试字符设备驱动,建议结合B站的这个视频教程中的3.2讲《我的第一个Linux驱动-驱动模块加载与卸载实验》来进行学习