1. 程式人生 > >字元裝置驅動 mem_read()函式

字元裝置驅動 mem_read()函式

字元裝置 mem_read()函式

/*讀函式*/
static ssize_t mem_read(struct file *filp, char __user *buf, 
	size_t size, loff_t *ppos)
{
    int num = MINOR(filp->f_inode->i_rdev);
    ssize_t retval=0;	//ssize_t:long,size_t:unsigned long 
    ssize_t count=buf_size;
    count=(size>count)?(count):(size);
	
	//判斷讀位置是否有效
	/* 最大空間4096,如果寫入100位元組,就只有100位元組有效 */
	/* 此時要讀取4096位元組,最多返回100位元組,超過100位元組部分,返回0表示失敗,應用程式要讀4096,但實際只讀到100 */
	//*ppos為當前讀寫的位置(當前訪問位置從0開始)
	/* 如果*ppos還沒到真實的大小時,繼續讀取,但是當*ppos超過了真實的大小時,則返回0, */
	if(*ppos>=real_size)	//*是否超出讀取範圍
        return retval;

    if (num >= MEMDEV_NR_DEVS) 
            return -ENODEV;
    printk(KERN_ALERT "Read chrdev.Major:%i Minor:%i\n",mem_major,num);
	//讀資料到使用者空間
    if(copy_to_user(buf,buffer,count))
    {
	retval=-EFAULT;
	goto err;
    }
    retval = count;
    *ppos+=count;	//*將檔案當前位置向後移,已經讀取了的位元組
    real_size=count;	//*返回實際讀取位元組數
    printk(KERN_ALERT "Read %li bytes to chrdev.\n",count);
err:
    return retval;	//*返回實際讀取位元組數
}