首先,需要有一个内核源码,并且编译配置
驱动程序的头文件依赖于内核,所以写驱动程序时候要使用内核,是编译后的内核。
内核是需要配置的,比如链接文件。到底是asm-arm还是asm-x86,内核用的是哪一个具体相关的架构目录,需要配置内核。
步骤:
1、配置编译内核、设备树、其它驱动程序
2、编译后的第一步东西放到板子上,
3、编译测试我们第一个驱动
一、内核编译命令:
cd 内核目录
make 100ask_imx6ull_defconfig //确定是给arm编译,还是给X86编译
make zImage -j4 //编译内核 -j4加快编译速度
make dtbs //编译设备树
cp arch/arm/boot/zImage ~/nfs_rootfs //zImage拷贝到nfs目录备用 位置
cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs //拷贝设备树文件备用 位置
make modules //编译模块驱动程序
make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs modules_install //拷贝模块驱动备用,安装内核模块到某个目录下
最后nfs_rootfs目录文件如下
[email protected]:/home/book/nfs_rootfs# ls
01_hello 100ask_imx6ull-14x14.dtb lib test zImage
------------------------------------------------------------------------
imx6ull 2.4开发案板内核编译
1.make clean // 第一次编译 Linux 内核之前先清理一下 2.make imx_v7_mfg_defconfig // 配置 Linux 内核、这是的 配置 Linux4.1.15 内核 3.make -j16 //编译内核 编译内核.编译设备树其它命令make zImage -j4 、make dtbs 4.设备树 imx6ull-14x14-emmc-7-1024x600-c.dtb需要单独编译 步骤: 1.找到imx6ull-14x14-emmc-7-1024x600-c.dts文件拷贝到内核arch/arm/boot/dts/目录下 2.到arch/arm/boot/dts/目录下配置Makefie 添加imx6ull-14x14-emmc-7-1024x600-c.dtb

3.回到 内核源码目录编译imx6ull-14x14-emmc-7-1024x600-c.dts设备树
[email protected]:/home/book/kernal-imx6ull# make imx6ull-14x14-emmc-7-1024x600-c.dtb
DTC arch/arm/boot/dts/imx6ull-14x14-emmc-7-1024x600-c.dtb
5.拷贝镜像文件和设备树到nfs
cp arch/arm/boot/zImage /home/book/nfs_rootfs //zImage拷贝到nfs目录备用 位置
cp arch/arm/boot/dts/imx6ull-14x14-emmc-7-1024x600-c.dtb /home/book/nfs_rootfs //拷贝设备树文件备用 位置
二、镜像文件和设备树拷贝开发板
1、zImage 2、100ask_imx6ull-14x14.dtb设备树 3、 modules //这三个文件需要拷贝到开发板
[email protected]:/home/book/nfs_rootfs# cd lib/
[email protected]:/home/book/nfs_rootfs/lib# ls
firmware modules
拷贝到板子上步骤:
1.查看开发板内核版本
uname -a
Linux ATK-IMX6U 4.1.15-g3dc0a4b #1 SMP PREEMPT Thu Aug 18 09:27:40 CST 2022 armv7l armv7l armv7l GNU/Linux
可以看出版本是4.1.15
2.挂载网络文件系统
3.把文件复制到开发板
mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
cp /mnt/zImage /boot
cp /mnt/100ask_imx6ull-14x14.dtb /boot
cp /mnt/lib/modules /lib -rfd //开发板有lib目录,所以要覆盖掉原来目录,-r递归复制,f强制复制,d复制链接文件依然做为链接文件,减少空间ok
sync
4.重启开发板
reboot
5.查看版本,内核更新时间
uname -a
----------------------------
[email protected]:/test# ls
imx6ull-14x14-evk.dts lib zImage
[email protected]:/test# cp zImage /boot/
[email protected]:/test# cp imx6ull-14x14-evk.dts /boot/
[email protected]:/test# cp lib/modules /lib/ -rfd
[email protected]:/test# sync
/
内核编译下载到开发板出现问题
内核编译已经成功,镜像文件和设备树拷贝到开发板时候,用tftp出现问题
1、ubuntu安装tftp
参考:
U-Boot常用命令_第四维度4的博客-CSDN博客_uboot mm命令
i.MX6ULL - 从零开始移植linux内核5.4.70_2.3.0_觉皇不秃头的博客-CSDN博客_imx6ull移植linux
2、需要在uboot中设置开发板的ip地址
开发板ip地址如下
[email protected]:~# ifconfig
eth0 Link encap:Ethernet HWaddr 88:42:33:01:70:95
inet addr:192.168.5.9 Bcast:192.168.5.255 Mask:255.255.255.0
inet6 addr: fe80::8a42:33ff:fe01:7095/64 Scope:Link
UP BROADCAST RUNNING MULTICAST DYNAMIC MTU:1500 Metric:1
RX packets:159 errors:0 dropped:0 overruns:0 frame:0
TX packets:87 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:13680 (13.3 KiB) TX bytes:16644 (16.2 KiB)
开发板网络地址环境变量
setenv ipaddr 192.168.5.9
setenv ethaddr 88:42:33:01:70:95
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.5.11
saveenv
3.编译后内核的镜像文件和设备树通过tftp传入开发板
第一种方法用tftp传输
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-hello-emmc.dtb
bootz 80800000 - 83000000
* 第二种方法用nfs传输
先挂载nfs
用nfs时候遇见问题:
=> ping 192.168.5.11
Using FEC1 device
host 192.168.5.11 is alive
=> nfs 80800000 192.168.5.11:/home/book/nfs_rootfs/zImage
Using FEC1 device
File transfer via NFS from server 192.168.5.11; our IP address is 192.168.5.9
Filename '/home/book/nfs_rootfs/zImage'.
Load address: 0x80800000
Loading: *** ERROR: File lookup fail
done
解决办法参考:
u-boot NFS下载文件报错:Loading: *** ERROR: File lookup fail解决方法_polaris_zgx的博客-CSDN博客_在uboot里用file出错
buntu中得NFS兼容V2。修改/etc/default/nfs-kernel-server 文件。
操作方法如下:
(1)打开文件:sudo vim /etc/default/nfs-kernel-server (注意一定要sudo或者root权限),修改文件
# Number of servers to start up
#RPCNFSDCOUNT=8
RPCNFSDCOUNT="-V 2 8"
# Runtime priority of server (see nice(1))
RPCNFSDPRIORITY=0
# Options for rpc.mountd.
# If you have a port-based firewall, you might want to set up
# a fixed port here using the --port option. For more information,
# see rpc.mountd(8) or http://wiki.debian.org/SecuringNFS
# To disable NFSv4 on the server, specify '--no-nfs-version 4' here
RPCMOUNTDOPTS="-V 2 --manage-gids"
# Do you want to start the svcgssd daemon? It is only required for Kerberos
# exports. Valid alternatives are "yes" and "no"; the default is "no".
NEED_SVCGSSD=""
# Options for rpc.svcgssd.
RPCSVCGSSDOPTS="--nfs-version 2,3,4 --debug --syslog"
(4)重启NFS服务器。sudo service nfs-kernel-server restart
然后重现传输,成功,这个厉害
传输命令:
nfs 80800000 192.168.5.11:/home/book/nfs_rootfs/zImage
nfs 83000000 192.168.5.11:/home/book/nfs_rootfs/imx6ull-14x14-emmc-7-1024x600-c.dtb
bootz 80800000 - 83000000
三、驱动程序的运行与测试
1、配置Makefile
配置驱动依赖的内核路径
2.驱动程序文件夹下make编译
生成.ko文件
3.insmod开发板加载驱动
查看模块驱动信息modinfo [驱动名]
这一步出现问题:
[email protected]:/mnt/01_hello_drv# insmod hello_drv.ko
[ 549.017403] hello_drv: version magic '4.1.15 SMP preempt mod_unload modversions ARMv6 p2v8 ' should be '4.1.15-g3dc0a4b SMP preempt mod_unload modversions ARMv7 p2v8 '
insmod: ERROR: could not insert module hello_drv.ko: Invalid module format
问题解决参考:
【I.MX6ULL】6ull 加载 linux 驱动模块失败_锤王马加爵的博客-CSDN博客
上个问题解决了,呦出现问题:
hello_drv: disagrees about version of symbol device_create 这个问题:
开发板的第 1 个驱动程序_韦东山的博客-CSDN博客
韦说原因就是板子上运行的内核太老了,解决方法就是先编译内核、替换板能上的内核,再 重新编译、安装驱动程序
但是,我感觉应该是驱动的文件makefile配置问题。
4.lsmod查看驱动是否加载成功
[email protected]:/mnt/01_chrdevbase# insmod chrdevbase.ko
[ 694.581914] chrdevbase init!
[email protected]:/mnt/01_chrdevbase# lsmod
Module Size Used by
chrdevbase 2073 0
icm20608 4019 0
5.成功后编译应用程序,测试驱动程序
arm-linux-gnueabihf-gcc -o chrapp chrdevbaseApp.c
运行应用程序:
./chrapp
Error Usage!
打印应用程序内容:
[email protected]:/mnt/01_chrdevbase# cat chrdevbaseApp.c
#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"
/***************************************************************
Copyright © ALIENTEK Co., Ltd. 1998-2029. All rights reserved.
文件名 : chrdevbaseApp.c
作者 : 左忠凯