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

2021-06-10 02:57:20 字數 2978 閱讀 5563

先留個**** ,有一起學習驅動程式的加qq295699450

字元裝置驅動:

這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下:

資料結構

struct scull_mem;

struct scull_dev*dev;

整個驅動程式**如下:

#include #include #include #include #include #include #include #include #define buffersize 4096

ssize_t scull_read (struct file *filp,char __user* buf,size_t count,loff_t *offset);

ssize_t scull_write(struct file *filp,const char __user*buf,size_t count,loff_t *offset);

int scull_open(struct inode *inode,struct file *filp);

int scull_release(struct inode *inode,struct file *filp);

struct scull_mem;

struct scull_dev*dev;

dev_t scull_dev_num=0;

int major,minor;

int cdev_registered=0;

void scull_trim(void)

kfree(ptr);

}dev->data=null;

dev->size=0;

}int scull_open(struct inode *inode,struct file *filp)

int scull_release(struct inode *inode,struct file *filp)

struct scull_mem * scull_follow(int item)

memset(tmp->data,0,buffersize);

if(times==0)

}ptr=tmp;

}return ptr;

}ssize_t scull_read (struct file *filp,char __user* buf,size_t count,loff_t *offset)

if(*offset+count>dev->size)

count=dev->size-*offset;

count=count > (buffersize-pos)? (buffersize-pos):count;

if(copy_to_user(buf,ptr->data+pos,count))

*offset+=count;

retval=count;

out:

return retval;

}ssize_t scull_write(struct file *filp,const char __user*buf,size_t count,loff_t *offset)

count=count > (buffersize-pos)? (buffersize-pos):count;

if(copy_from_user(ptr->data+pos,buf,count))

*offset+=count;

retval=count;

dev->size+=count;

out:

return retval;

}loff_t scull_llseek(struct file *filp,loff_t offset,int start)

if(new<0) return -einval;

filp->f_pos=new;

return new;

}struct file_operations scull_ops=;

void cleanup(void)

if(scull_dev_num!=0)

unregister_chrdev_region(scull_dev_num,1);

}static int __init scull_init(void)

dev->size=0;

dev->data=null;

/*finally,register cdev*/

cdev_init(&dev->cdev,&scull_ops);

dev->cdev.owner=this_module;

dev->cdev.ops=&scull_ops;

if((retval=cdev_add(&dev->cdev,scull_dev_num,1))<0)

goto fail;

cdev_registered=1;

printk(kern_alert "scull inited ok!\n");

return retval;

fail:

cleanup();

return retval;

}static void __exit scull_exit(void)

module_init(scull_init);

module_exit(scull_exit);

module_license("gpl");

初始化:

根據裝置名使用alloc_chrdev_region()申請裝置號,給scull_dev分配記憶體,使用cdev_init()初始化cdev裝置,並初始化dev裡面的各個成員,接著cdev_add()講dev中的cdev新增到核心裡面,初始化結束

解除安裝:先從核心閃出sucll_dev->cdev結構,然後kfree  scull_dev結構,最後使用unregister_chrdev_region()解除安裝裝置

就是如上流程,讀寫程式隨便寫

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...

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

linux下的應用程式在訪問字元裝置時,一般都是通過裝置檔案訪問的。裝置檔案一般都存放在 dev目錄下。字元裝置檔案的第乙個標誌是c,如下所示 總結 每乙個檔案代表乙個裝置,在時間前面有兩個用逗號隔開的數字,第乙個數字是主裝置號,第二個數字是次裝置號。一般認為乙個主裝置號對應乙個驅動程式,這裡列出的...

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

linux對裝置的操作與對檔案的操作是一樣的,可以看到乙個裝置所對應的檔案。我們平時用的read write等函式也可以用於裝置檔案。字元裝置 以字元為單位 按照順利操作 沒有快取區,故不支援隨機讀寫 例外 幀快取裝置,如顯示卡,是可以隨機訪問的 裝置號由主裝置號與次裝置號組成。主裝置號標識裝置對應...