dev_fifo.c
#include #include #include #include #include #include #define major_num 250
struct _mycdev ;
static dev_t g_pdevnum = ;
struct _mycdev *g_pcdev;
struct class *g_pcla;
//register device num
static int m_ndevices = 1;
module_param(m_ndevices, int, 0644);
module_parm_desc(m_ndevices, "the number of devices for register.\n");
static int mydev_fifo_open(struct indoe *inode, struct file *file);
static ssize_t mydev_fifo_read(struct file *file, char __user *ubuf, size_t size, loff_t *ppos);
static ssize_t mydev_fifo_write(struct file *file, const char __user *ubuf, size_t size, loff_t *ppos);
long mydev_fifo_unlocked_ioctl(struct file *file, unsigned int cmd,unsigned long arg);
int __init mydev_fifo_init(void);
void __exit mydev_fifo_exit(void);
static int mydev_fifo_open(struct indoe *inode, struct file *file)
static ssize_t mydev_fifo_read(struct file *file, char __user *ubuf, size_t size, loff_t *ppos)
static ssize_t mydev_fifo_write(struct file *file, const char __user *ubuf, size_t size, loff_t *ppos)
long mydev_fifo_unlocked_ioctl(struct file *file, unsigned int cmd,unsigned long arg)
//裝置操作函式介面
static const struct file_operations fifo_operations = ;
int __init mydev_fifo_init(void)
//裝置號 : 主裝置號(12bit) | 次裝置號(20bit)
g_pdevnum = mkdev(major_num, 0);
//靜態註冊裝置號
ret = register_chrdev_region(g_pdevnum, m_ndevices, "dev_fifo");
if(ret < 0) }
//建立裝置類
g_pcla = class_create(this_module, "dev_fifo");
if(is_err(g_pcla))
printk("device: %d \n", m_ndevices);
for(i=0; i < m_ndevices; i++)
//匯出裝置資訊到使用者空間(/sys/class/類名/裝置名)
device = device_create(g_pcla,null,g_pdevnum + i,null,"dev_fifo%d",i);
if(is_err(device))
} printk("register dev_fito to system,ok!\n");
return 0;
err_register_chrdev_region:
return ret;
err_class_create:
unregister_chrdev_region(g_pdevnum, m_ndevices);
err_cdev_add:
//將已經新增的全部除去
for(j=0; j < i; j++)
err_device_create:
//將已經匯出的裝置資訊除去
for(j = 0;j < i; j++) }
void __exit mydev_fifo_exit(void)
//刪除系統中的裝置類
class_destroy(g_pcla);
//從系統中刪除新增的字元裝置
for(i = 0;i < m_ndevices;i ++)
//釋放申請的裝置號
unregister_chrdev_region(g_pdevnum, m_ndevices);
return;
}module_license("gpl");
module_init(mydev_fifo_init);
module_exit(mydev_fifo_exit);
makefile
ifeq ($(kernelrelease),)
kernel_dir ?=/lib/modules/$(shell uname -r)/build
pwd :=$(shell pwd)
modules:
$(make) -c $(kernel_dir) m=$(pwd) modules
.phony:modules clean
clean:
$(make) -c $(kernel_dir) m=$(pwd) clean
else
obj-m := dev_fifo.o
endif
Linux驅動(三) 完善裝置驅動自動建立裝置號
include include include include include include include argc 應用程式引數個數,包括應用程式本身 ar 具體的引數內容,字串形式 int main int argc,char ar filename ar 1 獲取檔名稱 fd open f...
linux裝置驅動(二)
載入函式 解除安裝函式 模組引數 匯出符號 模組的宣告與描述 通過insmod或者modprobe載入模組時,載入函式將會自動執行 通過rmmod解除安裝模組時,解除安裝函式將會被自動執行 描述核心模組的許可許可權,如果不宣告,載入時將收到核心被汙染 kernel tainted 的警告 大多數情況...
驅動 linux裝置驅動 字元裝置驅動開發
preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...