字元裝置驅動程式框架

2021-06-08 09:42:37 字數 2708 閱讀 4475

1, 裝置號的內部表示形式

型別:dev_t 32=12(主裝置號) + 20(次裝置號)

相關巨集:

major(dev_t dev)

minor(dev_t dev)

mkdev(int major, int minor);

2. 分配和釋放裝置號

//靜態分配裝置號

int register_chrdev_region(dev_t first, unsigned int count,

char *name);

//動態分配裝置號

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor,

unsigned int count, char *name);

void unregister_chrdev_region(dev_t first, unsigned int count);

3.獲取裝置號的通常寫法

if (scull_major) else

if (result < 0)

4.一些重要的資料結構

struct file_operations ;

//代表開啟的檔案

struct file ;

struct inode ;

//從i結點中獲取次裝置號

unsigned int iminor(struct inode *inode);

// 從i結點中獲取主裝置號

unsigned int imajor(struct inode *inode);

5. 註冊字元裝置

標頭檔案:

cdev 結構體的定義:

struct cdev ;

分配和初始化字元裝置相關結構

方法1(將cdev作為單獨的乙個結構):

struct cdev *my_cdev = cdev_alloc( ); //分配裝置空間

my_cdev->ops = &my_fops;

//裝置初始化

void cdev_init(struct cdev *cdev, struct file_operations *fops);

//新增裝置

int cdev_add(struct cdev *dev, dev_t num, unsigned int count);

//刪除裝置

void cdev_del(struct cdev *dev);

方法2(將cdev作為自定義裝置結構的乙個成員):

struct mydev

裝置分配初始化以及刪除操作類似

ps: 2.6核心以前的字元裝置註冊方法

int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);

int unregister_chrdev(unsigned int major, const char *name);

6. 字元裝置驅動程式模板

字元裝置驅動模組載入和解除安裝函式模板 //

裝置結構體

struct ***_dev_t ;

//裝置驅動模組載入函式

static int __init ***_init(void)

else

//註冊裝置

ret = cdev_add(&***_dev.cdev, ***_dev_no, 1);}

//裝置驅動模組解除安裝函式

static void __exit ***_exit(void)

字元裝置常用i/o操作函式模板

//讀裝置

ssize_t ***_read(struct file *filep, char __user *buf, size_t count, loff_t *f_pos)

//寫裝置

ssize_t ***_write(struct file *filep, const char __user *buf, size_t count, loff_t *f_pos)

//ioctl函式

int ***_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg)

return 0;}

使用者空間與核心空間的資料傳輸

//核心空間到使用者空間資料的複製

unsigned long copy_to_user(void __user *to, const void *from,                         

unsigned long count);

//使用者空間到核心空間的複製

unsigned long copy_from_user(void *to, const void __user *from,

unsinged long count);

上述函式均返回不能被複製的位元組數,因此,如果完全複製成功,返回值為0.

如果要複製的內在是簡單型別,如char, int,long等,則可以使用簡單的put_user()和get_user()函式。 如:

int val; …

get_user(val, (int*)arg); …

put_user(val, (int*)arg);

linux字元裝置驅動程式框架

include include include include include include include include include include include include define device count1 字元裝置結構體 struct dev struct dev dev...

linux裝置驅動程式 字元裝置驅動程式

先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...

Linux裝置驅動程式 字元裝置驅動程式

1.檢視主裝置號,次裝置號 進入 dev目錄執行ls l,第四,五列分別為主次裝置號,10,180,1,5,這些是主裝置號,而60,63這些就是次裝置號 130 shell android dev ls l crw rw r system radio 10,60 1969 12 31 21 00 a...