天天看点

第一个驱动程序一、内核编译命令:二、镜像文件和设备树拷贝开发板三、驱动程序的运行与测试

首先,需要有一个内核源码,并且编译配置

驱动程序的头文件依赖于内核,所以写驱动程序时候要使用内核,是编译后的内核。

内核是需要配置的,比如链接文件。到底是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

作者            : 左忠凯