2017-06-20 66 views
1

我發現了良好的代碼作爲例如用於一個字符設備模塊:https://github.com/euspectre/kedr/blob/master/sources/examples/sample_target/cfake.c字符設備:選擇設備讀/寫

我不修改的代碼和我測試。我獲得了兩個設備(/ dev/cfake0和/ dev/cfake1),但我想了解一些內容。

有兩個設備導出,但只有一個讀取功能,如何指定哪個讀取功能用於每個設備(如果實現了兩個讀取功能)?

最後我想在同一個模塊上有兩個字符設備(一個用於I2C通信,另一個用於SPI),模塊和用戶空間需要通信,所以我需要導出它們兩個。

回答

2

你有你的文件中的每個調用一個函數:

  • 開放
  • 閱讀
  • 關閉
  • ...

但是,所有的功能都一個struct file作爲參數。

該結構 - 包含有關文件的信息 - 由模塊在內核中加載時創建。 (請參閱static int __init cfake_init_module(void);函數)。

最後,我想有兩個字符設備(一個用於I2C通信,另一個用於SPI)

你可以有東西做到這樣:

在這個例子中你給,每個文件創建一個minor device number(見cfake_construct_device())。您可以使用此編號來選擇設備是SPI還是I2C設備。

read功能可能看起來像:

ssize_t 
cfake_read(struct file *filp, char __user *buf, size_t count, 
    loff_t *f_pos) 
{ 
    /* reading minor device number */ 
    unsigned int mn = iminor(filp->f_inode); 

    /* select specialized function to use */ 
    if (0 == mn) 
     return cfake_read_i2c(filp, buf, count, f_pos); 
    else 
     return cfake_read_spi(filp, buf, count, f_pos); 
} 

說,我不認爲這是有一個模塊(除非這兩個設備必須共享數據)在兩個不同的協議是個好主意:在模塊崩潰,您將失去兩個通信通道,並且模塊將難以調試。

+0

感謝您的提示,我知道這不是一個好的理想,但我有一個FPGA在SPI通信,我需要共享數據到一個攝像頭,在I2C通信。 – PierreOlivier