第一个驱动程序

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

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

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

root@wandzhang-virtual-machine:/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设备树

           root@wandzhang-virtual-machine:/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    //这三个文件需要拷贝到开发板

root@wandzhang-virtual-machine:/home/book/nfs_rootfs# cd lib/
root@wandzhang-virtual-machine:/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

----------------------------


root@ATK-IMX6U:/test# ls
imx6ull-14x14-evk.dts  lib  zImage
root@ATK-IMX6U:/test# cp zImage /boot/
root@ATK-IMX6U:/test# cp imx6ull-14x14-evk.dts /boot/
root@ATK-IMX6U:/test# cp lib/modules /lib/ -rfd
root@ATK-IMX6U:/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地址如下 
root@ATK-IMX6U:~# 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  [驱动名]

       这一步出现问题:
       root@ATK-IMX6U:/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查看驱动是否加载成功

root@ATK-IMX6U:/mnt/01_chrdevbase# insmod chrdevbase.ko
[  694.581914] chrdevbase init!
root@ATK-IMX6U:/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!
打印应用程序内容:

root@ATK-IMX6U:/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
作者            : 左忠凯
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值