2011-03-17 85 views
3

我正在編寫需要在另一個設備上執行ioctl的內核驅動程序。我意識到這不是處理代碼的最佳方式,但這只是暫時的解決方案。我從函數中的ioctl調用中找回錯誤代碼-22(無效的參數),但是我沒有看到參數有什麼問題。以下是代碼的相關部分。從內核空間執行ioctl

#define GPIO74 "/dev/gpio/74" 

struct file* gpio74FD; 
    . 
    . 
    . 
gpio74FD = filp_open(GPIO74,O_RDWR,0) 
    . 
    . 
    . 
int device_ioctl(struct inode* inode,struct file *file, unsigned int ioctl_num,unsigned long ioctl_param) 
{ 
    . 
    . 
    . 
ret_val = gpio74FD->f_op->ioctl(inode, gpio74FD, GPIO_CONFIG_AS_INP, 0); //returns error code -22 (Invlaid Argument) 
    . 
    . 
    . 
return ret_val; 
} 

我懷疑它可能有一些做與路過此處不正確的索引節點,但即時通訊甚至不知道如何得到正確的inode如果它不是一個通過從用戶空間IOCTL。

+0

對不起,標題寫着「用戶空間「,但身體意味着內核空間。它是否正確? – JeremyP 2011-03-17 15:20:10

+0

林相當肯定它現在是inode,因爲我設法跟蹤到其他模塊中的return語句。我意識到我確實需要gpio模塊的inode,但我仍然不清楚如何獲得該inode的句柄 – 2011-03-17 15:20:47

+0

是的,這是一個錯字,它應該說內核空間,生病修復 – 2011-03-17 15:26:19

回答

1

由於您現在非常擅長「不要那樣做」的黑客領域,因此在gpio驅動程序中添加一些printk可以爲您提供一些有價值的信息。

另一個選項是避免這種可怕的黑客攻擊,並切換到危害較小的一個: 添加導出函數的GPIO驅動,你可以從自己的模塊調用