摘要:一開始我們編寫點燈程式,是把裝置和驅動在乙個檔案中實現的。我們會發現,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操作 一對...