Linux驅動學習筆記 驅動匯流排實驗

2021-10-16 12:56:35 字數 4861 閱讀 2908

在linux系統中,除了硬體匯流排,還有一種軟體虛擬出來的匯流排 –驅動匯流排bus

這種驅動匯流排的作用:軟體與硬體**分離,提高程式的復用性

驅動匯流排分三個部分:三者都是在/include/linux/device.h中定義

struct device
struct device_driver
struct bus_type
int __init buses_init

(void

)

核心啟動該函式會被執行進而初始化驅動匯流排

匯流排初始化後會在會建立匯流排對應的/sys/bus/目錄

1、註冊新的匯流排:

int

bus_register

(struct bus_type *bus)

;

2、解除安裝匯流排:

void

bus_unregister

(struct bus_type *bus)

int

device_register

(struct device *dev)

2、裝置解除安裝:

void

device_unregister

(struct device *dev)

int

driver_register

(struct device_driver *drv)

2、驅動解除安裝:

void

driver_unregister

(struct device_driver *drv)

1、匯流排註冊
#include

#include

#include

#include

//設定的device和driver的匹配規則 : 設定通過名字匹配

intxbus_match

(struct device *dev,

struct device_driver *drv)

return0;

}static

struct bus_type xbus =

;export_symbol

(xbus)

;//匯出xbus全域性符號

static

int __init xbus_init

(void

)static

void __exit xbus_exit

(void

)module_init

(xbus_init)

;module_exit

(xbus_exit)

;module_license

("gpl"

);

2、註冊裝置
#include

#include

#include

#include

extern

struct bus_type xbus;

// 註冊的xbus匯流排

//device被解除安裝時被執行

static

void

xbus_device_release

(struct device *dev)

static

struct device xbus_dev =

;static

int __init xbus_device_init

(void

)static

void __exit xbus_device_exit

(void

)module_init

(xbus_device_init)

;module_exit

(xbus_device_exit)

;module_license

("gpl"

);

3、註冊驅動
#include

#include

#include

#include

extern

struct bus_type xbus;

// 註冊的xbus匯流排

//device和driver匹配成功該函式就會被執行

static

intxdrv_probe

(struct device *dev)

//驅動被解除安裝時執行

static

intxdrv_remove

(struct device *dev)

static

struct device_driver xbus_drv =

;static

int __init xbus_drv_init

(void

)static

void __exit xbus_drv_exit

(void

)module_init

(xbus_drv_init)

;module_exit

(xbus_drv_exit)

;module_author

("ares");

module_license

("gpl"

);

註冊的匯流排xbus是通過名字匹配,device的名字設定為.init_name = "xbusdev",所以driver的名字(.name = "xbusdev")設定成和device一樣

4、編譯模組

kernel_dir=

/home/ares/ebf-buster-linux/

arch=arm

cross_compile=arm-linux-gnueabihf-

export arch cross_compile

obj-m +

= xbus.o xbus_device.o xbus_driver.o

all:

$(make)

-c $(kernel_dir) m=$(curdir) modules

.phone:clean

clean:

$(make)

-c $(kernel_dir) m=$(curdir) clean

5、載入模組
1、匯流排模組  sudo insmod xbus.ko

2、device sudo insmod xbus_device.ko

3、driver sudo insmod xbus_driver.ko

檢視列印的除錯資訊核心訊息:

[

39477.494030

] xbus driver init

[39477.494092

] xbus device & driver match success //device 和 driver匹配成功

[39477.494172

]/home/ares/drivers_learning/xbus/xbus_driver.c-xdrv_probe //device和driver匹配成功執行xdrv_probe函式

檢視/sys/bus/目錄:

ls /sys/bus/
有了乙個和註冊的xbus匯流排對應的資料夾:

檢視/sys/bus/xbus/目錄下的內容:

devices目錄 - 表示裡面是掛載該匯流排的裝置

drivers目錄 - 表示裡面是掛載在該匯流排的驅動

檢視/sys/bus/xbus/devices和drivers目錄下的內容:

兩個目錄的內容是一致,就是自己註冊的xbusdev

6、解除安裝模組

1、sudo rmmod xbus_device.ko

2、sudo rmmod xbus_driver.ko

3、sudo rmmod xbus.ko //由於xbus_device.ko和xbus_driver.ko依賴於xbus.ko,所以不能先解除安裝xbus.ko

檢視列印的除錯資訊:

[

40574.523079

]/home/ares/drivers_learning/xbus/xbus_device.c xbus_device_release

[40574.523090

] xbus_device exit

[40586.124660

] xbus driver exit

[40592.489635

] unregsiter xbus

學習筆記 裝置,驅動,匯流排

結構體 struct device 標頭檔案位於linux include linux device.h 用於描述裝置相關的資訊裝置之間的層次關係,以及裝置與匯流排 驅動的關係。這篇講如何建立裝置 結構體 device register tdev device unregister tdev 學過了...

Linux匯流排裝置驅動

註冊裝置使用的結構體platform device,該結構體在標頭檔案 include linux platform device.h 中,結構體成員如下 在平台檔案中 linux的arm平台 在arch arm中 定義結構體並把結構體加入到乙個platform device型別的指標陣列中,系統會...

linux驅動學習筆記

1.先從最簡單的例子開始 include include module license dual bsd gpl static int hello init void printk kern alert hello,world n return 0 static void hello exit vo...