首先,需要有一個核心源碼,并且編譯配置
驅動程式的頭檔案依賴于核心,是以寫驅動程式時候要使用核心,是編譯後的核心。
核心是需要配置的,比如連結檔案。到底是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
作者 : 左忠凱