i.MX8MP開發板移植驅動全過程

ningmengzier發表於2022-11-04

各位工程師使用者在對 飛凌嵌入式OKMX8MP-C開發板進行開發的過程中,可能會遇到需要移植驅動的情況。為避免使用者因不瞭解移植驅動的過程而影響開發進度,今天小編會以寫一個hello驅動為例,演示移植驅動的過程,有需求的小夥伴可參考此方法自行操作。

01進入原始碼的drivers目錄下,並建立一個名為hello的目錄:

forlinx@ubuntu:~$  cd  /home/forlinx/work/OK8MP-linux-sdk/OK8MP-linux-kernel/driversforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$mkdir  hello

02進入hello目錄,建立hello.c:

forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$  cd helloforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$  vi hello.c

在hello.c中寫入如下內容:

#include  <linux/init.h>#include  <linux/module.h>static  int hello_init(void){printk(KERN_ALERT  "Hello world\n");return  0;}static  void hello_exit(void){printk(KERN_ALERT  "Goodbye world\n");}module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE("Dual  BSD/GPL");

程式含義:insmod驅動掛載時列印Hello world,rmmod驅動解除安裝時列印 Goodbye world

03在該資料夾下建立Kconfig,Makefile兩個檔案。

forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$  vi  Kconfig

在Kconfig檔案中寫入如下內容:

config  HAVE_HELLOtristate       "hello driver"helpThis  hello  driver  is  just  to  show  how  to  develop  driver  process.This  driver  can  also  be  built  as  a  module.  If  so,  the  module will  be  called  .default  y#endmenu

表示如果使能了CONFIG_HAVE_HELLO,在核心裁剪配置檔案中,將顯示hellodrivers選單,預設編譯進核心:

y:編譯進核心

m:編譯為模組.ko檔案

n:表示不編譯,未使能。

forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$  vi  Kconfig

在Makefile檔案中寫入如下內容:

obj-$(CONFIG_HAVE_HELLO)        +=      hello.o

注意:

宏定義的名字要和Kconfig中的一樣。後面新增需要編譯的檔名,因為核心會自動新增字首CONFIG,所以我們這裡也要在名字前面新增CONFIG_,表示CONFIG_HAVE_HELLO使能時,編譯規則指定的檔案為hello.c。

給新增的這三個檔案許可權:

forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$  chmod  777 hello.cforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$  chmod  777 Kconfigforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$  chmod  777 Makefile

04編輯drivers頂層的Kconfig,Makefile檔案。

forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers/hello$  cd  ..forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$  vi Kconfig

在Kconfig檔案中寫入如下內容:

source  "drivers/counter/Kconfig"source  "drivers/mxc/Kconfig"source  "drivers/hello/Kconfig"    //在endmenu前新增hello資料夾的配置檔案解析endmenu

如此一來,配置系統就會按照這個配置去解析hello資料夾下的Kconfig。

編輯Makefile:

    forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$  vi Makefile

    在Makefile檔案中寫入如下內容:

    obj-$(CONFIG_COUNTER)           += counter/obj-y                           += mxc/obj-$(CONFIG_HAVE_HELLO)        +=      hello/     //在Makefile最後加入這一句

    這句話的作用是當CONFIG_HAVE_HELLO使能後,在哪裡去找原始檔。再結合hello檔案下模組Makefile就形成了層次式Makefile。注意不要少了/,這裡新增自定義資料夾的名字,表示把這個資料夾編譯進核心。

    5開始編譯:

    forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/drivers$  cd ../..forlinx@ubuntu:~/work/OK8MP-linux-sdk$  .  /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-linuxforlinx@ubuntu:~/work/OK8MP-linux-sdk$  .  environment-setup-aarch64-poky-linuxforlinx@ubuntu:~/work/OK8MP-linux-sdk$  cd  OK8MP-linux-kernelforlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel$  make modulesscripts/kconfig/conf --syncconfig Kconfigdrivers/hello/Kconfig:7:warning:  ignoring unsupported character '�'drivers/hello/Kconfig:7:warning:  ignoring unsupported character '�'drivers/hello/Kconfig:7:warning:  ignoring unsupported character '�'drivers/hello/Kconfig:7:warning:  ignoring unsupported character '�'** Restart config...*** Device Drivers*Trust the bootloader  to initialize Linux's CRNG (RANDOM_TRUST_BOOTLOADER) [N/y/?] nPlatform support for  Chrome hardware (transitional) (MFD_CROS_EC) [Y/n/m/?] yTrusted Execution  Environment support (TEE) [Y/n/m/?] yhello driver  (HAVE_HELLO) [Y/n/m/?] (NEW) m    //將hello驅動編譯進核心就配置為mCALL   scripts/checksyscalls.shCALL   scripts/atomic/check-atomics.shCHK      include/generated/compile.hGZIP   kernel/config_data.gzCC     kernel/configs.o[…]LD      vmlinuxSORTEX  vmlinuxSYSMAP  System.mapBuilding modules,  stage 2.MODPOST 536 modulesCC [M] drivers/hello/hello.mod.oLD [M] drivers/hello/hello.ko

    編譯完成後,即可在OK8MP-linux-kernel/drivers/hello目錄下看到編譯生成的驅動了:

    forlinx@ubuntu:~/work/OK8MP-linux-sdk/OK8MP-linux-kernel/$  ls drivers/hellohello.c  hello.ko  hello.mod  hello.mod.c  hello.mod.o  hello.o  Kconfig  Makefile modules.order

    6

    將hello.ko使用隨身碟或TF卡複製到開發板裡進行驗證:

    root@OK8MP:~# cd  /run/media/sda1/              //進入隨身碟的路徑下root@OK8MP:/run/media/sda1#  insmod  hello.ko   //掛載hello.ko[  138.679964] Hello  world                     //掛載驅動列印資訊root@OK8MP:/run/media/sda1#  rmmod  hello.ko    //解除安裝hello.ko[  142.022115]  Goodbye  world                  //解除安裝驅動列印資訊root@OK8MP:/run/media/sda1#

    由上述測試可看,hello.ko驅動可正常執行。

    以上就是小編為大家演示的自行書寫並新增一個驅動的過程,若您想要移植某一個模組,可向模組廠家索要現成的驅動.c檔案,之後再按照上述步驟配置Makefile和Kconfig即可。


    來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69989353/viewspace-2921866/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章