驅動 入門例項字元驅動(二)

2021-09-26 07:20:52 字數 2912 閱讀 9230

一、基本理論

二、基本資料結構和例項

一、基本理論

本文例項參考《linux裝置驅動開發詳解第二版》,例項只是為了入門測試,初始化基本沒有錯誤檢查。這次基於前面的例項,在filp->private_data新增自定義的裝置指標,這個是許多驅動都採取的做法。

二、基本資料結構和例項

#ifndef _glbmem_h_

#define _glbmem_h_

#include #include #define globalmem_size 0x1000

#define globalmem_clear 0x1

#define globalmem_major 0

#define globalmem_node_name "glbmem"

#define globalmem_file_name "glbmem"

#define globalmem_class_name "glbmem"

static int globalmem_major=globalmem_major;

struct globalmem_dev;

#endif

#include #include #include #include #include #include #include #include #include #include #include "glbmem.h"

static struct globalmem_dev *dev;

static struct class *glbmem_class;

static int glbmem_open(struct inode *inode,struct file *filp)

static void glbmem_close(struct inode *inode,struct file *filp)

static ssize_t glbmem_read(struct file *filp,char __user *buffer,size_t len,loff_t *offset)

if((len+p)>globalmem_size)

len=globalmem_size-p;

if(copy_to_user(buffer,(void*)(dev->mem+p),len))

else

return ret;

}static ssize_t glbmem_write(struct file *filp,char __user *buffer,size_t len,loff_t *offset)

if((p+len)>globalmem_size)

if(copy_from_user(dev->mem+p,buffer,len))else

return ret;

}static int glbmem_ioctl(struct file *filp,unsigned int cmd,unsigned long arg)

return 0;

}static const struct file_operations glbmem_fops=;

static void globalmem_setup_cdev(struct globalmem_dev *dev)

static int __init glbmem_init(void)

if(ret<0)

return ret;

printk("device number register successed.\n");

printk("major number is:%d.\nminor number is:%d.\n",major(devno),minor(devno));

dev=kmalloc(sizeof(struct globalmem_dev),gfp_kernel);

memset(dev,0,sizeof(struct globalmem_dev));

globalmem_setup_cdev(dev);

glbmem_class=class_create(this_module,globalmem_node_name);

device_create(glbmem_class,null,devno,null,globalmem_node_name);

printk(kern_alert "glbmem init success.\n");

return 0;

}static void __exit glbmem_exit(void)

module_init(glbmem_init);

module_exit(glbmem_exit);

module_license("dual bsd/gpl");

module_author("wen");

module_description("this is a example to display char device driver");

module_version("v1.0");

makefile:

ifneq ($(kernelrelease),)

obj-m :=glbmem.o

else

kerneldir :=/lib/modules/$(shell uname -r)/build

pwd :=$(shell pwd)

all:

$(make) -c $(kerneldir) m=$(pwd) modules

endif

clean:

rm *.ko *.o *mod*

測試:

三 、總結

驅動 入門例項hello驅動(一)

一 基本理論 二 基本資料結構和例項 三 總結 一 基本理論 雖然基本的linux核心是乙個大的image檔,也可以當做是乙個bin檔,可執行檔案。但是核心是模組化組成的,它允許在核心執行時向其中動態的插入或刪除 二 基本資料結構和例項 以下是module init和module exit巨集函式 ...

裝置驅動例項 字元裝置驅動

在整個linux裝置驅動學習中,字元裝置驅動較為基礎。通過對它的學習,對裝置驅動進一步加深了解 cdev 結構體struct cdev 講下比較重要的成員變數 dev t dev 定義了32位的裝置號,其中12位是主裝置號,20位是從裝置號。獲取主裝置號 major dev t dev 獲取從裝置號...

Linux驅動開發之字元裝置驅動例項

1 驅動標頭檔案mem dev.h ifndef memdev h define memdev h ifndef memdev major define memdev major 238 預設的mem的主裝置號 endif ifndef memdev nr devs define memdev nr...