嵌入式linux字元裝置註冊裝置驅動

2021-09-23 10:10:30 字數 3235 閱讀 5148

/*包含初始化巨集定義的標頭檔案,**中的module_init和module_exit在此檔案中*/

#include

/*包含初始化載入模組的標頭檔案,**中的module_license在此標頭檔案中*/

#include

/*定義module_param module_param_array的標頭檔案*/

#include

/*定義module_param module_param_array中perm的標頭檔案*/

#include

/*三個字元裝置函式*/

#include

/*mkdev轉換裝置號資料型別的巨集定義*/

#include

/*定義字元裝置的結構體*/

#include

/*分配記憶體空間函式標頭檔案*/

#include

/*包含函式device_create 結構體class等標頭檔案*/

#include

自己寫的煩盜一下

linux核心中:

a -- 使用cdev結構體來描述字元裝置;

b -- 通過其成員dev_t來定義裝置號(分為主、次裝置號)以確定字元裝置的唯一性;

c -- 通過其成員file_operations來定義字元裝置驅動提供給vfs的介面函式,如常見的open()、read()、write()等;

在linux字元裝置驅動中:

a -- 模組載入函式通過 register_chrdev_region( ) 或 alloc_chrdev_region( )來靜態或者動態獲取裝置號;

b -- 通過 cdev_init( ) 建立cdev與 file_operations之間的連線,通過 cdev_add( ) 向系統新增乙個cdev以完成註冊;

c -- 模組解除安裝函式通過cdev_del( )來登出cdev,通過 unregister_chrdev_region( )來釋放裝置號;

使用者空間訪問該裝置的程式:

a -- 通過linux系統呼叫,如open( )、read( )、write( ),來「呼叫」file_operations來定義字元裝置驅動提供給vfs的介面函式;

/*包含初始化巨集定義的標頭檔案,**中的module_init和module_exit在此檔案中*/

#include /*包含初始化載入模組的標頭檔案,**中的module_license在此標頭檔案中*/

#include /*定義module_param module_param_array的標頭檔案*/

#include /*定義module_param module_param_array中perm的標頭檔案*/

#include /*三個字元裝置函式*/

#include /*mkdev轉換裝置號資料型別的巨集定義*/

#include /*定義字元裝置的結構體*/

#include /*分配記憶體空間函式標頭檔案*/

#include /*包含函式device_create 結構體class等標頭檔案*/

#include #define device_name "chardevnode"

#define device_minor_num 2

#define dev_major 0

#define dev_minor 0

#define regdev_size 3000

module_license("dual bsd/gpl");

/*宣告是開源的,沒有核心版本限制*/

module_author("itopeet_dz");

/*宣告作者*/

int numdev_major = dev_major;

int numdev_minor = dev_minor;

/*輸入主裝置號*/

module_param(numdev_major,int,s_irusr);

/*輸入次裝置號*/

module_param(numdev_minor,int,s_irusr);

static struct class *myclass;

struct reg_dev

;struct reg_dev *my_devices;

/*開啟操作*/

static int chardevnode_open(struct inode *inode, struct file *file)

/*關閉操作*/

static int chardevnode_release(struct inode *inode, struct file *file)

/*io操作*/

static long chardevnode_ioctl(struct file *file, unsigned int cmd, unsigned long arg)

ssize_t chardevnode_read(struct file *file, char __user *buf, size_t count, loff_t *f_ops)

ssize_t chardevnode_write(struct file *file, const char __user *buf, size_t count, loff_t *f_ops)

loff_t chardevnode_llseek(struct file *file, loff_t offset, int ence)

struct file_operations my_fops = ;

/*裝置註冊到系統*/

static void reg_init_cdev(struct reg_dev *dev,int index)

else

}static int scdev_init(void)

else

if(ret<0)

myclass = class_create(this_module,device_name);

my_devices = kmalloc(device_minor_num * sizeof(struct reg_dev),gfp_kernel);

if(!my_devices)

memset(my_devices,0,device_minor_num * sizeof(struct reg_dev));

/*裝置初始化*/

for(i=0;i自己寫的**很繁瑣,**也盜了一下,這個最精簡

注意:

kmalloc(申請空間大小,許可權)    gfp_kernel等待分配

memset(位址,內容,大小)

嵌入式linux字元裝置驅動

arm linux 驅動 抵岸科技 1.我們需要先呼叫register chrdev region 或 alloc chrdev region 來向系統申請裝置號 int register chrdev region dev t first,unsigned int count,char name ...

嵌入式linux字元裝置驅動

1.我們需要先呼叫register chrdev region 或 alloc chrdev region 來向系統申請裝置號 int register chrdev region dev t first,unsigned int count,char name 函式通過已知的裝置號first來註冊...

linux字元裝置註冊相關函式

本文介紹linux字元裝置註冊相關的四個函式 cdev alloc cdev init cdev add和cdev del。這四個函式在檔案 fs char dev.c中定義,在標頭檔案include linux cdev.h中宣告。其中cdev alloc和cdev init是一對 互斥 函式,以...