Linux驅動開發筆記(一):helloworld驅動原始碼編寫、makefile編寫以及驅動編譯

21497936發表於2023-05-07

前言

  基於linux的驅動開發學習筆記,本篇是描述了一個字元驅動的基礎開發流程,以便做嵌入式開發多年的應用或者系統學習驅動開發。

筆者自身情況

  筆者擁有硬體基礎,微控制器軟硬基礎,linux系統基礎等各種,就是沒有linux驅動框架基礎,未做過linux系統移植和驅動移植開發了。所以補完linux系統移植和驅動開發就基本可以打通嵌入式整套流程了,作為技術leader不一定親自動手做,但是一定要對產品構架中的每一塊業務和技術要基本清楚。

推薦

  建議參考xun為的影片教程,教程整個過程非常清晰,直接給擁有很多知識基礎的研發,可以不陷入某山的固有思維誤區,也不用imx6的太過龐從彙報理解大而冗餘,它能直接以最終實現目標為目的,不用從什麼裸機開始做開發學習,怎麼做也告訴你為什麼都交代清楚,再結合多年相關從業工作經驗,說實在的,一通百通可以融會貫通。從業多年,第一次推薦,因為確實真的是好東西。

驅動

驅動分為四個部分

  • 標頭檔案:宏定義等等
  • 驅動模組的入口和出口宏:linux驅動框架
  • 宣告資訊:linux核心模組的必要宣告
  • 功能實現:真正實現驅動的實體程式碼

第一個驅動原始碼:Hello world!

步驟一:包含標頭檔案

  包含宏定義的標頭檔案init.h,是一些初始化和宏標頭檔案,一些module_init,module_exit等。

#include <linux/init.h>

  包含了初始化載入模組的標頭檔案

#include <linux/module.h>

步驟二:寫驅動檔案的入口和出口

  module_init()和module_exit()入口和出口宏。(PS:這裡括號內實際上需要填入入口出口函式,後續再填入)

module_init();module_exit();

步驟三:宣告開源資訊

  告訴核心,本模組驅動有開源許可證。

MODULE_LICENSE(“GPL”);

步驟四:實現基礎功能

  入口函式

static int hello_init(void){ 
    // 在核心裡面無法使用基礎c庫printf,需要使用核心庫printk
    printk(“Hello, I’m hongPangZi\n”);	
    return 0;}

  出口函式

static void hello_exit(void){
    printk(“bye-bye!!!\n”);}

  此時可以修改,步驟二的出口入口宏了

module_init(hello_init);module_exit(hello_exit);

  總結,按部就班四步法,搭建了基礎的驅動程式碼框架。
   在這裡插入圖片描述

#include <linux/init.h>#include <linux/module.h>static int hello_init(void){ 
    // 在核心裡面無法使用基礎c庫printf,需要使用核心庫printk
    printk(“Hello, I’m hongPangZi\n”);	
    return 0;}static void hello_exit(void){
    printk(“bye-bye!!!\n”);}MODULE_LICENSE(“GPL”);module_init(hello_init);module_exit(hello_exit);

Linux驅動編譯成模組

  把驅動編譯城模組,然後載入到核心裡面。
  把驅動直接編譯到核心,執行核心則會直接載入驅動。

步驟一:編寫makefle

1 生成中間檔案的名稱

obj-m += helloworld.o

2 核心的路徑

  核心在哪,實際路徑在哪

KDIR:=

3 當前路徑

PWD?=$(shell pwd)

4 總的編譯命令

all: 
    make -C $(KDIR) M=$(PWD) modules

  make進去KDIR路徑,當前路徑編譯成模組。
   在這裡插入圖片描述

obj-m = helloworld.o
KDIR:=PWD?=$(shell pwd)all:
	make -C $(KDIR) M=$(PWD) modules

步驟二:編譯驅動

  編譯驅動之前有幾點要注意:

1 核心原始碼要編譯透過

  與驅動編譯成的目標系統,獲取對應的核心且需要編譯透過。

2 核心原始碼版本

  開發板或者系統跑的核心版本需要與編譯核心驅動的核心原始碼版本一致。
注意3:編譯目標環境要確認是否是需要的構架,在核心目錄下:

make menu configureexport ARCH=arm

  修改構架後,可使用menu configure檢視標題欄的核心構架

3 編譯器版本

  找到使用的arm編譯器(實際為arm-linux-gnueabihf-gcc,取gcc字首)

export CROSS_COMPILE=arm-linux-gnueabihf-

4 編譯

  直接輸入make,編譯驅動,會生成hellowold.ko檔案,ko檔案就是編譯好的驅動模組。

步驟三:載入解除安裝驅動

1載入驅動

  將驅動複製到開發板或者目標系統,然後使用載入指令:

insmod helloworld.ko

  會列印入口載入的printk輸出。

2 檢視當前載入的驅動

lsmod

  可以檢視到載入的驅動模組

3 解除安裝驅動

rmmod helloworld

  可以移除指定驅動模組(PS:解除安裝驅動不需要.ko字尾),解除安裝成功會列印之前的printk輸出。

總結

  學習了驅動的基礎框架,那麼為了方便很好的測試,讓大家都有基礎環境,下一篇,將使用ubuntu18.04,編譯ubuntu18.04的驅動,然後做好本篇文章的相關實戰測試。


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

相關文章