先留個**** ,有一起學習驅動程式的加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等函式也可以用於裝置檔案。字元裝置 以字元為單位 按照順利操作 沒有快取區,故不支援隨機讀寫 例外 幀快取裝置,如顯示卡,是可以隨機訪問的 裝置號由主裝置號與次裝置號組成。主裝置號標識裝置對應...