天天看點

第一個驅動程式一、核心編譯指令:二、鏡像檔案和裝置樹拷貝開發闆三、驅動程式的運作與測試

首先,需要有一個核心源碼,并且編譯配置

驅動程式的頭檔案依賴于核心,是以寫驅動程式時候要使用核心,是編譯後的核心。

核心是需要配置的,比如連結檔案。到底是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

作者            : 左忠凱