Linux驅動開發筆記(四):裝置驅動介紹、熟悉雜項裝置驅動和ubuntu開發雜項裝置Demo
前言
linux三大裝置驅動
雜項裝置
cat /proc/misc
cat /proc/devices
雜項裝置描述結構體
cd /usr/src/linux-headers-4.18.0-15vi include/linux/miscdevice.h
struct miscdevice { int minor; // 次裝置號 const char *name; // 裝置節點名稱(如/dev/ttyS8,則ttyS是名稱) const struct file_operations *fops; // 檔案操作集(非常重要) struct list_head list; struct device *parent; struct device *this_device; const struct attribute_group **groups; const char *nodename; umode_t mode;};
雜項裝置檔案操作集
cd /usr/src/linux-headers-4.18.0-15vi include/linux/fs.h
struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); ssize_t (*read_iter) (struct kiocb *, struct iov_iter *); ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); int (*iterate) (struct file *, struct dir_context *); int (*iterate_shared) (struct file *, struct dir_context *); __poll_t (*poll) (struct file *, struct poll_table_struct *); long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); unsigned long mmap_supported_flags; int (*open) (struct inode *, struct file *); int (*flush) (struct file *, fl_owner_t id); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, loff_t, loff_t, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); int (*check_flags)(int); int (*setfl)(struct file *, unsigned long); int (*flock) (struct file *, int, struct file_lock *); ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); int (*setlease)(struct file *, long, struct file_lock **, void **); long (*fallocate)(struct file *file, int mode, loff_t offset, loff_t len); void (*show_fdinfo)(struct seq_file *m, struct file *f);#ifndef CONFIG_MMU unsigned (*mmap_capabilities)(struct file *);#endif ssize_t (*copy_file_range)(struct file *, loff_t, struct file *, loff_t, size_t, unsigned int); int (*clone_file_range)(struct file *, loff_t, struct file *, loff_t, u64); ssize_t (*dedupe_file_range)(struct file *, u64, u64, struct file *, u64);} __randomize_layout;
驅動編寫空模板準備
cd ~/work/drivecp -arf hellowolrd registerMiscDev
cd registerMiscDev/rm *.ko *.o *.order *.symvers
mv helloworld.c registerMiscDev.c
#include <linux/init.h>#include <linux/module.h>static int registerMiscDev_init(void){ // 在核心裡面無法使用基礎c庫printf,需要使用核心庫printk printk("Hello, I’m hongPangZi, registerMiscDev_init\n"); return 0;}static void registerMiscDev_exit(void){ printk("bye-bye!!!\n");}MODULE_LICENSE("GPL");module_init(registerMiscDev_init);module_exit(registerMiscDev_exit);
雜項裝置註冊流程Demo
步驟一:填充miscdevice結構體
#include <linux/miscdevice.h>#include <linux/fs.h>
struct miscdevice misc_dev { .minor = MISC_DYNAMIC_MINRO, // 這個宏是動態分配次裝置號,避免衝突 .name = "register_hongPangZi_misc, // 裝置節點名稱 .fops = misc_fops, // 這個變數記住,自己起的,步驟二使用}
步驟二:填充file_operations結構體
struct file_operations misc_fops { .owner = THIS_MODULE}
步驟三:註冊雜項裝置並生成裝置節點
static int registerMiscDev_init(void){ // 在核心裡面無法使用基礎c庫printf,需要使用核心庫printk printk("Hello, I’m hongPangZi, registerMiscDev_init\n"); int ret = 0; ret = misc_register(misc_dev); if(ret < 0) { printk("Failed to misc_register(misc_dev)\n"); return -1; } return 0;}
static int registerMiscDev_init(void){ // 在核心裡面無法使用基礎c庫printf,需要使用核心庫printk printk("Hello, I’m hongPangZi, registerMiscDev_init\n"); int ret = 0; ret = misc_register(&misc_dev); if(ret < 0) { printk("Failed to misc_register(misc_dev)\n"); return -1; } return 0;}
#include <linux/init.h>#include <linux/module.h>#include <linux/miscdevice.h>#include <linux/fs.h>struct file_operations misc_fops = { .owner = THIS_MODULE,};struct miscdevice misc_dev = { .minor = MISC_DYNAMIC_MINOR, // 這個宏是動態分配次裝置號,避免衝突 .name = "register_hongPangZi_misc", // 裝置節點名稱 .fops = &misc_fops, // 這個變數記住,自己起的,步驟二使用};static int registerMiscDev_init(void){ // 在核心裡面無法使用基礎c庫printf,需要使用核心庫printk printk("Hello, I’m hongPangZi, registerMiscDev_init\n"); int ret = 0; ret = misc_register(&misc_dev); if(ret < 0) { printk("Failed to misc_register(&misc_dev)\n"); return -1; } return 0;}static void registerMiscDev_exit(void){ misc_deregister(&misc_dev); printk("bye-bye!!!\n");}MODULE_LICENSE("GPL");module_init(registerMiscDev_init);module_exit(registerMiscDev_exit);
步驟四:編譯make
make
步驟五:載入解除安裝驅動測試
sudo insmod registerMiscDev.ko
dmesg
sudo rmmod registerMiscDev.ko
入坑
入坑一:編譯報錯,結構體之後未加分號
問題
解決
入坑二:編譯錯誤,檔案操作指標問題
問題
解決
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010283/viewspace-2996396/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 驅動Driver-MISC雜項驅動裝置
- 05_雜項裝置驅動
- Linux裝置驅動之字元裝置驅動Linux字元
- 字元裝置驅動 —— 字元裝置驅動框架字元框架
- 《Linux裝置驅動開發詳解(第2版)》——第1章Linux裝置驅動概述及開發環境構建1.1裝置驅動的作用Linux開發環境
- 深入淺出:Linux裝置驅動之字元裝置驅動Linux字元
- 乾坤合一:Linux裝置驅動之塊裝置驅動Linux
- Linux裝置驅動程式學習----1.裝置驅動程式簡介Linux
- 蛻變成蝶:Linux裝置驅動之字元裝置驅動Linux字元
- 蛻變成蝶~Linux裝置驅動之字元裝置驅動Linux字元
- 乾坤合一:Linux裝置驅動之USB主機和裝置驅動Linux
- Linux塊裝置驅動Linux
- Linux下的硬體驅動——USB裝置(下)(驅動開發部分)(轉)Linux
- SCO UNIX 下裝置驅動程式開發 (轉)
- SCO UNIX 下裝置驅動程式開發(轉)
- 【linux】驅動-7-平臺裝置驅動Linux
- LED字元裝置驅動字元
- Windows裝置和驅動的安裝Windows
- Linux裝置驅動程式 (轉)Linux
- linux裝置驅動中的併發控制Linux
- 【linux】驅動-6-匯流排-裝置-驅動Linux
- Ubuntu 安裝MTP驅動訪問安卓裝置Ubuntu安卓
- 在Linux中,什麼是裝置驅動程式?如何安裝和解除安裝裝置驅動程式?Linux
- 字元驅動裝置踩坑字元
- platform 裝置驅動實驗Platform
- Linux裝置驅動探究第1天----spi驅動(1)Linux
- linux 裝置驅動基本概念Linux
- Windows NT 裝置驅動程式開發基礎(1) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(3) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(2) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(4) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(5) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(7) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(6) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(8) (轉)Windows
- ArmSoM系列板卡 嵌入式Linux驅動開發實戰指南 之 字元裝置驅動Linux字元
- 開發Linux系統裝置驅動程式並不難(轉)Linux
- 非同步通知和MISC裝置驅動非同步