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裝置驅動程式學習----1.裝置驅動程式簡介Linux
- 【linux】驅動-7-平臺裝置驅動Linux
- 【linux】驅動-6-匯流排-裝置-驅動Linux
- LED字元裝置驅動字元
- linux 裝置驅動基本概念Linux
- 在Linux中,什麼是裝置驅動程式?如何安裝和解除安裝裝置驅動程式?Linux
- ArmSoM系列板卡 嵌入式Linux驅動開發實戰指南 之 字元裝置驅動Linux字元
- Linux裝置驅動開發詳解:基於Linux4.0核心Linux
- linux裝置驅動編寫入門Linux
- platform 裝置驅動實驗Platform
- 字元驅動裝置踩坑字元
- 非同步通知和MISC裝置驅動非同步
- Linux驅動實踐:如何編寫【 GPIO 】裝置的驅動程式?Linux
- 【Linux SPI】RFID RC522 裝置驅動Linux
- 【linux】驅動-9-裝置樹外掛Linux
- mtd裝置驅動(待學習)
- 無作業系統時的裝置驅動和有作業系統時的裝置驅動作業系統
- win10驅動未知裝置怎麼辦_win10裝置管理器驅動未知裝置處理方法Win10
- Linux驅動之I2C匯流排裝置以及驅動Linux
- pci匯流排驅動及pci裝置驅動註冊
- 裝置驅動程式包可以刪除嗎 win10裝置驅動程式包能刪嗎Win10
- linux核心原始碼閱讀-塊裝置驅動Linux原始碼
- linux驅動之獲取裝置樹資訊Linux
- iOS 裝置驅動 for windows 32&64iOSWindows
- 如何編寫一個簡單的Linux驅動(三)——完善裝置驅動Linux
- platform_driver驅動及裝置驅動匹配識別符號Platform符號
- 框架-SPI四種模式+通用裝置驅動實現框架模式
- [讀書筆記]裝置驅動程式簡介(第一章)筆記
- Linux驅動之裝置樹的基礎知識Linux
- 【Linux 中斷】紅外接收器裝置驅動Linux
- 裝置樹下的 LED 驅動實驗
- 字元裝置驅動——申請、建立、應用.字元
- liunx驅動之字元裝置的註冊字元
- Linux驅動實踐:你知道【字元裝置驅動程式】的兩種寫法嗎?Linux字元
- 【linux】驅動-8-一文解決裝置樹Linux