樹莓派點燈驅動程式 基於匯流排裝置驅動模型

2021-09-13 13:39:12 字數 3103 閱讀 3682

摘要:一開始我們編寫點燈程式,是把裝置和驅動在乙個檔案中實現的。我們會發現,linux的裝置驅動並不是這樣編寫的,基於軟體工程「高內聚,低耦合」的思想,裝置和驅動往往是分離的。匯流排裝置驅動模型就是這樣乙個思想。我們基於匯流排裝置驅動模型,實現樹莓派的點燈程式。

匯流排裝置驅動模型:

在linux2.6以後的裝置驅動模型中,需關心匯流排、裝置和驅動三個實體,匯流排將裝置和驅動繫結。在系統每註冊乙個裝置的時候,會尋找與之匹配的驅動。相反的,在系統每註冊乙個驅動的時候,會尋找與之匹配的裝置,而匹配由匯流排完成。

led_dev.c:負責device的**

#include #include #include #include #include #include #include #include static struct resource led_rsrc = ,

[1]=

};static void led_release( struct device *dev )

// allocate set and register a platform_device

static struct platform_device led_dev = ,

};static int __init led_dev_init(void)

static void __exit led_dev_exit(void)

module_init(led_dev_init);

module_exit(led_dev_exit);

module_license("gpl");

led_drv.c:負責driver的**

#include #include #include #include #include #include #include #include static dev_t devno;

static int major = 231;

static int minor = 0;

static char *module_name = "led_drv";

static struct class *leddrv_class;

static struct device *leddrv_class_dev;

volatile unsigned long *gpfsel0 = null;

volatile unsigned long *gpset0 = null;

volatile unsigned long *gpclr0 = null;

static int pin;

static int led_open(struct inode *inode, struct file *file)

//led_write函式

static ssize_t led_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)

else

return 0;

}static struct file_operations leds_fops = ;

static int led_probe( struct platform_device *pdev )

static int led_remove( struct platform_device *pdev )

// allocate set and register a platform_driver

static struct platform_driver led_drv =

};static int __init led_drv_init(void)

static void __exit led_drv_exit(void)

module_init(led_drv_init);

module_exit(led_drv_exit);

module_license("gpl");

makefie:

kern_dir=/home/dr/raspberry_src/linux-rpi-4.14.y

#kernel modules

obj-m += led_dev.o

obj-m += led_drv.o

build: kernel_modules

kernel_modules:

make -c $(kern_dir) m=`pwd` modules arch=arm cross_compile=/home/dr/raspberry_src/tools-master/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-

clean:

make -c $(kern_dir) m=`pwd` modules arch=arm cross_compile=/home/dr/raspberry_src/tools-master/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf- clean

led_test.c:測試程式**

#include #include //open

/* * led_test on

* led_test off

*/int main(int argc, char **ar**)

fd = open("/dev/led_drv",o_rdwr);

if( fd < 0 )

if( strcmp(ar**[1],"on") == 0 )

else if( strcmp(ar**[1],"off") == 0 )

write(fd, &val, 4);

}

測試執行:

1. 交叉編譯

sudo make

arm-linux-gnueabihf-gcc led_test.c -o led_test

2. 測試

./led_test on     //開燈

./led_test off //關燈

linux裝置驅動程式 字元裝置驅動程式

先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...

Linux裝置驅動程式 字元裝置驅動程式

1.檢視主裝置號,次裝置號 進入 dev目錄執行ls l,第四,五列分別為主次裝置號,10,180,1,5,這些是主裝置號,而60,63這些就是次裝置號 130 shell android dev ls l crw rw r system radio 10,60 1969 12 31 21 00 a...

裝置驅動程式

首先要問,什麼是裝置驅動程式?又名裝置處理程式,是i o系統的高層與裝置控制器之間的通訊程式 起乙個翻譯的作用 這個東西能幹什麼?簡要來說就是啟動指定裝置,完成上層指定的i o工作 裝置驅動程式的特點 略,書上193頁有 裝置處理方式 為每一類裝置設定乙個程序,專門用於執行這類裝置的i o操作 一對...