LINUX 裝置驅動 完善 版(二)

2021-07-25 17:36:59 字數 3040 閱讀 6070

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核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...